From 9b8103bfd6ebfcaac57fc0e981255eb71e57a406 Mon Sep 17 00:00:00 2001 From: Fatimah Alshammari Date: Mon, 7 Dec 2020 10:21:34 +0300 Subject: [PATCH 01/18] fixe order and order details --- assets/images/pharmacy/compare.png | Bin 0 -> 704 bytes lib/config/config.dart | 3 +- lib/config/localized_values.dart | 5 + .../PharmacyAddressesViewModel.dart | 16 +- .../order_model_view_model.dart | 23 +- lib/pages/landing/home_page.dart | 2 +- lib/pages/pharmacy/order/Order.dart | 753 +++++++++++------- lib/pages/pharmacy/order/OrderDetails.dart | 334 +++++--- lib/pages/pharmacy/order/ProductReview.dart | 93 ++- .../pharmacyAddresses/PharmacyAddresses.dart | 34 +- lib/pages/pharmacy/profile/profile.dart | 685 ++++++++-------- .../cancelOrder_service.dart | 39 + .../pharmacy_services/order_service.dart | 22 +- .../pharmacyAddress_service.dart | 10 +- lib/uitl/translations_delegate_base.dart | 5 + lib/widgets/pharmacy/product_tile.dart | 117 +-- 16 files changed, 1318 insertions(+), 823 deletions(-) create mode 100644 assets/images/pharmacy/compare.png create mode 100644 lib/services/pharmacy_services/cancelOrder_service.dart diff --git a/assets/images/pharmacy/compare.png b/assets/images/pharmacy/compare.png new file mode 100644 index 0000000000000000000000000000000000000000..11a49dfbf18881a724bae6e3ba9698ac4bd98eba GIT binary patch literal 704 zcmeAS@N?(olHy`uVBq!ia0vp^N!KqY3LE{-7{yi2FNExm2P z80zAbU2&bP`mqLqi*5E)hY|PEhLnm&f-@L zcK*|rAJBed&eA0r?5~VHrBq~-=7);^*j~V{y<^EFU*5z8Z6R##w%aldw%R|kuxOlg zL_EV`)q*LF(-KlkGMwM2SNvdPl~H`v@Gz0}{DTFmyhW_>lQWv%KIB`M$UiCPXkBA_ zNcJ4}6_XYmzt@oGbN#}+R$YxU{`5?NlY9UD`)@eId_z04i9+TB)rb>IWu~)!{~`C~ zoW+fUR%_NeK01Bsp7h*~jum(MKQ0U{wVJqMOL~v)qs}?Z2UkRX<#@!Yk#nH&UDg_% zPPQ%o8o6vt!~-`Nxr_2Yv&~$e`2KQ)UB|2!7oP;x ztoc>7z(_cFT^cK$OSR%gArva4o-DepSASuYGt#fwUmV*9^)?0L8PG`ptf6@%#^ z8*kp8u$L)nep<$}i0ap$97`sCKXv(lPp%OA&UsND`~LlyH`&Vel4WgN^b2mwhQ8vy iGLe<{8d`VW`oo;=**tObr%78uDaq5-&t;ucLK6Ti>MnNx literal 0 HcmV?d00001 diff --git a/lib/config/config.dart b/lib/config/config.dart index e7341682..5b03e49f 100644 --- a/lib/config/config.dart +++ b/lib/config/config.dart @@ -349,7 +349,8 @@ const GET_CUSTOMERS_ADDRESSES = "epharmacy/api/Customers/"; const GET_WISHLIST = "epharmacy/api/shopping_cart_items/"; const GET_ORDER = "orders?"; const GET_ORDER_DETAILS ="epharmacy/api/orders/"; -const GET_ADDRESS ="epharmacy/api/Customers/272843?fields=addresses"; +const GET_ADDRESS ="Customers/"; +const GET_Cancel_ORDER ="cancelorder/"; // Home Health Care const HHC_GET_ALL_SERVICES = "Services/Patients.svc/REST/PatientER_HHC_GetAllServices"; diff --git a/lib/config/localized_values.dart b/lib/config/localized_values.dart index c2a81962..a7358d90 100644 --- a/lib/config/localized_values.dart +++ b/lib/config/localized_values.dart @@ -642,6 +642,11 @@ const Map> localizedValues = { "cancelled": {"en": "Cancelled", "ar": " ملغي"}, "writeReview": {"en": "Write Review", "ar": " اكتب تقييمك"}, "shareReview": {"en": "SHARE REVIEW", "ar": " اكتب تقييمك"}, + "review": {"en": " reviews", "ar": " تقييمات"}, + "deliveredOrder": {"en": " DELIVERED", "ar": " تم التوصيل"}, + "compare": {"en": " Compare", "ar": "مقارنه"}, + "medicationsRefill": {"en": " Medication Refill", "ar": "اعادة تعبئة الدواء"}, + "myPrescription": {"en": " My Prescriptions", "ar": "وصفاتي"}, "backMyAccount": { "en": "BACK TO MY ACCOUNT ", "ar": " الرجوع لحسابي الشخصي" diff --git a/lib/core/viewModels/pharmacyModule/PharmacyAddressesViewModel.dart b/lib/core/viewModels/pharmacyModule/PharmacyAddressesViewModel.dart index 75a178fa..a2e3b924 100644 --- a/lib/core/viewModels/pharmacyModule/PharmacyAddressesViewModel.dart +++ b/lib/core/viewModels/pharmacyModule/PharmacyAddressesViewModel.dart @@ -6,19 +6,19 @@ import '../../../locator.dart'; import '../base_view_model.dart'; class PharmacyAddressesViewModel extends BaseViewModel { - PharmacyAddressService _PharmacyAddressService = locator(); + PharmacyAddressService _pharmacyAddressService = locator(); + List get address => _pharmacyAddressService.address; - List get address => _PharmacyAddressService.address; - - Future getAddress() async { + Future getAddress(address) async { setState(ViewState.Busy); - await _PharmacyAddressService.getAddress(); - if (_PharmacyAddressService.hasError) { - error = _PharmacyAddressService.error; + await _pharmacyAddressService.getAddress(address); + if (_pharmacyAddressService.hasError) { + error = _pharmacyAddressService.error; setState(ViewState.Error); } else { - + print(address.length); } } + } \ No newline at end of file diff --git a/lib/core/viewModels/pharmacyModule/order_model_view_model.dart b/lib/core/viewModels/pharmacyModule/order_model_view_model.dart index beb62a53..04cbe8e3 100644 --- a/lib/core/viewModels/pharmacyModule/order_model_view_model.dart +++ b/lib/core/viewModels/pharmacyModule/order_model_view_model.dart @@ -1,3 +1,5 @@ +//import 'dart:html'; + import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; import 'package:diplomaticquarterapp/services/pharmacy_services/orderDetails_service.dart'; import 'package:diplomaticquarterapp/services/pharmacy_services/order_service.dart'; @@ -6,6 +8,7 @@ import '../../../locator.dart'; import '../base_view_model.dart'; class OrderModelViewModel extends BaseViewModel { + OrderService _orderService = locator(); List get order => _orderService.orderList; @@ -22,7 +25,9 @@ class OrderModelViewModel extends BaseViewModel { error = _orderService.error; setState(ViewState.Error); } else { - + //order = _orderService.orderList; + print(order.length); + setState(ViewState.Idle); } } @@ -36,4 +41,20 @@ class OrderModelViewModel extends BaseViewModel { } } + + Future getProductReview(orderId) async { + setState(ViewState.Busy); + await _orderService.getProductReview(orderId); + if (_orderService.hasError) { + error = _orderService.error; + setState(ViewState.Error); + } else { + //order = _orderService.orderList; + print(order.length); + setState(ViewState.Idle); + } + } + + + } \ No newline at end of file diff --git a/lib/pages/landing/home_page.dart b/lib/pages/landing/home_page.dart index 57fc074a..3cde289c 100644 --- a/lib/pages/landing/home_page.dart +++ b/lib/pages/landing/home_page.dart @@ -489,7 +489,7 @@ class _HomePageState extends State { ), DashboardItem( onTap: () => Navigator.push( - context, FadePage(page: OrderPage())), + context, FadePage(page: PharmacyProfilePage())), child: Center( child: Padding( diff --git a/lib/pages/pharmacy/order/Order.dart b/lib/pages/pharmacy/order/Order.dart index 17849c47..f46eb08f 100644 --- a/lib/pages/pharmacy/order/Order.dart +++ b/lib/pages/pharmacy/order/Order.dart @@ -8,11 +8,13 @@ import 'package:diplomaticquarterapp/config/config.dart'; import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; import 'package:diplomaticquarterapp/services/pharmacy_services/order_service.dart'; import 'package:diplomaticquarterapp/pages/pharmacy/order/OrderDetails.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacies/order_model.dart'; +import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; class OrderPage extends StatefulWidget { // orderList({this.customerId, this.pageId}); - + var languageID ; @override _OrderPageState createState() => _OrderPageState(); } @@ -21,17 +23,19 @@ class _OrderPageState extends State with SingleTickerProviderStateMix String customerId=""; String page_id=""; - List delivered = [] ; - List processing = []; - List cancelled = []; - List pending = []; + List orderList = [] ; + List deliveredOrderList = [] ; + List processingOrderList = []; + List cancelledOrderList = []; + List pendingOrderList = []; + TabController _tabController; AppSharedPreferences sharedPref = AppSharedPreferences(); @override void initState() { // WidgetsBinding.instance.addPostFrameCallback((_) => getOrder()); - + getLanguageID(); super.initState(); _tabController = new TabController(length: 4, vsync: this,); } @@ -41,11 +45,8 @@ class _OrderPageState extends State with SingleTickerProviderStateMix return BaseView( onModelReady: (model) => model.getOrder(customerId, page_id), builder: (_,model, wi )=> AppScaffold( - appBarTitle:(TranslationBase.of(context).order), -// backgroundColor: Colors.green , -// centerTitle: true, -// title: Text(TranslationBase.of(context).order, style: TextStyle(color:Colors.white)), -// backgroundColor: Colors.green, + appBarTitle:TranslationBase.of(context).order, + baseViewModel: model, isShowAppBar: true, isPharmacy:true , body: Container( @@ -54,7 +55,6 @@ class _OrderPageState extends State with SingleTickerProviderStateMix TabBar( tabs: [ Tab(text: TranslationBase.of(context).delivered), -// Tab(text: model.order.length.toString()), Tab(text: TranslationBase.of(context).processing), Tab(text: TranslationBase.of(context).pending), Tab(text: TranslationBase.of(context).cancelled), @@ -87,10 +87,19 @@ class _OrderPageState extends State with SingleTickerProviderStateMix ); } + + Widget getDeliveredOrder(OrderModelViewModel model){ + for(int i=0 ; i< model.order.length; i++){ + if( model.order[i].orderStatusId == 30 || model.order[i].orderStatusId == 997 + || model.order[i].orderStatusId == 994 + ){ + deliveredOrderList.add(model.order[i]); + } + } return Container( width: MediaQuery.of(context).size.width, - child: model.order.length != 0 && model.order[0].orderStatusId == 30 + child: model.order.length != 0 ? SingleChildScrollView( child: Column( children: [ @@ -98,7 +107,7 @@ class _OrderPageState extends State with SingleTickerProviderStateMix scrollDirection: Axis.vertical, shrinkWrap: true, physics: ScrollPhysics(), - itemCount: 2 , + itemCount: deliveredOrderList.length, itemBuilder: (context, index){ return Container( child: Column( @@ -121,7 +130,7 @@ class _OrderPageState extends State with SingleTickerProviderStateMix ), ), Container( - child: Text(model.order[0].id.toString(), + child: Text(deliveredOrderList[index].id.toString(), style: TextStyle(fontSize: 16.0, fontWeight: FontWeight.bold, ), ), @@ -140,7 +149,7 @@ class _OrderPageState extends State with SingleTickerProviderStateMix ), ), Container( - child: Text(model.order[0].createdOnUtc.toString(), + child: Text(deliveredOrderList[index].createdOnUtc.toString().substring(0,11), style: TextStyle(fontSize: 14.0, ), ), @@ -155,7 +164,7 @@ class _OrderPageState extends State with SingleTickerProviderStateMix child: InkWell( onTap: () { Navigator.push(context, - MaterialPageRoute(builder: (context) => OrderDetailsPage())); + MaterialPageRoute(builder: (context) => OrderDetailsPage(orderModel:deliveredOrderList[index]))); }, child: SvgPicture.asset( 'assets/images/pharmacy/arrow_right.svg', @@ -175,27 +184,25 @@ class _OrderPageState extends State with SingleTickerProviderStateMix Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Expanded( - child: Container( - margin: EdgeInsets.only(left: 8, right: 8, top: 1, bottom: 8), - padding: EdgeInsets.only(left: 13.0, right: 13.0), - decoration: BoxDecoration( - border: Border.all( - color: Colors.blue[700], - style: BorderStyle.solid, - width: 5.0, - ), + Container( + margin: EdgeInsets.only(left: 8, right: 8, top: 1, bottom: 8), + padding: EdgeInsets.only(left: 13.0, right: 13.0), + decoration: BoxDecoration( + border: Border.all( color: Colors.blue[700], - borderRadius: BorderRadius.circular(30.0) - ), - child: Text( - model.order[0].orderStatus.toString(), -// TranslationBase.of(context).delivered, - style: TextStyle( - color: Colors.white, - fontSize: 15.0, - fontWeight: FontWeight.bold, + style: BorderStyle.solid, + width: 5.0, ), + color: Colors.blue[700], + borderRadius: BorderRadius.circular(30.0) + ), + child: Text( +// deliveredOrderList[0].orderStatus.toString().substring(12), + TranslationBase.of(context).deliveredOrder, + style: TextStyle( + color: Colors.white, + fontSize: 15.0, + fontWeight: FontWeight.bold, ), ), ), @@ -208,7 +215,7 @@ class _OrderPageState extends State with SingleTickerProviderStateMix children: [ Container( margin: EdgeInsets.only(left: 5), - child: Text(model.order[0].orderTotal.toString(), + child: Text(deliveredOrderList[index].orderTotal.toString(), style: TextStyle(fontSize: 16.0, fontWeight: FontWeight.bold, ), ), @@ -227,7 +234,7 @@ class _OrderPageState extends State with SingleTickerProviderStateMix Row( children: [ Container( - child: Text('12', + child: Text(deliveredOrderList[index].orderItems.length.toString(), style: TextStyle(fontSize: 14.0, ), ), @@ -267,7 +274,7 @@ class _OrderPageState extends State with SingleTickerProviderStateMix mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ - Image.asset( + SvgPicture.asset( 'assets/images/pharmacy/empty_box.svg'), Container( margin: EdgeInsets.only(top: 10.0), @@ -284,189 +291,391 @@ class _OrderPageState extends State with SingleTickerProviderStateMix } Widget getProcessingOrder(OrderModelViewModel model){ + for(int i=0 ; i< model.order.length; i++){ + if( model.order[i].orderStatusId == 20 || model.order[i].orderStatusId == 995 || + model.order[i].orderStatusId == 998 || model.order[i].orderStatusId == 999){ + processingOrderList.add(model.order[i]); + } + } return Container( - child: model.order.length != 0 && model.order[0].orderStatusId == 20 - ? SingleChildScrollView( - child: Column( + width: MediaQuery.of(context).size.width, + child: model.order.length != 0 + ? SingleChildScrollView( + child: Column( children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Container( - margin: EdgeInsets.all(8), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - children: [ - Container( - margin: EdgeInsets.only(right: 5), - child: Text(TranslationBase.of(context).orderNumber, - style: TextStyle(fontSize: 16.0, fontWeight: FontWeight.bold, - ), - ), - ), - Container( - child: Text(model.order[0].id.toString(), - style: TextStyle(fontSize: 16.0, fontWeight: FontWeight.bold, - ), - ), - ), - ], - ), - SizedBox( - height: 5,), - Row( - children: [ - Container( - margin: EdgeInsets.only(right: 5), - child: Text(TranslationBase.of(context).orderDate, - style: TextStyle(fontSize: 14.0, + ListView.builder( + scrollDirection: Axis.vertical, + shrinkWrap: true, + physics: ScrollPhysics(), + itemCount: processingOrderList.length, + itemBuilder: (context, index){ + return Container( + child: Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Container( + margin: EdgeInsets.all(8.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Container( + margin: EdgeInsets.only(right: 5), + child: Text(TranslationBase.of(context).orderNumber, + style: TextStyle(fontSize: 16.0, fontWeight: FontWeight.bold, + ), + ), + ), + Container( + child: Text(processingOrderList[index].id.toString(), + style: TextStyle(fontSize: 16.0, fontWeight: FontWeight.bold, + ), + ), + ), + ], + ), + SizedBox( + height: 5,), + Row( + children: [ + Container( + margin: EdgeInsets.only(right: 5), + child: Text(TranslationBase.of(context).orderDate, + style: TextStyle(fontSize: 14.0, + ), + ), + ), + Container( + child: Text(processingOrderList[index].createdOnUtc.toString().substring(0,11), + style: TextStyle(fontSize: 14.0, + ), + ), + ), + ], + ), + ], ), ), - ), - Container( - child: Text(model.order[0].createdOnUtc.toString(), - style: TextStyle(fontSize: 14.0, + Container( + margin: EdgeInsets.all(8.0), + child: InkWell( + onTap: () { + Navigator.push(context, + MaterialPageRoute(builder: (context) => OrderDetailsPage(orderModel:processingOrderList[index]))); + }, + child: SvgPicture.asset( + 'assets/images/pharmacy/arrow_right.svg', + height: 20, + width: 20,), ), ), - ), - ], - ), - ], - ), - ), - Container( - margin: EdgeInsets.all(8), - child: InkWell( - onTap: () { - Navigator.push(context, - MaterialPageRoute(builder: (context) => OrderDetailsPage())); - }, - child: SvgPicture.asset( - 'assets/images/pharmacy/arrow_right.svg', - height: 20, - width: 20,), - ), - ), - ], - ), - Divider( - color: Colors.grey[350], - height: 20, - thickness: 1, - indent: 0, - endIndent: 0, - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Expanded( - child: Container( - margin: EdgeInsets.only(left: 8, right: 8, top: 1, bottom: 8), - padding: EdgeInsets.only(left: 13.0, right: 13.0), - decoration: BoxDecoration( - border: Border.all( - color: Colors.green, - style: BorderStyle.solid, - width: 5.0, + ], ), - color: Colors.green, - borderRadius: BorderRadius.circular(30.0) - ), - child: Text( - model.order[0].orderStatus.toString(), -// TranslationBase.of(context).processing, - style: TextStyle( - color: Colors.white, - fontSize: 15.0, - fontWeight: FontWeight.bold, - ), - ), - ), - ), - Container( - margin: EdgeInsets.only(left: 8, right: 8, top: 1, bottom: 8), - child: Column( -// crossAxisAlignment: CrossAxisAlignment.end, - children: [ - Row( - children: [ - Container( - margin: EdgeInsets.only(left: 5), - child: Text(model.order[0].orderTotal.toString(), - style: TextStyle(fontSize: 16.0, fontWeight: FontWeight.bold, - ), - ), - ), - Container( - margin: EdgeInsets.only(left: 5), - child: Text(TranslationBase.of(context).sar, - style: TextStyle(fontSize: 16.0, fontWeight: FontWeight.bold, + Divider( + color: Colors.grey[350], + height: 20, + thickness: 1, + indent: 0, + endIndent: 0, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Container( + margin: EdgeInsets.only(left: 8, right: 8, top: 1, bottom: 8), + padding: EdgeInsets.only(left: 13.0, right: 13.0), + decoration: BoxDecoration( + border: Border.all( + color: Colors.green, + style: BorderStyle.solid, + width: 5.0, + ), + color: Colors.green, + borderRadius: BorderRadius.circular(30.0) ), - ), - ), - ], - ), - SizedBox( - height: 5,), - Row( - children: [ - Container( - child: Text('12', - style: TextStyle(fontSize: 14.0, + child: Text( + processingOrderList[index].orderStatus.toString().substring(12), + style: TextStyle( + color: Colors.white, + fontSize: 15.0, + fontWeight: FontWeight.bold, + ), ), ), - ), - Container( - margin: EdgeInsets.only(left: 5), - child: Text(TranslationBase.of(context).itemsNo, - style: TextStyle(fontSize: 14.0, + Container( + margin: EdgeInsets.only(left: 8, right: 8, top: 1, bottom: 8), + child: Column( +// crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Row( + children: [ + Container( + margin: EdgeInsets.only(left: 5), + child: Text(processingOrderList[index].orderTotal.toString(), + style: TextStyle(fontSize: 16.0, fontWeight: FontWeight.bold, + ), + ), + ), + Container( + margin: EdgeInsets.only(left: 5), + child: Text(TranslationBase.of(context).sar, + style: TextStyle(fontSize: 16.0, fontWeight: FontWeight.bold, + ), + ), + ), + ], + ), + SizedBox( + height: 5,), + Row( + children: [ + Container( + child: Text(processingOrderList[index].orderItems.length.toString(), + style: TextStyle(fontSize: 14.0, + ), + ), + ), + Container( + margin: EdgeInsets.only(left: 5), + child: Text(TranslationBase.of(context).itemsNo, + style: TextStyle(fontSize: 14.0, + ), + ), + ), + ], + ), + ], ), ), - ), - ], - ), - ], - ), - ), - ], - ), - Divider( - color: Colors.grey[350], - height: 20, - thickness: 8, - indent: 0, - endIndent: 0, - ), + ], + ), + Divider( + color: Colors.grey[350], + height: 20, + thickness: 8, + indent: 0, + endIndent: 0, + ), + ], + ), + ); + } + ) ], ), ) : Container( - child: Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Image.asset( - 'assets/images/pharmacy/empty_box.svg'), - Container( - margin: EdgeInsets.only(top: 10.0), - child: Text(TranslationBase.of(context).noOrder, - style: TextStyle( - fontSize: 16.0, - )), + child: Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + SvgPicture.asset( + 'assets/images/pharmacy/empty_box.svg'), + Container( + margin: EdgeInsets.only(top: 10.0), + child: Text(TranslationBase.of(context).noOrder, + style: TextStyle( + fontSize: 16.0, + )), + ), + ], + ), ), - ], - ), - ), - ), + ), ); +// return Container( +// child: model.order.length != 0 +// ? SingleChildScrollView( +// child: Column( +// children: [ +// ListView.builder( +// child: Row( +// mainAxisAlignment: MainAxisAlignment.spaceBetween, +// children: [ +// Container( +// margin: EdgeInsets.all(8), +// child: Column( +// crossAxisAlignment: CrossAxisAlignment.start, +// children: [ +// Row( +// children: [ +// Container( +// margin: EdgeInsets.only(right: 5), +// child: Text(TranslationBase.of(context).orderNumber, +// style: TextStyle(fontSize: 16.0, fontWeight: FontWeight.bold, +// ), +// ), +// ), +// Container( +// child: Text(processingOrderList[0].id.toString(), +// style: TextStyle(fontSize: 16.0, fontWeight: FontWeight.bold, +// ), +// ), +// ), +// ], +// ), +// SizedBox( +// height: 5,), +// Row( +// children: [ +// Container( +// margin: EdgeInsets.only(right: 5), +// child: Text(TranslationBase.of(context).orderDate, +// style: TextStyle(fontSize: 14.0, +// ), +// ), +// ), +// Container( +// child: Text(processingOrderList[0].createdOnUtc.toString().substring(0,11), +// style: TextStyle(fontSize: 14.0, +// ), +// ), +// ), +// ], +// ), +// ], +// ), +// ), +// Container( +// margin: EdgeInsets.all(8), +// child: InkWell( +// onTap: () { +// Navigator.push(context, +// MaterialPageRoute(builder: (context) => OrderDetailsPage(orderModel:processingOrderList[0]))); +// }, +// child: SvgPicture.asset( +// 'assets/images/pharmacy/arrow_right.svg', +// height: 20, +// width: 20,), +// ), +// ), +// ], +// ), +// ), +// Divider( +// color: Colors.grey[350], +// height: 20, +// thickness: 1, +// indent: 0, +// endIndent: 0, +// ), +// Row( +// mainAxisAlignment: MainAxisAlignment.spaceBetween, +// children: [ +// Container( +// margin: EdgeInsets.only(left: 8, right: 8, top: 1, bottom: 8), +// padding: EdgeInsets.only(left: 13.0, right: 13.0), +// decoration: BoxDecoration( +// border: Border.all( +// color: Colors.green, +// style: BorderStyle.solid, +// width: 5.0, +// ), +// color: Colors.green, +// borderRadius: BorderRadius.circular(30.0) +// ), +// child: Text( widget.languageID == "ar" +// ? processingOrderList[0].orderStatusn.toString() +// : processingOrderList[0].orderStatus.toString().substring(12), +//// TranslationBase.of(context).processing, +// style: TextStyle( +// color: Colors.white, +// fontSize: 15.0, +// fontWeight: FontWeight.bold, +// ), +// ), +// ), +// Container( +// margin: EdgeInsets.only(left: 8, right: 8, top: 1, bottom: 8), +// child: Column( +//// crossAxisAlignment: CrossAxisAlignment.end, +// children: [ +// Row( +// children: [ +// Container( +// margin: EdgeInsets.only(left: 5), +// child: Text(processingOrderList[0].orderTotal.toString(), +// style: TextStyle(fontSize: 16.0, fontWeight: FontWeight.bold, +// ), +// ), +// ), +// Container( +// margin: EdgeInsets.only(left: 5), +// child: Text(TranslationBase.of(context).sar, +// style: TextStyle(fontSize: 16.0, fontWeight: FontWeight.bold, +// ), +// ), +// ), +// ], +// ), +// SizedBox( +// height: 5,), +// Row( +// children: [ +// Container( +// child: Text(processingOrderList[0].orderItems[0].quantity.toString(), +// style: TextStyle(fontSize: 14.0, +// ), +// ), +// ), +// Container( +// margin: EdgeInsets.only(left: 5), +// child: Text(TranslationBase.of(context).itemsNo, +// style: TextStyle(fontSize: 14.0, +// ), +// ), +// ), +// ], +// ), +// ], +// ), +// ), +// ], +// ), +// Divider( +// color: Colors.grey[350], +// height: 20, +// thickness: 8, +// indent: 0, +// endIndent: 0, +// ), +// ], +// ), +// ) +// : Container( +// child: Center( +// child: Column( +// mainAxisAlignment: MainAxisAlignment.center, +// crossAxisAlignment: CrossAxisAlignment.center, +// children: [ +// SvgPicture.asset( +// 'assets/images/pharmacy/empty_box.svg'), +// Container( +// margin: EdgeInsets.only(top: 10.0), +// child: Text(TranslationBase.of(context).noOrder, +// style: TextStyle( +// fontSize: 16.0, +// )), +// ), +// ], +// ), +// ), +// ), +// ); } Widget getPendingOrder(OrderModelViewModel model){ + for(int i=0 ; i< model.order.length; i++){ + if( model.order[i].orderStatusId == 10){ + pendingOrderList.add(model.order[i]); + } + } return Container( - child: model.order.length != 0 && model.order[0].orderStatusId == 10 + child: model.order.length != 0 ? SingleChildScrollView( child: Column( children: [ @@ -474,7 +683,7 @@ class _OrderPageState extends State with SingleTickerProviderStateMix scrollDirection: Axis.vertical, shrinkWrap: true, physics: ScrollPhysics(), - itemCount: 2 , + itemCount: pendingOrderList.length , itemBuilder: (context, index){ return Container( child: SingleChildScrollView( @@ -498,7 +707,7 @@ class _OrderPageState extends State with SingleTickerProviderStateMix ), ), Container( - child: Text(model.order[0].id.toString(), + child: Text(pendingOrderList[index].id.toString(), style: TextStyle(fontSize: 16.0, fontWeight: FontWeight.bold, ), ), @@ -517,7 +726,7 @@ class _OrderPageState extends State with SingleTickerProviderStateMix ), ), Container( - child: Text(model.order[0].createdOnUtc.toString(), + child: Text(pendingOrderList[index].createdOnUtc.toString().substring(0,11), style: TextStyle(fontSize: 14.0, ), ), @@ -532,7 +741,7 @@ class _OrderPageState extends State with SingleTickerProviderStateMix child: InkWell( onTap: () { Navigator.push(context, - MaterialPageRoute(builder: (context) => OrderDetailsPage())); + MaterialPageRoute(builder: (context) => OrderDetailsPage(orderModel:pendingOrderList[index]))); }, child: SvgPicture.asset( 'assets/images/pharmacy/arrow_right.svg', @@ -552,28 +761,29 @@ class _OrderPageState extends State with SingleTickerProviderStateMix Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Expanded( - child:Container( - margin: EdgeInsets.all(8.0), - padding: EdgeInsets.only(left: 13.0, right: 13.0), - decoration: BoxDecoration( - border: Border.all( - color: Colors.orange[300], - style: BorderStyle.solid, - width: 5.0, - ), - color: Colors.orange[300], - borderRadius: BorderRadius.circular(30.0) - ), - child: Text( - model.order[0].orderStatus.toString(), - style: TextStyle( - color: Colors.white, - fontSize: 15.0, - fontWeight: FontWeight.bold, - ), + Container( + margin: EdgeInsets.all(8.0), + padding: EdgeInsets.only(left: 13.0, right: 13.0), + decoration: BoxDecoration( + border: Border.all( + color: Colors.orange[300], + style: BorderStyle.solid, + width: 5.0, ), - ), ), + color: Colors.orange[300], + borderRadius: BorderRadius.circular(30.0) + ), + child: Text( + widget.languageID == "ar" + ? pendingOrderList[index].orderStatusn.toString() + : pendingOrderList[index].orderStatus.toString().substring(12), + style: TextStyle( + color: Colors.white, + fontSize: 15.0, + fontWeight: FontWeight.bold, + ), + ), + ), Container( margin: EdgeInsets.all(8.0), child: Column( @@ -583,7 +793,7 @@ class _OrderPageState extends State with SingleTickerProviderStateMix children: [ Container( margin: EdgeInsets.only(left: 5), - child: Text(model.order[0].orderTotal.toString(), + child: Text(pendingOrderList[index].orderTotal.toString(), style: TextStyle(fontSize: 16.0, fontWeight: FontWeight.bold, ), ), @@ -602,7 +812,7 @@ class _OrderPageState extends State with SingleTickerProviderStateMix Row( children: [ Container( - child: Text('12', + child: Text(pendingOrderList[index].orderItems.length.toString(), style: TextStyle(fontSize: 14.0, ), ), @@ -644,7 +854,7 @@ class _OrderPageState extends State with SingleTickerProviderStateMix mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ - Image.asset( + SvgPicture.asset( 'assets/images/pharmacy/empty_box.svg'), Container( margin: EdgeInsets.only(top: 10.0), @@ -662,8 +872,14 @@ class _OrderPageState extends State with SingleTickerProviderStateMix } Widget getCancelledOrder(OrderModelViewModel model){ + for(int i=0 ; i< model.order.length; i++){ + if( model.order[i].orderStatusId == 40 || model.order[i].orderStatusId == 996 + || model.order[i].orderStatusId == 200){ + cancelledOrderList.add(model.order[i]); + } + } return Container( - child: model.order.length != 0 && model.order[0].orderStatusId == 40 + child: model.order.length != 0 ? SingleChildScrollView( child: Column( children: [ @@ -671,7 +887,7 @@ class _OrderPageState extends State with SingleTickerProviderStateMix scrollDirection: Axis.vertical, shrinkWrap: true, physics: ScrollPhysics(), - itemCount: 2 , + itemCount: cancelledOrderList.length, itemBuilder: (context, index){ return Container( child: SingleChildScrollView( @@ -695,7 +911,7 @@ class _OrderPageState extends State with SingleTickerProviderStateMix ), ), Container( - child: Text(model.order[0].id.toString(), + child: Text(cancelledOrderList[index].id.toString(), style: TextStyle(fontSize: 16.0, fontWeight: FontWeight.bold, ), ), @@ -714,7 +930,7 @@ class _OrderPageState extends State with SingleTickerProviderStateMix ), ), Container( - child: Text(model.order[0].createdOnUtc.toString(), + child: Text(cancelledOrderList[index].createdOnUtc.toString().substring(0,11), style: TextStyle(fontSize: 14.0, ), ), @@ -729,7 +945,7 @@ class _OrderPageState extends State with SingleTickerProviderStateMix child: InkWell( onTap: () { Navigator.push(context, - MaterialPageRoute(builder: (context) => OrderDetailsPage())); + MaterialPageRoute(builder: (context) => OrderDetailsPage(orderModel:cancelledOrderList[index]))); }, child: SvgPicture.asset( 'assets/images/pharmacy/arrow_right.svg', @@ -749,28 +965,28 @@ class _OrderPageState extends State with SingleTickerProviderStateMix Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Expanded( - child:Container( - margin: EdgeInsets.only(left: 8, right: 8, top: 1, bottom: 8), - padding: EdgeInsets.only(left: 10.0, right: 10.0), - decoration: BoxDecoration( - border: Border.all( - color: Colors.red[900], - style: BorderStyle.solid, - width: 5.0, - ), - color: Colors.red[900], - borderRadius: BorderRadius.circular(30.0) - ), - child: Text( - model.order[0].orderStatus.toString(), - style: TextStyle( - color: Colors.white, - fontSize: 15.0, - fontWeight: FontWeight.bold, - ), + Container( + margin: EdgeInsets.only(left: 8, right: 8, top: 1, bottom: 8), + padding: EdgeInsets.only(left: 10.0, right: 10.0), + decoration: BoxDecoration( + border: Border.all( + color: Colors.red[900], + style: BorderStyle.solid, + width: 5.0, ), - ), ), + color: Colors.red[900], + borderRadius: BorderRadius.circular(30.0) + ), + child: Text( widget.languageID == "ar" + ? cancelledOrderList[index].orderStatusn.toString() + : cancelledOrderList[index].orderStatus.toString().substring(12), + style: TextStyle( + color: Colors.white, + fontSize: 15.0, + fontWeight: FontWeight.bold, + ), + ), + ), Container( margin: EdgeInsets.only(left: 8, right: 8, top: 1, bottom: 8), child: Column( @@ -780,7 +996,7 @@ class _OrderPageState extends State with SingleTickerProviderStateMix children: [ Container( margin: EdgeInsets.only(left: 5), - child: Text(model.order[0].orderTotal.toString(), + child: Text(cancelledOrderList[index].orderTotal.toString(), style: TextStyle(fontSize: 16.0, fontWeight: FontWeight.bold, ), ), @@ -799,7 +1015,7 @@ class _OrderPageState extends State with SingleTickerProviderStateMix Row( children: [ Container( - child: Text('12', + child: Text(cancelledOrderList[index].orderItems.length.toString(), style: TextStyle(fontSize: 14.0, ), ), @@ -841,7 +1057,7 @@ class _OrderPageState extends State with SingleTickerProviderStateMix mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ - Image.asset( + SvgPicture.asset( 'assets/images/pharmacy/empty_box.svg'), Container( margin: EdgeInsets.only(top: 10.0), @@ -856,26 +1072,17 @@ class _OrderPageState extends State with SingleTickerProviderStateMix ), ); } -} + getLanguageID() async { + var languageID = await sharedPref.getString(APP_LANGUAGE); + setState(() { + widget.languageID = languageID; + }); + } +} -// filterOrders() { -// for () { -// if (order.order_status_id === 30 || order.order_status_id === 997 || order.order_status_id === 994) { // complete -// this.delivered.push(order); -// } else if (order.order_status_id === 40 || order.order_status_id === 200 || order.order_status_id === 996) { // cancelled & order refunded -// this.cancelled.push(order); -// } else if (order.order_status_id === 10) { // Pending -// this.pending.push(order); -// } else if (order.order_status_id === 20 || order.order_status_id === 995 || order.order_status_id === 998 || order.order_status_id === 999) { // Processing -// this.processing.push(order); -// } else { // Processing & other all other status -// this.other.push(order); -// } -// } -//} diff --git a/lib/pages/pharmacy/order/OrderDetails.dart b/lib/pages/pharmacy/order/OrderDetails.dart index d406e7f5..3c6e62b1 100644 --- a/lib/pages/pharmacy/order/OrderDetails.dart +++ b/lib/pages/pharmacy/order/OrderDetails.dart @@ -1,6 +1,8 @@ import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/order_model_view_model.dart'; import 'package:diplomaticquarterapp/pages/base/base_view.dart'; +import 'package:diplomaticquarterapp/pages/pharmacy/order/Order.dart'; +import 'package:diplomaticquarterapp/widgets/dialogs/confirm_dialog.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:flutter/material.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; @@ -9,11 +11,24 @@ import 'package:diplomaticquarterapp/widgets//pharmacy/product_tile.dart'; import 'package:diplomaticquarterapp/config/config.dart'; import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; import 'package:diplomaticquarterapp/services/pharmacy_services/orderDetails_service.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacies/order_model.dart'; +import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; +import 'package:diplomaticquarterapp/widgets/dialogs/confirm_dialog.dart'; +import 'package:diplomaticquarterapp/uitl/app_toast.dart'; + class OrderDetailsPage extends StatefulWidget { + var languageID ; + + + OrderModel orderModel; + OrderDetailsPage({ + @required this.orderModel +}); + @override _OrderDetailsPageState createState() => _OrderDetailsPageState(); } @@ -23,20 +38,28 @@ class _OrderDetailsPageState extends State { String customerId=""; String page_id=""; String orderId="3516"; + var model; + var isCancel = false; + var isRefund = false; + var dataIsCancel; + var dataIsRefund; + + @override void initState() { - WidgetsBinding.instance.addPostFrameCallback((_) => getOrderDetails()); super.initState(); + getLanguageID(); + + getCancelOrder(widget.orderModel.id); +// cancelOrderDetail(widget.orderModel.id); } @override Widget build(BuildContext context) { return BaseView( - onModelReady:(model) => model.getOrderDetails(orderId), + onModelReady:(model) => model.getOrderDetails(widget.orderModel.id), builder: (_,model, wi )=> AppScaffold( - appBarTitle: (TranslationBase.of(context).orderDetail), -// title: Text(TranslationBase.of(context).orderDetail, style: TextStyle(color:Colors.white)), -// backgroundColor: Colors.green, + appBarTitle: TranslationBase.of(context).orderDetail, isShowAppBar: true, isPharmacy:true , body: Container( @@ -62,39 +85,43 @@ class _OrderDetailsPageState extends State { ], ), ), - Container( - margin: EdgeInsets.only(top: 15.0, right: 10.0), - padding: EdgeInsets.only(left: 11.0, right: 11.0), - decoration: BoxDecoration( - border: Border.all( - color: Colors.blue, - style: BorderStyle.solid, - width: 5.0, + Container( + + margin: EdgeInsets.only(top: 15.0, right: 10.0), + padding: EdgeInsets.only(left: 11.0, right: 11.0), + decoration: BoxDecoration( + border: Border.all( + color: getStatusBackgroundColor(), + style: BorderStyle.solid, + width: 5.0, + ), + color: getStatusBackgroundColor(), + borderRadius: BorderRadius.circular(30.0) + ), + child: Text(widget.orderModel.orderStatus.toString().substring(12), +// widget.languageID == "ar" +// ? widget.orderModel.orderStatusn.toString() +// : widget.orderModel.orderStatus.toString().substring(12) , +// TranslationBase.of(context).delivered, + style: TextStyle( + color: Colors.white, + fontSize: 13.0, + fontWeight: FontWeight.bold, ), - color: Colors.blue, - borderRadius: BorderRadius.circular(30.0) - ), - child: Text( - TranslationBase.of(context).delivered, - style: TextStyle( - color: Colors.white, - fontSize: 13.0, - fontWeight: FontWeight.bold, ), ), - ), ], ), Container( margin: EdgeInsets.only(left: 10.0, top: 13.0), child: Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text('NAME', - style: TextStyle(fontSize: 15.0, fontWeight: FontWeight.bold, - ), + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(model.order[0].shippingAddress.firstName.toString().substring(10) + ' ' +model.order[0].shippingAddress.lastName.toString().substring(9), + style: TextStyle(fontSize: 15.0, fontWeight: FontWeight.bold, ), - ], + ), + ] ), ), Container( @@ -102,7 +129,7 @@ class _OrderDetailsPageState extends State { child: Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text('Cloud Solutions', + Text(model.order[0].shippingAddress.address1.toString().substring(9), style: TextStyle(fontSize: 15.0, fontWeight: FontWeight.bold, color: Colors.grey, ), @@ -110,22 +137,37 @@ class _OrderDetailsPageState extends State { ], ), ), - Row( - children: [ - Container( - margin: EdgeInsets.fromLTRB(10.0, 5.0, 8.0, 5.0), - child: SvgPicture.asset( - 'assets/images/pharmacy/mobile_number_icon.svg', - height: 13,), + Container( + margin: EdgeInsets.fromLTRB(10.0, 5.0, 1.0, 5.0), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(model.order[0].shippingAddress.address2.toString().substring(9), + style: TextStyle(fontSize: 15.0, fontWeight: FontWeight.bold, + color: Colors.grey, + ), ), - Container( - margin: EdgeInsets.only(top: 5.0, bottom: 5.0), - child: Text('588888778', - style: TextStyle(fontSize: 15.0, + ] + ), + ), + Container( + child: Row( + children: [ + Container( + margin: EdgeInsets.fromLTRB(10.0, 5.0, 8.0, 5.0), + child: SvgPicture.asset( + 'assets/images/pharmacy/mobile_number_icon.svg', + height: 13,), + ), + Container( + margin: EdgeInsets.only(top: 5.0, bottom: 5.0), + child: Text(model.order[0].shippingAddress.phoneNumber.toString(), + style: TextStyle(fontSize: 15.0, + ), ), ), - ), - ], + ], + ), ), Divider( color: Colors.grey[350], @@ -151,11 +193,21 @@ class _OrderDetailsPageState extends State { ), ), Container( - margin: EdgeInsets.only(bottom: 10.0, top: 10.0), - child: SvgPicture.asset( - 'assets/images/pharmacy/hmg_shipping_logo.svg', - height: 25, - width: 25,), + child: model.order[0].shippingRateComputationMethodSystemName == "Shipping.FixedOrByWeight" + ? Container( + margin: EdgeInsets.only(bottom: 10.0, top: 10.0), + child: SvgPicture.asset( + 'assets/images/pharmacy/hmg_shipping_logo.svg', + height: 25, + width: 25,), + ) + : Container( + margin: EdgeInsets.only(bottom: 10.0, top: 10.0), + child: SvgPicture.asset( + 'assets/images/pharmacy/aramex_shipping_logo.svg', + height: 25, + width: 25,), + ), ), ], ), @@ -184,7 +236,7 @@ class _OrderDetailsPageState extends State { ), Container( margin: EdgeInsets.only(bottom: 10.0, top: 10.0), - child:Text('Mada', + child:Text(model.order[0].paymentName.toString().substring(12), style: TextStyle(fontSize: 13.0, fontWeight: FontWeight.bold, ), ), @@ -211,10 +263,23 @@ class _OrderDetailsPageState extends State { ], ), ), - Container( - child: productTile(productName: 'Panadol Extra 500 MG', productPrice: '10.00', productRate: 3.00, - productReviews:4, totalPrice: '10.00', qyt: '3',), + ListView.builder( + scrollDirection: Axis.vertical, + shrinkWrap: true, + physics: ScrollPhysics(), + itemCount:widget.orderModel.orderItems.length, + itemBuilder: (context, index){ + return Container( + child: productTile(productName: widget.orderModel.orderItems[index].product.name.toString(), + productPrice: widget.orderModel.orderItems[index].product.price.toString(), + productRate: widget.orderModel.orderItems[index].product.approvedRatingSum.toDouble(), + productReviews:widget.orderModel.orderItems[index].product.approvedTotalReviews, + totalPrice: widget.orderModel.orderItems[index].priceExclTax.toString(), + qyt: widget.orderModel.orderItems[index].quantity.toString(),), + ); + } ), + Container( padding: EdgeInsets.only(bottom: 10.0), margin: EdgeInsets.only(left: 10.0, top: 5.0), @@ -253,7 +318,7 @@ class _OrderDetailsPageState extends State { ), ), ), - Text('343.55', + Text(model.order[0].orderSubtotalExclTax.toString(), style: TextStyle(fontSize: 13.0, ), ), @@ -287,7 +352,7 @@ class _OrderDetailsPageState extends State { ), ), ), - Text('343.55', + Text(model.order[0].orderShippingExclTax.toString(), style: TextStyle(fontSize: 13.0, ), ), @@ -321,7 +386,7 @@ class _OrderDetailsPageState extends State { ), ), ), - Text('343.55', + Text(model.order[0].orderTax.toString(), style: TextStyle(fontSize: 13.0, ), ), @@ -353,7 +418,7 @@ class _OrderDetailsPageState extends State { ), ), ), - Text('343.55', + Text(model.order[0].orderTotal.toString(), style: TextStyle(fontSize: 15.0, fontWeight: FontWeight.bold, ), ), @@ -362,14 +427,16 @@ class _OrderDetailsPageState extends State { ), ], ), - InkWell( + widget.orderModel.orderStatusId == 10 ? InkWell( onTap: (){ - }, + // payOnline link + }, child: Container( - margin: EdgeInsets.only(top: 20.0), +// margin: EdgeInsets.only(top: 20.0), height: 50.0, color: Colors.transparent, child: Container( + padding: EdgeInsets.only(left: 150.0, right: 150.0), decoration: BoxDecoration( border: Border.all( color: Colors.green, @@ -390,27 +457,30 @@ class _OrderDetailsPageState extends State { ), ), ), - ), - InkWell( + ) : Container(), + +// getCancelOrder(canCancel, canRefund), + isCancel ? InkWell( onTap: () { -// confirmDelete(snapshot.data[index]["id"]); - cancelOrder("id"); + Navigator.push(context, + MaterialPageRoute(builder: (context) => presentConfirmDialog())); }, child: Container( +// padding: EdgeInsets.only(left: 13.0, right: 13.0, top: 5.0), height: 50.0, color: Colors.transparent, - child: Center( - child: Text( - TranslationBase.of(context).cancelOrder, - style: TextStyle( + child: Center( + child: Text( + TranslationBase.of(context).cancelOrder, + style: TextStyle( color: Colors.red[900], fontWeight: FontWeight.bold, decoration: TextDecoration.underline - ), ), ), ), - ), + ), + ) : Container(), ], ), ), @@ -418,58 +488,88 @@ class _OrderDetailsPageState extends State { ), ); } - cancelOrder(id){ - showDialog( + + + + Color getStatusBackgroundColor() { + print(widget.orderModel.orderStatusId); +// if(orderStatus == 'delivered') + if(widget.orderModel.orderStatusId == 30 ||widget.orderModel.orderStatusId == 997 + ||widget.orderModel.orderStatusId == 994) + return Colors.blue[700]; + else if (widget.orderModel.orderStatusId == 20 ||widget.orderModel.orderStatusId == 995 + ||widget.orderModel.orderStatusId == 998 ||widget.orderModel.orderStatusId == 999) + return Colors.green; + else if (widget.orderModel.orderStatusId == 10) + return Colors.orange[300]; + else if (widget.orderModel.orderStatusId == 40 ||widget.orderModel.orderStatusId == 996 + ||widget.orderModel.orderStatusId == 200) + return Colors.red[900]; + } + + + getCancelOrder(dataIsCancel){ + if(widget.orderModel.canCancel && widget.orderModel.canRefund) + { + setState(() { + isCancel = true; + isRefund = false; + }); + } + else if (widget.orderModel.canCancel ){ + setState(() { + isCancel = true; + isRefund = false; + }); + + } + else if (widget.orderModel.canRefund){ + setState(() { + isCancel = false; + isRefund = true; + }); + } + else { + setState(() { + isCancel = false; + isRefund = false; + }); + } +} + + presentConfirmDialog(){ + ConfirmDialog dialog = new ConfirmDialog( context: context, - builder: (BuildContext context)=> AlertDialog( - title: Text(TranslationBase.of(context).confirm, - style: TextStyle( - fontWeight: FontWeight.bold, - ),), - content: Text(TranslationBase.of(context).confirmCancellation, - style: TextStyle( - color: Colors.grey, - ),), - actions:[ - FlatButton( - child: Text(TranslationBase.of(context).cancel, - style: TextStyle( - color: Colors.red, - fontWeight: FontWeight.bold, - fontSize: 16, - ),), - onPressed: (){ - Navigator.pop(context); - }, - ), - FlatButton( - child: Text(TranslationBase.of(context).ok, - style: TextStyle( - color: Colors.grey, - fontWeight: FontWeight.bold, - fontSize: 16, - ),), - onPressed: (){ -// http.delete(""https://uat.hmgwebservices.com/epharmacy/api/orders/$id"); - Navigator.push(context, - MaterialPageRoute(builder: (context)=> OrderDetailsPage())); - }, - ), - ], - ) - ); + confirmMessage: TranslationBase.of(context).confirmCancellation, + okText: TranslationBase.of(context).confirm, + cancelText: TranslationBase.of(context).cancel_nocaps, + okFunction: () => { + cancelOrderDetail(widget.orderModel.id), + ConfirmDialog.closeAlertDialog(context) + }, + cancelFunction: () => {}); + dialog.showAlertDialog(context); + } + + cancelOrderDetail(order){ + if(widget.orderModel.canCancel && widget.orderModel.canRefund == false){ +// setState(() { + cancelOrderDetail(order); + AppToast.showSuccessToast(message: "Request Sent Successfully"); +// }); +// return OrderPage(); + } + else{} + } + + getLanguageID() async { + var languageID = await sharedPref.getString(APP_LANGUAGE); + setState(() { + widget.languageID = languageID; + }); } } - getOrderDetails() { - print("getOrderDetails 5466"); - OrderDetailsService service = new OrderDetailsService(); - service.getOrderDetails(AppGlobal.context).then((res) { - print(res); - }); - } - getPayOrder(){ - } diff --git a/lib/pages/pharmacy/order/ProductReview.dart b/lib/pages/pharmacy/order/ProductReview.dart index 9de67849..0f9217b7 100644 --- a/lib/pages/pharmacy/order/ProductReview.dart +++ b/lib/pages/pharmacy/order/ProductReview.dart @@ -1,3 +1,6 @@ +import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/order_model_view_model.dart'; +import 'package:diplomaticquarterapp/pages/base/base_view.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:flutter/material.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:flutter_svg/flutter_svg.dart'; @@ -6,6 +9,7 @@ import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; import 'package:diplomaticquarterapp/services/pharmacy_services/order_service.dart'; import 'package:diplomaticquarterapp/pages/pharmacy/profile/profile.dart'; import 'package:rating_bar/rating_bar.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacies/order_model.dart'; import 'package:diplomaticquarterapp/widgets//pharmacy/product_tile.dart'; class ProductReviewPage extends StatefulWidget { @@ -15,35 +19,45 @@ class ProductReviewPage extends StatefulWidget { } class _ProductReviewPageState extends State { + String orderId ="3516"; + var pharmacyUser =""; + var product =""; + var CustomerId =""; + String submitTxt =""; + var doctorRating= ""; + var reviewObj = {}; + AppSharedPreferences sharedPref = AppSharedPreferences(); + @override Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - centerTitle: true, - title: Text(TranslationBase.of(context).writeReview, style: TextStyle(color:Colors.white)), - backgroundColor: Colors.green, - ), + return BaseView( + onModelReady: (model)=>model.getProductReview(orderId), + builder: (_,model, wi )=> AppScaffold( + appBarTitle: TranslationBase.of(context).writeReview, + isShowAppBar: true, + isPharmacy:true , body: Container( color: Colors.white, child: SingleChildScrollView( - child: Column( - children: [ -// Container( + child: Column( + children: [ +// Container( // child: productTile(productName: 'Panadol Extra 500 MG', productPrice: '10.00', productRate: 3.00, // productReviews:4, ), // ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - Container( - margin: EdgeInsets.only(left: 10), - child: Image( - image: - AssetImage('assets/images/al-habib_onlne_pharmacy_bg.png'), + Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + Container( + margin: EdgeInsets.only(left: 10), + child: SvgPicture.asset( +// model.order[0].orderItems[0].product.images[0].src.toString(), + 'assets/images/al-habib_onlne_pharmacy_bg.png', fit: BoxFit.cover, width: 80, height: 80, ), + ),] ), Container( margin: EdgeInsets.only(top :15.0, bottom: 15.0), @@ -51,7 +65,7 @@ class _ProductReviewPageState extends State { children: [ Row( children: [ - Text('medication name', + Text(model.order[0].orderItems[0].product.name.toString(), style: TextStyle(fontSize: 16.0, ), ), @@ -61,14 +75,14 @@ class _ProductReviewPageState extends State { children: [ Container( margin: EdgeInsets.only(left: 5), - child: Text('90.00', + child: Text(model.order[0].orderItems[0].product.price.toString(), style: TextStyle(fontSize: 16.0, fontWeight: FontWeight.bold, ), ), ), Container( margin: EdgeInsets.only(left: 5), - child: Text('SAR', + child: Text(TranslationBase.of(context).sar, style: TextStyle(fontSize: 16.0, fontWeight: FontWeight.bold, ), ), @@ -94,14 +108,15 @@ class _ProductReviewPageState extends State { ), ), Container( - child: Text('4.9', + child: Text(model.order[0].orderItems[0].product.approvedRatingSum.toString(), style: TextStyle(fontSize: 14.0, fontWeight: FontWeight.bold, ), ), ), Container( margin: EdgeInsets.only(left: 5), - child: Text('10 (reviews)', + child: Text("(" + model.order[0].orderItems[0].product.approvedTotalReviews.toString() + + ' ' + TranslationBase.of(context).review +")", style: TextStyle(fontSize: 12.0, ), ), @@ -111,8 +126,6 @@ class _ProductReviewPageState extends State { ], ), ), - ], - ), Divider( color: Colors.grey[350], height: 20, @@ -165,7 +178,8 @@ class _ProductReviewPageState extends State { ), InkWell( onTap: () { - +// Navigator.push(context, +// MaterialPageRoute(builder: (context) => )); }, child: Container( height: 50.0, @@ -196,11 +210,14 @@ class _ProductReviewPageState extends State { ), ], ), - ), - ), - ); + ), + ),), + ); } + + + //new screen is showing after submitting the review Widget getReviewedProduct(){ return Column( @@ -309,4 +326,24 @@ class _ProductReviewPageState extends State { ], ); } + +// submit(){ +// this.orderId.id = "0"; +// this.reviewObj.position = 0; +// this.reviewObj.customerId = this.pharmacyUser.CustomerId; +// this.reviewObj.productId = this.product.id; +// this.reviewObj.storeId = 2; +// this.reviewObj.isApproved = false; +// this.reviewObj.title =''; +// this.reviewObj.reviewText = this.submitTxt; +// this.reviewObj.rating = this.doctorRating; +// this.reviewObj.replyText = null; +// this.reviewObj.helpfulYesTotal = 0; +// this.reviewObj.helpfulNoTotal = 0; +// this.reviewObj.createdOnUtc = new Date().toString(); +// this.submitProductReview(); +// } + submitProductReview(){ + + } } diff --git a/lib/pages/pharmacy/pharmacyAddresses/PharmacyAddresses.dart b/lib/pages/pharmacy/pharmacyAddresses/PharmacyAddresses.dart index 44df964d..07862645 100644 --- a/lib/pages/pharmacy/pharmacyAddresses/PharmacyAddresses.dart +++ b/lib/pages/pharmacy/pharmacyAddresses/PharmacyAddresses.dart @@ -7,9 +7,11 @@ import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/pages/pharmacy/pharmacyAddresses/AddAddress.dart'; -import 'package:diplomaticquarterapp/config/config.dart'; import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; +import 'package:diplomaticquarterapp/config/config.dart'; import 'package:diplomaticquarterapp/services/pharmacy_services/pharmacyAddress_service.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacies/PharmacyAddressesModel.dart'; +import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/PharmacyAddressesViewModel.dart'; class PharmacyAddressesPage extends StatefulWidget{ @override @@ -17,13 +19,11 @@ class PharmacyAddressesPage extends StatefulWidget{ } class _PharmacyAddressesState extends State{ - + String address=""; int selectedRadio; bool _value = false; AppSharedPreferences sharedPref = AppSharedPreferences(); - - @override void initState(){ // WidgetsBinding.instance.addPostFrameCallback((_) => getAllAddress()); @@ -39,12 +39,10 @@ class _PharmacyAddressesState extends State{ Widget build (BuildContext context){ return BaseView( - onModelReady: (model) => model.getAddress(), + onModelReady: (model) => model.getAddress(address), builder: (_,model, wi )=> AppScaffold( - appBarTitle: "", -// centerTitle: true, -// title: Text(TranslationBase.of(context).changeAddress, style: TextStyle(color:Colors.white)), -// backgroundColor: Colors.green, + appBarTitle:TranslationBase.of(context).changeAddress, + baseViewModel: model, isShowAppBar: true, isPharmacy:true , body: Container( @@ -55,7 +53,7 @@ class _PharmacyAddressesState extends State{ scrollDirection: Axis.vertical, shrinkWrap: true, physics: ScrollPhysics(), - itemCount: 5 , + itemCount: model.address.length, itemBuilder: (context, index){ return Container( child: Padding( @@ -111,14 +109,19 @@ class _PharmacyAddressesState extends State{ Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text('NAME', + Text('name', +// model.address[0].customers[0].addresses[0].firstName, style: TextStyle(fontSize: 15.0, fontWeight: FontWeight.bold, ), ), SizedBox( height: 5,), - Text('Address', - style: TextStyle(fontSize: 15.0, color: Colors.grey, + Expanded( + child: Text(model.address[0].customers[0].addresses[0].address1+ ''+ + model.address[0].customers[0].addresses[0].address2+ '' + + model.address[0].customers[0].addresses[0].zipPostalCode, + style: TextStyle(fontSize: 15.0, color: Colors.grey, + ), ), ), SizedBox( @@ -354,11 +357,6 @@ class _PharmacyAddressesState extends State{ } getAllAddress() { -// print("ADDRESSES"); -// PharmacyAddressService service = new PharmacyAddressService(); -// service.getAddress(AppGlobal.context).then((res) { -// print(res); -// }); } diff --git a/lib/pages/pharmacy/profile/profile.dart b/lib/pages/pharmacy/profile/profile.dart index 272ef0d4..ec19ae8d 100644 --- a/lib/pages/pharmacy/profile/profile.dart +++ b/lib/pages/pharmacy/profile/profile.dart @@ -1,7 +1,21 @@ +import 'package:diplomaticquarterapp/pages/ContactUs/LiveChat/livechat_page.dart'; +import 'package:diplomaticquarterapp/pages/ContactUs/findus/findus_page.dart'; +import 'package:diplomaticquarterapp/pages/family/my-family.dart'; +import 'package:diplomaticquarterapp/pages/medical/prescriptions/prescriptions_home_page.dart'; +import 'package:diplomaticquarterapp/pages/pharmacies/wishlist.dart'; +import 'package:diplomaticquarterapp/pages/pharmacy/order/Order.dart'; +import 'package:diplomaticquarterapp/pages/pharmacy/pharmacyAddresses/PharmacyAddresses.dart'; import 'package:diplomaticquarterapp/widgets/avatar/large_avatar.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/order_model_view_model.dart'; +import 'package:diplomaticquarterapp/pages/base/base_view.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; +import 'package:diplomaticquarterapp/config/config.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacies/order_model.dart'; +import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; + class PharmacyProfilePage extends StatefulWidget { @override @@ -9,370 +23,411 @@ class PharmacyProfilePage extends StatefulWidget { } class _ProfilePageState extends State { + AppSharedPreferences sharedPref = AppSharedPreferences(); + String customerId=""; + String page_id=""; + @override Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - centerTitle: true, - title: Text(TranslationBase.of(context).myAccount, style: TextStyle(color:Colors.white)), - backgroundColor: Colors.green, - ), - body: Container( - child:SingleChildScrollView( - child: Column( - children:[ - Container( - child:Row( - children: [ - Container( - padding:EdgeInsets.only(top:20.0, left:10.0, right:10.0, bottom:10.0,), - child: LargeAvatar(name: "profile", url:'' ,), - ), - Container( - child: Column( - children: [ - Text( - TranslationBase.of(context).welcome, - style: TextStyle(fontSize: 14.0, - fontWeight: FontWeight.bold, - color:Colors.grey - ), - ), - Text( - 'NAME', - style: TextStyle( - fontSize: 16.0, - fontWeight: FontWeight.bold - ), - ), - ], - ), - ) - ], - ), - ), - Divider( - color: Colors.grey[350], - height: 20, - thickness: 5, - indent: 0, - endIndent: 0, - ), - SizedBox( - height: 15, - ), - Container( + return BaseView( + onModelReady: (model) => model.getOrder(customerId, page_id), + builder: (_,model, wi )=> AppScaffold( + appBarTitle: TranslationBase.of(context).myAccount, + isShowAppBar: true, + isPharmacy:true , + body: Container( + child:SingleChildScrollView( + child: Column( + children:[ + Container( child:Row( children: [ - Expanded( - child: InkWell( - child: Column( - children: [ - SvgPicture.asset( - 'assets/images/pharmacy/orders_icon.svg', - width: 50, - height: 50,), - SizedBox( - height: 5, + Container( + padding:EdgeInsets.only(top:20.0, left:10.0, right:10.0, bottom:10.0,), + child: LargeAvatar(name: "profile", url:'' ,), + ), + Container( + child: Column( + children: [ + Text( + TranslationBase.of(context).welcome, + style: TextStyle(fontSize: 14.0, + fontWeight: FontWeight.bold, + color:Colors.grey ), - Text( - TranslationBase.of(context).orders, - style: TextStyle(fontSize: 13.0, - fontWeight: FontWeight.bold,), + ), + Text("Name", +// model.order[0].customer.firstName.toString(), + style: TextStyle( + fontSize: 16.0, + fontWeight: FontWeight.bold ), - ], + ), + ], + ), + ) + ], + ), + ), + Divider( + color: Colors.grey[350], + height: 20, + thickness: 5, + indent: 0, + endIndent: 0, + ), + SizedBox( + height: 15, + ), + Container( + child:Row( + children: [ + Expanded( + child: InkWell( + onTap: () { + Navigator.push(context, + MaterialPageRoute(builder: (context) => OrderPage())); + }, + child: Column( + children: [ + SvgPicture.asset( + 'assets/images/pharmacy/orders_icon.svg', + width: 50, + height: 50,), + SizedBox( + height: 5, + ), + Text( + TranslationBase.of(context).orders, + style: TextStyle(fontSize: 13.0, + fontWeight: FontWeight.bold,), + ), + ], + ), ), ), - ), - Expanded( - child: InkWell( - child: Column( - children: [ - SvgPicture.asset( - 'assets/images/pharmacy/lakum_icon.svg', - width: 50, - height: 50,), - SizedBox( - height: 5, - ), - Text( - TranslationBase.of(context).lakum, - style: TextStyle(fontSize: 13.0, - fontWeight: FontWeight.bold + Expanded( + child: InkWell( + child: Column( + children: [ + SvgPicture.asset( + 'assets/images/pharmacy/lakum_icon.svg', + width: 50, + height: 50,), + SizedBox( + height: 5, ), - ), - ], + Text( + TranslationBase.of(context).lakum, + style: TextStyle(fontSize: 13.0, + fontWeight: FontWeight.bold + ), + ), + ], + ), ), ), - ), - Expanded( - child: InkWell( - child: Column( - children: [ - SvgPicture.asset( - 'assets/images/pharmacy/wishlist_icon.svg', - width: 50, - height: 50,), - SizedBox( - height: 5, - ), - Text( - TranslationBase.of(context).wishlist, - style: TextStyle(fontSize: 13.0, - fontWeight: FontWeight.bold,), - ), - ], + Expanded( + child: InkWell( + onTap: () { + Navigator.push(context, + MaterialPageRoute(builder: (context) => WishlistPage())); + }, + child: Column( + children: [ + SvgPicture.asset( + 'assets/images/pharmacy/wishlist_icon.svg', + width: 50, + height: 50,), + SizedBox( + height: 5, + ), + Text( + TranslationBase.of(context).wishlist, + style: TextStyle(fontSize: 13.0, + fontWeight: FontWeight.bold,), + ), + ], + ), ), ), + Expanded( + child: InkWell( + child: Column( + children: [ + SvgPicture.asset( + 'assets/images/pharmacy/review_icon.svg', + width: 50, + height: 50,), + SizedBox( + height: 5, + ), + Text( + TranslationBase.of(context).reviews, + style: TextStyle(fontSize: 13.0, + fontWeight: FontWeight.bold,), + ), + ], + ), + ), + ), + ], + ) + ), + SizedBox( + height: 15, + ), + Divider( + color: Colors.grey[350], + height: 20, + thickness: 5, + indent: 0, + endIndent: 0, + ), + SizedBox( + height: 10, + ), + Container( + padding: EdgeInsets.only(left: 10.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + TranslationBase.of(context).myAccount, + style: TextStyle( + fontSize: 16.0, + fontWeight: FontWeight.bold + ), ), - Expanded( - child: InkWell( - child: Column( + SizedBox( + height: 10, + ), + Divider( + color: Colors.grey, + height: 20, + ), + InkWell( + onTap: () { + Navigator.push(context, + MaterialPageRoute(builder: (context) => HomePrescriptionsPage())); + }, + child: Row( children: [ SvgPicture.asset( - 'assets/images/pharmacy/review_icon.svg', - width: 50, - height: 50,), + 'assets/images/pharmacy/my_prescription_icon.svg', + width: 28, + height: 28,), SizedBox( - height: 5, - ), - Text( - TranslationBase.of(context).reviews, - style: TextStyle(fontSize: 13.0, - fontWeight: FontWeight.bold,), + width: 15, ), + Text(TranslationBase.of(context).myPrescription, + style: TextStyle(fontSize: 13.0, + ), + ), ], ), - ), - ), - ], - ) - ), - SizedBox( - height: 15, - ), - Divider( - color: Colors.grey[350], - height: 20, - thickness: 5, - indent: 0, - endIndent: 0, - ), - SizedBox( - height: 10, - ), - Container( - padding: EdgeInsets.only(left: 10.0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - TranslationBase.of(context).myAccount, - style: TextStyle( - fontSize: 16.0, - fontWeight: FontWeight.bold ), - ), - SizedBox( - height: 10, - ), - Divider( - color: Colors.grey, - height: 20, - ), - InkWell( - child: Row( + SizedBox( + height: 5, + ), + Divider( + color: Colors.grey, + height: 20, + ), + InkWell( + onTap: () { + Navigator.push(context, + MaterialPageRoute(builder: (context) => MyFamily())); + }, + child: Row( children: [ SvgPicture.asset( - 'assets/images/pharmacy/my_prescription_icon.svg', + 'assets/images/pharmacy/compare.png', width: 28, height: 28,), SizedBox( width: 15, ), - Text(TranslationBase.of(context).myPrescriptions, - style: TextStyle(fontSize: 13.0, - ), + Text(TranslationBase.of(context).compare, + style: TextStyle(fontSize: 13.0, ), + ), ], ), - ), - SizedBox( - height: 5, - ), - Divider( - color: Colors.grey, - height: 20, - ), - InkWell( - child: Row( - children: [ - SvgPicture.asset( - 'assets/images/pharmacy/medication_refill_icon.svg', - width: 28, - height: 28,), - SizedBox( - width: 15, - ), - Text(TranslationBase.of(context).medicationRefill, - style: TextStyle(fontSize: 13.0, - ), - ), - ], ), - ), - SizedBox( - height: 5, - ), - Divider( - color: Colors.grey, - height: 20, - ), - InkWell( - child: Row( - children: [ - SvgPicture.asset( - 'assets/images/pharmacy/pill_reminder_icon.svg', - width: 30, - height: 30,), - SizedBox( - width: 20, - ), - Text(TranslationBase.of(context).pillReminder, - style: TextStyle(fontSize: 13.0, - ), - ), - ], + SizedBox( + height: 5, ), - ), - SizedBox( - height: 5, - ), - Divider( - color: Colors.grey, - height: 20, - ), - InkWell( - child: Row( - children: [ - SvgPicture.asset( - 'assets/images/pharmacy/my_family_icon.svg', - width: 20, - height: 20,), - SizedBox( - width: 20, - ), - Text(TranslationBase.of(context).family, - style: TextStyle(fontSize: 13.0, - ), - ), - ], + Divider( + color: Colors.grey, + height: 20, ), - ), - SizedBox( - height: 5, - ), - Divider( - color: Colors.grey, - height: 20, - ), - InkWell( - child: Row( - children: [ - SvgPicture.asset( - 'assets/images/pharmacy/shipping_addresses_icon.svg', - width: 30, - height: 30,), - SizedBox( - width: 20, - ), - Text(TranslationBase.of(context).shippingAddresses, - style: TextStyle(fontSize: 13.0, + InkWell( + onTap: () { + Navigator.push(context, + MaterialPageRoute(builder: (context) => HomePrescriptionsPage())); + }, + child: Row( + children: [ + SvgPicture.asset( + 'assets/images/pharmacy/medication_refill_icon.svg', + width: 30, + height: 30,), + SizedBox( + width: 20, ), - ), - ], + Text(TranslationBase.of(context).medicationsRefill, + style: TextStyle(fontSize: 13.0, + ), + ), + ], + ), ), - ), - ], - ), - ), - SizedBox( - height: 10, - ), - Divider( - color: Colors.grey[350], - height: 20, - thickness: 5, - indent: 0, - endIndent: 0, - ), - SizedBox( - height: 10, - ), - Container( - padding: EdgeInsets.only(left: 10.0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - TranslationBase.of(context).reachUs, - style: TextStyle( - fontSize: 16.0, - fontWeight: FontWeight.bold + SizedBox( + height: 5, ), - ), - SizedBox( - height: 5, - ), - Divider( - color: Colors.grey, - height: 20, - ), - InkWell( - child: Row( + Divider( + color: Colors.grey, + height: 20, + ), + InkWell( + onTap: () { + Navigator.push(context, + MaterialPageRoute(builder: (context) => MyFamily())); + }, + child: Row( children: [ SvgPicture.asset( - 'assets/images/pharmacy/contact_us_icon.svg', + 'assets/images/pharmacy/my_family_icon.svg', width: 20, height: 20,), SizedBox( width: 20, ), - Text( - TranslationBase.of(context).contactUs, - style: TextStyle(fontSize: 13.0), + Text(TranslationBase.of(context).family, + style: TextStyle(fontSize: 13.0, + ), ), ], ), - ), - SizedBox( - height: 5, - ), - Divider( - color: Colors.grey, - height: 20, - ), - InkWell( - child: Row( - children: [ - SvgPicture.asset( - 'assets/images/pharmacy/our_locations_icon.svg', - width: 30, - height: 30,), - SizedBox( - width: 20, - ), - Text( - TranslationBase.of(context).ourLocations, - style: TextStyle(fontSize: 13.0), - ), - ], ), - ) - ], + SizedBox( + height: 5, + ), + Divider( + color: Colors.grey, + height: 20, + ), + InkWell( + onTap: () { + Navigator.push(context, + MaterialPageRoute(builder: (context) => PharmacyAddressesPage())); + }, + child: Row( + children: [ + SvgPicture.asset( + 'assets/images/pharmacy/shipping_addresses_icon.svg', + width: 30, + height: 30,), + SizedBox( + width: 20, + ), + Text(TranslationBase.of(context).shippingAddresses, + style: TextStyle(fontSize: 13.0, + ), + ), + ], + ), + ), + ], + ), ), - ) - ], + SizedBox( + height: 10, + ), + Divider( + color: Colors.grey[350], + height: 20, + thickness: 5, + indent: 0, + endIndent: 0, + ), + SizedBox( + height: 10, + ), + Container( + padding: EdgeInsets.only(left: 10.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + TranslationBase.of(context).reachUs, + style: TextStyle( + fontSize: 16.0, + fontWeight: FontWeight.bold + ), + ), + SizedBox( + height: 5, + ), + Divider( + color: Colors.grey, + height: 20, + ), + InkWell( + onTap: () { + Navigator.push(context, + MaterialPageRoute(builder: (context) => LiveChatPage())); + }, + child: Row( + children: [ + SvgPicture.asset( + 'assets/images/pharmacy/contact_us_icon.svg', + width: 20, + height: 20,), + SizedBox( + width: 20, + ), + Text( + TranslationBase.of(context).contactUs, + style: TextStyle(fontSize: 13.0), + ), + ], + ), + ), + SizedBox( + height: 5, + ), + Divider( + color: Colors.grey, + height: 20, + ), + InkWell( + onTap: () { + Navigator.push(context, + MaterialPageRoute(builder: (context) => FindUsPage())); + }, + child: Row( + children: [ + SvgPicture.asset( + 'assets/images/pharmacy/our_locations_icon.svg', + width: 30, + height: 30,), + SizedBox( + width: 20, + ), + Text( + TranslationBase.of(context).ourLocations, + style: TextStyle(fontSize: 13.0), + ), + ], + ), + ) + ], + ), + ) + ], + ), ), ), ), diff --git a/lib/services/pharmacy_services/cancelOrder_service.dart b/lib/services/pharmacy_services/cancelOrder_service.dart new file mode 100644 index 00000000..de80a473 --- /dev/null +++ b/lib/services/pharmacy_services/cancelOrder_service.dart @@ -0,0 +1,39 @@ + +import 'package:diplomaticquarterapp/config/config.dart'; +import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacies/order_model.dart'; +import 'package:diplomaticquarterapp/core/service/base_service.dart'; +import 'package:diplomaticquarterapp/models/Authentication/authenticated_user.dart'; +import 'package:diplomaticquarterapp/services/authentication/auth_provider.dart'; +import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; +import 'package:flutter/material.dart'; + + +class CancelOrderService extends BaseService{ + AppSharedPreferences sharedPref = AppSharedPreferences(); + AppGlobal appGlobal = new AppGlobal(); + + AuthenticatedUser authUser = new AuthenticatedUser(); + AuthProvider authProvider = new AuthProvider(); + + List get orderDetails => orderDetails; + List _orderList = List(); + List get orderList => _orderList; + String url =""; + + + Future cancelOrderDetail(order) async { + print("step 1"); + hasError = false; + await baseAppClient.getPharmacy(GET_Cancel_ORDER+order, + onSuccess: (dynamic response, int statusCode) { + _orderList.clear(); + response['orders'].forEach((item) { + _orderList.add(OrderModel.fromJson(item)); + }); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }); + } +} \ No newline at end of file diff --git a/lib/services/pharmacy_services/order_service.dart b/lib/services/pharmacy_services/order_service.dart index d43d417b..70523da1 100644 --- a/lib/services/pharmacy_services/order_service.dart +++ b/lib/services/pharmacy_services/order_service.dart @@ -16,7 +16,7 @@ class OrderService extends BaseService{ List _orderList = List(); List get orderList => _orderList; -String url =""; + String url =""; Future getOrder(custmerId, page_id) async { print("step 1"); @@ -30,6 +30,7 @@ String url =""; response['orders'].forEach((item) { _orderList.add(OrderModel.fromJson(item)); }); + print(_orderList.length); print(response); }, onFailure: (String error, int statusCode) { hasError = true; @@ -38,6 +39,25 @@ String url =""; } + Future getProductReview(orderId) async { + print("step 1"); + hasError = false; + url =GET_ORDER+"customer=1,fields=id,order_total,order_status,order_statusn,order_status_id,created_on_utc&page=1&limit=200&customer_id=1367368"; +// url =GET_ORDER+"customer=1,fields=id,order_total,order_status,order_statusn,order_status_id,created_on_utc&page=$page_id&limit=200&customer_id=$custmerId"; + print(url); + await baseAppClient.getPharmacy(url, + onSuccess: (dynamic response, int statusCode) { + _orderList.clear(); + response['orders'].forEach((item) { + _orderList.add(OrderModel.fromJson(item)); + }); + print(_orderList.length); + print(response); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }); + } // Future getOrder(BuildContext context ) async { // // if (await this.sharedPref.getObject(USER_PROFILE) != null) { diff --git a/lib/services/pharmacy_services/pharmacyAddress_service.dart b/lib/services/pharmacy_services/pharmacyAddress_service.dart index eae5ac8c..3ff2a2d3 100644 --- a/lib/services/pharmacy_services/pharmacyAddress_service.dart +++ b/lib/services/pharmacy_services/pharmacyAddress_service.dart @@ -9,21 +9,23 @@ import 'package:diplomaticquarterapp/core/model/pharmacies/PharmacyAddressesMode class PharmacyAddressService extends BaseService{ - List get address => address; AppSharedPreferences sharedPref = AppSharedPreferences(); AppGlobal appGlobal = new AppGlobal(); AuthenticatedUser authUser = new AuthenticatedUser(); AuthProvider authProvider = new AuthProvider(); + List get address => address; List _addressList = List(); List get reviewList => _addressList; + String url =""; - - Future getAddress() async { + Future getAddress(address) async { print("step 1"); hasError = false; - await baseAppClient.getPharmacy(GET_ORDER, + url =GET_ADDRESS+"272843?fields=addresses"; + print(url); + await baseAppClient.getPharmacy(url, onSuccess: (dynamic response, int statusCode) { _addressList.clear(); response['customers'].forEach((item) { diff --git a/lib/uitl/translations_delegate_base.dart b/lib/uitl/translations_delegate_base.dart index 345592d7..b21558cd 100644 --- a/lib/uitl/translations_delegate_base.dart +++ b/lib/uitl/translations_delegate_base.dart @@ -764,6 +764,11 @@ class TranslationBase { String get orderDate => localizedValues['orderDate'][locale.languageCode]; String get itemsNo => localizedValues['itemsNo'][locale.languageCode]; String get noOrder => localizedValues['noOrder'][locale.languageCode]; + String get review => localizedValues['review'][locale.languageCode]; + String get deliveredOrder => localizedValues['deliveredOrder'][locale.languageCode]; + String get compare => localizedValues['compare'][locale.languageCode]; + String get medicationsRefill => localizedValues['medicationsRefill'][locale.languageCode]; + String get myPrescription => localizedValues['myPrescription'][locale.languageCode]; // pharmacy module // String get medicationRefill => localizedValues['medicationRefill'][locale.languageCode]; diff --git a/lib/widgets/pharmacy/product_tile.dart b/lib/widgets/pharmacy/product_tile.dart index e0182f08..f16ff7e5 100644 --- a/lib/widgets/pharmacy/product_tile.dart +++ b/lib/widgets/pharmacy/product_tile.dart @@ -8,6 +8,7 @@ import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; + class productTile extends StatelessWidget { final String productName; final String productPrice; @@ -25,7 +26,7 @@ class productTile extends StatelessWidget { @override Widget build(BuildContext context) { return Container( - height: 150, + height: 180, width: double.infinity, color: Colors.white, child: Column( @@ -115,7 +116,7 @@ class productTile extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ Container( -// margin: EdgeInsets.all(5), + margin: EdgeInsets.only(bottom: 5.0), child: RichText( text: TextSpan( text: 'QYT: $qyt', @@ -161,68 +162,72 @@ class productTile extends StatelessWidget { ], ), ): Container(), - this.isOrderDetails == true ?Row( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - Container( - margin: EdgeInsets.all(5), - child: Align( - alignment: Alignment.topLeft, - child: RatingBar.readOnly( - initialRating: productRate, - size: 15.0, - filledColor: Colors.yellow[700], - emptyColor: Colors.grey[500], - isHalfAllowed: true, - halfFilledIcon: Icons.star_half, - filledIcon: Icons.star, - emptyIcon: Icons.star, +// this.isOrderDetails == true && model.order[0].orderStatusId == 30? + this.isOrderDetails == true? + Expanded( + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Container( +// margin: EdgeInsets.all(5.0), + child: Align( + alignment: Alignment.topLeft, + child: RatingBar.readOnly( + initialRating: productRate, + size: 15.0, + filledColor: Colors.yellow[700], + emptyColor: Colors.grey[500], + isHalfAllowed: true, + halfFilledIcon: Icons.star_half, + filledIcon: Icons.star, + emptyIcon: Icons.star, + ), ), ), - ), - Container( - margin: EdgeInsets.all(5), - child: Align( - alignment: Alignment.topLeft, - child: RichText( - text: TextSpan( - text: '($productReviews reviews)', - style: TextStyle( - fontWeight: FontWeight.bold, - color: Colors.grey, - fontSize: 13), + Container( +// margin: EdgeInsets.all(5), + child: Align( +// alignment: Alignment.topLeft, + child: RichText( + text: TextSpan( + text: '($productReviews reviews)', + style: TextStyle( + fontWeight: FontWeight.bold, + color: Colors.grey, + fontSize: 13), + ), ), ), ), - ), - InkWell( - onTap: () { - Navigator.push(context, - MaterialPageRoute(builder: (context) => ProductReviewPage())); - }, - child: Container( - padding: EdgeInsets.only(left: 13.0, right: 13.0, top: 5.0), - height: 30.0, - decoration: BoxDecoration( - border: Border.all( - color: Colors.orange, - style: BorderStyle.solid, - width: 1.0 + InkWell( + onTap: () { + Navigator.push(context, + MaterialPageRoute(builder: (context) => ProductReviewPage())); + }, + child: Container( + padding: EdgeInsets.only(left: 13.0, right: 13.0, top: 5.0), + height: 30.0, + decoration: BoxDecoration( + border: Border.all( + color: Colors.orange, + style: BorderStyle.solid, + width: 1.0 + ), + color: Colors.transparent, + borderRadius: BorderRadius.circular(5.0) + ), + child: Text( + TranslationBase.of(context).writeReview, + style: TextStyle( + fontSize:12, + color: Colors.orange, + ), ), - color: Colors.transparent, - borderRadius: BorderRadius.circular(5.0) - ), - child: Text( - TranslationBase.of(context).writeReview, - style: TextStyle( - fontSize:12, - color: Colors.orange, ), - ), ), - ), - ], - ) : Container(), + ], + ), + ) : Container(), ], ), ); From ed68eed9dfcbd2e863d204551b3565b09312e11e Mon Sep 17 00:00:00 2001 From: Fatimah Alshammari Date: Mon, 7 Dec 2020 12:18:57 +0300 Subject: [PATCH 02/18] added links for profile --- lib/pages/landing/landing_page_pharmcy.dart | 8 +++++--- lib/pages/pharmacy/order/OrderDetails.dart | 22 ++++++++++----------- lib/pages/pharmacy/profile/profile.dart | 2 +- 3 files changed, 17 insertions(+), 15 deletions(-) diff --git a/lib/pages/landing/landing_page_pharmcy.dart b/lib/pages/landing/landing_page_pharmcy.dart index 4308e186..59492370 100644 --- a/lib/pages/landing/landing_page_pharmcy.dart +++ b/lib/pages/landing/landing_page_pharmcy.dart @@ -2,6 +2,7 @@ import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; import 'package:diplomaticquarterapp/pages/parent_categorise_page.dart'; import 'package:diplomaticquarterapp/pages/pharmacies/screens/cart-order-page.dart'; import 'package:diplomaticquarterapp/pages/pharmacies/screens/pharmacy_module_page.dart'; +import 'package:diplomaticquarterapp/pages/pharmacy/profile/profile.dart'; import 'package:diplomaticquarterapp/pages/pharmacy_categorise.dart'; import 'package:diplomaticquarterapp/pages/search_products_page.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; @@ -136,9 +137,10 @@ class _LandingPagePharmacyState extends State { PharmacyPage(), PharmacyCategorisePage(), OffersCategorisePage(), - Container( - child: Text('text'), - ), + PharmacyProfilePage(), +// Container( +// child: Text('text'), +// ), CartOrderPage(), ], // Please do not remove the BookingOptions from this array ), diff --git a/lib/pages/pharmacy/order/OrderDetails.dart b/lib/pages/pharmacy/order/OrderDetails.dart index 3c6e62b1..94b1aba2 100644 --- a/lib/pages/pharmacy/order/OrderDetails.dart +++ b/lib/pages/pharmacy/order/OrderDetails.dart @@ -544,23 +544,23 @@ class _OrderDetailsPageState extends State { okText: TranslationBase.of(context).confirm, cancelText: TranslationBase.of(context).cancel_nocaps, okFunction: () => { - cancelOrderDetail(widget.orderModel.id), +// cancelOrderDetail(widget.orderModel.id), ConfirmDialog.closeAlertDialog(context) }, cancelFunction: () => {}); dialog.showAlertDialog(context); } - cancelOrderDetail(order){ - if(widget.orderModel.canCancel && widget.orderModel.canRefund == false){ -// setState(() { - cancelOrderDetail(order); - AppToast.showSuccessToast(message: "Request Sent Successfully"); -// }); -// return OrderPage(); - } - else{} - } +// cancelOrderDetail(order){ +// if(widget.orderModel.canCancel && widget.orderModel.canRefund == false){ +//// setState(() { +// cancelOrderDetail(order); +// AppToast.showSuccessToast(message: "Request Sent Successfully"); +//// }); +//// return OrderPage(); +// } +// else{} +// } getLanguageID() async { var languageID = await sharedPref.getString(APP_LANGUAGE); diff --git a/lib/pages/pharmacy/profile/profile.dart b/lib/pages/pharmacy/profile/profile.dart index ec19ae8d..0336370c 100644 --- a/lib/pages/pharmacy/profile/profile.dart +++ b/lib/pages/pharmacy/profile/profile.dart @@ -1,6 +1,6 @@ import 'package:diplomaticquarterapp/pages/ContactUs/LiveChat/livechat_page.dart'; import 'package:diplomaticquarterapp/pages/ContactUs/findus/findus_page.dart'; -import 'package:diplomaticquarterapp/pages/family/my-family.dart'; +import 'package:diplomaticquarterapp/pages/DrawerPages/family/my-family.dart'; import 'package:diplomaticquarterapp/pages/medical/prescriptions/prescriptions_home_page.dart'; import 'package:diplomaticquarterapp/pages/pharmacies/wishlist.dart'; import 'package:diplomaticquarterapp/pages/pharmacy/order/Order.dart'; From 888a74fb9bf5178af8c1470b550c4110afdd55ee Mon Sep 17 00:00:00 2001 From: enadhilal Date: Mon, 7 Dec 2020 12:33:03 +0300 Subject: [PATCH 03/18] =?UTF-8?q?add=20these=20pages=20=E2=80=8BProduct=20?= =?UTF-8?q?Tile=20Component=20Product=20Detail=20Page=20=E2=80=8BWishlist?= =?UTF-8?q?=20Page=20=E2=80=8BReviews=20Page=20Brands=20Page=20+=20Search?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/images/offer.png | Bin 0 -> 2631 bytes assets/images/offer_ar.png | Bin 0 -> 2626 bytes lib/config/config.dart | 14 +- lib/core/service/client/base_app_client.dart | 42 +- .../pharmacyModule/brand_view_model.dart | 41 + .../product_detail_view_model.dart | 43 + .../pharmacyModule/review_view_model.dart | 26 + .../pharmacyModule/wishlist_view_model.dart | 36 + lib/locator.dart | 17 + lib/models/pharmacy/Wishlist.dart | 881 +++++++++++++++++ lib/models/pharmacy/brandModel.dart | 157 ++++ lib/models/pharmacy/locationModel.dart | 159 ++++ lib/models/pharmacy/productDetailModel.dart | 249 +++++ lib/models/pharmacy/products.dart | 835 ++++++++++++++++ lib/models/pharmacy/reviewModel.dart | 803 ++++++++++++++++ lib/models/pharmacy/topBrandsModel.dart | 137 +++ lib/pages/base/base_view.dart | 7 +- lib/pages/landing/home_page.dart | 7 +- .../pharmacies/ProductCheckTypeWidget.dart | 55 ++ lib/pages/pharmacies/compare.dart | 597 ++++++++++++ lib/pages/pharmacies/my_reviews.dart | 194 ++++ lib/pages/pharmacies/product-brands.dart | 284 ++++++ lib/pages/pharmacies/product_detail.dart | 888 ++++++++++++++++++ lib/pages/pharmacies/wishlist.dart | 90 +- .../pharmacy_services/brands_service.dart | 44 + .../product_detail_service.dart | 61 ++ .../pharmacy_services/review_service.dart | 28 + .../pharmacy_services/wishList_service.dart | 74 +- lib/widgets/others/app_scaffold_widget.dart | 10 +- lib/widgets/pharmacy/product_tile.dart | 114 ++- 30 files changed, 5814 insertions(+), 79 deletions(-) create mode 100644 assets/images/offer.png create mode 100644 assets/images/offer_ar.png create mode 100644 lib/core/viewModels/pharmacyModule/brand_view_model.dart create mode 100644 lib/core/viewModels/pharmacyModule/product_detail_view_model.dart create mode 100644 lib/core/viewModels/pharmacyModule/review_view_model.dart create mode 100644 lib/core/viewModels/pharmacyModule/wishlist_view_model.dart create mode 100644 lib/models/pharmacy/Wishlist.dart create mode 100644 lib/models/pharmacy/brandModel.dart create mode 100644 lib/models/pharmacy/locationModel.dart create mode 100644 lib/models/pharmacy/productDetailModel.dart create mode 100644 lib/models/pharmacy/products.dart create mode 100644 lib/models/pharmacy/reviewModel.dart create mode 100644 lib/models/pharmacy/topBrandsModel.dart create mode 100644 lib/pages/pharmacies/ProductCheckTypeWidget.dart create mode 100644 lib/pages/pharmacies/compare.dart create mode 100644 lib/pages/pharmacies/my_reviews.dart create mode 100644 lib/pages/pharmacies/product-brands.dart create mode 100644 lib/pages/pharmacies/product_detail.dart create mode 100644 lib/services/pharmacy_services/brands_service.dart create mode 100644 lib/services/pharmacy_services/product_detail_service.dart create mode 100644 lib/services/pharmacy_services/review_service.dart diff --git a/assets/images/offer.png b/assets/images/offer.png new file mode 100644 index 0000000000000000000000000000000000000000..b9977670cc0f532b5704938259829151d67ed875 GIT binary patch literal 2631 zcmV-N3b^%&P)q$q3BLTds|Vv;z-O}rJ3 z78#THx)<9!)jvLGIXgbPJ7>ckC*62w9*jdAKQ3|bzKw|PH063t*>A3M&E|Ye9h`NRD9^oR>WFufOa*`90C4N7uM-g!=b$?gFea~IUhg+dtGmW7 zd1o$@9t!#(sg8IjF*Y^)rXY`}eI0=a#UAo=A92e)9yYBT5Tmmz9UoggoPY1CuM=^Z z@0KpAx+*9UQp8CSC-7An1X3OGHkZNU9*w>L=WlK~`?C+@YTjhn?aAr?SAGm>HQ=mctXPx!KL8iwKRHk z)74;XTn9}{mq6^sbyvQ%3gWweb3u3`|U$8dhiM1XhjB&g0HF3aitq~Uk{5` zuY~5GY=qdlA3LjkeD^MxK6$w0b~F8bkp1ja$WKf<+o3n0h~2W$*SVy!Ir>y75rB|k zh>)S`<5xPSZLxcQ1hKB`AlB6d#!c&C(V82C_mTbNFkHHSSK;+E9EKJDT;pqBERLQz zM_(x?0+25rJws2BeSaMlJkP~1-}`bP$C@2Z7KkvH{L0rp1_$SfVB2;eL;ymDBZg`H zhNK|UU=(~@2c!FS@f5hqX9iBg+{F}RKN%2G{&;LW9>vswH-*pt{LL-2hL9BAxCF{& z4f{yH`gxHZR=e@y1zugeJuz8wZy4vtp4|l~sBVCv!VeJ`G?qs|_Zn%nU~XvCmwQ&>;)4Q) z0BUR$hAaO5T0tzLN2?TCc-Z&ud(OMIZ7WOhRS`irGid(xdNA+$IaphNS@b@xpz*zX zAp82svfHar@o0qDP1i!SYd*wG{Qi}S+vG2g!p!L}oTkyt*$Xh+=l%F7472|_QuH@t zGfL!dm|7mCsiRUz6M<9&Jp;e|rH^jo3Me3}r2V-UV0`tivToC_i;rHt2HM|vYQgc* ztFUmpcqHDXC!dk_Hcp7x`u%IvI{@Cp!}(4VV1AACN}Y%cDlU2ROavss4_oqXjb=Zmq&(vFLy zN}8hO-mNfpaF3^bi@JCUD&}&>J}>(@)F3K=E$95xqlNDQACd50ThSL571plO7C_aA z(Ejv}A`*P}=O6GvAm;rwAq~*SQ zie6(nDGQxkJZto!**px4dOvmcRuo219cI=f)@CtwSIAG5QJiqE*$|0!8p1!PR6zW4AnBT#3Vi6I))! z)NpF=2SJ~jQs6-8`Bno?=Of=6U7UX>sKJTRt9A!DsmtP19r21AV>y=X!Bb!X2*5J$*J_w`2ayA*-O-`X>=ZZ6M3h**Cpl};uifNNd#SPoxcDm=DuueE>7F(NWs?vRrLr#fUDrejh=MH z^oBM%4>Cj$8d_BWw}O{2y4DK57LXxApjR||XuNoVTfrwnqx0d52%;nGmB3Z-ANvxO zz4ey1=>oqVL5c`e!JnFuYP>Y8g0BVq62Y@jQuK}dGkC8|uA#j5XR>6lx*9@{mxLjh2xh@+oS2ARYKsOE* ze4RsfLTN*2^u~a%%i{4)YY@QIHX&*UAtK-nybaSjUW-0Mh+yHF2*e82i{zg}?RVWQOUeD2L+FJ{9-)V$2g0z>fbdjD pAo>9B*W8)Qq_vn#3ZW1H@PD47K5?G}_gVk|002ovPDHLkV1hU-3I6~9 literal 0 HcmV?d00001 diff --git a/assets/images/offer_ar.png b/assets/images/offer_ar.png new file mode 100644 index 0000000000000000000000000000000000000000..1fdbf749c13f25315123508b1935dc771cc382d6 GIT binary patch literal 2626 zcmV-I3cdA-P) z1bk^6nOes7o$dR{ZS|I!&D`GJ-R|w|?%a7l$(1%7t3;@G&_hW$g5tgO#v(xX20hhm4YczUV}tqyJH&)H}$r^*;7#m)ldqcvqYnn;L$dg^xKx!{iajG|@{)akN>~Ix#x? zx5;J`cilKPfF5#MRaIMF3cV|a!$|CgOekSU*@&_GcvrmJ;NI;Ty$suLlV<;R?06dz zLRD4Eo=TDx98f60`*WFeZ;)AZ2}I1r8KbW!QyW*@I5wa)r>bhmO1n6S2mu};hh}n_ zbS%g$asZ>?*?E1n+t;028UYxyemcR z&Sj(2Gb{)qn1pSvD0r_ip3TuKntFs> zCT)3rrs;^_mxA{LW7A1`RmV9MEssF*_ol289YoAEz0u8JH-}IS)FbSmDO`~=b|Ncy zuQ7g;L~{rU9+##>=q6&RUy_x$2xKrQ`1nFLx)~;75GFTD`15TqJ?cZGM65BLEFv`pLFdyNVd*Beb5qH zT5=o-(b=~TCR2|={vQ{)UpJL6&`mCSE<(z_Op82lda%(}f3pZWBvI>~YoM5#t2&}1 zn^x&$146jM*vBB9(^o5FbnPlwuTdz(TKfo1^1D_2<>J?NTC_E#v{bbus4FK~71lV$TZ z?$7?^Aap$O^!015xdi~qiNKjT-%TIlo}g7jF))%&3|71PB!jis0Cg` zaFjue?fiu{l5mvOgZ5wlK+^=3NI;Q4_p!d+vZQvVTiI+bIBNmFN9N=^P#F0TvhSXE z^3#-oDPf=C*{)+EkVT}rfuk+dVJ&ty1AbPy_q&>UpW69!RRv$1n%B3(U%07e+m!?- z3p9G}+z{kPMj$_O844%IT#X`_5_YZ&f;>EeGa@hwydKccruP5V){0*xwcoO&&Gb0c z1TZT5|0yu#MJl z+;zP#)00}HAqoK~m=bob&xmM9j}YomO7`0x`W{60++lf&K@T$jYH7rPB)~9`wlRD7 zd0|L!>9$31Ce{k0*8pA`JWCG?M+DE)%NS~w>{kijYKb`{K-f#5s>id`g zNU?uYCaz(p!Z8)8)X7nhs?24Wd^2IKa?=Zy-#tA;hmBI3q`QJ{A`{W{loxG`q;q$bGI@Y-P1eIoD#vY zM?j>HzNOF8DA<<$^#x6}U;Ffmc1+sv)e

^SEDPjv5^m{DoxddfwmuBIarK7Im+U zZU#rsP#W)wB1}8-Dv`&##@PkuH9$}lX3f>P0Ndy}UFV&DR#Oi_3tH5_6 zm@4>Vb&0wDMhx3Tfu}@Z6+EYfm!?$ke!w-cXu9y?JO|$&7~LH>Awo$#xT%7-Z}iiK zk-i`mydS8G2&9Dl@aV0|ncqSFnLxoeJ{)BhL!l6^KK{$XsR@IS3ydxp+*ovK*oBvc z3?79ko>kEVa1X&dodRg6>y^Ngtn4B$g$U3ju;mfR!#R(VcLj>{2KN9CVc8?#^O=bb zSSRq?+XK`IOGF@VYJY`EA~}93bpWwYb!s4Q2s1uWH4#h;%?B$U;aS6b1%qj!31L|* k5}`<6&>gG+G!p>e|HhcBcl3n_`Tzg`07*qoM6N<$g2Wg0G5`Po literal 0 HcmV?d00001 diff --git a/lib/config/config.dart b/lib/config/config.dart index c3a47bde..936657e3 100644 --- a/lib/config/config.dart +++ b/lib/config/config.dart @@ -2,12 +2,13 @@ import 'dart:io'; import 'package:diplomaticquarterapp/models/Request.dart'; import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; -import 'package:diplomaticquarterapp/widgets/mobile-no/mobile_no.dart'; const MAX_SMALL_SCREEN = 660; -// const BASE_URL = 'https://hmgwebservices.com/'; -const BASE_URL = 'https://uat.hmgwebservices.com//'; + +const BASE_URL = 'https://hmgwebservices.com/'; +//const BASE_PHARMACY_URL = 'http://swd-pharapp-01:7200/api/'; +const BASE_PHARMACY_URL = 'https://uat.hmgwebservices.com/epharmacy/api/'; const GET_PROJECT = 'Services/Lists.svc/REST/GetProject'; @@ -351,7 +352,12 @@ const GET_CMC_ORDER_DETAIL_BY_ID = const GET_CHECK_UP_ITEMS = "Services/Patients.svc/REST/GetCheckUpItems"; //Pharmacy wishlist -const GET_WISHLIST = "http://swd-pharapp-01:7200/api/shopping_cart_items/"; +const GET_WISHLIST = "shopping_cart_items/"; +const GET_REVIEW = "customerreviews/"; +const GET_BRANDS = "manufacturer"; +const GET_TOP_BRANDS = "topmanufacturer?page=1&limit=8"; +const GET_PRODUCT_DETAIL = "products/"; +const GET_LOCATION = "Services/Patients.svc/REST/GetPharmcyListBySKU"; const TIMER_MIN = 10; diff --git a/lib/core/service/client/base_app_client.dart b/lib/core/service/client/base_app_client.dart index 11319d96..a17dcba6 100644 --- a/lib/core/service/client/base_app_client.dart +++ b/lib/core/service/client/base_app_client.dart @@ -114,7 +114,7 @@ class BaseAppClient { onFailure( parsed['ErrorEndUserMessage'] ?? parsed['ErrorMessage'], statusCode); - logout(); + // logout(); } } else if (parsed['MessageStatus'] == 1 || parsed['SMSLoginRequired'] == true) { @@ -141,9 +141,9 @@ class BaseAppClient { get(String endPoint, {Function(dynamic response, int statusCode) onSuccess, - Function(String error, int statusCode) onFailure, - bool isAllowAny = false, - Map queryParams}) async { + Function(String error, int statusCode) onFailure, + bool isAllowAny = false, + Map queryParams}) async { String url = BASE_URL + endPoint; if (queryParams != null) { String queryString = Uri(queryParameters: queryParams).query; @@ -171,6 +171,38 @@ class BaseAppClient { } } + getPharmacy(String endPoint, + {Function(dynamic response, int statusCode) onSuccess, + Function(String error, int statusCode) onFailure, + bool isAllowAny = false, + Map queryParams}) async { + String url = BASE_PHARMACY_URL + endPoint; + if (queryParams != null) { + String queryString = Uri(queryParameters: queryParams).query; + url += '?' + queryString; + } + + print("URL : $url"); + + if (await Utils.checkConnection()) { + final response = await http.get(url.trim(), headers: { + 'Content-Type': 'application/json', + 'Accept': 'application/json' + }); + final int statusCode = response.statusCode; + print("statusCode :$statusCode"); + + if (statusCode < 200 || statusCode >= 400 || json == null) { + onFailure('Error While Fetching data', statusCode); + } else { + var parsed = json.decode(response.body.toString()); + onSuccess(parsed, statusCode); + } + } else { + onFailure('Please Check The Internet Connection', -1); + } + } + logout() async { await sharedPref.remove(LOGIN_TOKEN_ID); Navigator.of(AppGlobal.context).pushReplacementNamed(LOGIN_TYPE); @@ -180,4 +212,4 @@ class BaseAppClient { ///return id.replaceAll(RegExp('/[^\w\s]/'), ''); // return id.replaceAll(RegExp('/[^a-zA-Z ]'), ''); } -} +} \ No newline at end of file diff --git a/lib/core/viewModels/pharmacyModule/brand_view_model.dart b/lib/core/viewModels/pharmacyModule/brand_view_model.dart new file mode 100644 index 00000000..2984632b --- /dev/null +++ b/lib/core/viewModels/pharmacyModule/brand_view_model.dart @@ -0,0 +1,41 @@ +import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; +import 'package:diplomaticquarterapp/core/viewModels/base_view_model.dart'; +import 'package:diplomaticquarterapp/models/pharmacy/brandModel.dart'; +import 'package:diplomaticquarterapp/models/pharmacy/topBrandsModel.dart'; +import 'package:diplomaticquarterapp/services/pharmacy_services/brands_service.dart'; + + +import '../../../locator.dart'; + +class BrandsViewModel extends BaseViewModel{ + BrandsService _brandsService = locator(); + List get brandsListList => _brandsService.brandsList; + + BrandsService _topBrandsService = locator(); + List get topBrandsListList => _topBrandsService.topBrandsList; + + bool hasError = false; + + + Future getBrandsData() async { + hasError = false; + setState(ViewState.Busy); + await _brandsService.getBrands(); + if (_brandsService.hasError) { + error = _brandsService.error; + setState(ViewState.ErrorLocal); + } else + setState(ViewState.Idle); + } + + Future getTopBrandsData() async { + hasError = false; + setState(ViewState.Busy); + await _topBrandsService.getTopBrands(); + if (_topBrandsService.hasError) { + error = _topBrandsService.error; + setState(ViewState.ErrorLocal); + } else + setState(ViewState.Idle); + } +} \ No newline at end of file diff --git a/lib/core/viewModels/pharmacyModule/product_detail_view_model.dart b/lib/core/viewModels/pharmacyModule/product_detail_view_model.dart new file mode 100644 index 00000000..aa693602 --- /dev/null +++ b/lib/core/viewModels/pharmacyModule/product_detail_view_model.dart @@ -0,0 +1,43 @@ +import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; +import 'package:diplomaticquarterapp/core/viewModels/base_view_model.dart'; +import 'package:diplomaticquarterapp/models/pharmacy/locationModel.dart'; +import 'package:diplomaticquarterapp/models/pharmacy/productDetailModel.dart'; +import 'package:diplomaticquarterapp/services/pharmacy_services/product_detail_service.dart'; + + +import '../../../locator.dart'; + +class ProductDetailViewModel extends BaseViewModel{ + ProductDetailService _productDetailService = locator(); + + List get productDetailService => _productDetailService.productDetailList; + + List get productLocationService => _productDetailService.productLocationList; + + bool hasError = false; + + + Future getProductReviewsData() async { + hasError = false; + setState(ViewState.Busy); + await _productDetailService.getProductReviews(); + if (_productDetailService.hasError) { + error = _productDetailService.error; + setState(ViewState.ErrorLocal); + } else + setState(ViewState.Idle); + } + + Future getProductLocationData() async { + hasError = false; + setState(ViewState.Busy); + await _productDetailService.getProductAvailabiltyDetail(); + if (_productDetailService.hasError) { + error = _productDetailService.error; + setState(ViewState.ErrorLocal); + } else + setState(ViewState.Idle); + } + + +} \ No newline at end of file diff --git a/lib/core/viewModels/pharmacyModule/review_view_model.dart b/lib/core/viewModels/pharmacyModule/review_view_model.dart new file mode 100644 index 00000000..3661820b --- /dev/null +++ b/lib/core/viewModels/pharmacyModule/review_view_model.dart @@ -0,0 +1,26 @@ +import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; +import 'package:diplomaticquarterapp/core/viewModels/base_view_model.dart'; +import 'package:diplomaticquarterapp/models/pharmacy/reviewModel.dart'; +import 'package:diplomaticquarterapp/services/pharmacy_services/review_service.dart'; + +import '../../../locator.dart'; + +class ReviewViewModel extends BaseViewModel{ + ReviewService _reviewService = locator(); + + List get reviewListList => _reviewService.reviewList; + + bool hasError = false; + + + Future getReviewData() async { + hasError = false; + setState(ViewState.Busy); + await _reviewService.getReview(); + if (_reviewService.hasError) { + error = _reviewService.error; + setState(ViewState.ErrorLocal); + } else + setState(ViewState.Idle); + } +} \ No newline at end of file diff --git a/lib/core/viewModels/pharmacyModule/wishlist_view_model.dart b/lib/core/viewModels/pharmacyModule/wishlist_view_model.dart new file mode 100644 index 00000000..788b7f3c --- /dev/null +++ b/lib/core/viewModels/pharmacyModule/wishlist_view_model.dart @@ -0,0 +1,36 @@ +import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; +import 'package:diplomaticquarterapp/core/viewModels/base_view_model.dart'; +import 'package:diplomaticquarterapp/models/pharmacy/Wishlist.dart'; +import 'package:diplomaticquarterapp/services/pharmacy_services/wishList_service.dart'; + +import '../../../locator.dart'; + +class WishListViewModel extends BaseViewModel{ + WishListService _wishlistService = locator(); + + List get wishListList => _wishlistService.wishListProducts; + bool hasError = false; + + +// Future getWishlistData() async { +// setState(ViewState.Busy); +// await _wishlistService.getWishlist(); +// if (_wishlistService.hasError) { +// error = _wishlistService.error; +// setState(ViewState.Error); +// } else { +// setState(ViewState.Idle); +// } +// } + + Future getWishlistData() async { + hasError = false; + setState(ViewState.Busy); + await _wishlistService.getWishlist(); + if (_wishlistService.hasError) { + error = _wishlistService.error; + setState(ViewState.ErrorLocal); + } else + setState(ViewState.Idle); + } +} \ No newline at end of file diff --git a/lib/locator.dart b/lib/locator.dart index 203bd8a0..ebf002b4 100644 --- a/lib/locator.dart +++ b/lib/locator.dart @@ -4,6 +4,8 @@ import 'package:diplomaticquarterapp/core/viewModels/AlHabibMedicalService/H2O_v import 'package:diplomaticquarterapp/core/viewModels/child_vaccines/user_information_view_model.dart'; import 'package:diplomaticquarterapp/core/viewModels/AlHabibMedicalService/home_health_care_view_model.dart'; import 'package:diplomaticquarterapp/core/viewModels/dashboard_view_model.dart'; +import 'package:diplomaticquarterapp/services/pharmacy_services/review_service.dart'; +import 'package:diplomaticquarterapp/services/pharmacy_services/wishList_service.dart'; import 'package:diplomaticquarterapp/uitl/navigation_service.dart'; import 'package:get_it/get_it.dart'; @@ -80,10 +82,16 @@ import 'core/viewModels/pharmacies_view_model.dart'; import 'core/service/pharmacies_service.dart'; import 'core/service/insurance_service.dart'; import 'core/viewModels/insurance_card_View_model.dart'; +import 'core/viewModels/pharmacyModule/brand_view_model.dart'; import 'core/viewModels/pharmacyModule/pharmacy_module_view_model.dart'; +import 'core/viewModels/pharmacyModule/product_detail_view_model.dart'; +import 'core/viewModels/pharmacyModule/review_view_model.dart'; +import 'core/viewModels/pharmacyModule/wishlist_view_model.dart'; import 'core/viewModels/qr_view_model.dart'; import 'core/viewModels/vaccine_view_model.dart'; import 'core/service/vaccine_service.dart'; +import 'services/pharmacy_services/brands_service.dart'; +import 'services/pharmacy_services/product_detail_service.dart'; GetIt locator = GetIt.instance; @@ -139,6 +147,10 @@ void setupLocator() { locator.registerLazySingleton(() => PharmacyModuleService()); + locator.registerLazySingleton(() => WishListService()); + locator.registerLazySingleton(() => ReviewService()); + locator.registerLazySingleton(() => BrandsService()); + locator.registerLazySingleton(() => ProductDetailService()); /// View Model @@ -190,5 +202,10 @@ void setupLocator() { locator.registerFactory(() => PharmacyModuleViewModel()); + locator.registerFactory(() => WishListViewModel()); + locator.registerFactory(() => ReviewViewModel()); + locator.registerFactory(() => BrandsViewModel()); + locator.registerFactory(() => ProductDetailViewModel()); + } diff --git a/lib/models/pharmacy/Wishlist.dart b/lib/models/pharmacy/Wishlist.dart new file mode 100644 index 00000000..41704ede --- /dev/null +++ b/lib/models/pharmacy/Wishlist.dart @@ -0,0 +1,881 @@ +// To parse this JSON data, do +// +// final wishlist = wishlistFromJson(jsonString); + +import 'dart:convert'; + +List wishlistFromJson(String str) => List.from(json.decode(str).map((x) => Wishlist.fromJson(x))); + +String wishlistToJson(List data) => json.encode(List.from(data.map((x) => x.toJson()))); + +class Wishlist { + Wishlist({ + this.languageId, + this.id, + this.productAttributes, + this.customerEnteredPrice, + this.quantity, + this.discountAmountInclTax, + this.subtotal, + this.subtotalWithVat, + this.subtotalVatAmount, + this.subtotalVatRate, + this.currency, + this.currencyn, + this.rentalStartDateUtc, + this.rentalEndDateUtc, + this.createdOnUtc, + this.updatedOnUtc, + this.shoppingCartType, + this.productId, + this.product, + this.customerId, + this.customer, + }); + + dynamic languageId; + dynamic id; + List productAttributes; + dynamic customerEnteredPrice; + dynamic quantity; + dynamic discountAmountInclTax; + dynamic subtotal; + dynamic subtotalWithVat; + dynamic subtotalVatAmount; + dynamic subtotalVatRate; + dynamic currency; + dynamic currencyn; + dynamic rentalStartDateUtc; + dynamic rentalEndDateUtc; + dynamic createdOnUtc; + dynamic updatedOnUtc; + dynamic shoppingCartType; + dynamic productId; + dynamic product; + dynamic customerId; + Customer customer; + + factory Wishlist.fromJson(Map json) => Wishlist( + languageId: json["language_id"], + id: json["id"], + productAttributes: List.from(json["product_attributes"].map((x) => x)), + customerEnteredPrice: json["customer_entered_price"], + quantity: json["quantity"], + discountAmountInclTax: json["discount_amount_incl_tax"], + subtotal: json["subtotal"], + subtotalWithVat: json["subtotal_with_vat"], + subtotalVatAmount: json["subtotal_vat_amount"], + subtotalVatRate: json["subtotal_vat_rate"], + currency: json["currency"], + currencyn: json["currencyn"], + rentalStartDateUtc: json["rental_start_date_utc"], + rentalEndDateUtc: json["rental_end_date_utc"], + createdOnUtc: DateTime.parse(json["created_on_utc"]), + updatedOnUtc: DateTime.parse(json["updated_on_utc"]), + shoppingCartType: json["shopping_cart_type"], + productId: json["product_id"], + product: Product.fromJson(json["product"]), + customerId: json["customer_id"], + customer: Customer.fromJson(json["customer"]), + ); + + Map toJson() => { + "language_id": languageId, + "id": id, + "product_attributes": List.from(productAttributes.map((x) => x)), + "customer_entered_price": customerEnteredPrice, + "quantity": quantity, + "discount_amount_incl_tax": discountAmountInclTax, + "subtotal": subtotal, + "subtotal_with_vat": subtotalWithVat, + "subtotal_vat_amount": subtotalVatAmount, + "subtotal_vat_rate": subtotalVatRate, + "currency": currency, + "currencyn": currencyn, + "rental_start_date_utc": rentalStartDateUtc, + "rental_end_date_utc": rentalEndDateUtc, + "created_on_utc": createdOnUtc.toIso8601String(), + "updated_on_utc": updatedOnUtc.toIso8601String(), + "shopping_cart_type": shoppingCartType, + "product_id": productId, + "product": product.toJson(), + "customer_id": customerId, + "customer": customer.toJson(), + }; +} + +class Customer { + Customer({ + this.billingAddress, + this.shippingAddress, + this.addresses, + this.id, + this.username, + this.email, + this.firstName, + this.lastName, + this.languageId, + this.adminComment, + this.isTaxExempt, + this.hasShoppingCartItems, + this.active, + this.deleted, + this.isSystemAccount, + this.systemName, + this.lastIpAddress, + this.createdOnUtc, + this.lastLoginDateUtc, + this.lastActivityDateUtc, + this.registeredInStoreId, + this.roleIds, + }); + + Address billingAddress; + Address shippingAddress; + List

addresses; + String id; + String username; + String email; + dynamic firstName; + dynamic lastName; + dynamic languageId; + dynamic adminComment; + bool isTaxExempt; + bool hasShoppingCartItems; + bool active; + bool deleted; + bool isSystemAccount; + dynamic systemName; + String lastIpAddress; + DateTime createdOnUtc; + DateTime lastLoginDateUtc; + DateTime lastActivityDateUtc; + dynamic registeredInStoreId; + List roleIds; + + factory Customer.fromJson(Map json) => Customer( + billingAddress: Address.fromJson(json["billing_address"]), + shippingAddress: Address.fromJson(json["shipping_address"]), + addresses: List
.from(json["addresses"].map((x) => Address.fromJson(x))), + id: json["id"], + username: json["username"], + email: json["email"], + firstName: json["first_name"], + lastName: json["last_name"], + languageId: json["language_id"], + adminComment: json["admin_comment"], + isTaxExempt: json["is_tax_exempt"], + hasShoppingCartItems: json["has_shopping_cart_items"], + active: json["active"], + deleted: json["deleted"], + isSystemAccount: json["is_system_account"], + systemName: json["system_name"], + lastIpAddress: json["last_ip_address"], + createdOnUtc: DateTime.parse(json["created_on_utc"]), + lastLoginDateUtc: DateTime.parse(json["last_login_date_utc"]), + lastActivityDateUtc: DateTime.parse(json["last_activity_date_utc"]), + registeredInStoreId: json["registered_in_store_id"], + roleIds: List.from(json["role_ids"].map((x) => x)), + ); + + Map toJson() => { + "billing_address": billingAddress.toJson(), + "shipping_address": shippingAddress.toJson(), + "addresses": List.from(addresses.map((x) => x.toJson())), + "id": id, + "username": username, + "email": email, + "first_name": firstName, + "last_name": lastName, + "language_id": languageId, + "admin_comment": adminComment, + "is_tax_exempt": isTaxExempt, + "has_shopping_cart_items": hasShoppingCartItems, + "active": active, + "deleted": deleted, + "is_system_account": isSystemAccount, + "system_name": systemName, + "last_ip_address": lastIpAddress, + "created_on_utc": createdOnUtc.toIso8601String(), + "last_login_date_utc": lastLoginDateUtc.toIso8601String(), + "last_activity_date_utc": lastActivityDateUtc.toIso8601String(), + "registered_in_store_id": registeredInStoreId, + "role_ids": List.from(roleIds.map((x) => x)), + }; +} + +class Address { + Address({ + this.id, + this.firstName, + this.lastName, + this.email, + this.company, + this.countryId, + this.country, + this.stateProvinceId, + this.city, + this.address1, + this.address2, + this.zipPostalCode, + this.phoneNumber, + this.faxNumber, + this.customerAttributes, + this.createdOnUtc, + this.province, + this.latLong, + }); + + String id; + FirstName firstName; + LastName lastName; + Email email; + dynamic company; + dynamic countryId; + Country country; + dynamic stateProvinceId; + City city; + String address1; + String address2; + String zipPostalCode; + String phoneNumber; + dynamic faxNumber; + String customerAttributes; + DateTime createdOnUtc; + dynamic province; + String latLong; + + factory Address.fromJson(Map json) => Address( + id: json["id"], + firstName: firstNameValues.map[json["first_name"]], + lastName: lastNameValues.map[json["last_name"]], + email: emailValues.map[json["email"]], + company: json["company"], + countryId: json["country_id"], + country: countryValues.map[json["country"]], + stateProvinceId: json["state_province_id"], + city: cityValues.map[json["city"]], + address1: json["address1"], + address2: json["address2"], + zipPostalCode: json["zip_postal_code"], + phoneNumber: json["phone_number"], + faxNumber: json["fax_number"], + customerAttributes: json["customer_attributes"], + createdOnUtc: DateTime.parse(json["created_on_utc"]), + province: json["province"], + latLong: json["lat_long"], + ); + + Map toJson() => { + "id": id, + "first_name": firstNameValues.reverse[firstName], + "last_name": lastNameValues.reverse[lastName], + "email": emailValues.reverse[email], + "company": company, + "country_id": countryId, + "country": countryValues.reverse[country], + "state_province_id": stateProvinceId, + "city": cityValues.reverse[city], + "address1": address1, + "address2": address2, + "zip_postal_code": zipPostalCode, + "phone_number": phoneNumber, + "fax_number": faxNumber, + "customer_attributes": customerAttributes, + "created_on_utc": createdOnUtc.toIso8601String(), + "province": province, + "lat_long": latLong, + }; +} + +enum City { RIYADH, AL_OYUN } + +final cityValues = EnumValues({ + "Al Oyun": City.AL_OYUN, + "Riyadh": City.RIYADH +}); + +enum Country { SAUDI_ARABIA } + +final countryValues = EnumValues({ + "Saudi Arabia": Country.SAUDI_ARABIA +}); + +enum Email { TAMER_FANASHEH_GMAIL_COM, TAMER_DASDASDAS_GMAIL_COM } + +final emailValues = EnumValues({ + "Tamer.dasdasdas@gmail.com": Email.TAMER_DASDASDAS_GMAIL_COM, + "Tamer.fanasheh@gmail.com": Email.TAMER_FANASHEH_GMAIL_COM +}); + +enum FirstName { TAMER, TAMER_FANASHEH } + +final firstNameValues = EnumValues({ + "TAMER": FirstName.TAMER, + "TAMER FANASHEH": FirstName.TAMER_FANASHEH +}); + +enum LastName { FANASHEH, MUSA } + +final lastNameValues = EnumValues({ + "FANASHEH": LastName.FANASHEH, + "MUSA": LastName.MUSA +}); + +class Product { + Product({ + this.id, + this.visibleIndividually, + this.name, + this.namen, + this.localizedNames, + this.shortDescription, + this.shortDescriptionn, + this.fullDescription, + this.fullDescriptionn, + this.markasNew, + this.showOnHomePage, + this.metaKeywords, + this.metaDescription, + this.metaTitle, + this.allowCustomerReviews, + this.approvedRatingSum, + this.notApprovedRatingSum, + this.approvedTotalReviews, + this.notApprovedTotalReviews, + this.sku, + this.isRx, + this.prescriptionRequired, + this.rxMessage, + this.rxMessagen, + this.manufacturerPartNumber, + this.gtin, + this.isGiftCard, + this.requireOtherProducts, + this.automaticallyAddRequiredProducts, + this.isDownload, + this.unlimitedDownloads, + this.maxNumberOfDownloads, + this.downloadExpirationDays, + this.hasSampleDownload, + this.hasUserAgreement, + this.isRecurring, + this.recurringCycleLength, + this.recurringTotalCycles, + this.isRental, + this.rentalPriceLength, + this.isShipEnabled, + this.isFreeShipping, + this.shipSeparately, + this.additionalShippingCharge, + this.isTaxExempt, + this.isTelecommunicationsOrBroadcastingOrElectronicServices, + this.useMultipleWarehouses, + this.manageInventoryMethodId, + this.stockQuantity, + this.stockAvailability, + this.stockAvailabilityn, + this.displayStockAvailability, + this.displayStockQuantity, + this.minStockQuantity, + this.notifyAdminForQuantityBelow, + this.allowBackInStockSubscriptions, + this.orderMinimumQuantity, + this.orderMaximumQuantity, + this.allowedQuantities, + this.allowAddingOnlyExistingAttributeCombinations, + this.disableBuyButton, + this.disableWishlistButton, + this.availableForPreOrder, + this.preOrderAvailabilityStartDateTimeUtc, + this.callForPrice, + this.price, + this.oldPrice, + this.productCost, + this.specialPrice, + this.specialPriceStartDateTimeUtc, + this.specialPriceEndDateTimeUtc, + this.customerEntersPrice, + this.minimumCustomerEnteredPrice, + this.maximumCustomerEnteredPrice, + this.basepriceEnabled, + this.basepriceAmount, + this.basepriceBaseAmount, + this.hasTierPrices, + this.hasDiscountsApplied, + this.discountName, + this.discountNamen, + this.discountDescription, + this.discountDescriptionn, + this.discountPercentage, + this.currency, + this.currencyn, + this.weight, + this.length, + this.width, + this.height, + this.availableStartDateTimeUtc, + this.availableEndDateTimeUtc, + this.displayOrder, + this.published, + this.deleted, + this.createdOnUtc, + this.updatedOnUtc, + this.productType, + this.parentGroupedProductId, + this.roleIds, + this.discountIds, + this.storeIds, + this.manufacturerIds, + this.reviews, + this.images, + this.attributes, + this.specifications, + this.associatedProductIds, + this.tags, + this.vendorId, + this.seName, + }); + + String id; + bool visibleIndividually; + String name; + String namen; + List localizedNames; + String shortDescription; + String shortDescriptionn; + String fullDescription; + String fullDescriptionn; + bool markasNew; + bool showOnHomePage; + dynamic metaKeywords; + dynamic metaDescription; + dynamic metaTitle; + bool allowCustomerReviews; + dynamic approvedRatingSum; + dynamic notApprovedRatingSum; + dynamic approvedTotalReviews; + dynamic notApprovedTotalReviews; + String sku; + bool isRx; + bool prescriptionRequired; + dynamic rxMessage; + dynamic rxMessagen; + dynamic manufacturerPartNumber; + dynamic gtin; + bool isGiftCard; + bool requireOtherProducts; + bool automaticallyAddRequiredProducts; + bool isDownload; + bool unlimitedDownloads; + dynamic maxNumberOfDownloads; + dynamic downloadExpirationDays; + bool hasSampleDownload; + bool hasUserAgreement; + bool isRecurring; + dynamic recurringCycleLength; + dynamic recurringTotalCycles; + bool isRental; + dynamic rentalPriceLength; + bool isShipEnabled; + bool isFreeShipping; + bool shipSeparately; + dynamic additionalShippingCharge; + bool isTaxExempt; + bool isTelecommunicationsOrBroadcastingOrElectronicServices; + bool useMultipleWarehouses; + dynamic manageInventoryMethodId; + dynamic stockQuantity; + String stockAvailability; + String stockAvailabilityn; + bool displayStockAvailability; + bool displayStockQuantity; + dynamic minStockQuantity; + dynamic notifyAdminForQuantityBelow; + bool allowBackInStockSubscriptions; + dynamic orderMinimumQuantity; + dynamic orderMaximumQuantity; + dynamic allowedQuantities; + bool allowAddingOnlyExistingAttributeCombinations; + bool disableBuyButton; + bool disableWishlistButton; + bool availableForPreOrder; + dynamic preOrderAvailabilityStartDateTimeUtc; + bool callForPrice; + double price; + dynamic oldPrice; + double productCost; + dynamic specialPrice; + dynamic specialPriceStartDateTimeUtc; + dynamic specialPriceEndDateTimeUtc; + bool customerEntersPrice; + dynamic minimumCustomerEnteredPrice; + dynamic maximumCustomerEnteredPrice; + bool basepriceEnabled; + dynamic basepriceAmount; + dynamic basepriceBaseAmount; + bool hasTierPrices; + bool hasDiscountsApplied; + dynamic discountName; + dynamic discountNamen; + dynamic discountDescription; + dynamic discountDescriptionn; + dynamic discountPercentage; + String currency; + String currencyn; + double weight; + dynamic length; + dynamic width; + dynamic height; + dynamic availableStartDateTimeUtc; + dynamic availableEndDateTimeUtc; + dynamic displayOrder; + bool published; + bool deleted; + DateTime createdOnUtc; + DateTime updatedOnUtc; + String productType; + dynamic parentGroupedProductId; + List roleIds; + List discountIds; + List storeIds; + List manufacturerIds; + List reviews; + List images; + List attributes; + List specifications; + List associatedProductIds; + List tags; + dynamic vendorId; + String seName; + + factory Product.fromJson(Map json) => Product( + id: json["id"], + visibleIndividually: json["visible_individually"], + name: json["name"], + namen: json["namen"], + localizedNames: List.from(json["localized_names"].map((x) => LocalizedName.fromJson(x))), + shortDescription: json["short_description"], + shortDescriptionn: json["short_descriptionn"], + fullDescription: json["full_description"], + fullDescriptionn: json["full_descriptionn"], + markasNew: json["markas_new"], + showOnHomePage: json["show_on_home_page"], + metaKeywords: json["meta_keywords"], + metaDescription: json["meta_description"], + metaTitle: json["meta_title"], + allowCustomerReviews: json["allow_customer_reviews"], + approvedRatingSum: json["approved_rating_sum"], + notApprovedRatingSum: json["not_approved_rating_sum"], + approvedTotalReviews: json["approved_total_reviews"], + notApprovedTotalReviews: json["not_approved_total_reviews"], + sku: json["sku"], + isRx: json["is_rx"], + prescriptionRequired: json["prescription_required"], + rxMessage: json["rx_message"], + rxMessagen: json["rx_messagen"], + manufacturerPartNumber: json["manufacturer_part_number"], + gtin: json["gtin"], + isGiftCard: json["is_gift_card"], + requireOtherProducts: json["require_other_products"], + automaticallyAddRequiredProducts: json["automatically_add_required_products"], + isDownload: json["is_download"], + unlimitedDownloads: json["unlimited_downloads"], + maxNumberOfDownloads: json["max_number_of_downloads"], + downloadExpirationDays: json["download_expiration_days"], + hasSampleDownload: json["has_sample_download"], + hasUserAgreement: json["has_user_agreement"], + isRecurring: json["is_recurring"], + recurringCycleLength: json["recurring_cycle_length"], + recurringTotalCycles: json["recurring_total_cycles"], + isRental: json["is_rental"], + rentalPriceLength: json["rental_price_length"], + isShipEnabled: json["is_ship_enabled"], + isFreeShipping: json["is_free_shipping"], + shipSeparately: json["ship_separately"], + additionalShippingCharge: json["additional_shipping_charge"], + isTaxExempt: json["is_tax_exempt"], + isTelecommunicationsOrBroadcastingOrElectronicServices: json["is_telecommunications_or_broadcasting_or_electronic_services"], + useMultipleWarehouses: json["use_multiple_warehouses"], + manageInventoryMethodId: json["manage_inventory_method_id"], + stockQuantity: json["stock_quantity"], + stockAvailability: json["stock_availability"], + stockAvailabilityn: json["stock_availabilityn"], + displayStockAvailability: json["display_stock_availability"], + displayStockQuantity: json["display_stock_quantity"], + minStockQuantity: json["min_stock_quantity"], + notifyAdminForQuantityBelow: json["notify_admin_for_quantity_below"], + allowBackInStockSubscriptions: json["allow_back_in_stock_subscriptions"], + orderMinimumQuantity: json["order_minimum_quantity"], + orderMaximumQuantity: json["order_maximum_quantity"], + allowedQuantities: json["allowed_quantities"], + allowAddingOnlyExistingAttributeCombinations: json["allow_adding_only_existing_attribute_combinations"], + disableBuyButton: json["disable_buy_button"], + disableWishlistButton: json["disable_wishlist_button"], + availableForPreOrder: json["available_for_pre_order"], + preOrderAvailabilityStartDateTimeUtc: json["pre_order_availability_start_date_time_utc"], + callForPrice: json["call_for_price"], + price: json["price"].toDouble(), + oldPrice: json["old_price"], + productCost: json["product_cost"].toDouble(), + specialPrice: json["special_price"], + specialPriceStartDateTimeUtc: json["special_price_start_date_time_utc"], + specialPriceEndDateTimeUtc: json["special_price_end_date_time_utc"], + customerEntersPrice: json["customer_enters_price"], + minimumCustomerEnteredPrice: json["minimum_customer_entered_price"], + maximumCustomerEnteredPrice: json["maximum_customer_entered_price"], + basepriceEnabled: json["baseprice_enabled"], + basepriceAmount: json["baseprice_amount"], + basepriceBaseAmount: json["baseprice_base_amount"], + hasTierPrices: json["has_tier_prices"], + hasDiscountsApplied: json["has_discounts_applied"], + discountName: json["discount_name"], + discountNamen: json["discount_namen"], + discountDescription: json["discount_description"], + discountDescriptionn: json["discount_Descriptionn"], + discountPercentage: json["discount_percentage"], + currency: json["currency"], + currencyn: json["currencyn"], + weight: json["weight"].toDouble(), + length: json["length"], + width: json["width"], + height: json["height"], + availableStartDateTimeUtc: json["available_start_date_time_utc"], + availableEndDateTimeUtc: json["available_end_date_time_utc"], + displayOrder: json["display_order"], + published: json["published"], + deleted: json["deleted"], + createdOnUtc: DateTime.parse(json["created_on_utc"]), + updatedOnUtc: DateTime.parse(json["updated_on_utc"]), + productType: json["product_type"], + parentGroupedProductId: json["parent_grouped_product_id"], + roleIds: List.from(json["role_ids"].map((x) => x)), + discountIds: List.from(json["discount_ids"].map((x) => x)), + storeIds: List.from(json["store_ids"].map((x) => x)), + manufacturerIds: List.from(json["manufacturer_ids"].map((x) => x)), + reviews: List.from(json["reviews"].map((x) => x)), + images: List.from(json["images"].map((x) => Image.fromJson(x))), + attributes: List.from(json["attributes"].map((x) => x)), + specifications: List.from(json["specifications"].map((x) => Specification.fromJson(x))), + associatedProductIds: List.from(json["associated_product_ids"].map((x) => x)), + tags: List.from(json["tags"].map((x) => x)), + vendorId: json["vendor_id"], + seName: json["se_name"], + ); + + Map toJson() => { + "id": id, + "visible_individually": visibleIndividually, + "name": name, + "namen": namen, + "localized_names": List.from(localizedNames.map((x) => x.toJson())), + "short_description": shortDescription, + "short_descriptionn": shortDescriptionn, + "full_description": fullDescription, + "full_descriptionn": fullDescriptionn, + "markas_new": markasNew, + "show_on_home_page": showOnHomePage, + "meta_keywords": metaKeywords, + "meta_description": metaDescription, + "meta_title": metaTitle, + "allow_customer_reviews": allowCustomerReviews, + "approved_rating_sum": approvedRatingSum, + "not_approved_rating_sum": notApprovedRatingSum, + "approved_total_reviews": approvedTotalReviews, + "not_approved_total_reviews": notApprovedTotalReviews, + "sku": sku, + "is_rx": isRx, + "prescription_required": prescriptionRequired, + "rx_message": rxMessage, + "rx_messagen": rxMessagen, + "manufacturer_part_number": manufacturerPartNumber, + "gtin": gtin, + "is_gift_card": isGiftCard, + "require_other_products": requireOtherProducts, + "automatically_add_required_products": automaticallyAddRequiredProducts, + "is_download": isDownload, + "unlimited_downloads": unlimitedDownloads, + "max_number_of_downloads": maxNumberOfDownloads, + "download_expiration_days": downloadExpirationDays, + "has_sample_download": hasSampleDownload, + "has_user_agreement": hasUserAgreement, + "is_recurring": isRecurring, + "recurring_cycle_length": recurringCycleLength, + "recurring_total_cycles": recurringTotalCycles, + "is_rental": isRental, + "rental_price_length": rentalPriceLength, + "is_ship_enabled": isShipEnabled, + "is_free_shipping": isFreeShipping, + "ship_separately": shipSeparately, + "additional_shipping_charge": additionalShippingCharge, + "is_tax_exempt": isTaxExempt, + "is_telecommunications_or_broadcasting_or_electronic_services": isTelecommunicationsOrBroadcastingOrElectronicServices, + "use_multiple_warehouses": useMultipleWarehouses, + "manage_inventory_method_id": manageInventoryMethodId, + "stock_quantity": stockQuantity, + "stock_availability": stockAvailability, + "stock_availabilityn": stockAvailabilityn, + "display_stock_availability": displayStockAvailability, + "display_stock_quantity": displayStockQuantity, + "min_stock_quantity": minStockQuantity, + "notify_admin_for_quantity_below": notifyAdminForQuantityBelow, + "allow_back_in_stock_subscriptions": allowBackInStockSubscriptions, + "order_minimum_quantity": orderMinimumQuantity, + "order_maximum_quantity": orderMaximumQuantity, + "allowed_quantities": allowedQuantities, + "allow_adding_only_existing_attribute_combinations": allowAddingOnlyExistingAttributeCombinations, + "disable_buy_button": disableBuyButton, + "disable_wishlist_button": disableWishlistButton, + "available_for_pre_order": availableForPreOrder, + "pre_order_availability_start_date_time_utc": preOrderAvailabilityStartDateTimeUtc, + "call_for_price": callForPrice, + "price": price, + "old_price": oldPrice, + "product_cost": productCost, + "special_price": specialPrice, + "special_price_start_date_time_utc": specialPriceStartDateTimeUtc, + "special_price_end_date_time_utc": specialPriceEndDateTimeUtc, + "customer_enters_price": customerEntersPrice, + "minimum_customer_entered_price": minimumCustomerEnteredPrice, + "maximum_customer_entered_price": maximumCustomerEnteredPrice, + "baseprice_enabled": basepriceEnabled, + "baseprice_amount": basepriceAmount, + "baseprice_base_amount": basepriceBaseAmount, + "has_tier_prices": hasTierPrices, + "has_discounts_applied": hasDiscountsApplied, + "discount_name": discountName, + "discount_namen": discountNamen, + "discount_description": discountDescription, + "discount_Descriptionn": discountDescriptionn, + "discount_percentage": discountPercentage, + "currency": currency, + "currencyn": currencyn, + "weight": weight, + "length": length, + "width": width, + "height": height, + "available_start_date_time_utc": availableStartDateTimeUtc, + "available_end_date_time_utc": availableEndDateTimeUtc, + "display_order": displayOrder, + "published": published, + "deleted": deleted, + "created_on_utc": createdOnUtc.toIso8601String(), + "updated_on_utc": updatedOnUtc.toIso8601String(), + "product_type": productType, + "parent_grouped_product_id": parentGroupedProductId, + "role_ids": List.from(roleIds.map((x) => x)), + "discount_ids": List.from(discountIds.map((x) => x)), + "store_ids": List.from(storeIds.map((x) => x)), + "manufacturer_ids": List.from(manufacturerIds.map((x) => x)), + "reviews": List.from(reviews.map((x) => x)), + "images": List.from(images.map((x) => x.toJson())), + "attributes": List.from(attributes.map((x) => x)), + "specifications": List.from(specifications.map((x) => x.toJson())), + "associated_product_ids": List.from(associatedProductIds.map((x) => x)), + "tags": List.from(tags.map((x) => x)), + "vendor_id": vendorId, + "se_name": seName, + }; +} + +class Image { + Image({ + this.id, + this.position, + this.src, + this.thumb, + this.attachment, + }); + + dynamic id; + dynamic position; + String src; + String thumb; + String attachment; + + factory Image.fromJson(Map json) => Image( + id: json["id"], + position: json["position"], + src: json["src"], + thumb: json["thumb"], + attachment: json["attachment"], + ); + + Map toJson() => { + "id": id, + "position": position, + "src": src, + "thumb": thumb, + "attachment": attachment, + }; +} + +class LocalizedName { + LocalizedName({ + this.languageId, + this.localizedName, + }); + + dynamic languageId; + String localizedName; + + factory LocalizedName.fromJson(Map json) => LocalizedName( + languageId: json["language_id"], + localizedName: json["localized_name"], + ); + + Map toJson() => { + "language_id": languageId, + "localized_name": localizedName, + }; +} + +class Specification { + Specification({ + this.id, + this.displayOrder, + this.defaultValue, + this.defaultValuen, + this.name, + this.nameN, + }); + + dynamic id; + dynamic displayOrder; + String defaultValue; + String defaultValuen; + String name; + String nameN; + + factory Specification.fromJson(Map json) => Specification( + id: json["id"], + displayOrder: json["display_order"], + defaultValue: json["default_value"], + defaultValuen: json["default_valuen"], + name: json["name"], + nameN: json["nameN"], + ); + + Map toJson() => { + "id": id, + "display_order": displayOrder, + "default_value": defaultValue, + "default_valuen": defaultValuen, + "name": name, + "nameN": nameN, + }; +} + +class EnumValues { + Map map; + Map reverseMap; + + EnumValues(this.map); + + Map get reverse { + if (reverseMap == null) { + reverseMap = map.map((k, v) => new MapEntry(v, k)); + } + return reverseMap; + } +} diff --git a/lib/models/pharmacy/brandModel.dart b/lib/models/pharmacy/brandModel.dart new file mode 100644 index 00000000..b20afa33 --- /dev/null +++ b/lib/models/pharmacy/brandModel.dart @@ -0,0 +1,157 @@ +// To parse this JSON data, do +// +// final brand = brandFromJson(jsonString); + +import 'dart:convert'; + +List brandFromJson(String str) => List.from(json.decode(str).map((x) => Brand.fromJson(x))); + +String brandToJson(List data) => json.encode(List.from(data.map((x) => x.toJson()))); + +class Brand { + Brand({ + this.id, + this.name, + this.namen, + this.localizedNames, + this.description, + this.manufacturerTemplateId, + this.metaKeywords, + this.metaDescription, + this.metaTitle, + this.pageSize, + this.pageSizeOptions, + this.priceRanges, + this.published, + this.deleted, + this.displayOrder, + this.createdOnUtc, + this.updatedOnUtc, + this.image, + }); + + String id; + String name; + String namen; + List localizedNames; + String description; + int manufacturerTemplateId; + String metaKeywords; + dynamic metaDescription; + dynamic metaTitle; + int pageSize; + PageSizeOptions pageSizeOptions; + dynamic priceRanges; + bool published; + bool deleted; + int displayOrder; + DateTime createdOnUtc; + DateTime updatedOnUtc; + Image image; + + factory Brand.fromJson(Map json) => Brand( + id: json["id"], + name: json["name"], + namen: json["namen"], + localizedNames: List.from(json["localized_names"].map((x) => LocalizedName.fromJson(x))), + description: json["description"] == null ? null : json["description"], + manufacturerTemplateId: json["manufacturer_template_id"], + metaKeywords: json["meta_keywords"], + metaDescription: json["meta_description"], + metaTitle: json["meta_title"], + pageSize: json["page_size"], + pageSizeOptions: pageSizeOptionsValues.map[json["page_size_options"]], + priceRanges: json["price_ranges"], + published: json["published"], + deleted: json["deleted"], + displayOrder: json["display_order"], + createdOnUtc: DateTime.parse(json["created_on_utc"]), + updatedOnUtc: DateTime.parse(json["updated_on_utc"]), + image: json["image"] == null ? null : Image.fromJson(json["image"]), + ); + + Map toJson() => { + "id": id, + "name": name, + "namen": namen, + "localized_names": List.from(localizedNames.map((x) => x.toJson())), + "description": description == null ? null : description, + "manufacturer_template_id": manufacturerTemplateId, + "meta_keywords": metaKeywords, + "meta_description": metaDescription, + "meta_title": metaTitle, + "page_size": pageSize, + "page_size_options": pageSizeOptionsValues.reverse[pageSizeOptions], + "price_ranges": priceRanges, + "published": published, + "deleted": deleted, + "display_order": displayOrder, + "created_on_utc": createdOnUtc.toIso8601String(), + "updated_on_utc": updatedOnUtc.toIso8601String(), + "image": image == null ? null : image.toJson(), + }; +} + +class Image { + Image({ + this.src, + this.thumb, + this.attachment, + }); + + String src; + dynamic thumb; + dynamic attachment; + + factory Image.fromJson(Map json) => Image( + src: json["src"], + thumb: json["thumb"], + attachment: json["attachment"], + ); + + Map toJson() => { + "src": src, + "thumb": thumb, + "attachment": attachment, + }; +} + +class LocalizedName { + LocalizedName({ + this.languageId, + this.localizedName, + }); + + int languageId; + String localizedName; + + factory LocalizedName.fromJson(Map json) => LocalizedName( + languageId: json["language_id"], + localizedName: json["localized_name"], + ); + + Map toJson() => { + "language_id": languageId, + "localized_name": localizedName, + }; +} + +enum PageSizeOptions { THE_2460100 } + +final pageSizeOptionsValues = EnumValues({ + "24, 60, 100": PageSizeOptions.THE_2460100 +}); + +class EnumValues { + Map map; + Map reverseMap; + + EnumValues(this.map); + + Map get reverse { + if (reverseMap == null) { + reverseMap = map.map((k, v) => new MapEntry(v, k)); + } + return reverseMap; + } +} diff --git a/lib/models/pharmacy/locationModel.dart b/lib/models/pharmacy/locationModel.dart new file mode 100644 index 00000000..36ee7350 --- /dev/null +++ b/lib/models/pharmacy/locationModel.dart @@ -0,0 +1,159 @@ +// To parse this JSON data, do +// +// final locationModel = locationModelFromJson(jsonString); + +import 'dart:convert'; + +List locationModelFromJson(String str) => List.from(json.decode(str).map((x) => LocationModel.fromJson(x))); + +String locationModelToJson(List data) => json.encode(List.from(data.map((x) => x.toJson()))); + +class LocationModel { + LocationModel({ + this.expiryDate, + this.sellingPrice, + this.quantity, + this.itemId, + this.locationId, + this.projectId, + this.setupId, + this.locationDescription, + this.locationDescriptionN, + this.itemDescription, + this.itemDescriptionN, + this.alias, + this.locationTypeId, + this.barcode, + this.companybarcode, + this.cityId, + this.cityName, + this.distanceInKilometers, + this.latitude, + this.locationType, + this.longitude, + this.phoneNumber, + this.projectImageUrl, + this.sortOrder, + }); + + ExpiryDate expiryDate; + double sellingPrice; + int quantity; + int itemId; + int locationId; + int projectId; + String setupId; + String locationDescription; + dynamic locationDescriptionN; + ItemDescription itemDescription; + dynamic itemDescriptionN; + Alias alias; + int locationTypeId; + int barcode; + dynamic companybarcode; + int cityId; + CityName cityName; + int distanceInKilometers; + String latitude; + int locationType; + String longitude; + String phoneNumber; + String projectImageUrl; + int sortOrder; + + factory LocationModel.fromJson(Map json) => LocationModel( + expiryDate: expiryDateValues.map[json["ExpiryDate"]], + sellingPrice: json["SellingPrice"].toDouble(), + quantity: json["Quantity"], + itemId: json["ItemID"], + locationId: json["LocationID"], + projectId: json["ProjectID"], + setupId: json["SetupID"], + locationDescription: json["LocationDescription"], + locationDescriptionN: json["LocationDescriptionN"], + itemDescription: itemDescriptionValues.map[json["ItemDescription"]], + itemDescriptionN: json["ItemDescriptionN"], + alias: aliasValues.map[json["Alias"]], + locationTypeId: json["LocationTypeID"], + barcode: json["Barcode"], + companybarcode: json["Companybarcode"], + cityId: json["CityID"], + cityName: cityNameValues.map[json["CityName"]], + distanceInKilometers: json["DistanceInKilometers"], + latitude: json["Latitude"], + locationType: json["LocationType"], + longitude: json["Longitude"], + phoneNumber: json["PhoneNumber"], + projectImageUrl: json["ProjectImageURL"], + sortOrder: json["SortOrder"], + ); + + Map toJson() => { + "ExpiryDate": expiryDateValues.reverse[expiryDate], + "SellingPrice": sellingPrice, + "Quantity": quantity, + "ItemID": itemId, + "LocationID": locationId, + "ProjectID": projectId, + "SetupID": setupId, + "LocationDescription": locationDescription, + "LocationDescriptionN": locationDescriptionN, + "ItemDescription": itemDescriptionValues.reverse[itemDescription], + "ItemDescriptionN": itemDescriptionN, + "Alias": aliasValues.reverse[alias], + "LocationTypeID": locationTypeId, + "Barcode": barcode, + "Companybarcode": companybarcode, + "CityID": cityId, + "CityName": cityNameValues.reverse[cityName], + "DistanceInKilometers": distanceInKilometers, + "Latitude": latitude, + "LocationType": locationType, + "Longitude": longitude, + "PhoneNumber": phoneNumber, + "ProjectImageURL": projectImageUrl, + "SortOrder": sortOrder, + }; +} + +enum Alias { CAPSULE } + +final aliasValues = EnumValues({ + "CAPSULE": Alias.CAPSULE +}); + +enum CityName { RIYADH, KHOBAR, QASSIM } + +final cityNameValues = EnumValues({ + "Khobar": CityName.KHOBAR, + "Qassim": CityName.QASSIM, + "Riyadh": CityName.RIYADH +}); + +enum ExpiryDate { DATE_16223220000000300, DATE_16250004000000300, DATE_16538580000000300 } + +final expiryDateValues = EnumValues({ + "/Date(1622322000000+0300)/": ExpiryDate.DATE_16223220000000300, + "/Date(1625000400000+0300)/": ExpiryDate.DATE_16250004000000300, + "/Date(1653858000000+0300)/": ExpiryDate.DATE_16538580000000300 +}); + +enum ItemDescription { XERACTAN_20_MG_CAP_30_S } + +final itemDescriptionValues = EnumValues({ + "XERACTAN 20 MG CAP 30'S": ItemDescription.XERACTAN_20_MG_CAP_30_S +}); + +class EnumValues { + Map map; + Map reverseMap; + + EnumValues(this.map); + + Map get reverse { + if (reverseMap == null) { + reverseMap = map.map((k, v) => new MapEntry(v, k)); + } + return reverseMap; + } +} diff --git a/lib/models/pharmacy/productDetailModel.dart b/lib/models/pharmacy/productDetailModel.dart new file mode 100644 index 00000000..d2e8f010 --- /dev/null +++ b/lib/models/pharmacy/productDetailModel.dart @@ -0,0 +1,249 @@ +// To parse this JSON data, do +// +// final productDetail = productDetailFromJson(jsonString); + +import 'dart:convert'; + +List productDetailFromJson(String str) => List.from(json.decode(str).map((x) => ProductDetail.fromJson(x))); + +String productDetailToJson(List data) => json.encode(List.from(data.map((x) => x.toJson()))); + +class ProductDetail { + ProductDetail({ + this.reviews, + }); + + List reviews; + + factory ProductDetail.fromJson(Map json) => ProductDetail( + reviews: List.from(json["reviews"].map((x) => Review.fromJson(x))), + ); + + Map toJson() => { + "reviews": List.from(reviews.map((x) => x.toJson())), + }; +} + +class Review { + Review({ + this.id, + this.position, + this.reviewId, + this.customerId, + this.productId, + this.storeId, + this.isApproved, + this.title, + this.reviewText, + this.replyText, + this.rating, + this.helpfulYesTotal, + this.helpfulNoTotal, + this.createdOnUtc, + this.customer, + this.product, + }); + + int id; + int position; + int reviewId; + int customerId; + int productId; + int storeId; + bool isApproved; + String title; + String reviewText; + dynamic replyText; + int rating; + int helpfulYesTotal; + int helpfulNoTotal; + DateTime createdOnUtc; + Customer customer; + dynamic product; + + factory Review.fromJson(Map json) => Review( + id: json["id"], + position: json["position"], + reviewId: json["review_id"], + customerId: json["customer_id"], + productId: json["product_id"], + storeId: json["store_id"], + isApproved: json["is_approved"], + title: json["title"], + reviewText: json["review_text"], + replyText: json["reply_text"], + rating: json["rating"], + helpfulYesTotal: json["helpful_yes_total"], + helpfulNoTotal: json["helpful_no_total"], + createdOnUtc: DateTime.parse(json["created_on_utc"]), + customer: Customer.fromJson(json["customer"]), + product: json["product"], + ); + + Map toJson() => { + "id": id, + "position": position, + "review_id": reviewId, + "customer_id": customerId, + "product_id": productId, + "store_id": storeId, + "is_approved": isApproved, + "title": title, + "review_text": reviewText, + "reply_text": replyText, + "rating": rating, + "helpful_yes_total": helpfulYesTotal, + "helpful_no_total": helpfulNoTotal, + "created_on_utc": createdOnUtc.toIso8601String(), + "customer": customer.toJson(), + "product": product, + }; +} + +class Customer { + Customer({ + this.fileNumber, + this.iqamaNumber, + this.isOutSa, + this.patientType, + this.gender, + this.birthDate, + this.phone, + this.countryCode, + this.yahalaAccountno, + this.billingAddress, + this.shippingAddress, + this.id, + this.username, + this.email, + this.firstName, + this.lastName, + this.languageId, + this.adminComment, + this.isTaxExempt, + this.hasShoppingCartItems, + this.active, + this.deleted, + this.isSystemAccount, + this.systemName, + this.lastIpAddress, + this.createdOnUtc, + this.lastLoginDateUtc, + this.lastActivityDateUtc, + this.registeredInStoreId, + }); + + dynamic fileNumber; + dynamic iqamaNumber; + int isOutSa; + int patientType; + dynamic gender; + DateTime birthDate; + dynamic phone; + dynamic countryCode; + dynamic yahalaAccountno; + dynamic billingAddress; + dynamic shippingAddress; + String id; + Email username; + Email email; + dynamic firstName; + dynamic lastName; + dynamic languageId; + dynamic adminComment; + dynamic isTaxExempt; + dynamic hasShoppingCartItems; + dynamic active; + dynamic deleted; + dynamic isSystemAccount; + dynamic systemName; + dynamic lastIpAddress; + dynamic createdOnUtc; + dynamic lastLoginDateUtc; + dynamic lastActivityDateUtc; + dynamic registeredInStoreId; + + factory Customer.fromJson(Map json) => Customer( + fileNumber: json["file_number"], + iqamaNumber: json["iqama_number"], + isOutSa: json["is_out_sa"], + patientType: json["patient_type"], + gender: json["gender"], + birthDate: DateTime.parse(json["birth_date"]), + phone: json["phone"], + countryCode: json["country_code"], + yahalaAccountno: json["yahala_accountno"], + billingAddress: json["billing_address"], + shippingAddress: json["shipping_address"], + id: json["id"], + username: emailValues.map[json["username"]], + email: emailValues.map[json["email"]], + firstName: json["first_name"], + lastName: json["last_name"], + languageId: json["language_id"], + adminComment: json["admin_comment"], + isTaxExempt: json["is_tax_exempt"], + hasShoppingCartItems: json["has_shopping_cart_items"], + active: json["active"], + deleted: json["deleted"], + isSystemAccount: json["is_system_account"], + systemName: json["system_name"], + lastIpAddress: json["last_ip_address"], + createdOnUtc: json["created_on_utc"], + lastLoginDateUtc: json["last_login_date_utc"], + lastActivityDateUtc: json["last_activity_date_utc"], + registeredInStoreId: json["registered_in_store_id"], + ); + + Map toJson() => { + "file_number": fileNumber, + "iqama_number": iqamaNumber, + "is_out_sa": isOutSa, + "patient_type": patientType, + "gender": gender, + "birth_date": birthDate.toIso8601String(), + "phone": phone, + "country_code": countryCode, + "yahala_accountno": yahalaAccountno, + "billing_address": billingAddress, + "shipping_address": shippingAddress, + "id": id, + "username": emailValues.reverse[username], + "email": emailValues.reverse[email], + "first_name": firstName, + "last_name": lastName, + "language_id": languageId, + "admin_comment": adminComment, + "is_tax_exempt": isTaxExempt, + "has_shopping_cart_items": hasShoppingCartItems, + "active": active, + "deleted": deleted, + "is_system_account": isSystemAccount, + "system_name": systemName, + "last_ip_address": lastIpAddress, + "created_on_utc": createdOnUtc, + "last_login_date_utc": lastLoginDateUtc, + "last_activity_date_utc": lastActivityDateUtc, + "registered_in_store_id": registeredInStoreId, + }; +} + +enum Email { STEVE_GATES_NOP_COMMERCE_COM } + +final emailValues = EnumValues({ + "steve_gates@nopCommerce.com": Email.STEVE_GATES_NOP_COMMERCE_COM +}); + +class EnumValues { + Map map; + Map reverseMap; + + EnumValues(this.map); + + Map get reverse { + if (reverseMap == null) { + reverseMap = map.map((k, v) => new MapEntry(v, k)); + } + return reverseMap; + } +} diff --git a/lib/models/pharmacy/products.dart b/lib/models/pharmacy/products.dart new file mode 100644 index 00000000..b4833c64 --- /dev/null +++ b/lib/models/pharmacy/products.dart @@ -0,0 +1,835 @@ +// To parse this JSON data, do +// +// final products = productsFromJson(jsonString); + +import 'dart:convert'; + +Products productsFromJson(String str) => Products.fromJson(json.decode(str)); + +String productsToJson(Products data) => json.encode(data.toJson()); + +class Products { + Products({ + this.messageStatus, + this.products, + }); + + dynamic messageStatus; + List products; + + factory Products.fromJson(Map json) => Products( + messageStatus: json["MessageStatus"], + products: List.from(json["products"].map((x) => Product.fromJson(x))), + ); + + Map toJson() => { + "MessageStatus": messageStatus, + "products": List.from(products.map((x) => x.toJson())), + }; +} + +class Product { + Product({ + this.id, + this.visibleIndividually, + this.name, + this.namen, + this.localizedNames, + this.shortDescription, + this.shortDescriptionn, + this.fullDescription, + this.fullDescriptionn, + this.markasNew, + this.showOnHomePage, + this.metaKeywords, + this.metaDescription, + this.metaTitle, + this.allowCustomerReviews, + this.approvedRatingSum, + this.notApprovedRatingSum, + this.approvedTotalReviews, + this.notApprovedTotalReviews, + this.sku, + this.isRx, + this.prescriptionRequired, + this.rxMessage, + this.rxMessagen, + this.manufacturerPartNumber, + this.gtin, + this.isGiftCard, + this.requireOtherProducts, + this.automaticallyAddRequiredProducts, + this.isDownload, + this.unlimitedDownloads, + this.maxNumberOfDownloads, + this.downloadExpirationDays, + this.hasSampleDownload, + this.hasUserAgreement, + this.isRecurring, + this.recurringCycleLength, + this.recurringTotalCycles, + this.isRental, + this.rentalPriceLength, + this.isShipEnabled, + this.isFreeShipping, + this.shipSeparately, + this.additionalShippingCharge, + this.isTaxExempt, + this.isTelecommunicationsOrBroadcastingOrElectronicServices, + this.useMultipleWarehouses, + this.manageInventoryMethodId, + this.stockQuantity, + this.stockAvailability, + this.stockAvailabilityn, + this.displayStockAvailability, + this.displayStockQuantity, + this.minStockQuantity, + this.notifyAdminForQuantityBelow, + this.allowBackInStockSubscriptions, + this.orderMinimumQuantity, + this.orderMaximumQuantity, + this.allowedQuantities, + this.allowAddingOnlyExistingAttributeCombinations, + this.disableBuyButton, + this.disableWishlistButton, + this.availableForPreOrder, + this.preOrderAvailabilityStartDateTimeUtc, + this.callForPrice, + this.price, + this.oldPrice, + this.productCost, + this.specialPrice, + this.specialPriceStartDateTimeUtc, + this.specialPriceEndDateTimeUtc, + this.customerEntersPrice, + this.minimumCustomerEnteredPrice, + this.maximumCustomerEnteredPrice, + this.basepriceEnabled, + this.basepriceAmount, + this.basepriceBaseAmount, + this.hasTierPrices, + this.hasDiscountsApplied, + this.discountName, + this.discountNamen, + this.discountDescription, + this.discountDescriptionn, + this.discountPercentage, + this.currency, + this.currencyn, + this.weight, + this.length, + this.width, + this.height, + this.availableStartDateTimeUtc, + this.availableEndDateTimeUtc, + this.displayOrder, + this.published, + this.deleted, + this.createdOnUtc, + this.updatedOnUtc, + this.productType, + this.parentGroupedProductId, + this.roleIds, + this.discountIds, + this.storeIds, + this.manufacturerIds, + this.reviews, + this.images, + this.attributes, + this.specifications, + this.associatedProductIds, + this.tags, + this.vendorId, + this.seName, + }); + + String id; + bool visibleIndividually; + String name; + String namen; + List localizedNames; + String shortDescription; + String shortDescriptionn; + String fullDescription; + String fullDescriptionn; + bool markasNew; + bool showOnHomePage; + String metaKeywords; + String metaDescription; + String metaTitle; + bool allowCustomerReviews; + int approvedRatingSum; + int notApprovedRatingSum; + int approvedTotalReviews; + int notApprovedTotalReviews; + String sku; + bool isRx; + bool prescriptionRequired; + String rxMessage; + String rxMessagen; + dynamic manufacturerPartNumber; + dynamic gtin; + bool isGiftCard; + bool requireOtherProducts; + bool automaticallyAddRequiredProducts; + bool isDownload; + bool unlimitedDownloads; + int maxNumberOfDownloads; + dynamic downloadExpirationDays; + bool hasSampleDownload; + bool hasUserAgreement; + bool isRecurring; + int recurringCycleLength; + int recurringTotalCycles; + bool isRental; + int rentalPriceLength; + bool isShipEnabled; + bool isFreeShipping; + bool shipSeparately; + int additionalShippingCharge; + bool isTaxExempt; + bool isTelecommunicationsOrBroadcastingOrElectronicServices; + bool useMultipleWarehouses; + int manageInventoryMethodId; + int stockQuantity; + String stockAvailability; + String stockAvailabilityn; + bool displayStockAvailability; + bool displayStockQuantity; + int minStockQuantity; + int notifyAdminForQuantityBelow; + bool allowBackInStockSubscriptions; + int orderMinimumQuantity; + int orderMaximumQuantity; + dynamic allowedQuantities; + bool allowAddingOnlyExistingAttributeCombinations; + bool disableBuyButton; + bool disableWishlistButton; + bool availableForPreOrder; + dynamic preOrderAvailabilityStartDateTimeUtc; + bool callForPrice; + double price; + int oldPrice; + double productCost; + dynamic specialPrice; + dynamic specialPriceStartDateTimeUtc; + dynamic specialPriceEndDateTimeUtc; + bool customerEntersPrice; + int minimumCustomerEnteredPrice; + int maximumCustomerEnteredPrice; + bool basepriceEnabled; + int basepriceAmount; + int basepriceBaseAmount; + bool hasTierPrices; + bool hasDiscountsApplied; + String discountName; + String discountNamen; + String discountDescription; + String discountDescriptionn; + String discountPercentage; + String currency; + String currencyn; + double weight; + int length; + int width; + int height; + dynamic availableStartDateTimeUtc; + dynamic availableEndDateTimeUtc; + int displayOrder; + bool published; + bool deleted; + DateTime createdOnUtc; + DateTime updatedOnUtc; + String productType; + int parentGroupedProductId; + List roleIds; + List discountIds; + List storeIds; + List manufacturerIds; + List reviews; + List images; + List attributes; + List specifications; + List associatedProductIds; + List tags; + int vendorId; + String seName; + + factory Product.fromJson(Map json) => Product( + id: json["id"], + visibleIndividually: json["visible_individually"], + name: json["name"], + namen: json["namen"], + localizedNames: List.from(json["localized_names"].map((x) => LocalizedName.fromJson(x))), + shortDescription: json["short_description"] == null ? null : json["short_description"], + shortDescriptionn: json["short_descriptionn"] == null ? null : json["short_descriptionn"], + fullDescription: json["full_description"], + fullDescriptionn: json["full_descriptionn"], + markasNew: json["markas_new"], + showOnHomePage: json["show_on_home_page"], + metaKeywords: json["meta_keywords"] == null ? null : json["meta_keywords"], + metaDescription: json["meta_description"] == null ? null : json["meta_description"], + metaTitle: json["meta_title"] == null ? null : json["meta_title"], + allowCustomerReviews: json["allow_customer_reviews"], + approvedRatingSum: json["approved_rating_sum"], + notApprovedRatingSum: json["not_approved_rating_sum"], + approvedTotalReviews: json["approved_total_reviews"], + notApprovedTotalReviews: json["not_approved_total_reviews"], + sku: json["sku"], + isRx: json["is_rx"], + prescriptionRequired: json["prescription_required"], + rxMessage: json["rx_message"] == null ? null : json["rx_message"], + rxMessagen: json["rx_messagen"] == null ? null : json["rx_messagen"], + manufacturerPartNumber: json["manufacturer_part_number"], + gtin: json["gtin"], + isGiftCard: json["is_gift_card"], + requireOtherProducts: json["require_other_products"], + automaticallyAddRequiredProducts: json["automatically_add_required_products"], + isDownload: json["is_download"], + unlimitedDownloads: json["unlimited_downloads"], + maxNumberOfDownloads: json["max_number_of_downloads"], + downloadExpirationDays: json["download_expiration_days"], + hasSampleDownload: json["has_sample_download"], + hasUserAgreement: json["has_user_agreement"], + isRecurring: json["is_recurring"], + recurringCycleLength: json["recurring_cycle_length"], + recurringTotalCycles: json["recurring_total_cycles"], + isRental: json["is_rental"], + rentalPriceLength: json["rental_price_length"], + isShipEnabled: json["is_ship_enabled"], + isFreeShipping: json["is_free_shipping"], + shipSeparately: json["ship_separately"], + additionalShippingCharge: json["additional_shipping_charge"], + isTaxExempt: json["is_tax_exempt"], + isTelecommunicationsOrBroadcastingOrElectronicServices: json["is_telecommunications_or_broadcasting_or_electronic_services"], + useMultipleWarehouses: json["use_multiple_warehouses"], + manageInventoryMethodId: json["manage_inventory_method_id"], + stockQuantity: json["stock_quantity"], + stockAvailability: json["stock_availability"], + stockAvailabilityn: json["stock_availabilityn"], + displayStockAvailability: json["display_stock_availability"], + displayStockQuantity: json["display_stock_quantity"], + minStockQuantity: json["min_stock_quantity"], + notifyAdminForQuantityBelow: json["notify_admin_for_quantity_below"], + allowBackInStockSubscriptions: json["allow_back_in_stock_subscriptions"], + orderMinimumQuantity: json["order_minimum_quantity"], + orderMaximumQuantity: json["order_maximum_quantity"], + allowedQuantities: json["allowed_quantities"], + allowAddingOnlyExistingAttributeCombinations: json["allow_adding_only_existing_attribute_combinations"], + disableBuyButton: json["disable_buy_button"], + disableWishlistButton: json["disable_wishlist_button"], + availableForPreOrder: json["available_for_pre_order"], + preOrderAvailabilityStartDateTimeUtc: json["pre_order_availability_start_date_time_utc"], + callForPrice: json["call_for_price"], + price: json["price"].toDouble(), + oldPrice: json["old_price"], + productCost: json["product_cost"].toDouble(), + specialPrice: json["special_price"], + specialPriceStartDateTimeUtc: json["special_price_start_date_time_utc"], + specialPriceEndDateTimeUtc: json["special_price_end_date_time_utc"], + customerEntersPrice: json["customer_enters_price"], + minimumCustomerEnteredPrice: json["minimum_customer_entered_price"], + maximumCustomerEnteredPrice: json["maximum_customer_entered_price"], + basepriceEnabled: json["baseprice_enabled"], + basepriceAmount: json["baseprice_amount"], + basepriceBaseAmount: json["baseprice_base_amount"], + hasTierPrices: json["has_tier_prices"], + hasDiscountsApplied: json["has_discounts_applied"], + discountName: json["discount_name"] == null ? null : json["discount_name"], + discountNamen: json["discount_namen"] == null ? null : json["discount_namen"], + discountDescription: json["discount_description"] == null ? null : json["discount_description"], + discountDescriptionn: json["discount_Descriptionn"] == null ? null : json["discount_Descriptionn"], + discountPercentage: json["discount_percentage"] == null ? null : json["discount_percentage"], + currency: json["currency"], + currencyn: json["currencyn"], + weight: json["weight"].toDouble(), + length: json["length"], + width: json["width"], + height: json["height"], + availableStartDateTimeUtc: json["available_start_date_time_utc"], + availableEndDateTimeUtc: json["available_end_date_time_utc"], + displayOrder: json["display_order"], + published: json["published"], + deleted: json["deleted"], + createdOnUtc: DateTime.parse(json["created_on_utc"]), + updatedOnUtc: DateTime.parse(json["updated_on_utc"]), + productType: json["product_type"], + parentGroupedProductId: json["parent_grouped_product_id"], + roleIds: List.from(json["role_ids"].map((x) => x)), + discountIds: List.from(json["discount_ids"].map((x) => x)), + storeIds: List.from(json["store_ids"].map((x) => x)), + manufacturerIds: List.from(json["manufacturer_ids"].map((x) => x)), + reviews: List.from(json["reviews"].map((x) => Review.fromJson(x))), + images: List.from(json["images"].map((x) => Image.fromJson(x))), + attributes: List.from(json["attributes"].map((x) => x)), + specifications: List.from(json["specifications"].map((x) => Specification.fromJson(x))), + associatedProductIds: List.from(json["associated_product_ids"].map((x) => x)), + tags: List.from(json["tags"].map((x) => x)), + vendorId: json["vendor_id"], + seName: json["se_name"], + ); + + Map toJson() => { + "id": id, + "visible_individually": visibleIndividually, + "name": name, + "namen": namen, + "localized_names": List.from(localizedNames.map((x) => x.toJson())), + "short_description": shortDescription == null ? null : shortDescription, + "short_descriptionn": shortDescriptionn == null ? null : shortDescriptionn, + "full_description": fullDescription, + "full_descriptionn": fullDescriptionn, + "markas_new": markasNew, + "show_on_home_page": showOnHomePage, + "meta_keywords": metaKeywords == null ? null : metaKeywords, + "meta_description": metaDescription == null ? null : metaDescription, + "meta_title": metaTitle == null ? null : metaTitle, + "allow_customer_reviews": allowCustomerReviews, + "approved_rating_sum": approvedRatingSum, + "not_approved_rating_sum": notApprovedRatingSum, + "approved_total_reviews": approvedTotalReviews, + "not_approved_total_reviews": notApprovedTotalReviews, + "sku": sku, + "is_rx": isRx, + "prescription_required": prescriptionRequired, + "rx_message": rxMessage == null ? null : rxMessage, + "rx_messagen": rxMessagen == null ? null : rxMessagen, + "manufacturer_part_number": manufacturerPartNumber, + "gtin": gtin, + "is_gift_card": isGiftCard, + "require_other_products": requireOtherProducts, + "automatically_add_required_products": automaticallyAddRequiredProducts, + "is_download": isDownload, + "unlimited_downloads": unlimitedDownloads, + "max_number_of_downloads": maxNumberOfDownloads, + "download_expiration_days": downloadExpirationDays, + "has_sample_download": hasSampleDownload, + "has_user_agreement": hasUserAgreement, + "is_recurring": isRecurring, + "recurring_cycle_length": recurringCycleLength, + "recurring_total_cycles": recurringTotalCycles, + "is_rental": isRental, + "rental_price_length": rentalPriceLength, + "is_ship_enabled": isShipEnabled, + "is_free_shipping": isFreeShipping, + "ship_separately": shipSeparately, + "additional_shipping_charge": additionalShippingCharge, + "is_tax_exempt": isTaxExempt, + "is_telecommunications_or_broadcasting_or_electronic_services": isTelecommunicationsOrBroadcastingOrElectronicServices, + "use_multiple_warehouses": useMultipleWarehouses, + "manage_inventory_method_id": manageInventoryMethodId, + "stock_quantity": stockQuantity, + "stock_availability": stockAvailability, + "stock_availabilityn": stockAvailabilityn, + "display_stock_availability": displayStockAvailability, + "display_stock_quantity": displayStockQuantity, + "min_stock_quantity": minStockQuantity, + "notify_admin_for_quantity_below": notifyAdminForQuantityBelow, + "allow_back_in_stock_subscriptions": allowBackInStockSubscriptions, + "order_minimum_quantity": orderMinimumQuantity, + "order_maximum_quantity": orderMaximumQuantity, + "allowed_quantities": allowedQuantities, + "allow_adding_only_existing_attribute_combinations": allowAddingOnlyExistingAttributeCombinations, + "disable_buy_button": disableBuyButton, + "disable_wishlist_button": disableWishlistButton, + "available_for_pre_order": availableForPreOrder, + "pre_order_availability_start_date_time_utc": preOrderAvailabilityStartDateTimeUtc, + "call_for_price": callForPrice, + "price": price, + "old_price": oldPrice, + "product_cost": productCost, + "special_price": specialPrice, + "special_price_start_date_time_utc": specialPriceStartDateTimeUtc, + "special_price_end_date_time_utc": specialPriceEndDateTimeUtc, + "customer_enters_price": customerEntersPrice, + "minimum_customer_entered_price": minimumCustomerEnteredPrice, + "maximum_customer_entered_price": maximumCustomerEnteredPrice, + "baseprice_enabled": basepriceEnabled, + "baseprice_amount": basepriceAmount, + "baseprice_base_amount": basepriceBaseAmount, + "has_tier_prices": hasTierPrices, + "has_discounts_applied": hasDiscountsApplied, + "discount_name": discountName == null ? null : discountName, + "discount_namen": discountNamen == null ? null : discountNamen, + "discount_description": discountDescription == null ? null : discountDescription, + "discount_Descriptionn": discountDescriptionn == null ? null : discountDescriptionn, + "discount_percentage": discountPercentage == null ? null : discountPercentage, + "currency": currency, + "currencyn": currencyn, + "weight": weight, + "length": length, + "width": width, + "height": height, + "available_start_date_time_utc": availableStartDateTimeUtc, + "available_end_date_time_utc": availableEndDateTimeUtc, + "display_order": displayOrder, + "published": published, + "deleted": deleted, + "created_on_utc": createdOnUtc.toIso8601String(), + "updated_on_utc": updatedOnUtc.toIso8601String(), + "product_type": productType, + "parent_grouped_product_id": parentGroupedProductId, + "role_ids": List.from(roleIds.map((x) => x)), + "discount_ids": List.from(discountIds.map((x) => x)), + "store_ids": List.from(storeIds.map((x) => x)), + "manufacturer_ids": List.from(manufacturerIds.map((x) => x)), + "reviews": List.from(reviews.map((x) => x.toJson())), + "images": List.from(images.map((x) => x.toJson())), + "attributes": List.from(attributes.map((x) => x)), + "specifications": List.from(specifications.map((x) => x.toJson())), + "associated_product_ids": List.from(associatedProductIds.map((x) => x)), + "tags": List.from(tags.map((x) => x)), + "vendor_id": vendorId, + "se_name": seName, + }; +} + +class Image { + Image({ + this.id, + this.position, + this.src, + this.thumb, + this.attachment, + }); + + int id; + int position; + String src; + String thumb; + String attachment; + + factory Image.fromJson(Map json) => Image( + id: json["id"], + position: json["position"], + src: json["src"], + thumb: json["thumb"], + attachment: json["attachment"], + ); + + Map toJson() => { + "id": id, + "position": position, + "src": src, + "thumb": thumb, + "attachment": attachment, + }; +} + +class LocalizedName { + LocalizedName({ + this.languageId, + this.localizedName, + }); + + int languageId; + String localizedName; + + factory LocalizedName.fromJson(Map json) => LocalizedName( + languageId: json["language_id"], + localizedName: json["localized_name"], + ); + + Map toJson() => { + "language_id": languageId, + "localized_name": localizedName, + }; +} + +class Review { + Review({ + this.id, + this.position, + this.reviewId, + this.customerId, + this.productId, + this.storeId, + this.isApproved, + this.title, + this.reviewText, + this.replyText, + this.rating, + this.helpfulYesTotal, + this.helpfulNoTotal, + this.createdOnUtc, + this.customer, + this.product, + }); + + int id; + int position; + int reviewId; + int customerId; + int productId; + int storeId; + bool isApproved; + String title; + String reviewText; + dynamic replyText; + int rating; + int helpfulYesTotal; + int helpfulNoTotal; + DateTime createdOnUtc; + Customer customer; + dynamic product; + + factory Review.fromJson(Map json) => Review( + id: json["id"], + position: json["position"], + reviewId: json["review_id"], + customerId: json["customer_id"], + productId: json["product_id"], + storeId: json["store_id"], + isApproved: json["is_approved"], + title: json["title"], + reviewText: json["review_text"], + replyText: json["reply_text"], + rating: json["rating"], + helpfulYesTotal: json["helpful_yes_total"], + helpfulNoTotal: json["helpful_no_total"], + createdOnUtc: DateTime.parse(json["created_on_utc"]), + customer: Customer.fromJson(json["customer"]), + product: json["product"], + ); + + Map toJson() => { + "id": id, + "position": position, + "review_id": reviewId, + "customer_id": customerId, + "product_id": productId, + "store_id": storeId, + "is_approved": isApproved, + "title": title, + "review_text": reviewText, + "reply_text": replyText, + "rating": rating, + "helpful_yes_total": helpfulYesTotal, + "helpful_no_total": helpfulNoTotal, + "created_on_utc": createdOnUtc.toIso8601String(), + "customer": customer.toJson(), + "product": product, + }; +} + +class Customer { + Customer({ + this.fileNumber, + this.iqamaNumber, + this.isOutSa, + this.patientType, + this.gender, + this.birthDate, + this.phone, + this.countryCode, + this.yahalaAccountno, + this.billingAddress, + this.shippingAddress, + this.addresses, + this.id, + this.username, + this.email, + this.firstName, + this.lastName, + this.languageId, + this.adminComment, + this.isTaxExempt, + this.hasShoppingCartItems, + this.active, + this.deleted, + this.isSystemAccount, + this.systemName, + this.lastIpAddress, + this.createdOnUtc, + this.lastLoginDateUtc, + this.lastActivityDateUtc, + this.registeredInStoreId, + this.roleIds, + }); + + dynamic fileNumber; + dynamic iqamaNumber; + int isOutSa; + int patientType; + dynamic gender; + DateTime birthDate; + dynamic phone; + dynamic countryCode; + dynamic yahalaAccountno; + dynamic billingAddress; + dynamic shippingAddress; + List addresses; + String id; + Username username; + Email email; + dynamic firstName; + dynamic lastName; + dynamic languageId; + dynamic adminComment; + dynamic isTaxExempt; + dynamic hasShoppingCartItems; + dynamic active; + dynamic deleted; + dynamic isSystemAccount; + dynamic systemName; + dynamic lastIpAddress; + dynamic createdOnUtc; + dynamic lastLoginDateUtc; + dynamic lastActivityDateUtc; + dynamic registeredInStoreId; + List roleIds; + + factory Customer.fromJson(Map json) => Customer( + fileNumber: json["file_number"], + iqamaNumber: json["iqama_number"], + isOutSa: json["is_out_sa"], + patientType: json["patient_type"], + gender: json["gender"], + birthDate: DateTime.parse(json["birth_date"]), + phone: json["phone"], + countryCode: json["country_code"], + yahalaAccountno: json["yahala_accountno"], + billingAddress: json["billing_address"], + shippingAddress: json["shipping_address"], + addresses: List.from(json["addresses"].map((x) => x)), + id: json["id"], + username: usernameValues.map[json["username"]], + email: emailValues.map[json["email"]], + firstName: json["first_name"], + lastName: json["last_name"], + languageId: json["language_id"], + adminComment: json["admin_comment"], + isTaxExempt: json["is_tax_exempt"], + hasShoppingCartItems: json["has_shopping_cart_items"], + active: json["active"], + deleted: json["deleted"], + isSystemAccount: json["is_system_account"], + systemName: json["system_name"], + lastIpAddress: json["last_ip_address"], + createdOnUtc: json["created_on_utc"], + lastLoginDateUtc: json["last_login_date_utc"], + lastActivityDateUtc: json["last_activity_date_utc"], + registeredInStoreId: json["registered_in_store_id"], + roleIds: List.from(json["role_ids"].map((x) => x)), + ); + + Map toJson() => { + "file_number": fileNumber, + "iqama_number": iqamaNumber, + "is_out_sa": isOutSa, + "patient_type": patientType, + "gender": gender, + "birth_date": birthDate.toIso8601String(), + "phone": phone, + "country_code": countryCode, + "yahala_accountno": yahalaAccountno, + "billing_address": billingAddress, + "shipping_address": shippingAddress, + "addresses": List.from(addresses.map((x) => x)), + "id": id, + "username": usernameValues.reverse[username], + "email": emailValues.reverse[email], + "first_name": firstName, + "last_name": lastName, + "language_id": languageId, + "admin_comment": adminComment, + "is_tax_exempt": isTaxExempt, + "has_shopping_cart_items": hasShoppingCartItems, + "active": active, + "deleted": deleted, + "is_system_account": isSystemAccount, + "system_name": systemName, + "last_ip_address": lastIpAddress, + "created_on_utc": createdOnUtc, + "last_login_date_utc": lastLoginDateUtc, + "last_activity_date_utc": lastActivityDateUtc, + "registered_in_store_id": registeredInStoreId, + "role_ids": List.from(roleIds.map((x) => x)), + }; +} + +enum Email { MEMO17299_GMAIL_COM, STEVE_GATES_NOP_COMMERCE_COM } + +final emailValues = EnumValues({ + "Memo17299@gmail.com": Email.MEMO17299_GMAIL_COM, + "steve_gates@nopCommerce.com": Email.STEVE_GATES_NOP_COMMERCE_COM +}); + +enum Username { AMAL_26, STEVE_GATES_NOP_COMMERCE_COM } + +final usernameValues = EnumValues({ + "amal_26": Username.AMAL_26, + "steve_gates@nopCommerce.com": Username.STEVE_GATES_NOP_COMMERCE_COM +}); + +class Specification { + Specification({ + this.id, + this.displayOrder, + this.defaultValue, + this.defaultValuen, + this.name, + this.nameN, + }); + + int id; + int displayOrder; + String defaultValue; + String defaultValuen; + Name name; + NameN nameN; + + factory Specification.fromJson(Map json) => Specification( + id: json["id"], + displayOrder: json["display_order"], + defaultValue: json["default_value"], + defaultValuen: json["default_valuen"], + name: nameValues.map[json["name"]], + nameN: nameNValues.map[json["nameN"]], + ); + + Map toJson() => { + "id": id, + "display_order": displayOrder, + "default_value": defaultValue, + "default_valuen": defaultValuen, + "name": nameValues.reverse[name], + "nameN": nameNValues.reverse[nameN], + }; +} + +enum Name { PRIMARY_UNIT_OF_MEASURE, BRAND, MANUFACTURER_COUNTRY_NAME, STORAGE, COMPOSITION, SPF } + +final nameValues = EnumValues({ + "BRAND": Name.BRAND, + "COMPOSITION": Name.COMPOSITION, + "MANUFACTURER COUNTRY NAME": Name.MANUFACTURER_COUNTRY_NAME, + "Primary Unit Of Measure": Name.PRIMARY_UNIT_OF_MEASURE, + "SPF": Name.SPF, + "STORAGE": Name.STORAGE +}); + +enum NameN { EMPTY, NAME_N, PURPLE, FLUFFY, TENTACLED, SPF } + +final nameNValues = EnumValues({ + "وحدة القياس الأولية": NameN.EMPTY, + "تخزين": NameN.FLUFFY, + "علامة تجارية": NameN.NAME_N, + "اسم البلد المصنع": NameN.PURPLE, + "SPF": NameN.SPF, + "المكونات": NameN.TENTACLED +}); + +class EnumValues { + Map map; + Map reverseMap; + + EnumValues(this.map); + + Map get reverse { + if (reverseMap == null) { + reverseMap = map.map((k, v) => new MapEntry(v, k)); + } + return reverseMap; + } +} diff --git a/lib/models/pharmacy/reviewModel.dart b/lib/models/pharmacy/reviewModel.dart new file mode 100644 index 00000000..da30212c --- /dev/null +++ b/lib/models/pharmacy/reviewModel.dart @@ -0,0 +1,803 @@ +// To parse this JSON data, do +// +// final review = reviewFromJson(jsonString); + +import 'dart:convert'; + +List reviewFromJson(String str) => List.from(json.decode(str).map((x) => Review.fromJson(x))); + +String reviewToJson(List data) => json.encode(List.from(data.map((x) => x.toJson()))); + +class Product { + Product({ + this.id, + this.visibleIndividually, + this.name, + this.namen, + this.localizedNames, + this.shortDescription, + this.shortDescriptionn, + this.fullDescription, + this.fullDescriptionn, + this.markasNew, + this.showOnHomePage, + this.metaKeywords, + this.metaDescription, + this.metaTitle, + this.allowCustomerReviews, + this.approvedRatingSum, + this.notApprovedRatingSum, + this.approvedTotalReviews, + this.notApprovedTotalReviews, + this.sku, + this.isRx, + this.prescriptionRequired, + this.rxMessage, + this.rxMessagen, + this.manufacturerPartNumber, + this.gtin, + this.isGiftCard, + this.requireOtherProducts, + this.automaticallyAddRequiredProducts, + this.isDownload, + this.unlimitedDownloads, + this.maxNumberOfDownloads, + this.downloadExpirationDays, + this.hasSampleDownload, + this.hasUserAgreement, + this.isRecurring, + this.recurringCycleLength, + this.recurringTotalCycles, + this.isRental, + this.rentalPriceLength, + this.isShipEnabled, + this.isFreeShipping, + this.shipSeparately, + this.additionalShippingCharge, + this.isTaxExempt, + this.isTelecommunicationsOrBroadcastingOrElectronicServices, + this.useMultipleWarehouses, + this.manageInventoryMethodId, + this.stockQuantity, + this.stockAvailability, + this.stockAvailabilityn, + this.displayStockAvailability, + this.displayStockQuantity, + this.minStockQuantity, + this.notifyAdminForQuantityBelow, + this.allowBackInStockSubscriptions, + this.orderMinimumQuantity, + this.orderMaximumQuantity, + this.allowedQuantities, + this.allowAddingOnlyExistingAttributeCombinations, + this.disableBuyButton, + this.disableWishlistButton, + this.availableForPreOrder, + this.preOrderAvailabilityStartDateTimeUtc, + this.callForPrice, + this.price, + this.oldPrice, + this.productCost, + this.specialPrice, + this.specialPriceStartDateTimeUtc, + this.specialPriceEndDateTimeUtc, + this.customerEntersPrice, + this.minimumCustomerEnteredPrice, + this.maximumCustomerEnteredPrice, + this.basepriceEnabled, + this.basepriceAmount, + this.basepriceBaseAmount, + this.hasTierPrices, + this.hasDiscountsApplied, + this.discountName, + this.discountNamen, + this.discountDescription, + this.discountDescriptionn, + this.discountPercentage, + this.currency, + this.currencyn, + this.weight, + this.length, + this.width, + this.height, + this.availableStartDateTimeUtc, + this.availableEndDateTimeUtc, + this.displayOrder, + this.published, + this.deleted, + this.createdOnUtc, + this.updatedOnUtc, + this.productType, + this.parentGroupedProductId, + this.roleIds, + this.discountIds, + this.storeIds, + this.manufacturerIds, + this.reviews, + this.images, + this.attributes, + this.specifications, + this.associatedProductIds, + this.tags, + this.vendorId, + this.seName, + }); + + String id; + bool visibleIndividually; + String name; + String namen; + List localizedNames; + String shortDescription; + String shortDescriptionn; + String fullDescription; + String fullDescriptionn; + bool markasNew; + bool showOnHomePage; + String metaKeywords; + String metaDescription; + String metaTitle; + bool allowCustomerReviews; + dynamic approvedRatingSum; + dynamic notApprovedRatingSum; + dynamic approvedTotalReviews; + dynamic notApprovedTotalReviews; + String sku; + bool isRx; + bool prescriptionRequired; + dynamic rxMessage; + dynamic rxMessagen; + dynamic manufacturerPartNumber; + dynamic gtin; + bool isGiftCard; + bool requireOtherProducts; + bool automaticallyAddRequiredProducts; + bool isDownload; + bool unlimitedDownloads; + dynamic maxNumberOfDownloads; + dynamic downloadExpirationDays; + bool hasSampleDownload; + bool hasUserAgreement; + bool isRecurring; + dynamic recurringCycleLength; + dynamic recurringTotalCycles; + bool isRental; + dynamic rentalPriceLength; + bool isShipEnabled; + bool isFreeShipping; + bool shipSeparately; + dynamic additionalShippingCharge; + bool isTaxExempt; + bool isTelecommunicationsOrBroadcastingOrElectronicServices; + bool useMultipleWarehouses; + dynamic manageInventoryMethodId; + dynamic stockQuantity; + String stockAvailability; + String stockAvailabilityn; + bool displayStockAvailability; + bool displayStockQuantity; + dynamic minStockQuantity; + dynamic notifyAdminForQuantityBelow; + bool allowBackInStockSubscriptions; + dynamic orderMinimumQuantity; + dynamic orderMaximumQuantity; + dynamic allowedQuantities; + bool allowAddingOnlyExistingAttributeCombinations; + bool disableBuyButton; + bool disableWishlistButton; + bool availableForPreOrder; + dynamic preOrderAvailabilityStartDateTimeUtc; + bool callForPrice; + dynamic price; + dynamic oldPrice; + dynamic productCost; + dynamic specialPrice; + dynamic specialPriceStartDateTimeUtc; + dynamic specialPriceEndDateTimeUtc; + bool customerEntersPrice; + dynamic minimumCustomerEnteredPrice; + dynamic maximumCustomerEnteredPrice; + bool basepriceEnabled; + dynamic basepriceAmount; + dynamic basepriceBaseAmount; + bool hasTierPrices; + bool hasDiscountsApplied; + dynamic discountName; + dynamic discountNamen; + dynamic discountDescription; + dynamic discountDescriptionn; + dynamic discountPercentage; + String currency; + String currencyn; + double weight; + dynamic length; + dynamic width; + dynamic height; + dynamic availableStartDateTimeUtc; + dynamic availableEndDateTimeUtc; + dynamic displayOrder; + bool published; + bool deleted; + DateTime createdOnUtc; + DateTime updatedOnUtc; + String productType; + dynamic parentGroupedProductId; + List roleIds; + List discountIds; + List storeIds; + List manufacturerIds; + List reviews; + List images; + List attributes; + List specifications; + List associatedProductIds; + List tags; + dynamic vendorId; + String seName; + + factory Product.fromJson(Map json) => Product( + id: json["id"], + visibleIndividually: json["visible_individually"], + name: json["name"], + namen: json["namen"], + localizedNames: List.from(json["localized_names"].map((x) => LocalizedName.fromJson(x))), + shortDescription: json["short_description"], + shortDescriptionn: json["short_descriptionn"], + fullDescription: json["full_description"], + fullDescriptionn: json["full_descriptionn"], + markasNew: json["markas_new"], + showOnHomePage: json["show_on_home_page"], + metaKeywords: json["meta_keywords"], + metaDescription: json["meta_description"], + metaTitle: json["meta_title"], + allowCustomerReviews: json["allow_customer_reviews"], + approvedRatingSum: json["approved_rating_sum"], + notApprovedRatingSum: json["not_approved_rating_sum"], + approvedTotalReviews: json["approved_total_reviews"], + notApprovedTotalReviews: json["not_approved_total_reviews"], + sku: json["sku"], + isRx: json["is_rx"], + prescriptionRequired: json["prescription_required"], + rxMessage: json["rx_message"], + rxMessagen: json["rx_messagen"], + manufacturerPartNumber: json["manufacturer_part_number"], + gtin: json["gtin"], + isGiftCard: json["is_gift_card"], + requireOtherProducts: json["require_other_products"], + automaticallyAddRequiredProducts: json["automatically_add_required_products"], + isDownload: json["is_download"], + unlimitedDownloads: json["unlimited_downloads"], + maxNumberOfDownloads: json["max_number_of_downloads"], + downloadExpirationDays: json["download_expiration_days"], + hasSampleDownload: json["has_sample_download"], + hasUserAgreement: json["has_user_agreement"], + isRecurring: json["is_recurring"], + recurringCycleLength: json["recurring_cycle_length"], + recurringTotalCycles: json["recurring_total_cycles"], + isRental: json["is_rental"], + rentalPriceLength: json["rental_price_length"], + isShipEnabled: json["is_ship_enabled"], + isFreeShipping: json["is_free_shipping"], + shipSeparately: json["ship_separately"], + additionalShippingCharge: json["additional_shipping_charge"], + isTaxExempt: json["is_tax_exempt"], + isTelecommunicationsOrBroadcastingOrElectronicServices: json["is_telecommunications_or_broadcasting_or_electronic_services"], + useMultipleWarehouses: json["use_multiple_warehouses"], + manageInventoryMethodId: json["manage_inventory_method_id"], + stockQuantity: json["stock_quantity"], + stockAvailability: json["stock_availability"], + stockAvailabilityn: json["stock_availabilityn"], + displayStockAvailability: json["display_stock_availability"], + displayStockQuantity: json["display_stock_quantity"], + minStockQuantity: json["min_stock_quantity"], + notifyAdminForQuantityBelow: json["notify_admin_for_quantity_below"], + allowBackInStockSubscriptions: json["allow_back_in_stock_subscriptions"], + orderMinimumQuantity: json["order_minimum_quantity"], + orderMaximumQuantity: json["order_maximum_quantity"], + allowedQuantities: json["allowed_quantities"], + allowAddingOnlyExistingAttributeCombinations: json["allow_adding_only_existing_attribute_combinations"], + disableBuyButton: json["disable_buy_button"], + disableWishlistButton: json["disable_wishlist_button"], + availableForPreOrder: json["available_for_pre_order"], + preOrderAvailabilityStartDateTimeUtc: json["pre_order_availability_start_date_time_utc"], + callForPrice: json["call_for_price"], + price: json["price"], + oldPrice: json["old_price"], + productCost: json["product_cost"], + specialPrice: json["special_price"], + specialPriceStartDateTimeUtc: json["special_price_start_date_time_utc"], + specialPriceEndDateTimeUtc: json["special_price_end_date_time_utc"], + customerEntersPrice: json["customer_enters_price"], + minimumCustomerEnteredPrice: json["minimum_customer_entered_price"], + maximumCustomerEnteredPrice: json["maximum_customer_entered_price"], + basepriceEnabled: json["baseprice_enabled"], + basepriceAmount: json["baseprice_amount"], + basepriceBaseAmount: json["baseprice_base_amount"], + hasTierPrices: json["has_tier_prices"], + hasDiscountsApplied: json["has_discounts_applied"], + discountName: json["discount_name"], + discountNamen: json["discount_namen"], + discountDescription: json["discount_description"], + discountDescriptionn: json["discount_Descriptionn"], + discountPercentage: json["discount_percentage"], + currency: json["currency"], + currencyn: json["currencyn"], + weight: json["weight"].toDouble(), + length: json["length"], + width: json["width"], + height: json["height"], + availableStartDateTimeUtc: json["available_start_date_time_utc"], + availableEndDateTimeUtc: json["available_end_date_time_utc"], + displayOrder: json["display_order"], + published: json["published"], + deleted: json["deleted"], + createdOnUtc: DateTime.parse(json["created_on_utc"]), + updatedOnUtc: DateTime.parse(json["updated_on_utc"]), + productType: json["product_type"], + parentGroupedProductId: json["parent_grouped_product_id"], + roleIds: List.from(json["role_ids"].map((x) => x)), + discountIds: List.from(json["discount_ids"].map((x) => x)), + storeIds: List.from(json["store_ids"].map((x) => x)), + manufacturerIds: List.from(json["manufacturer_ids"].map((x) => x)), + reviews: List.from(json["reviews"].map((x) => Review.fromJson(x))), + images: List.from(json["images"].map((x) => Image.fromJson(x))), + attributes: List.from(json["attributes"].map((x) => x)), + specifications: List.from(json["specifications"].map((x) => Specification.fromJson(x))), + associatedProductIds: List.from(json["associated_product_ids"].map((x) => x)), + tags: List.from(json["tags"].map((x) => x)), + vendorId: json["vendor_id"], + seName: json["se_name"], + ); + + Map toJson() => { + "id": id, + "visible_individually": visibleIndividually, + "name": name, + "namen": namen, + "localized_names": List.from(localizedNames.map((x) => x.toJson())), + "short_description": shortDescription, + "short_descriptionn": shortDescriptionn, + "full_description": fullDescription, + "full_descriptionn": fullDescriptionn, + "markas_new": markasNew, + "show_on_home_page": showOnHomePage, + "meta_keywords": metaKeywords, + "meta_description": metaDescription, + "meta_title": metaTitle, + "allow_customer_reviews": allowCustomerReviews, + "approved_rating_sum": approvedRatingSum, + "not_approved_rating_sum": notApprovedRatingSum, + "approved_total_reviews": approvedTotalReviews, + "not_approved_total_reviews": notApprovedTotalReviews, + "sku": sku, + "is_rx": isRx, + "prescription_required": prescriptionRequired, + "rx_message": rxMessage, + "rx_messagen": rxMessagen, + "manufacturer_part_number": manufacturerPartNumber, + "gtin": gtin, + "is_gift_card": isGiftCard, + "require_other_products": requireOtherProducts, + "automatically_add_required_products": automaticallyAddRequiredProducts, + "is_download": isDownload, + "unlimited_downloads": unlimitedDownloads, + "max_number_of_downloads": maxNumberOfDownloads, + "download_expiration_days": downloadExpirationDays, + "has_sample_download": hasSampleDownload, + "has_user_agreement": hasUserAgreement, + "is_recurring": isRecurring, + "recurring_cycle_length": recurringCycleLength, + "recurring_total_cycles": recurringTotalCycles, + "is_rental": isRental, + "rental_price_length": rentalPriceLength, + "is_ship_enabled": isShipEnabled, + "is_free_shipping": isFreeShipping, + "ship_separately": shipSeparately, + "additional_shipping_charge": additionalShippingCharge, + "is_tax_exempt": isTaxExempt, + "is_telecommunications_or_broadcasting_or_electronic_services": isTelecommunicationsOrBroadcastingOrElectronicServices, + "use_multiple_warehouses": useMultipleWarehouses, + "manage_inventory_method_id": manageInventoryMethodId, + "stock_quantity": stockQuantity, + "stock_availability": stockAvailability, + "stock_availabilityn": stockAvailabilityn, + "display_stock_availability": displayStockAvailability, + "display_stock_quantity": displayStockQuantity, + "min_stock_quantity": minStockQuantity, + "notify_admin_for_quantity_below": notifyAdminForQuantityBelow, + "allow_back_in_stock_subscriptions": allowBackInStockSubscriptions, + "order_minimum_quantity": orderMinimumQuantity, + "order_maximum_quantity": orderMaximumQuantity, + "allowed_quantities": allowedQuantities, + "allow_adding_only_existing_attribute_combinations": allowAddingOnlyExistingAttributeCombinations, + "disable_buy_button": disableBuyButton, + "disable_wishlist_button": disableWishlistButton, + "available_for_pre_order": availableForPreOrder, + "pre_order_availability_start_date_time_utc": preOrderAvailabilityStartDateTimeUtc, + "call_for_price": callForPrice, + "price": price, + "old_price": oldPrice, + "product_cost": productCost, + "special_price": specialPrice, + "special_price_start_date_time_utc": specialPriceStartDateTimeUtc, + "special_price_end_date_time_utc": specialPriceEndDateTimeUtc, + "customer_enters_price": customerEntersPrice, + "minimum_customer_entered_price": minimumCustomerEnteredPrice, + "maximum_customer_entered_price": maximumCustomerEnteredPrice, + "baseprice_enabled": basepriceEnabled, + "baseprice_amount": basepriceAmount, + "baseprice_base_amount": basepriceBaseAmount, + "has_tier_prices": hasTierPrices, + "has_discounts_applied": hasDiscountsApplied, + "discount_name": discountName, + "discount_namen": discountNamen, + "discount_description": discountDescription, + "discount_Descriptionn": discountDescriptionn, + "discount_percentage": discountPercentage, + "currency": currency, + "currencyn": currencyn, + "weight": weight, + "length": length, + "width": width, + "height": height, + "available_start_date_time_utc": availableStartDateTimeUtc, + "available_end_date_time_utc": availableEndDateTimeUtc, + "display_order": displayOrder, + "published": published, + "deleted": deleted, + "created_on_utc": createdOnUtc.toIso8601String(), + "updated_on_utc": updatedOnUtc.toIso8601String(), + "product_type": productType, + "parent_grouped_product_id": parentGroupedProductId, + "role_ids": List.from(roleIds.map((x) => x)), + "discount_ids": List.from(discountIds.map((x) => x)), + "store_ids": List.from(storeIds.map((x) => x)), + "manufacturer_ids": List.from(manufacturerIds.map((x) => x)), + "reviews": List.from(reviews.map((x) => x.toJson())), + "images": List.from(images.map((x) => x.toJson())), + "attributes": List.from(attributes.map((x) => x)), + "specifications": List.from(specifications.map((x) => x.toJson())), + "associated_product_ids": List.from(associatedProductIds.map((x) => x)), + "tags": List.from(tags.map((x) => x)), + "vendor_id": vendorId, + "se_name": seName, + }; +} + +class Review { + Review({ + this.id, + this.position, + this.reviewId, + this.customerId, + this.productId, + this.storeId, + this.isApproved, + this.title, + this.reviewText, + this.replyText, + this.rating, + this.helpfulYesTotal, + this.helpfulNoTotal, + this.createdOnUtc, + this.customer, + this.product, + }); + + dynamic id; + dynamic position; + dynamic reviewId; + dynamic customerId; + dynamic productId; + dynamic storeId; + bool isApproved; + String title; + ReviewText reviewText; + dynamic replyText; + dynamic rating; + dynamic helpfulYesTotal; + dynamic helpfulNoTotal; + DateTime createdOnUtc; + Customer customer; + Product product; + + factory Review.fromJson(Map json) => Review( + id: json["id"], + position: json["position"], + reviewId: json["review_id"], + customerId: json["customer_id"], + productId: json["product_id"], + storeId: json["store_id"], + isApproved: json["is_approved"], + title: json["title"], + reviewText: reviewTextValues.map[json["review_text"]], + replyText: json["reply_text"], + rating: json["rating"], + helpfulYesTotal: json["helpful_yes_total"], + helpfulNoTotal: json["helpful_no_total"], + createdOnUtc: DateTime.parse(json["created_on_utc"]), + customer: Customer.fromJson(json["customer"]), + product: json["product"] == null ? null : Product.fromJson(json["product"]), + ); + + Map toJson() => { + "id": id, + "position": position, + "review_id": reviewId, + "customer_id": customerId, + "product_id": productId, + "store_id": storeId, + "is_approved": isApproved, + "title": title, + "review_text": reviewText, + "reply_text": replyText, + "rating": rating, + "helpful_yes_total": helpfulYesTotal, + "helpful_no_total": helpfulNoTotal, + "created_on_utc": createdOnUtc.toIso8601String(), + "customer": customer.toJson(), + "product": product == null ? null : product.toJson(), + }; +} + +class Image { + Image({ + this.id, + this.position, + this.src, + this.thumb, + this.attachment, + }); + + dynamic id; + dynamic position; + String src; + String thumb; + String attachment; + + factory Image.fromJson(Map json) => Image( + id: json["id"], + position: json["position"], + src: json["src"], + thumb: json["thumb"], + attachment: json["attachment"], + ); + + Map toJson() => { + "id": id, + "position": position, + "src": src, + "thumb": thumb, + "attachment": attachment, + }; +} + +class LocalizedName { + LocalizedName({ + this.languageId, + this.localizedName, + }); + + dynamic languageId; + String localizedName; + + factory LocalizedName.fromJson(Map json) => LocalizedName( + languageId: json["language_id"], + localizedName: json["localized_name"], + ); + + Map toJson() => { + "language_id": languageId, + "localized_name": localizedName, + }; +} + +class Specification { + Specification({ + this.id, + this.displayOrder, + this.defaultValue, + this.defaultValuen, + this.name, + this.nameN, + }); + + dynamic id; + dynamic displayOrder; + String defaultValue; + String defaultValuen; + String name; + String nameN; + + factory Specification.fromJson(Map json) => Specification( + id: json["id"], + displayOrder: json["display_order"], + defaultValue: json["default_value"], + defaultValuen: json["default_valuen"], + name: json["name"], + nameN: json["nameN"], + ); + + Map toJson() => { + "id": id, + "display_order": displayOrder, + "default_value": defaultValue, + "default_valuen": defaultValuen, + "name": name, + "nameN": nameN, + }; +} + +class Customer { + Customer({ + this.fileNumber, + this.iqamaNumber, + this.isOutSa, + this.patientType, + this.gender, + this.birthDate, + this.phone, + this.countryCode, + this.yahalaAccountno, + this.billingAddress, + this.shippingAddress, + this.addresses, + this.id, + this.username, + this.email, + this.firstName, + this.lastName, + this.languageId, + this.adminComment, + this.isTaxExempt, + this.hasShoppingCartItems, + this.active, + this.deleted, + this.isSystemAccount, + this.systemName, + this.lastIpAddress, + this.createdOnUtc, + this.lastLoginDateUtc, + this.lastActivityDateUtc, + this.registeredInStoreId, + this.roleIds, + }); + + dynamic fileNumber; + dynamic iqamaNumber; + dynamic isOutSa; + dynamic patientType; + dynamic gender; + DateTime birthDate; + dynamic phone; + dynamic countryCode; + dynamic yahalaAccountno; + dynamic billingAddress; + dynamic shippingAddress; + List addresses; + String id; + Username username; + Email email; + dynamic firstName; + dynamic lastName; + dynamic languageId; + dynamic adminComment; + dynamic isTaxExempt; + dynamic hasShoppingCartItems; + dynamic active; + dynamic deleted; + dynamic isSystemAccount; + dynamic systemName; + dynamic lastIpAddress; + dynamic createdOnUtc; + dynamic lastLoginDateUtc; + dynamic lastActivityDateUtc; + dynamic registeredInStoreId; + List roleIds; + + factory Customer.fromJson(Map json) => Customer( + fileNumber: json["file_number"], + iqamaNumber: json["iqama_number"], + isOutSa: json["is_out_sa"], + patientType: json["patient_type"], + gender: json["gender"], + birthDate: DateTime.parse(json["birth_date"]), + phone: json["phone"], + countryCode: json["country_code"], + yahalaAccountno: json["yahala_accountno"], + billingAddress: json["billing_address"], + shippingAddress: json["shipping_address"], + addresses: List.from(json["addresses"].map((x) => x)), + id: json["id"], + username: usernameValues.map[json["username"]], + email: emailValues.map[json["email"]], + firstName: json["first_name"], + lastName: json["last_name"], + languageId: json["language_id"], + adminComment: json["admin_comment"], + isTaxExempt: json["is_tax_exempt"], + hasShoppingCartItems: json["has_shopping_cart_items"], + active: json["active"], + deleted: json["deleted"], + isSystemAccount: json["is_system_account"], + systemName: json["system_name"], + lastIpAddress: json["last_ip_address"], + createdOnUtc: json["created_on_utc"], + lastLoginDateUtc: json["last_login_date_utc"], + lastActivityDateUtc: json["last_activity_date_utc"], + registeredInStoreId: json["registered_in_store_id"], + roleIds: List.from(json["role_ids"].map((x) => x)), + ); + + Map toJson() => { + "file_number": fileNumber, + "iqama_number": iqamaNumber, + "is_out_sa": isOutSa, + "patient_type": patientType, + "gender": gender, + "birth_date": birthDate.toIso8601String(), + "phone": phone, + "country_code": countryCode, + "yahala_accountno": yahalaAccountno, + "billing_address": billingAddress, + "shipping_address": shippingAddress, + "addresses": List.from(addresses.map((x) => x)), + "id": id, + "username": usernameValues.reverse[username], + "email": emailValues.reverse[email], + "first_name": firstName, + "last_name": lastName, + "language_id": languageId, + "admin_comment": adminComment, + "is_tax_exempt": isTaxExempt, + "has_shopping_cart_items": hasShoppingCartItems, + "active": active, + "deleted": deleted, + "is_system_account": isSystemAccount, + "system_name": systemName, + "last_ip_address": lastIpAddress, + "created_on_utc": createdOnUtc, + "last_login_date_utc": lastLoginDateUtc, + "last_activity_date_utc": lastActivityDateUtc, + "registered_in_store_id": registeredInStoreId, + "role_ids": List.from(roleIds.map((x) => x)), + }; +} + +enum Email { TAMER_FANASHEH_DRSULAIMANALHABIB_COM, STEVE_GATES_NOP_COMMERCE_COM } + +final emailValues = EnumValues({ + "steve_gates@nopCommerce.com": Email.STEVE_GATES_NOP_COMMERCE_COM, + "tamer.fanasheh@drsulaimanalhabib.com": Email.TAMER_FANASHEH_DRSULAIMANALHABIB_COM +}); + +enum Username { TAMERF, STEVE_GATES_NOP_COMMERCE_COM } + +final usernameValues = EnumValues({ + "steve_gates@nopCommerce.com": Username.STEVE_GATES_NOP_COMMERCE_COM, + "tamerf": Username.TAMERF +}); + +enum ReviewText { ENADDD, ENAD_TEST_0001, GOOD, ENAD_TEST_REVIEW_001, ENAD } + +final reviewTextValues = EnumValues({ + "ENAD ": ReviewText.ENAD, + "enaddd": ReviewText.ENADDD, + "ENAD TEST 0001": ReviewText.ENAD_TEST_0001, + "Enad Test Review 001": ReviewText.ENAD_TEST_REVIEW_001, + "good": ReviewText.GOOD +}); + +class EnumValues { + Map map; + Map reverseMap; + + EnumValues(this.map); + + Map get reverse { + if (reverseMap == null) { + reverseMap = map.map((k, v) => new MapEntry(v, k)); + } + return reverseMap; + } +} diff --git a/lib/models/pharmacy/topBrandsModel.dart b/lib/models/pharmacy/topBrandsModel.dart new file mode 100644 index 00000000..e27ee270 --- /dev/null +++ b/lib/models/pharmacy/topBrandsModel.dart @@ -0,0 +1,137 @@ +// To parse this JSON data, do +// +// final topBrand = topBrandFromJson(jsonString); + +import 'dart:convert'; + +List topBrandFromJson(String str) => List.from(json.decode(str).map((x) => TopBrand.fromJson(x))); + +String topBrandToJson(List data) => json.encode(List.from(data.map((x) => x.toJson()))); + +class TopBrand { + TopBrand({ + this.id, + this.name, + this.namen, + this.localizedNames, + this.description, + this.manufacturerTemplateId, + this.metaKeywords, + this.metaDescription, + this.metaTitle, + this.pageSize, + this.pageSizeOptions, + this.priceRanges, + this.published, + this.deleted, + this.displayOrder, + this.createdOnUtc, + this.updatedOnUtc, + this.image, + }); + + String id; + String name; + String namen; + List localizedNames; + dynamic description; + int manufacturerTemplateId; + String metaKeywords; + dynamic metaDescription; + dynamic metaTitle; + int pageSize; + String pageSizeOptions; + dynamic priceRanges; + bool published; + bool deleted; + int displayOrder; + DateTime createdOnUtc; + DateTime updatedOnUtc; + Image image; + + factory TopBrand.fromJson(Map json) => TopBrand( + id: json["id"], + name: json["name"], + namen: json["namen"], + localizedNames: List.from(json["localized_names"].map((x) => LocalizedName.fromJson(x))), + description: json["description"], + manufacturerTemplateId: json["manufacturer_template_id"], + metaKeywords: json["meta_keywords"], + metaDescription: json["meta_description"], + metaTitle: json["meta_title"], + pageSize: json["page_size"], + pageSizeOptions: json["page_size_options"], + priceRanges: json["price_ranges"], + published: json["published"], + deleted: json["deleted"], + displayOrder: json["display_order"], + createdOnUtc: DateTime.parse(json["created_on_utc"]), + updatedOnUtc: DateTime.parse(json["updated_on_utc"]), + image: Image.fromJson(json["image"]), + ); + + Map toJson() => { + "id": id, + "name": name, + "namen": namen, + "localized_names": List.from(localizedNames.map((x) => x.toJson())), + "description": description, + "manufacturer_template_id": manufacturerTemplateId, + "meta_keywords": metaKeywords, + "meta_description": metaDescription, + "meta_title": metaTitle, + "page_size": pageSize, + "page_size_options": pageSizeOptions, + "price_ranges": priceRanges, + "published": published, + "deleted": deleted, + "display_order": displayOrder, + "created_on_utc": createdOnUtc.toIso8601String(), + "updated_on_utc": updatedOnUtc.toIso8601String(), + "image": image.toJson(), + }; +} + +class Image { + Image({ + this.src, + this.thumb, + this.attachment, + }); + + String src; + dynamic thumb; + dynamic attachment; + + factory Image.fromJson(Map json) => Image( + src: json["src"], + thumb: json["thumb"], + attachment: json["attachment"], + ); + + Map toJson() => { + "src": src, + "thumb": thumb, + "attachment": attachment, + }; +} + +class LocalizedName { + LocalizedName({ + this.languageId, + this.localizedName, + }); + + int languageId; + String localizedName; + + factory LocalizedName.fromJson(Map json) => LocalizedName( + languageId: json["language_id"], + localizedName: json["localized_name"], + ); + + Map toJson() => { + "language_id": languageId, + "localized_name": localizedName, + }; +} diff --git a/lib/pages/base/base_view.dart b/lib/pages/base/base_view.dart index f5311aae..5713da91 100644 --- a/lib/pages/base/base_view.dart +++ b/lib/pages/base/base_view.dart @@ -24,9 +24,10 @@ class _BaseViewState extends State> { @override void initState() { - if (widget.onModelReady != null && authenticatedUserObject.isLogin) { - widget.onModelReady(model); - } +// if (widget.onModelReady != null && authenticatedUserObject.isLogin) { +// widget.onModelReady(model); +// } + widget.onModelReady(model); super.initState(); } diff --git a/lib/pages/landing/home_page.dart b/lib/pages/landing/home_page.dart index 20184c9f..14640945 100644 --- a/lib/pages/landing/home_page.dart +++ b/lib/pages/landing/home_page.dart @@ -10,6 +10,9 @@ import 'package:diplomaticquarterapp/pages/ErService/ErOptions.dart'; import 'package:diplomaticquarterapp/pages/base/base_view.dart'; import 'package:diplomaticquarterapp/pages/livecare/livecare_home.dart'; import 'package:diplomaticquarterapp/pages/paymentService/payment_service.dart'; +import 'package:diplomaticquarterapp/pages/pharmacies/my_reviews.dart'; +import 'package:diplomaticquarterapp/pages/pharmacies/product-brands.dart'; +import 'package:diplomaticquarterapp/pages/pharmacies/product_detail.dart'; import 'package:diplomaticquarterapp/pages/pharmacies/wishlist.dart'; import 'package:diplomaticquarterapp/pages/pharmacyModule/pharmacy_module_page.dart'; import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; @@ -480,7 +483,7 @@ class _HomePageState extends State { opacity: 0.5, ), DashboardItem( - // onTap: () => Navigator.push(context, FadePage(page: PharmacyPage())), +// onTap: () => Navigator.push(context, FadePage(page: PharmacyPage())), child: Center( child: Padding( @@ -509,7 +512,7 @@ class _HomePageState extends State { height: MediaQuery.of(context).size.width * 0.4, imageName: 'al-habib_onlne_pharmacy_bg.png', onTap: (){ - Navigator.push(context, FadePage(page: WishlistPage())); + Navigator.push(context, FadePage(page: ProductDetailPage())); }, ), DashboardItem( diff --git a/lib/pages/pharmacies/ProductCheckTypeWidget.dart b/lib/pages/pharmacies/ProductCheckTypeWidget.dart new file mode 100644 index 00000000..f2d87529 --- /dev/null +++ b/lib/pages/pharmacies/ProductCheckTypeWidget.dart @@ -0,0 +1,55 @@ +import 'package:diplomaticquarterapp/widgets/pharmacy/product_tile.dart'; +import 'package:flutter/material.dart'; + +class ProductCheckTypeWidget extends StatelessWidget { + final List wishlist; + final bool isTrue; + + ProductCheckTypeWidget(this.isTrue, this.wishlist); + + @override + Widget build(BuildContext context) { + return isTrue + ? ListView.builder( + itemCount: wishlist.length, + itemBuilder: (BuildContext context, int index) { + return Column( + children: [ + Container( + child: isTrue + ? productTile( + productName: wishlist[index].product.name, + productPrice: wishlist[index].subtotal, + productRate: + double.parse(wishlist[index].subtotalVatRate), + productImage: wishlist[index].product.images[0].src, + showLine: isTrue, + ) + : productTile( + productName: wishlist[index].product.name, + productPrice: wishlist[index].subtotal, + productRate: + double.parse(wishlist[index].subtotalVatRate), + productImage: wishlist[index].product.images[0].src, + showLine: isTrue, + ), + ), + Divider(height: 1, color: Colors.grey) + ], + ); + }) + : GridView.count( + crossAxisCount: 2, + children: List.generate( + wishlist.length, + (index) => productTile( + productName: wishlist[index].product.name, + productPrice: wishlist[index].subtotal, + productRate: + double.parse(wishlist[index].subtotalVatRate), + productImage: wishlist[index].product.images[0].src, + showLine: isTrue, + )), + ); + } +} diff --git a/lib/pages/pharmacies/compare.dart b/lib/pages/pharmacies/compare.dart new file mode 100644 index 00000000..ffb3dd06 --- /dev/null +++ b/lib/pages/pharmacies/compare.dart @@ -0,0 +1,597 @@ +import 'package:flutter/material.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; +import 'package:carousel_slider/carousel_slider.dart'; +import 'package:font_awesome_flutter/font_awesome_flutter.dart'; + +void main() => runApp(ComparePage()); + +class ComparePage extends StatefulWidget { + @override + _ComparePageState createState() => _ComparePageState(); +} + +class _ComparePageState extends State { + @override + Widget build(BuildContext context) { + return AppScaffold( + appBarTitle: 'Reviews page', + isShowAppBar: true, + isPharmacy: true, + body: Container( + child: compareList(), + ), + ); + } +} + +compareList() { + return CarouselSlider( + options: CarouselOptions( + height: 800.0, viewportFraction: 0.95, enableInfiniteScroll: false), + items: [1, 2].map((i) { + return Builder( + builder: (BuildContext context) { + return Padding( + padding: const EdgeInsets.only(top: 8), + child: Container( + width: MediaQuery.of(context).size.width, + margin: EdgeInsets.symmetric(horizontal: 10.0), + child: slideDetail(), + ), + ); + }, + ); + }).toList(), + ); +} + +slideDetail() { + return ListView( + children: [ + Row( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Container( + height: 800, + width: 150, + margin: EdgeInsets.symmetric(horizontal: 10.0), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10), + border: Border( + top: BorderSide(width: 0.5, color: Colors.grey), + left: BorderSide(width: 0.5, color: Colors.grey), + right: BorderSide(width: 0.5, color: Colors.grey), + bottom: BorderSide(width: 0.5, color: Colors.grey), + ), + color: Colors.white), + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + children: [ + Container( + child: Align( + alignment: Alignment.topRight, + child: Icon(FontAwesomeIcons.trashAlt, size: 15)), + ), + SizedBox(height: 20,), + Image( + image: AssetImage( + 'assets/images/al-habib_onlne_pharmacy_bg.png'), + fit: BoxFit.cover, + width: 100, + height: 60, + ), + Padding( + padding: EdgeInsets.only(top: 8.0), + child: Container( + height: 1.0, + width: 300.0, + color:Colors.grey,), + ), + Container( + margin: EdgeInsets.all(5), + child: Align( + alignment: Alignment.topLeft, + child: RichText( + text: TextSpan( + text: 'SAR 999.99', + style: TextStyle( + fontWeight: FontWeight.bold, + color: Colors.black, + fontSize: 13), + ), + ), + ), + ), + Container( + margin: EdgeInsets.all(5), + child: Align( + alignment: Alignment.topLeft, + child: RichText( + text: TextSpan( + text: + 'ENAD test', + style: TextStyle( + color: Colors.black54, + fontSize: 15, + fontWeight: FontWeight.bold), + ), + ), + ), + ), + Padding( + padding: EdgeInsets.only(top: 8.0), + child: Container( + height: 1.0, + width: 300.0, + color:Colors.grey,), + ), + Container( + margin: EdgeInsets.all(5), + child: Align( + alignment: Alignment.topLeft, + child: RichText( + text: TextSpan( + text: 'Primary Unit Of Measure', + style: TextStyle( + fontWeight: FontWeight.bold, + color: Colors.black, + fontSize: 13), + ), + ), + ), + ), + Container( + margin: EdgeInsets.all(5), + child: Align( + alignment: Alignment.topLeft, + child: RichText( + text: TextSpan( + text: + 'Each', + style: TextStyle( + color: Colors.black54, + fontSize: 15, + fontWeight: FontWeight.bold), + ), + ), + ), + ), + Padding( + padding: EdgeInsets.only(top: 8.0), + child: Container( + height: 1.0, + width: 300.0, + color:Colors.grey,), + ), + Container( + margin: EdgeInsets.all(5), + child: Align( + alignment: Alignment.topLeft, + child: RichText( + text: TextSpan( + text: 'Primary Unit Of Measure', + style: TextStyle( + fontWeight: FontWeight.bold, + color: Colors.black, + fontSize: 13), + ), + ), + ), + ), + Container( + margin: EdgeInsets.all(5), + child: Align( + alignment: Alignment.topLeft, + child: RichText( + text: TextSpan( + text: + 'Each', + style: TextStyle( + color: Colors.black54, + fontSize: 15, + fontWeight: FontWeight.bold), + ), + ), + ), + ), + Padding( + padding: EdgeInsets.only(top: 8.0), + child: Container( + height: 1.0, + width: 300.0, + color:Colors.grey,), + ), + Container( + margin: EdgeInsets.all(5), + child: Align( + alignment: Alignment.topLeft, + child: RichText( + text: TextSpan( + text: 'Primary Unit Of Measure', + style: TextStyle( + fontWeight: FontWeight.bold, + color: Colors.black, + fontSize: 13), + ), + ), + ), + ), + Container( + margin: EdgeInsets.all(5), + child: Align( + alignment: Alignment.topLeft, + child: RichText( + text: TextSpan( + text: + 'Each', + style: TextStyle( + color: Colors.black54, + fontSize: 15, + fontWeight: FontWeight.bold), + ), + ), + ), + ), + Padding( + padding: EdgeInsets.only(top: 8.0), + child: Container( + height: 1.0, + width: 300.0, + color:Colors.grey,), + ), + Container( + margin: EdgeInsets.all(5), + child: Align( + alignment: Alignment.topLeft, + child: RichText( + text: TextSpan( + text: 'Primary Unit Of Measure', + style: TextStyle( + fontWeight: FontWeight.bold, + color: Colors.black, + fontSize: 13), + ), + ), + ), + ), + Container( + margin: EdgeInsets.all(5), + child: Align( + alignment: Alignment.topLeft, + child: RichText( + text: TextSpan( + text: + 'Each', + style: TextStyle( + color: Colors.black54, + fontSize: 15, + fontWeight: FontWeight.bold), + ), + ), + ), + ), + Padding( + padding: EdgeInsets.only(top: 8.0), + child: Container( + height: 1.0, + width: 300.0, + color:Colors.grey,), + ), + Container( + margin: EdgeInsets.all(5), + child: Align( + alignment: Alignment.topLeft, + child: RichText( + text: TextSpan( + text: 'Primary Unit Of Measure', + style: TextStyle( + fontWeight: FontWeight.bold, + color: Colors.black, + fontSize: 13), + ), + ), + ), + ), + Container( + margin: EdgeInsets.all(5), + child: Align( + alignment: Alignment.topLeft, + child: RichText( + text: TextSpan( + text: + 'Each', + style: TextStyle( + color: Colors.black54, + fontSize: 15, + fontWeight: FontWeight.bold), + ), + ), + ), + ), + Padding( + padding: EdgeInsets.only(top: 8.0), + child: Container( + height: 1.0, + width: 300.0, + color:Colors.grey,), + ), + ], + ), + ), + ), + Container( + height: 800, + width: 150, + margin: EdgeInsets.symmetric(horizontal: 10.0), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10), + border: Border( + top: BorderSide(width: 0.5, color: Colors.grey), + left: BorderSide(width: 0.5, color: Colors.grey), + right: BorderSide(width: 0.5, color: Colors.grey), + bottom: BorderSide(width: 0.5, color: Colors.grey), + ), + color: Colors.white), + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + children: [ + Container( + child: Align( + alignment: Alignment.topRight, + child: Icon(FontAwesomeIcons.trashAlt, size: 15)), + ), + SizedBox(height: 20,), + Image( + image: AssetImage( + 'assets/images/al-habib_onlne_pharmacy_bg.png'), + fit: BoxFit.cover, + width: 100, + height: 60, + ), + Padding( + padding: EdgeInsets.only(top: 8.0), + child: Container( + height: 1.0, + width: 300.0, + color:Colors.grey,), + ), + Container( + margin: EdgeInsets.all(5), + child: Align( + alignment: Alignment.topLeft, + child: RichText( + text: TextSpan( + text: 'SAR 999.99', + style: TextStyle( + fontWeight: FontWeight.bold, + color: Colors.black, + fontSize: 13), + ), + ), + ), + ), + Container( + margin: EdgeInsets.all(5), + child: Align( + alignment: Alignment.topLeft, + child: RichText( + text: TextSpan( + text: + 'ENAD test', + style: TextStyle( + color: Colors.black54, + fontSize: 15, + fontWeight: FontWeight.bold), + ), + ), + ), + ), + Padding( + padding: EdgeInsets.only(top: 8.0), + child: Container( + height: 1.0, + width: 300.0, + color:Colors.grey,), + ), + Container( + margin: EdgeInsets.all(5), + child: Align( + alignment: Alignment.topLeft, + child: RichText( + text: TextSpan( + text: 'Primary Unit Of Measure', + style: TextStyle( + fontWeight: FontWeight.bold, + color: Colors.black, + fontSize: 13), + ), + ), + ), + ), + Container( + margin: EdgeInsets.all(5), + child: Align( + alignment: Alignment.topLeft, + child: RichText( + text: TextSpan( + text: + 'Each', + style: TextStyle( + color: Colors.black54, + fontSize: 15, + fontWeight: FontWeight.bold), + ), + ), + ), + ), + Padding( + padding: EdgeInsets.only(top: 8.0), + child: Container( + height: 1.0, + width: 300.0, + color:Colors.grey,), + ), + Container( + margin: EdgeInsets.all(5), + child: Align( + alignment: Alignment.topLeft, + child: RichText( + text: TextSpan( + text: 'Primary Unit Of Measure', + style: TextStyle( + fontWeight: FontWeight.bold, + color: Colors.black, + fontSize: 13), + ), + ), + ), + ), + Container( + margin: EdgeInsets.all(5), + child: Align( + alignment: Alignment.topLeft, + child: RichText( + text: TextSpan( + text: + 'Each', + style: TextStyle( + color: Colors.black54, + fontSize: 15, + fontWeight: FontWeight.bold), + ), + ), + ), + ), + Padding( + padding: EdgeInsets.only(top: 8.0), + child: Container( + height: 1.0, + width: 300.0, + color:Colors.grey,), + ), + Container( + margin: EdgeInsets.all(5), + child: Align( + alignment: Alignment.topLeft, + child: RichText( + text: TextSpan( + text: 'Primary Unit Of Measure', + style: TextStyle( + fontWeight: FontWeight.bold, + color: Colors.black, + fontSize: 13), + ), + ), + ), + ), + Container( + margin: EdgeInsets.all(5), + child: Align( + alignment: Alignment.topLeft, + child: RichText( + text: TextSpan( + text: + 'Each', + style: TextStyle( + color: Colors.black54, + fontSize: 15, + fontWeight: FontWeight.bold), + ), + ), + ), + ), + Padding( + padding: EdgeInsets.only(top: 8.0), + child: Container( + height: 1.0, + width: 300.0, + color:Colors.grey,), + ), + Container( + margin: EdgeInsets.all(5), + child: Align( + alignment: Alignment.topLeft, + child: RichText( + text: TextSpan( + text: 'Primary Unit Of Measure', + style: TextStyle( + fontWeight: FontWeight.bold, + color: Colors.black, + fontSize: 13), + ), + ), + ), + ), + Container( + margin: EdgeInsets.all(5), + child: Align( + alignment: Alignment.topLeft, + child: RichText( + text: TextSpan( + text: + 'Each', + style: TextStyle( + color: Colors.black54, + fontSize: 15, + fontWeight: FontWeight.bold), + ), + ), + ), + ), + Padding( + padding: EdgeInsets.only(top: 8.0), + child: Container( + height: 1.0, + width: 300.0, + color:Colors.grey,), + ), + Container( + margin: EdgeInsets.all(5), + child: Align( + alignment: Alignment.topLeft, + child: RichText( + text: TextSpan( + text: 'Primary Unit Of Measure', + style: TextStyle( + fontWeight: FontWeight.bold, + color: Colors.black, + fontSize: 13), + ), + ), + ), + ), + Container( + margin: EdgeInsets.all(5), + child: Align( + alignment: Alignment.topLeft, + child: RichText( + text: TextSpan( + text: + 'Each', + style: TextStyle( + color: Colors.black54, + fontSize: 15, + fontWeight: FontWeight.bold), + ), + ), + ), + ), + Padding( + padding: EdgeInsets.only(top: 8.0), + child: Container( + height: 1.0, + width: 300.0, + color:Colors.grey,), + ), + ], + ), + ), + ), + ], + ), + ], + ); +} diff --git a/lib/pages/pharmacies/my_reviews.dart b/lib/pages/pharmacies/my_reviews.dart new file mode 100644 index 00000000..725743c3 --- /dev/null +++ b/lib/pages/pharmacies/my_reviews.dart @@ -0,0 +1,194 @@ +import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/review_view_model.dart'; +import 'package:flutter/material.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; +import 'package:rating_bar/rating_bar.dart'; +import 'package:diplomaticquarterapp/pages/base/base_view.dart'; + +void main() => runApp(MyReviewsPage()); + +class MyReviewsPage extends StatefulWidget { + @override + _MyReviewsPageState createState() => _MyReviewsPageState(); +} + +class _MyReviewsPageState extends State { + @override + Widget build(BuildContext context) { + return BaseView( + onModelReady: (model) => model.getReviewData(), + builder: (_, model, wi) => AppScaffold( + appBarTitle: 'Wishlist page', + isShowAppBar: true, + isPharmacy: true, + body: Container( + child: ListView.builder( + itemCount: model.reviewListList.length, + itemBuilder: (BuildContext context, int index) { + return Column( + children: [ + Container( + child: reviewDetails( + model.reviewListList[index], + double.parse(model.reviewListList[index].product + .approvedTotalReviews.toString()), + double.parse(model.reviewListList[index].rating.toString()), + ), + ), + Divider(height: 1, color: Colors.grey) + ], + ); + }), + ), + ), + ); + } +} + +reviewDetails(data, rate, myRate) { + return Container( + child: Padding( + padding: const EdgeInsets.only(bottom: 10.0), + child: Container( + height: 200, + width: double.infinity, + color: Colors.white, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Row( + children: [ + Container( + margin: EdgeInsets.only(top: 10, left: 10), + child: Image.network( + data.product.images[0].src.trim(), + fit: BoxFit.cover, + width: 80, + height: 80, + ), + ), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Container( + margin: EdgeInsets.all(5), + child: Align( + alignment: Alignment.topLeft, + child: RichText( + text: TextSpan( + text: data.product.name, + style: TextStyle( + color: Colors.black54, + fontSize: 13, + fontWeight: FontWeight.bold), + ), + ), + ), + ), + Column( + children: [ + Container( + margin: EdgeInsets.all(5), + child: Align( + alignment: Alignment.topLeft, + child: RichText( + text: TextSpan( + text: data.product.price.toString() + + " " + + data.product.currency, + style: TextStyle( + fontWeight: FontWeight.bold, + color: Colors.black, + fontSize: 13), + ), + ), + ), + ), + ], + ), + Container( + margin: EdgeInsets.all(5), + child: Align( + alignment: Alignment.topLeft, + child: RatingBar.readOnly( + initialRating: rate, + size: 15.0, + filledColor: Colors.yellow[700], + emptyColor: Colors.grey[500], + isHalfAllowed: true, + halfFilledIcon: Icons.star_half, + filledIcon: Icons.star, + emptyIcon: Icons.star, + ), + ), + ), + ], + ), + ], + ), + SizedBox( + height: 20, + ), + Container( + child: Row( + children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Container( + padding: EdgeInsets.only(left: 10), + child: Text(data.createdOnUtc.toString())), + ], + ), + ), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.end, + mainAxisAlignment: MainAxisAlignment.end, + children: [ + Container( + padding: EdgeInsets.only(left: 60), + child: RatingBar.readOnly( + initialRating: myRate, + size: 15.0, + filledColor: Colors.yellow[700], + emptyColor: Colors.grey[500], + isHalfAllowed: true, + halfFilledIcon: Icons.star_half, + filledIcon: Icons.star, + emptyIcon: Icons.star, + ), + ), + ], + ), + ), + ], + ), + ), + SizedBox( + height: 15, + ), + Expanded( + child: Container( + padding: EdgeInsets.only(left: 10), + child: Text(fixingString(data.reviewText.toString())), + ), + ), + ], + ), + ), + ), + ); +} + +fixingString(txt){ + String stringTxt; + String newTxt; + stringTxt = txt.toString(); + newTxt = stringTxt.split('.')[1]; + + return newTxt; +} diff --git a/lib/pages/pharmacies/product-brands.dart b/lib/pages/pharmacies/product-brands.dart new file mode 100644 index 00000000..86013a9c --- /dev/null +++ b/lib/pages/pharmacies/product-brands.dart @@ -0,0 +1,284 @@ +import 'package:flutter/material.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; +import 'package:diplomaticquarterapp/pages/base/base_view.dart'; +import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/brand_view_model.dart'; + +void main() => runApp(ProductBrandsPage()); + +class ProductBrandsPage extends StatefulWidget { + @override + _ProductBrandsPageState createState() => _ProductBrandsPageState(); +} + +class _ProductBrandsPageState extends State { + @override + Widget build(BuildContext context) { + return BaseView( + onModelReady: (model) => model.getTopBrandsData(), + builder: (_, model, wi) => AppScaffold( + appBarTitle: 'Brands page', + isShowAppBar: true, + isPharmacy: true, + body: Container( + child: Column( + children: [ + Container( + color: Colors.white, + alignment: Alignment.topLeft, + padding: EdgeInsets.only(left: 10.0, top: 10.0), + child: Text( + 'Top Brands', + style: TextStyle( + fontWeight: FontWeight.bold + ), + ), + ), + Container( + height: 220, + width: double.infinity, + color: Colors.white, + child: topBrand(), + ), + SizedBox( + height: 10, + ), + Container( + height: 100, + width: double.infinity, + color: Colors.white, + child: IconButton( + icon: Icon(Icons.search), + onPressed: () { + showSearch(context: context, delegate: SearchBar()); + }, + ), + ), + SizedBox( + height: 10, + ), + Container( + height: 280, + width: double.infinity, + color: Colors.white, + child: ListView.builder( + itemCount: model.brandsListList.length, + itemBuilder: (BuildContext ctxt, int index) { + return Container( + margin: EdgeInsets.only(top: 50, left: 10), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Text(model.brandsListList[index].name), + SizedBox( + height: 3, + ), + Divider(height: 1, color: Colors.grey) + ], + ), + ); + }), + ), + ], + ), + ), + ), + ); + } +} + +//topBrand() { +// return BaseView( +// onModelReady: (model) => model.getBrandsData(), +// builder: (_, model, wi) => Column( +// crossAxisAlignment: CrossAxisAlignment.start, +// mainAxisAlignment: MainAxisAlignment.start, +// children: [ +// Container( +// padding: EdgeInsets.all(10), +// child: Text( +// 'Top Brands', +// ), +// ), +// Row( +// children: [ +// Container( +// margin: EdgeInsets.fromLTRB(10.0, 10.0, 0.0, 0.0), +// child: Container( +// margin: EdgeInsets.only(bottom: 10.0), +// child: Container( +// margin: EdgeInsets.only(bottom: 10.0), +// child: Container( +// child: Container( +// padding: EdgeInsets.symmetric( +// horizontal: 10.0, vertical: 10.0), +// decoration: BoxDecoration( +// borderRadius: BorderRadius.circular(10), +// border: Border( +// top: BorderSide(width: 1.0, color: Colors.grey), +// left: BorderSide(width: 1.0, color: Colors.grey), +// right: BorderSide(width: 1.0, color: Colors.grey), +// bottom: BorderSide(width: 1.0, color: Colors.grey), +// ), +// color: Colors.white, +// ), +// child: Image( +// image: AssetImage( +// 'assets/images/al-habib_onlne_pharmacy_bg.png'), +// fit: BoxFit.cover, +// width: 60, +// height: 40, +// ), +// ), +// ), +// ), +// ), +// ), +// ], +// ), +// Row( +// children: [ +// Container( +// margin: EdgeInsets.fromLTRB(10.0, 10.0, 0.0, 0.0), +// child: Container( +// margin: EdgeInsets.only(bottom: 10.0), +// child: Container( +// margin: EdgeInsets.only(bottom: 10.0), +// child: Container( +// padding: EdgeInsets.only(left: 5), +// child: Container( +// padding: EdgeInsets.symmetric( +// horizontal: 10.0, vertical: 10.0), +// decoration: BoxDecoration( +// borderRadius: BorderRadius.circular(10), +// border: Border( +// top: BorderSide(width: 1.0, color: Colors.grey), +// left: BorderSide(width: 1.0, color: Colors.grey), +// right: BorderSide(width: 1.0, color: Colors.grey), +// bottom: BorderSide(width: 1.0, color: Colors.grey), +// ), +// color: Colors.white, +// ), +// child: Image( +// image: AssetImage( +// 'assets/images/al-habib_onlne_pharmacy_bg.png'), +// fit: BoxFit.cover, +// width: 60, +// height: 40, +// ), +// ), +// ), +// ), +// ), +// ), +// ], +// ), +// ], +// ), +// ); +//} + +topBrand() { + return BaseView( + onModelReady: (model) => model.getTopBrandsData(), + builder: (_, model, wi) => GridView.count( + crossAxisCount: 4, + children: List.generate( + model.topBrandsListList.length, + (index) => Column( + children: [ + Container( + margin: EdgeInsets.fromLTRB(5.0, 10.0, 5.0, 0.0), + child: Container( + child: Container( + child: Container( +// padding: EdgeInsets.only(left: 5), + child: Container( + padding: EdgeInsets.symmetric( + horizontal: 10.0, vertical: 10.0), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10), + border: Border( + top: BorderSide(width: 1.0, color: Colors.grey), + left: BorderSide(width: 1.0, color: Colors.grey), + right: BorderSide(width: 1.0, color: Colors.grey), + bottom: BorderSide(width: 1.0, color: Colors.grey), + ), + color: Colors.white, + ), + child: Image.network( + model.topBrandsListList[index].image.src.trim(), + fit: BoxFit.cover, + width: 60, + height: 40, + ), + ), + ), + ), + ), + ), + ], + ), + ), + ), + ); +} + +brandSearch() { + return Text('ENAD'); +} + +class SearchBar extends SearchDelegate { + @override + List buildActions(BuildContext context) { + return [ + IconButton( + icon: Icon(Icons.clear), + onPressed: () { + query = ""; + }, + ) + ]; + } + + @override + Widget buildLeading(BuildContext context) { + return IconButton( + icon: AnimatedIcon( + icon: AnimatedIcons.menu_arrow, + progress: transitionAnimation, + ), + onPressed: () { + close(context, null); + }, + ); + } + + @override + Widget buildResults(BuildContext context) { + return Container( + height: 100, + width: 100, + child: Card( + color: Colors.red, + child: Center( + child: Text(query), + ), + ), + ); + } + + @override + Widget buildSuggestions(BuildContext context) { + return ListView.builder( + itemCount: 5, + itemBuilder: (context, index) => ListTile( + leading: Icon(Icons.location_city), + title: Text("Enad"), + onTap: () { + showResults(context); + }, + ), + ); + } +} diff --git a/lib/pages/pharmacies/product_detail.dart b/lib/pages/pharmacies/product_detail.dart new file mode 100644 index 00000000..aa91f072 --- /dev/null +++ b/lib/pages/pharmacies/product_detail.dart @@ -0,0 +1,888 @@ +import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/product_detail_view_model.dart'; +import 'package:diplomaticquarterapp/pages/base/base_view.dart'; +import 'package:flutter/material.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; +import 'package:font_awesome_flutter/font_awesome_flutter.dart'; +import 'package:rating_bar/rating_bar.dart'; +import 'package:provider/provider.dart'; + +int price = 0; +void main() => runApp(ProductDetailPage()); + +class ProductDetailPage extends StatefulWidget { + @override + __ProductDetailPageState createState() => __ProductDetailPageState(); +} + +class __ProductDetailPageState extends State { + bool isTrue = true; + bool isDetails = true; + bool isReviews = false; + bool isAvailabilty = false; + + Widget build(BuildContext context) { + return AppScaffold( + appBarTitle: 'product detail page', + isShowAppBar: true, + isPharmacy: true, + body: SingleChildScrollView( + child: Column( + children: [ + Container( + width: double.infinity, + color: Colors.white, + child: Column( + children: [ + Image( + image: AssetImage('assets/images/timeline_bg.png'), + ), + Container( + width: double.infinity, + height: 50, + color: Colors.yellowAccent, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Expanded( + flex: 1, + child: Container( + alignment: Alignment.centerRight, + child: Text( + "Discount on Second item", + style: TextStyle( + fontWeight: FontWeight.bold, fontSize: 17), + ), + ), + ), + SizedBox( + width: 10, + ), + Expanded( + flex: 0, + child: Container( + child: Image( + image: AssetImage('assets/images/offer.png'), + ), + ), + ), + ], + ), + ), + ], + ), + ), + SizedBox( + height: 4, + ), + Container( + width: 500, + height: 150, + color: Colors.white, + child: productNameAndPrice(), + ), + SizedBox( + height: 6, + ), + Container( + width: 500, + height: 120, + color: Colors.white, + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.all(8.0), + child: Container( + child: Text( + "Specificaion", + style: TextStyle(fontWeight: FontWeight.bold), + ), + ), + ), + Divider(color: Colors.grey) + ], + ), + ), + SizedBox( + height: 6, + ), + Container( + width: 500, + margin: EdgeInsets.only(bottom: 100), +// height: 350, + color: Colors.white, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Column( + children: [ + FlatButton( + onPressed: () { + setState(() { + isDetails = true; + isReviews = false; + isAvailabilty = false; + }); + }, + child: Text( + 'DETAILS', + style: TextStyle( + fontSize: 16, fontWeight: FontWeight.bold), + ), + color: Colors.white, + ), + isDetails + ? Container( + width: 100, + height: 5, + color: Colors.green, + ) + : Container() + ], + ), + SizedBox( + width: 20, + ), + Column( + children: [ + FlatButton( + onPressed: () { + setState(() { + isDetails = false; + isReviews = true; + isAvailabilty = false; + }); + }, + child: Text( + 'REVIEWS', + style: TextStyle( + fontSize: 16, fontWeight: FontWeight.bold), + ), + color: Colors.white, + ), + isReviews + ? Container( + width: 100, + height: 5, + color: Colors.green, + ) + : Container(), + ], + ), + SizedBox( + width: 20, + ), + Column( + children: [ + FlatButton( + onPressed: () { + setState(() { + isDetails = false; + isReviews = false; + isAvailabilty = true; + }); + }, + child: Text( + 'AVAILABILTY', + style: TextStyle( + fontSize: 16, fontWeight: FontWeight.bold), + ), + color: Colors.white, + ), + isAvailabilty + ? Container( + width: 100, + height: 5, + color: Colors.green, + ) + : Container(), + ], + ), + ], + ), + SizedBox( + height: 10, + ), + isDetails + ? Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + child: Text( + 'Description', + style: TextStyle( + fontSize: 17, + color: Colors.grey, + fontWeight: FontWeight.w600), + ), + ), + SizedBox( + height: 10, + ), + Container( + child: Text( + 'Body Mosturizing and nourishing lotion', + style: TextStyle(fontSize: 20), + ), + ), + ], + ), + ) + : isReviews + ? BaseView( + onModelReady: (model) => + model.getProductReviewsData(), + builder: (_, model, wi) => ListView.builder( + physics: const ScrollPhysics(), + itemCount: model.productDetailService[0].reviews.length, + scrollDirection: Axis.vertical, + shrinkWrap: true, + itemBuilder: (BuildContext context, int index){ + return Padding( + padding: EdgeInsets.all(8.0), + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + child: Row( + children: [ + Container( + child: Text( + model.productDetailService[0] + .reviews[index].id + .toString(), + style: TextStyle( + fontSize: 17, + color: Colors.grey, + fontWeight: FontWeight.w600), + ), + ), + Container( + margin: EdgeInsets.only(left: 232), + child: RatingBar.readOnly( + initialRating: model + .productDetailService[0] + .reviews[index] + .rating + .toDouble(), + size: 15.0, + filledColor: Colors.yellow[700], + emptyColor: Colors.grey[500], + isHalfAllowed: true, + halfFilledIcon: Icons.star_half, + filledIcon: Icons.star, + emptyIcon: Icons.star, + ), + ), + ], + ), + ), + SizedBox( + height: 10, + ), + Container( + child: Text( + model.productDetailService[0].reviews[index] + .reviewText, + style: TextStyle(fontSize: 20), + ), + ), + SizedBox( + height: 50, + ), + Divider(height: 1, color: Colors.grey), + ], + ), + ); + }, + ), + ) + : isAvailabilty + ? BaseView( + onModelReady: (model) => + model.getProductLocationData(), + builder: (_, model, wi) => ListView.builder( + physics: const ScrollPhysics(), + scrollDirection: Axis.vertical, + shrinkWrap: true, + itemCount: model.productLocationService.length, + itemBuilder: (BuildContext context, int index){ + return Padding( + padding: const EdgeInsets.all(8.0), + child: Column( +// crossAxisAlignment: CrossAxisAlignment.start, +// mainAxisAlignment: MainAxisAlignment.start, + children: [ + Row( +// crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: + MainAxisAlignment.start, + children: [ + Expanded( + flex: 1, + child: Image.network(model + .productLocationService[index] + .projectImageUrl), + ), + SizedBox( + width: 10, + ), + Expanded( + flex: 4, + child: Text( + model.productLocationService[index] + .locationDescription + + "\n" + + fixingString(model + .productLocationService[ + 0] + .cityName + .toString()), + style: TextStyle(fontSize: 12), + ), + ), + Expanded( + flex: 1, + child: IconButton( + icon: Icon(Icons.location_on), + color: Colors.red, + onPressed: () {}, + ), + ), + Expanded( + flex: 1, + child: IconButton( + icon: Icon(Icons.phone), + color: Colors.red, + onPressed: () {}, + ), + ), + ], + ), + Divider(height: 1.2, color: Colors.grey) + ], + ), + ); + }, + + ), + ) + : Container(), + ], + ), + ), +// ListView(scrollDirection: Axis.vertical, shrinkWrap: true, children: [Text('ENAD')]), + ], + ), + ), + bottomSheet: footerWidget(), + ); + } +} + +class footerWidget extends StatefulWidget { + @override + _footerWidgetState createState() => _footerWidgetState(); +} + +class _footerWidgetState extends State { + double quantityUI = 70; + bool showUI = false; + @override + Widget build(BuildContext context) { + return Container( + width: double.infinity, + height: quantityUI, + color: Colors.white, + child: Column( + children: [ + showUI + ? Container( + width: double.infinity, + height: 90, + color: Colors.white, + child: Container( + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.all(8.0), + child: Text( + 'Quantity', + style: TextStyle( + fontSize: 15, fontWeight: FontWeight.bold), + ), + ), +// ListView( +// scrollDirection: Axis.horizontal, +// children: [ +// itemQuantity(), +// ], +// ), + Container( +// margin: EdgeInsets.symmetric(vertical: 20.0), + height: 50.0, + child: ListView( + scrollDirection: Axis.horizontal, + children: [ + InkWell( + child: Container( + alignment: Alignment.center, + width: 50.0, + color: Colors.white, + child: Text( + '1', + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 20), + ), + ), + onTap: () { + setState(() { + price = 1; + return price; + }); + }, + ), + SizedBox( + width: 5, + ), + InkWell( + child: Container( + alignment: Alignment.center, + width: 50.0, + color: Colors.white, + child: Text( + '2', + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 20), + ), + ), + onTap: () { + setState(() { + price = 2; + // return price; + }); + }, + ), + SizedBox( + width: 5, + ), + InkWell( + child: Container( + alignment: Alignment.center, + width: 50.0, + color: Colors.white, + child: Text( + '3', + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 20), + ), + ), + onTap: () { + setState(() { + price = 3; + return price; + }); + }, + ), + SizedBox( + width: 5, + ), + InkWell( + child: Container( + alignment: Alignment.center, + width: 50.0, + color: Colors.white, + child: Text( + '4', + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 20), + ), + ), + onTap: () { + setState(() { + price = 4; + return price; + }); + }, + ), + SizedBox( + width: 5, + ), + InkWell( + child: Container( + alignment: Alignment.center, + width: 50.0, + color: Colors.white, + child: Text( + '5', + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 20), + ), + ), + onTap: () { + setState(() { + price = 5; + return price; + }); + }, + ), + SizedBox( + width: 5, + ), + InkWell( + child: Container( + alignment: Alignment.center, + width: 50.0, + color: Colors.white, + child: Text( + '6', + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 20), + ), + ), + onTap: () { + setState(() { + price = 6; + return price; + }); + }, + ), + SizedBox( + width: 5, + ), + InkWell( + child: Container( + alignment: Alignment.center, + width: 50.0, + color: Colors.white, + child: Text( + '7', + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 20), + ), + ), + onTap: () { + setState(() { + price = 7; + return price; + }); + }, + ), + SizedBox( + width: 5, + ), + InkWell( + child: Container( + alignment: Alignment.center, + width: 50.0, + color: Colors.white, + child: Text( + '8', + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 20), + ), + ), + onTap: () { + setState(() { + price = 8; + return price; + }); + }, + ), + SizedBox( + width: 5, + ), + InkWell( + child: Container( + alignment: Alignment.center, + width: 50.0, + color: Colors.white, + child: Text( + '9', + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 20), + ), + ), + onTap: () { + setState(() { + price = 9; + return price; + }); + }, + ), + SizedBox( + width: 5, + ), + InkWell( + child: Container( + alignment: Alignment.center, + width: 50.0, + color: Colors.white, + child: Text( + '10', + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 20), + ), + ), + onTap: () { + setState(() { + price = 10; + return price; + }); + }, + ), + SizedBox( + width: 5, + ), + Container( + width: 50.0, + child: TextField( + decoration: + InputDecoration(labelText: 'quantity #'), + onChanged: (text) { + if (int.tryParse(text) == null) { + text = ''; + } else { + setState(() { + price = int.parse(text); + }); + } + }, + ), + ), + ], + ), + ) + ], + ), + ), + ) + : Container( + height: 20, + ), + Row( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + width: 70, + height: 50, + child: FlatButton( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Expanded( + flex: 4, + child: Text( + price.toString(), + style: TextStyle(fontSize: 20), + ), + ), + Expanded( + flex: 5, + child: Text( + "QTY", + style: TextStyle(fontSize: 16), + ), + ), + ], + ), + onPressed: () { + setState(() { + if (showUI) { + quantityUI = 70; + showUI = false; + } else { + quantityUI = 150; + showUI = true; + } + }); + }, + ), + ), + InkWell( + onTap: () {}, + child: Container( + alignment: Alignment.center, + width: 190, + height: 46, + color: Colors.green, + child: Text( + 'Add to Cart', + style: TextStyle( + color: Colors.white, + fontWeight: FontWeight.bold, + fontSize: 15), + ), + ), + ), + SizedBox( + width: 5, + ), + InkWell( + onTap: () {}, + child: Container( + alignment: Alignment.center, + width: 120, + height: 46, + color: Colors.blue, + child: Text( + 'Buy Now', + style: TextStyle( + color: Colors.white, + fontWeight: FontWeight.bold, + fontSize: 15), + ), + ), + ), + ], + ), + ], + ), + ); + } +} + +productNameAndPrice() { + return Column( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.all(8.0), + child: Row( + children: [ + Text( + "22 SR", + style: TextStyle(fontWeight: FontWeight.bold, fontSize: 30), + ), + SizedBox( + width: 100, + ), + Text( + "Out Of Stock", + style: TextStyle(fontWeight: FontWeight.bold, color: Colors.red), + ), + SizedBox(width: 30), + Text( + "notify me ", + style: TextStyle( + color: Colors.blue, + decoration: TextDecoration.underline, + ), + ), + Icon( + FontAwesomeIcons.bell, + color: Colors.blue, + size: 15.0, + ), + ], + ), + ), + Padding( + padding: const EdgeInsets.all(8.0), + child: Container( + margin: EdgeInsets.only(left: 5), + child: Text( + "Johnson And Jonson Vita-Rich Smoothing Body Cream - With Papaya Extract 200 ML", + style: TextStyle(fontWeight: FontWeight.bold, fontSize: 15), + ), + ), + ), + Row( + children: [ + Expanded( + flex: 2, + child: Container( + margin: EdgeInsets.only(right: 150), + child: Align( + alignment: Alignment.bottomLeft, + child: RatingBar.readOnly( + initialRating: 3, + size: 15.0, + filledColor: Colors.yellow[700], + emptyColor: Colors.grey[500], + isHalfAllowed: true, + halfFilledIcon: Icons.star_half, + filledIcon: Icons.star, + emptyIcon: Icons.star, + ), + ), + ), + ), + Expanded( + flex: 1, + child: Container( + child: Text( + 'Prescription attachment required', + style: TextStyle(color: Colors.red, fontSize: 10), + ), + ), + ), + Icon( + FontAwesomeIcons.questionCircle, + color: Colors.red, + size: 15.0, + ), + ], + ), + ], + ); +} + +slideDetail() { + return Row( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.all(8.0), + child: Container( + padding: const EdgeInsets.symmetric(horizontal: 14.0, vertical: 15.0), + decoration: const BoxDecoration( + border: Border( + top: BorderSide(width: 0.5, color: Colors.grey), + left: BorderSide(width: 0.5, color: Colors.grey), + right: BorderSide(width: 0.5, color: Colors.grey), + bottom: BorderSide(width: 0.5, color: Colors.grey), + ), + color: Colors.white, + ), + child: const Text('1', + textAlign: TextAlign.center, + style: TextStyle(color: Color(0xFF000000))), + ), + ) + ], + ); +} + +fixingString(txt) { + String stringTxt; + String newTxt; + stringTxt = txt.toString(); + newTxt = stringTxt.split('.')[1]; + + return newTxt; +} diff --git a/lib/pages/pharmacies/wishlist.dart b/lib/pages/pharmacies/wishlist.dart index 8fa7352d..3a09031b 100644 --- a/lib/pages/pharmacies/wishlist.dart +++ b/lib/pages/pharmacies/wishlist.dart @@ -1,8 +1,8 @@ -import 'package:diplomaticquarterapp/config/config.dart'; +import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/wishlist_view_model.dart'; +import 'package:diplomaticquarterapp/pages/base/base_view.dart'; +import 'package:diplomaticquarterapp/pages/pharmacies/ProductCheckTypeWidget.dart'; import 'package:flutter/material.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; -import 'package:diplomaticquarterapp/services/pharmacy_services/wishList_service.dart'; -import 'package:diplomaticquarterapp/widgets/pharmacy/product_tile.dart'; void main() => runApp(WishlistPage()); @@ -14,42 +14,60 @@ class WishlistPage extends StatefulWidget { } class _WishlistPageState extends State { - - @override - void initState(){ - WidgetsBinding.instance.addPostFrameCallback((_) => getWishListItems()); - } + bool isTrue = true; Widget build(BuildContext context) { - return AppScaffold( - appBarTitle: 'Wishlist page', - isShowAppBar: true, - isPharmacy: true, - body: Container( -// child: productTile(), - child: ListView.builder( - itemCount: 3, - itemBuilder: (BuildContext context, int index) { - return Column( - children: [ - Container( - child: productTile(productName: 'Panadol Extra 500 MG', productPrice: '10.00', productRate: 3.00,), - ), - Divider(height: 1, color: Colors.grey) - ], - ); - }), + return BaseView( + onModelReady: (model) => model.getWishlistData(), + builder: (_, model, wi) => AppScaffold( + appBarTitle: 'Wishlist page', + isShowAppBar: true, + isPharmacy: true, + body: Container( +// child: ListView.builder( +// itemCount: 3, +// itemBuilder: (BuildContext context, int index) { +// return Column( +// children: [ +// Container( +// child: productTile(productName: 'Panadol Extra 500 MG', productPrice: '10.00', productRate: 3.00,), +// ), +// Divider(height: 1, color: Colors.grey) +// ], +// ); +// }), + child: Column( + children: [ +// Expanded( +// flex: 1, +// child: Container( +// color: Colors.white, +// width: double.infinity, +// height: 30, +// child: IconButton( +// alignment: Alignment.topRight, +// icon: Icon(Icons.art_track), +// color: Colors.blueAccent, +// onPressed: () { +// setState(() { +// isTrue = !isTrue; +// }); +// }, +// ), +// ), +// ), + Expanded( + flex: 20, + child: Container( + width: double.infinity, + height: MediaQuery.of(context).size.height * 0.85, //250, + child: ProductCheckTypeWidget(isTrue, model.wishListList), + ), + ), + ], + ), + ), ), ); } } - -getWishListItems() { - - print("getWishListItems"); - WishListService service = new WishListService(); - service.getWishlist(AppGlobal.context).then((res) { - print(res); - }); - -} diff --git a/lib/services/pharmacy_services/brands_service.dart b/lib/services/pharmacy_services/brands_service.dart new file mode 100644 index 00000000..e4a40d6c --- /dev/null +++ b/lib/services/pharmacy_services/brands_service.dart @@ -0,0 +1,44 @@ +import 'package:diplomaticquarterapp/config/config.dart'; +import 'package:diplomaticquarterapp/core/service/base_service.dart'; +import 'package:diplomaticquarterapp/models/pharmacy/brandModel.dart'; +import 'package:diplomaticquarterapp/models/pharmacy/topBrandsModel.dart'; +import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; + +class BrandsService extends BaseService { + AppSharedPreferences sharedPref = AppSharedPreferences(); + bool isLogin = false; + + List _brandsList = List(); + List get brandsList => _brandsList; + + List _topBrandsList = List(); + List get topBrandsList => _topBrandsList; + + Future getBrands() async { + hasError = false; + await baseAppClient.getPharmacy(GET_BRANDS, + onSuccess: (dynamic response, int statusCode) { + _brandsList.clear(); + response['manufacturer'].forEach((item) { + _brandsList.add(Brand.fromJson(item)); + }); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }); + } + + Future getTopBrands() async { + hasError = false; + await baseAppClient.getPharmacy(GET_TOP_BRANDS, + onSuccess: (dynamic response, int statusCode) { + _topBrandsList.clear(); + response['manufacturer'].forEach((item) { + _topBrandsList.add(TopBrand.fromJson(item)); + }); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }); + } +} diff --git a/lib/services/pharmacy_services/product_detail_service.dart b/lib/services/pharmacy_services/product_detail_service.dart new file mode 100644 index 00000000..f9bbb7e3 --- /dev/null +++ b/lib/services/pharmacy_services/product_detail_service.dart @@ -0,0 +1,61 @@ +import 'package:diplomaticquarterapp/config/config.dart'; +import 'package:diplomaticquarterapp/core/service/base_service.dart'; +import 'package:diplomaticquarterapp/models/pharmacy/locationModel.dart'; +import 'package:diplomaticquarterapp/models/pharmacy/productDetailModel.dart'; +import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; + +class ProductDetailService extends BaseService { + AppSharedPreferences sharedPref = AppSharedPreferences(); + bool isLogin = false; + + List _productDetailList = List(); + List get productDetailList => _productDetailList; + + List _productLocationList = List(); + List get productLocationList => _productLocationList; + + + Future getProductReviews() async { + hasError = false; + await baseAppClient.getPharmacy(GET_PRODUCT_DETAIL+"1480?fields=reviews", + onSuccess: (dynamic response, int statusCode) { + _productDetailList.clear(); + response['products'].forEach((item) { + _productDetailList.add(ProductDetail.fromJson(item)); + print(response); + }); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }); + } + + Future getProductAvailabiltyDetail() async { + hasError = false; + Map request; + + request = { + "Channel": 3, + "DeviceTypeID": 2, + "IPAdress": "10.20.10.20", + "LanguageID": 2, + "PatientOutSA": 0, + "SKU": "6720020025", + "SessionID": null, + "VersionID": 5.6, + "generalid": "Cs2020@2016\$2958", + "isDentalAllowedBackend": false + }; + await baseAppClient.post(GET_LOCATION, + onSuccess: (dynamic response, int statusCode) { + _productLocationList.clear(); + response['PharmList'].forEach((item) { + _productLocationList.add(LocationModel.fromJson(item)); + }); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: request); + } + +} diff --git a/lib/services/pharmacy_services/review_service.dart b/lib/services/pharmacy_services/review_service.dart new file mode 100644 index 00000000..67434643 --- /dev/null +++ b/lib/services/pharmacy_services/review_service.dart @@ -0,0 +1,28 @@ +import 'package:diplomaticquarterapp/config/config.dart'; +import 'package:diplomaticquarterapp/core/service/base_service.dart'; +import 'package:diplomaticquarterapp/models/pharmacy/reviewModel.dart'; +import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; + + +class ReviewService extends BaseService { + AppSharedPreferences sharedPref = AppSharedPreferences(); + bool isLogin = false; + List _reviewList = List(); + List get reviewList => _reviewList; + + + Future getReview() async { + hasError = false; + await baseAppClient.getPharmacy(GET_REVIEW+"1367368", + onSuccess: (dynamic response, int statusCode) { + _reviewList.clear(); + response['reviews'].forEach((item) { + _reviewList.add(Review.fromJson(item)); + }); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }); + } + +} diff --git a/lib/services/pharmacy_services/wishList_service.dart b/lib/services/pharmacy_services/wishList_service.dart index 0f9687e8..d4a00230 100644 --- a/lib/services/pharmacy_services/wishList_service.dart +++ b/lib/services/pharmacy_services/wishList_service.dart @@ -1,8 +1,9 @@ - import 'package:diplomaticquarterapp/config/config.dart'; import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; import 'package:diplomaticquarterapp/core/service/base_service.dart'; import 'package:diplomaticquarterapp/models/Authentication/authenticated_user.dart'; +import 'package:diplomaticquarterapp/models/pharmacy/Wishlist.dart'; +import 'package:diplomaticquarterapp/models/pharmacy/products.dart'; import 'package:diplomaticquarterapp/services/authentication/auth_provider.dart'; import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; import 'package:flutter/material.dart'; @@ -10,30 +11,61 @@ import 'package:flutter/material.dart'; class WishListService extends BaseService { AppSharedPreferences sharedPref = AppSharedPreferences(); - AppGlobal appGlobal = new AppGlobal(); - - AuthenticatedUser authUser = new AuthenticatedUser(); - AuthProvider authProvider = new AuthProvider(); - - - Future getWishlist(BuildContext context) async { + bool isLogin = false; + List _wishListProducts = List(); + List get wishListProducts => _wishListProducts; - if (await this.sharedPref.getObject(USER_PROFILE) != null) { - var data = AuthenticatedUser.fromJson( - await this.sharedPref.getObject(USER_PROFILE)); - authUser = data; - } +// Future getWishlist() async { +// var isLogin = await sharedPref.getString(LOGIN_TOKEN_ID); +// this.isLogin = isLogin != null; +//// if (!isLogin) { +//// // if not login +//// } else { +//// try { +//// await baseAppClient.get( +//// GET_WISHLIST +'/productsbyids/5308,3608,2316,963,5045,2714,1480,',//+ "272843" + "?shopping_cart_type=2", +//// onSuccess: (dynamic response, int statusCode) { +//// wishListProducts.clear(); +//// response['shopping_carts'].forEach((item) { +//// wishListProducts.add(Product.fromJson(item)); +//// }); +//// }, onFailure: (String error, int statusCode) { +//// hasError = true; +//// super.error = error; +//// }); +//// } catch (error) { +//// throw error; +//// } +//// } +// hasError = false; +// try { +// await baseAppClient.getPharmacy(GET_WISHLIST+"1367368?shopping_cart_type=2", +// onSuccess: (dynamic response, int statusCode) { +// wishListProducts.clear(); +// response.forEach((item) { +// wishListProducts.add(Wishlist.fromJson(response)); +// }); +// }, onFailure: (String error, int statusCode) { +// hasError = true; +// super.error = error; +// }); +// } catch (error) { +// throw error; +// } +// } - dynamic localRes; - String URL; - URL = GET_WISHLIST+"272843"+"?shopping_cart_type=2"; - await baseAppClient.get(URL, - onSuccess: (response, statusCode) async { - localRes = response; + Future getWishlist() async { + hasError = false; + await baseAppClient.getPharmacy(GET_WISHLIST+"1367368?shopping_cart_type=2", + onSuccess: (dynamic response, int statusCode) { + _wishListProducts.clear(); + response['shopping_carts'].forEach((item) { + _wishListProducts.add(Wishlist.fromJson(item)); + }); }, onFailure: (String error, int statusCode) { - throw error; + hasError = true; + super.error = error; }); - return Future.value(localRes); } } diff --git a/lib/widgets/others/app_scaffold_widget.dart b/lib/widgets/others/app_scaffold_widget.dart index 53a945aa..c203d0a6 100644 --- a/lib/widgets/others/app_scaffold_widget.dart +++ b/lib/widgets/others/app_scaffold_widget.dart @@ -33,6 +33,7 @@ class AppScaffold extends StatelessWidget { final bool isBottomBar; final Widget floatingActionButton; final bool isPharmacy; + final bool showCart; final String title; final String description; final bool isShowDecPage; @@ -51,9 +52,12 @@ class AppScaffold extends StatelessWidget { this.baseViewModel, this.floatingActionButton, this.isPharmacy = false, + this.showCart = false, this.title, this.description, - this.isShowDecPage = true, this.isBottomBar,this.backgroundColor}); + this.isShowDecPage = true, + this.isBottomBar, + this.backgroundColor}); @override Widget build(BuildContext context) { @@ -80,7 +84,7 @@ class AppScaffold extends StatelessWidget { ), centerTitle: true, actions: [ - isPharmacy + isPharmacy && showCart ? IconButton( icon: Icon(Icons.shopping_cart), color: Colors.white, @@ -89,7 +93,7 @@ class AppScaffold extends StatelessWidget { .popUntil(ModalRoute.withName('/')); }, ) - : IconButton( + : isPharmacy && !showCart ? Container() :IconButton( icon: Icon(FontAwesomeIcons.home), color: Colors.white, onPressed: () { diff --git a/lib/widgets/pharmacy/product_tile.dart b/lib/widgets/pharmacy/product_tile.dart index 3fa93363..6e484ae2 100644 --- a/lib/widgets/pharmacy/product_tile.dart +++ b/lib/widgets/pharmacy/product_tile.dart @@ -9,12 +9,14 @@ class productTile extends StatelessWidget { final String productName; final String productPrice; final double productRate; + final String productImage; + final bool showLine; - productTile({this.productName, this.productPrice, this.productRate}); + productTile({this.productName, this.productPrice, this.productRate,this.productImage ,this.showLine = true}); @override Widget build(BuildContext context) { - return Container( + return showLine? Container( height: 120, width: double.infinity, color: Colors.white, @@ -26,13 +28,19 @@ class productTile extends StatelessWidget { children: [ Container( margin: EdgeInsets.only(left: 10), - child: Image( - image: - AssetImage('assets/images/al-habib_onlne_pharmacy_bg.png'), + child: Image.network( + productImage.trim(), fit: BoxFit.cover, width: 80, height: 80, ), +// child: Image( +// image: +// AssetImage('assets/images/al-habib_onlne_pharmacy_bg.png'), +// fit: BoxFit.cover, +// width: 80, +// height: 80, +// ), ), Expanded( flex: 5, @@ -102,6 +110,102 @@ class productTile extends StatelessWidget { ), ], ), + ): + Container( + child: Padding( + padding: EdgeInsets.all(8.0), + child: Row( + children: [ + Padding( + padding: EdgeInsets.only(left:15), + child: Container( + width: 160, + height: 200, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10), + border: Border( + top: BorderSide(width: 0.5, color: Colors.grey), + left: BorderSide(width: 0.5, color: Colors.grey), + right: BorderSide(width: 0.5, color: Colors.grey), + bottom: BorderSide(width: 0.5, color: Colors.grey), + ), + color: Colors.white), + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + SizedBox(height: 2,), + Container( + child: Image.network( + productImage.trim(), + fit: BoxFit.cover, + width: 80, + height: 70, + ), + ), + SizedBox(height: 10,), +// Container(width: 150,height: 20,color: Colors.green,), + Container( + alignment: Alignment.centerLeft, + child:Column( + children: [ + Container( + margin: EdgeInsets.all(5), + child: Align( + alignment: Alignment.topLeft, + child: RichText( + text: TextSpan( + text: + productName, + style: TextStyle( + color: Colors.black54, + fontSize: 15, + fontWeight: FontWeight.bold), + ), + ), + ), + ), + Container( + margin: EdgeInsets.all(5), + child: Align( + alignment: Alignment.topLeft, + child: RichText( + text: TextSpan( + text: 'SAR $productPrice', + style: TextStyle( + fontWeight: FontWeight.bold, + color: Colors.black, + fontSize: 13), + ), + ), + ), + ), + Container( + alignment: Alignment.topLeft, + margin: EdgeInsets.all(5), + child: Align( + child: RatingBar.readOnly( + initialRating: productRate, + size: 15.0, + filledColor: Colors.yellow[700], + emptyColor: Colors.grey[500], + isHalfAllowed: true, + halfFilledIcon: Icons.star_half, + filledIcon: Icons.star, + emptyIcon: Icons.star, + ), + ), + ), + ], + ), + ), + ], + ), + ), + ), + ], + ), + ), ); } } From 378562b78110ab73331a8bdec5dde4507724aacc Mon Sep 17 00:00:00 2001 From: mosazaid Date: Mon, 7 Dec 2020 15:44:26 +0200 Subject: [PATCH 04/18] adding some changes in order pages like translate texts --- lib/config/localized_values.dart | 14 ++- .../pharmacies/screens/cart-order-page.dart | 108 +++++++++--------- .../screens/cart-order-preview.dart | 64 +++++++---- lib/uitl/translations_delegate_base.dart | 8 ++ 4 files changed, 114 insertions(+), 80 deletions(-) diff --git a/lib/config/localized_values.dart b/lib/config/localized_values.dart index 15ae4181..c98fbb14 100644 --- a/lib/config/localized_values.dart +++ b/lib/config/localized_values.dart @@ -669,9 +669,16 @@ const Map localizedValues = { "shippedMethod": {"en": "SHIP BY:", "ar": " الشحن بواسطة:"}, "orderDetail": {"en": "Order Detail", "ar": " تفاصيل الطلب"}, "orderSummary": {"en": "Order Summary", "ar": " تفاصيل المنتج"}, - "subtotal": {"en": "Subtotal", "ar": " المجموع"}, + "subtotal": {"en": "Subtotal", "ar": " المجموع الفرعي"}, "shipping": {"en": "Shipping", "ar": " الشحن"}, + "shipBy": {"en": "SHIP BY:", "ar": "الشحن عن طريق:"}, + "lakumPoints": {"en": "Lakum Points", "ar": "نقاط لكم"}, + "use": {"en": "USE", "ar": "استخدم"}, + "proceedPay": {"en": "PROCEED TO PAY", "ar": "المتابعة للدفع"}, "vat": {"en": "VAT (15%)", "ar": "(15%) القيمة المضافة"}, + "inclusiveVat": {"en": "(inclusive VAT)", "ar": "(شامل الضريبة)"}, + "items": {"en": "item(s)", "ar": "عنصر"}, + "checkOut": {"en": "CHECK OUT", "ar": "الدفع"}, "sar": {"en": "SAR", "ar": " ر.س "}, "payOnline": {"en": "PAY ONLINE", "ar": "اتمام عملية الدفع "}, "cancelOrder": {"en": "CANCEL ORDER", "ar": "الغاء الطلب "}, @@ -1144,4 +1151,9 @@ const Map localizedValues = { "en": "Select Home Health Care Services", "ar": " حدد خدمات الرعاية الصحية المنزلية" }, + "pharmacyServiceTermsCondition": { + "en": "I agree with the terms of service and I adhere to them unconditionally", + "ar": " أوافق على شروط الخدمة وألتزم بها دون قيد أو شرط" + }, + }; diff --git a/lib/pages/pharmacies/screens/cart-order-page.dart b/lib/pages/pharmacies/screens/cart-order-page.dart index d8a274d7..c5576900 100644 --- a/lib/pages/pharmacies/screens/cart-order-page.dart +++ b/lib/pages/pharmacies/screens/cart-order-page.dart @@ -1,6 +1,7 @@ import 'package:diplomaticquarterapp/core/model/pharmacies/Addresses.dart'; import 'package:diplomaticquarterapp/core/model/pharmacies/ShoppingCartResponse.dart'; import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/OrderPreviewViewModel.dart'; +import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; import 'package:diplomaticquarterapp/pages/base/base_view.dart'; import 'package:diplomaticquarterapp/pages/pharmacies/screens/cart-order-preview.dart'; import 'package:diplomaticquarterapp/pages/pharmacies/screens/pharmacy-terms-conditions-page.dart'; @@ -95,13 +96,13 @@ class CartOrderPage extends StatelessWidget { MainAxisAlignment.spaceBetween, children: [ Texts( - "Subtotal", + TranslationBase.of(context).subtotal, fontSize: 14, color: Colors.black, fontWeight: FontWeight.w500, ), Texts( - "SAR ${(cart.subtotal).toStringAsFixed(2)}", + "${TranslationBase.of(context).sar} ${(cart.subtotal).toStringAsFixed(2)}", fontSize: 14, color: Colors.black, fontWeight: FontWeight.w500, @@ -120,13 +121,13 @@ class CartOrderPage extends StatelessWidget { MainAxisAlignment.spaceBetween, children: [ Texts( - "VAT (15%)", + "${TranslationBase.of(context).vat}", fontSize: 14, color: Colors.black, fontWeight: FontWeight.w500, ), Texts( - "SAR ${(cart.subtotalVatAmount).toStringAsFixed(2)}", + "${TranslationBase.of(context).sar} ${(cart.subtotalVatAmount).toStringAsFixed(2)}", fontSize: 14, color: Colors.black, fontWeight: FontWeight.w500, @@ -151,7 +152,7 @@ class CartOrderPage extends StatelessWidget { fontWeight: FontWeight.bold, ), Texts( - "SAR ${(cart.subtotal).toStringAsFixed(2)}", + "${TranslationBase.of(context).sar} ${(cart.subtotal).toStringAsFixed(2)}", fontSize: 14, color: Colors.black, fontWeight: FontWeight.bold, @@ -181,7 +182,9 @@ class CartOrderPage extends StatelessWidget { : Container(), bottomSheet: Container( height: !(model.cartResponse.shoppingCarts == null || - model.cartResponse.shoppingCarts.length == 0) ? height * 0.15 : 0, + model.cartResponse.shoppingCarts.length == 0) + ? height * 0.15 + : 0, color: Colors.white, child: OrderBottomWidget(model.addresses, height), ), @@ -206,6 +209,8 @@ class _OrderBottomWidgetState extends State { @override Widget build(BuildContext context) { + ProjectViewModel projectProvider = Provider.of(context); + return Container( margin: EdgeInsets.symmetric(horizontal: 10, vertical: 0), child: Consumer( @@ -238,7 +243,9 @@ class _OrderBottomWidgetState extends State { width: 25.0, height: widget.height * 0.070, decoration: new BoxDecoration( - color: !isAgree ? Color(0xffeeeeee) : Colors.green, + color: !isAgree + ? Color(0xffeeeeee) + : Colors.green, shape: BoxShape.circle, ), child: !isAgree @@ -258,7 +265,8 @@ class _OrderBottomWidgetState extends State { padding: EdgeInsets.symmetric(horizontal: 4), margin: const EdgeInsets.symmetric(vertical: 4), child: Texts( - "I agree with the terms of service and I adhere to them unconditionally", + TranslationBase.of(context) + .pharmacyServiceTermsCondition, fontSize: 13, color: Colors.grey.shade800, fontWeight: FontWeight.normal, @@ -267,10 +275,8 @@ class _OrderBottomWidgetState extends State { ), InkWell( onTap: () => { - Navigator.push( - context, - FadePage( - page: PharmacyTermsConditions())) + Navigator.push(context, + FadePage(page: PharmacyTermsConditions())) }, child: Container( child: Icon( @@ -290,39 +296,43 @@ class _OrderBottomWidgetState extends State { child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Container( - margin: EdgeInsets.symmetric( - horizontal: 0, vertical: 4), - child: Row( - children: [ - Texts( - "SAR ${(cart.subtotal).toStringAsFixed(2)}", - fontSize: 14, - fontWeight: FontWeight.bold, - ), - Padding( - padding: const EdgeInsets.symmetric( - horizontal: 4), - child: Texts( - "(inclusive VAT)", - fontSize: 8, - color: Colors.grey, + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Container( + margin: EdgeInsets.symmetric( + horizontal: 0, vertical: 0), + child: Row( + children: [ + Texts( + "${TranslationBase.of(context).sar} ${(cart.subtotal).toStringAsFixed(2)}", + fontSize: + projectProvider.isArabic ? 12 : 14, fontWeight: FontWeight.bold, ), - ), - ], + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 4), + child: Texts( + "${TranslationBase.of(context).inclusiveVat}", + fontSize: 8, + color: Colors.grey, + fontWeight: FontWeight.bold, + ), + ), + ], + ), ), - ), - Texts( - "${cart.quantityCount} item(s)", - fontSize: 10, - color: Colors.grey, - fontWeight: FontWeight.bold, - ), - ], + Texts( + "${cart.quantityCount} ${TranslationBase.of(context).items}", + fontSize: 10, + color: Colors.grey, + fontWeight: FontWeight.bold, + ), + ], + ), ), RaisedButton( onPressed: isAgree @@ -335,7 +345,7 @@ class _OrderBottomWidgetState extends State { } : null, child: new Text( - "CHECK OUT", + "${TranslationBase.of(context).checkOut}", style: new TextStyle( color: isAgree ? Colors.white @@ -345,19 +355,9 @@ class _OrderBottomWidgetState extends State { color: Color(0xff005aff), disabledColor: Color(0xff005aff), ), - /* SecondaryButton( - label: "CHECK OUT", - color: Colors.blueAccent, - textColor: Colors.white, - onTap: (() { - Navigator.push( - context, FadePage(page: OrderPreviewPage(widget.addresses))); - }), - disabled: isAgree ? false : true, - )*/ ], ), - ) + ), ], ) : Container(), diff --git a/lib/pages/pharmacies/screens/cart-order-preview.dart b/lib/pages/pharmacies/screens/cart-order-preview.dart index aed2dbc5..39d06ea8 100644 --- a/lib/pages/pharmacies/screens/cart-order-preview.dart +++ b/lib/pages/pharmacies/screens/cart-order-preview.dart @@ -2,6 +2,7 @@ import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; import 'package:diplomaticquarterapp/core/model/pharmacies/Addresses.dart'; import 'package:diplomaticquarterapp/core/model/pharmacies/payment-checkout-data.dart'; import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/OrderPreviewViewModel.dart'; +import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; import 'package:diplomaticquarterapp/pages/base/base_view.dart'; import 'package:diplomaticquarterapp/pages/pharmacies/screens/address-select-page.dart'; import 'package:diplomaticquarterapp/pages/pharmacies/screens/payment-method-select-page.dart'; @@ -22,7 +23,8 @@ class OrderPreviewPage extends StatelessWidget { @override Widget build(BuildContext context) { - PreferredSizeWidget appBarWidget = AppBarWidget("Check out", null, true); + PreferredSizeWidget appBarWidget = + AppBarWidget("${TranslationBase.of(context).checkOut}", null, true); final mediaQuery = MediaQuery.of(context); final height = mediaQuery.size.height - appBarWidget.preferredSize.height - @@ -33,7 +35,7 @@ class OrderPreviewPage extends StatelessWidget { builder: (_, model, wi) => ChangeNotifierProvider.value( value: model.paymentCheckoutData, child: AppScaffold( - title: "Check out", + title: "${TranslationBase.of(context).checkOut}", isShowAppBar: true, isShowDecPage: false, appBarWidget: appBarWidget, @@ -114,13 +116,13 @@ class OrderPreviewPage extends StatelessWidget { MainAxisAlignment.spaceBetween, children: [ Texts( - "Subtotal", + "${TranslationBase.of(context).subtotal}", fontSize: 14, color: Colors.black, fontWeight: FontWeight.w500, ), Texts( - "SAR ${(model.cartResponse.subtotal).toStringAsFixed(2)}", + "${TranslationBase.of(context).sar} ${(model.cartResponse.subtotal).toStringAsFixed(2)}", fontSize: 14, color: Colors.black, fontWeight: FontWeight.w500, @@ -139,13 +141,13 @@ class OrderPreviewPage extends StatelessWidget { MainAxisAlignment.spaceBetween, children: [ Texts( - "Shipping", + "${TranslationBase.of(context).shipping}", fontSize: 14, color: Colors.black, fontWeight: FontWeight.w500, ), Texts( - "SAR ${(model.totalAdditionalShippingCharge).toStringAsFixed(2)}", + "${TranslationBase.of(context).sar} ${(model.totalAdditionalShippingCharge).toStringAsFixed(2)}", fontSize: 14, color: Colors.black, fontWeight: FontWeight.w500, @@ -164,13 +166,13 @@ class OrderPreviewPage extends StatelessWidget { MainAxisAlignment.spaceBetween, children: [ Texts( - "VAT (15%)", + "${TranslationBase.of(context).vat}", fontSize: 14, color: Colors.black, fontWeight: FontWeight.w500, ), Texts( - "SAR ${(model.cartResponse.subtotalVatAmount).toStringAsFixed(2)}", + "${TranslationBase.of(context).sar} ${(model.cartResponse.subtotalVatAmount).toStringAsFixed(2)}", fontSize: 14, color: Colors.black, fontWeight: FontWeight.w500, @@ -195,7 +197,7 @@ class OrderPreviewPage extends StatelessWidget { fontWeight: FontWeight.bold, ), Texts( - "SAR ${(model.cartResponse.subtotal).toStringAsFixed(2)}", + "${TranslationBase.of(context).sar} ${(model.cartResponse.subtotal).toStringAsFixed(2)}", fontSize: 14, color: Colors.black, fontWeight: FontWeight.bold, @@ -215,7 +217,9 @@ class OrderPreviewPage extends StatelessWidget { ), ), bottomSheet: Container( - height: model.cartResponse.shoppingCarts != null ? height * 0.10 : 0, + height: model.cartResponse.shoppingCarts != null + ? height * 0.10 + : 0, color: Colors.white, child: PaymentBottomWidget(model), ), @@ -396,7 +400,7 @@ class _SelectAddressWidgetState extends State { padding: EdgeInsets.symmetric( vertical: 0, horizontal: 6), child: Texts( - "SHIP BY:", + "${TranslationBase.of(context).shipBy}", fontSize: 12, fontWeight: FontWeight.bold, color: Colors.black, @@ -562,6 +566,8 @@ class _LakumWidgetState extends State { @override Widget build(BuildContext context) { + ProjectViewModel projectProvider = Provider.of(context); + return Container( color: Colors.white, padding: EdgeInsets.symmetric(vertical: 12, horizontal: 12), @@ -579,7 +585,7 @@ class _LakumWidgetState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ Texts( - "Lakum Points", + "${TranslationBase.of(context).lakumPoints}", fontSize: 12, fontWeight: FontWeight.bold, ), @@ -599,23 +605,27 @@ class _LakumWidgetState extends State { mainAxisAlignment: MainAxisAlignment.end, children: [ Texts( - "Riyal", + "${TranslationBase.of(context).riyal}", fontSize: 12, fontWeight: FontWeight.bold, ), Container( - margin: EdgeInsets.only(left: 4), + margin: projectProvider.isArabic ? EdgeInsets.only(right: 4) : EdgeInsets.only(left: 4), width: 60, - height: 40, + height: 50, child: TextField( decoration: InputDecoration( border: OutlineInputBorder( borderSide: BorderSide(color: Colors.black, width: 0.2), gapPadding: 0, - borderRadius: BorderRadius.only( - topLeft: Radius.circular(8), - bottomLeft: Radius.circular(8)), + borderRadius: projectProvider.isArabic + ? BorderRadius.only( + topRight: Radius.circular(8), + bottomRight: Radius.circular(8)) + : BorderRadius.only( + topLeft: Radius.circular(8), + bottomLeft: Radius.circular(8)), ), disabledBorder: OutlineInputBorder( borderSide: @@ -670,12 +680,16 @@ class _LakumWidgetState extends State { ), ), Container( - height: 40, + height: 50, padding: EdgeInsets.symmetric(horizontal: 8, vertical: 12), decoration: new BoxDecoration( color: Color(0xff3666E0), shape: BoxShape.rectangle, - borderRadius: BorderRadius.only( + borderRadius: projectProvider.isArabic + ? BorderRadius.only( + topLeft: Radius.circular(6), + bottomLeft: Radius.circular(6)) + : BorderRadius.only( topRight: Radius.circular(6), bottomRight: Radius.circular(6)), border: Border.fromBorderSide(BorderSide( @@ -684,7 +698,7 @@ class _LakumWidgetState extends State { )), ), child: Texts( - "USE", + "${TranslationBase.of(context).use}", fontSize: 12, color: Colors.white, fontWeight: FontWeight.bold, @@ -727,7 +741,7 @@ class PaymentBottomWidget extends StatelessWidget { child: Row( children: [ Texts( - "SAR ${(model.cartResponse.subtotal).toStringAsFixed(2)}", + "${TranslationBase.of(context).sar} ${(model.cartResponse.subtotal).toStringAsFixed(2)}", fontSize: 14, fontWeight: FontWeight.bold, color: Color(0xff929295), @@ -736,7 +750,7 @@ class PaymentBottomWidget extends StatelessWidget { padding: const EdgeInsets.symmetric(horizontal: 4), child: Texts( - "(inclusive VAT)", + "${TranslationBase.of(context).inclusiveVat}", fontSize: 8, color: Color(0xff929295), fontWeight: FontWeight.w600, @@ -746,7 +760,7 @@ class PaymentBottomWidget extends StatelessWidget { ), ), Texts( - "${model.cartResponse.quantityCount} item(s)", + "${model.cartResponse.quantityCount} ${TranslationBase.of(context).items}", fontSize: 10, color: Colors.grey, fontWeight: FontWeight.bold, @@ -785,7 +799,7 @@ class PaymentBottomWidget extends StatelessWidget { child: Padding( padding: const EdgeInsets.symmetric(vertical: 16), child: new Text( - "PROCEED TO PAY", + "${TranslationBase.of(context).proceedPay}", style: new TextStyle( color: (paymentData.address != null && paymentData.paymentOption != null) diff --git a/lib/uitl/translations_delegate_base.dart b/lib/uitl/translations_delegate_base.dart index 6721824d..0bd2ce60 100644 --- a/lib/uitl/translations_delegate_base.dart +++ b/lib/uitl/translations_delegate_base.dart @@ -735,7 +735,14 @@ class TranslationBase { String get orderDetail => localizedValues['orderDetail'][locale.languageCode]; String get subtotal => localizedValues['subtotal'][locale.languageCode]; String get shipping => localizedValues['shipping'][locale.languageCode]; + String get shipBy => localizedValues['shipBy'][locale.languageCode]; + String get lakumPoints => localizedValues['lakumPoints'][locale.languageCode]; + String get use => localizedValues['use'][locale.languageCode]; + String get proceedPay => localizedValues['proceedPay'][locale.languageCode]; String get vat => localizedValues['vat'][locale.languageCode]; + String get inclusiveVat => localizedValues['inclusiveVat'][locale.languageCode]; + String get items => localizedValues['items'][locale.languageCode]; + String get checkOut => localizedValues['checkOut'][locale.languageCode]; String get total => localizedValues['total'][locale.languageCode]; String get sar => localizedValues['sar'][locale.languageCode]; String get payOnline => localizedValues['payOnline'][locale.languageCode]; @@ -1023,6 +1030,7 @@ class TranslationBase { String get riyal => localizedValues['riyal'][locale.languageCode]; String get termOfService => localizedValues['termOfService'][locale.languageCode]; String get shoppingCart => localizedValues['shoppingCart'][locale.languageCode]; + String get pharmacyServiceTermsCondition => localizedValues['pharmacyServiceTermsCondition'][locale.languageCode]; String get referralStatus => localizedValues['referralStatus'][locale.languageCode]; From 727940c5c687360eb3b01e1a75a0225667310ca7 Mon Sep 17 00:00:00 2001 From: enadhilal Date: Tue, 8 Dec 2020 10:18:48 +0300 Subject: [PATCH 05/18] fixed merging issues --- lib/widgets/others/app_scaffold_widget.dart | 229 ++++------ lib/widgets/pharmacy/product_tile.dart | 476 ++++++++++---------- 2 files changed, 346 insertions(+), 359 deletions(-) diff --git a/lib/widgets/others/app_scaffold_widget.dart b/lib/widgets/others/app_scaffold_widget.dart index 7d0d60f8..4b588453 100644 --- a/lib/widgets/others/app_scaffold_widget.dart +++ b/lib/widgets/others/app_scaffold_widget.dart @@ -37,7 +37,6 @@ class AppScaffold extends StatelessWidget { final bool isBottomBar; final Widget floatingActionButton; final bool isPharmacy; - final bool showCart; final String title; final String description; final String image; @@ -49,29 +48,28 @@ class AppScaffold extends StatelessWidget { final PreferredSizeWidget appBarWidget; AuthenticatedUserObject authenticatedUserObject = - locator(); + locator(); AppScaffold( {@required this.body, - this.appBarTitle = '', - this.isLoading = false, - this.isShowAppBar = false, - this.hasAppBarParam, - this.bottomSheet, - this.baseViewModel, - this.floatingActionButton, - this.isPharmacy = false, - this.showCart = false, - this.title, - this.description, - this.isShowDecPage = true, - this.isBottomBar, - this.backgroundColor, - this.preferredSize = 0.0, - this.appBarIcons, - this.appBarWidget, - this.image, - this.infoList}); + this.appBarTitle = '', + this.isLoading = false, + this.isShowAppBar = false, + this.hasAppBarParam, + this.bottomSheet, + this.baseViewModel, + this.floatingActionButton, + this.isPharmacy = false, + this.title, + this.description, + this.isShowDecPage = true, + this.isBottomBar, + this.backgroundColor, + this.preferredSize = 0.0, + this.appBarIcons, + this.appBarWidget, + this.image, + this.infoList}); @override Widget build(BuildContext context) { @@ -90,58 +88,29 @@ class AppScaffold extends StatelessWidget { appBar = preferredSize == 0 ? appBarWidget : PreferredSize( - child: appBarWidget, - preferredSize: Size.fromHeight(preferredSize)); + child: appBarWidget, + preferredSize: Size.fromHeight(preferredSize)); } else { appBar = this.appBarWidget; } return Scaffold( - backgroundColor: backgroundColor ?? Theme.of(context).scaffoldBackgroundColor, - appBar: isShowAppBar - ? AppBar( - elevation: 0, - backgroundColor: isPharmacy - ? Colors.green - : Theme.of(context).appBarTheme.color, - textTheme: TextTheme( - headline6: - TextStyle(color: Colors.white, fontWeight: FontWeight.bold), - ), - title: Text(authenticatedUserObject.isLogin - ? appBarTitle.toUpperCase() - : TranslationBase.of(context).serviceInformationTitle),leading: Builder( - builder: (BuildContext context) { - return ArrowBack(); - }, - ), - centerTitle: true, - actions: [ - isPharmacy && showCart - ? IconButton( - icon: Icon(Icons.shopping_cart), - color: Colors.white, - onPressed: () { - Navigator.of(context) - .popUntil(ModalRoute.withName('/')); - }, - ) - : isPharmacy && !showCart ? Container() :IconButton( - icon: Icon(FontAwesomeIcons.home), - color: Colors.white, - onPressed: () { - Navigator.of(context) - .popUntil(ModalRoute.withName('/')); - }, - ), - ], - ) + backgroundColor: + backgroundColor ?? Theme.of(context).scaffoldBackgroundColor, + appBar: appBar, + body: (!Provider.of(context, listen: false).isLogin && + isShowDecPage) + ? NotAutPage( + title: appBarTitle, + description: description, + infoList: infoList, + ) : baseViewModel != null - ? NetworkBaseView( - child: buildBodyWidget(), - baseViewModel: baseViewModel, - ) - : buildBodyWidget(), + ? NetworkBaseView( + child: buildBodyWidget(), + baseViewModel: baseViewModel, + ) + : buildBodyWidget(), bottomSheet: bottomSheet, //floatingActionButton: floatingActionButton ?? floatingActionButton, // bottomNavigationBar: @@ -164,7 +133,7 @@ class AppScaffold extends StatelessWidget { class AppBarWidget extends StatelessWidget with PreferredSizeWidget { final AuthenticatedUserObject authenticatedUserObject = - locator(); + locator(); final String appBarTitle; final List appBarIcons; @@ -184,72 +153,72 @@ class AppBarWidget extends StatelessWidget with PreferredSizeWidget { Widget buildAppBar(BuildContext context) { return isShowAppBar ? AppBar( - elevation: 0, - backgroundColor: - isPharmacy ? Colors.green : Theme.of(context).appBarTheme.color, - textTheme: TextTheme( - headline6: - TextStyle(color: Colors.white, fontWeight: FontWeight.bold), + elevation: 0, + backgroundColor: + isPharmacy ? Colors.green : Theme.of(context).appBarTheme.color, + textTheme: TextTheme( + headline6: + TextStyle(color: Colors.white, fontWeight: FontWeight.bold), + ), + title: Texts( + authenticatedUserObject.isLogin || !isShowDecPage + ? appBarTitle.toUpperCase() + : TranslationBase.of(context).serviceInformationTitle, + color: Colors.white, + bold: true, + ), + leading: Builder( + builder: (BuildContext context) { + return ArrowBack(); + }, + ), + centerTitle: true, + actions: [ + isPharmacy + ? IconButton( + icon: Icon(Icons.shopping_cart), + color: Colors.white, + onPressed: () { + Navigator.of(context) + .popUntil(ModalRoute.withName('/')); + }) + : Container(), + image != null + ? InkWell( + onTap: () => Navigator.push( + context, + FadePage( + page: InsuranceUpdate(), ), - title: Texts( - authenticatedUserObject.isLogin || !isShowDecPage - ? appBarTitle.toUpperCase() - : TranslationBase.of(context).serviceInformationTitle, + ), + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Image.asset( + image, + height: SizeConfig.heightMultiplier * 5, + width: SizeConfig.heightMultiplier * 5, color: Colors.white, - bold: true, ), - leading: Builder( - builder: (BuildContext context) { - return ArrowBack(); - }, - ), - centerTitle: true, - actions: [ - isPharmacy - ? IconButton( - icon: Icon(Icons.shopping_cart), - color: Colors.white, - onPressed: () { - Navigator.of(context) - .popUntil(ModalRoute.withName('/')); - }) - : Container(), - image != null - ? InkWell( - onTap: () => Navigator.push( - context, - FadePage( - page: InsuranceUpdate(), - ), - ), - child: Padding( - padding: const EdgeInsets.all(8.0), - child: Image.asset( - image, - height: SizeConfig.heightMultiplier * 5, - width: SizeConfig.heightMultiplier * 5, - color: Colors.white, - ), - ), - ) - : IconButton( - icon: Icon(FontAwesomeIcons.home), - color: Colors.white, - onPressed: () { - Navigator.pushAndRemoveUntil( - context, - MaterialPageRoute( - builder: (context) => LandingPage()), - (Route r) => false); - }, - ), - if (appBarIcons != null) ...appBarIcons - ], - ) + ), + ) + : IconButton( + icon: Icon(FontAwesomeIcons.home), + color: Colors.white, + onPressed: () { + Navigator.pushAndRemoveUntil( + context, + MaterialPageRoute( + builder: (context) => LandingPage()), + (Route r) => false); + }, + ), + if (appBarIcons != null) ...appBarIcons + ], + ) : Container( - height: 0, - width: 0, - ); + height: 0, + width: 0, + ); } @override diff --git a/lib/widgets/pharmacy/product_tile.dart b/lib/widgets/pharmacy/product_tile.dart index 78b89ef0..725966d5 100644 --- a/lib/widgets/pharmacy/product_tile.dart +++ b/lib/widgets/pharmacy/product_tile.dart @@ -6,9 +6,6 @@ import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:rating_bar/rating_bar.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; - - - class productTile extends StatelessWidget { final String productName; final String productPrice; @@ -16,14 +13,20 @@ class productTile extends StatelessWidget { final int productReviews; final String qyt; final String totalPrice; - final bool isOrderDetails; - final String productImage; - final bool showLine; - + final bool isOrderDetails; + final String productImage; + final bool showLine; - productTile({this.productName, this.productPrice, this.productRate, - this.qyt, this.totalPrice, this.productReviews, - this.isOrderDetails=true, this.productImage ,this.showLine = true}); + productTile( + {this.productName, + this.productPrice, + this.productRate, + this.qyt, + this.totalPrice, + this.productReviews, + this.isOrderDetails = true, + this.productImage, + this.showLine = true}); @override Widget build(BuildContext context) { @@ -63,8 +66,7 @@ class productTile extends StatelessWidget { alignment: Alignment.topLeft, child: RichText( text: TextSpan( - text: - productName, + text: productName, style: TextStyle( color: Colors.black54, fontSize: 15, @@ -88,251 +90,267 @@ class productTile extends StatelessWidget { ), ), ), - this.isOrderDetails == false ? Container( - margin: EdgeInsets.all(5), - child: Align( - alignment: Alignment.topLeft, - child: RatingBar.readOnly( - initialRating: productRate, - size: 15.0, - filledColor: Colors.yellow[700], - emptyColor: Colors.grey[500], - isHalfAllowed: true, - halfFilledIcon: Icons.star_half, - filledIcon: Icons.star, - emptyIcon: Icons.star, - ), - ), - ): Container(), + this.isOrderDetails == false + ? Container( + margin: EdgeInsets.all(5), + child: Align( + alignment: Alignment.topLeft, + child: RatingBar.readOnly( + initialRating: productRate, + size: 15.0, + filledColor: Colors.yellow[700], + emptyColor: Colors.grey[500], + isHalfAllowed: true, + halfFilledIcon: Icons.star_half, + filledIcon: Icons.star, + emptyIcon: Icons.star, + ), + ), + ) + : Container(), ], ), ), - this.isOrderDetails == false ? Expanded( - flex: 1, - child: Column ( - children: [ - Icon(FontAwesomeIcons.trashAlt, size: 15), - SizedBox(height: 50,), - Icon(FontAwesomeIcons.shoppingCart, size: 15), - ], - ), - ) : Container(), + this.isOrderDetails == false + ? Expanded( + flex: 1, + child: Column( + children: [ + Icon(FontAwesomeIcons.trashAlt, size: 15), + SizedBox( + height: 50, + ), + Icon(FontAwesomeIcons.shoppingCart, size: 15), + ], + ), + ) + : Container(), ], ), - this.isOrderDetails == true ?Expanded( - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - Container( - margin: EdgeInsets.only(bottom: 5.0), - child: RichText( - text: TextSpan( - text: 'QYT: $qyt', - style: TextStyle( - fontWeight: FontWeight.bold, - color: Colors.grey, - fontSize: 13), - ), - ), - ), - Column( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - Text( - TranslationBase.of(context).total, - style: TextStyle( - color: Colors.grey, - fontSize: 13.0, - fontWeight: FontWeight.bold, - ), - ), - ], - ), - Row( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - RichText( + this.isOrderDetails == true + ? Expanded( + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + Container( + margin: EdgeInsets.only(bottom: 5.0), + child: RichText( text: TextSpan( - text: ' $totalPrice SAR', + text: 'QYT: $qyt', style: TextStyle( fontWeight: FontWeight.bold, - color: Colors.black, - fontSize: 15), + color: Colors.grey, + fontSize: 13), ), ), - ], - ), - ], - ), - ], - ), - ): Container(), -// this.isOrderDetails == true && model.order[0].orderStatusId == 30? - this.isOrderDetails == true? - Expanded( - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - Container( -// margin: EdgeInsets.all(5.0), - child: Align( - alignment: Alignment.topLeft, - child: RatingBar.readOnly( - initialRating: productRate, - size: 15.0, - filledColor: Colors.yellow[700], - emptyColor: Colors.grey[500], - isHalfAllowed: true, - halfFilledIcon: Icons.star_half, - filledIcon: Icons.star, - emptyIcon: Icons.star, - ), - ), - ), - Container( -// margin: EdgeInsets.all(5), - child: Align( -// alignment: Alignment.topLeft, - child: RichText( - text: TextSpan( - text: '($productReviews reviews)', - style: TextStyle( - fontWeight: FontWeight.bold, - color: Colors.grey, - fontSize: 13), - ), - ), - ), - ), - InkWell( - onTap: () { - Navigator.push(context, - MaterialPageRoute(builder: (context) => ProductReviewPage())); - }, - child: Container( - padding: EdgeInsets.only(left: 13.0, right: 13.0, top: 5.0), - height: 30.0, - decoration: BoxDecoration( - border: Border.all( - color: Colors.orange, - style: BorderStyle.solid, - width: 1.0 ), - color: Colors.transparent, - borderRadius: BorderRadius.circular(5.0) - ), - child: Text( - TranslationBase.of(context).writeReview, - style: TextStyle( - fontSize:12, - color: Colors.orange, - ), - ), - ), - ), - ], - ), - ) : Container(), - ], - ), - ): - Container( - child: Padding( - padding: EdgeInsets.all(8.0), - child: Row( - children: [ - Padding( - padding: EdgeInsets.only(left:15), - child: Container( - width: 160, - height: 200, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(10), - border: Border( - top: BorderSide(width: 0.5, color: Colors.grey), - left: BorderSide(width: 0.5, color: Colors.grey), - right: BorderSide(width: 0.5, color: Colors.grey), - bottom: BorderSide(width: 0.5, color: Colors.grey), - ), - color: Colors.white), - child: Column( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - SizedBox(height: 2,), - Container( - child: Image.network( - productImage.trim(), - fit: BoxFit.cover, - width: 80, - height: 70, - ), - ), - SizedBox(height: 10,), -// Container(width: 150,height: 20,color: Colors.green,), - Container( - alignment: Alignment.centerLeft, - child:Column( + Column( + crossAxisAlignment: CrossAxisAlignment.center, children: [ - Container( - margin: EdgeInsets.all(5), - child: Align( - alignment: Alignment.topLeft, - child: RichText( - text: TextSpan( - text: - productName, - style: TextStyle( - color: Colors.black54, - fontSize: 15, - fontWeight: FontWeight.bold), + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + Text( + TranslationBase.of(context).total, + style: TextStyle( + color: Colors.grey, + fontSize: 13.0, + fontWeight: FontWeight.bold, ), ), - ), + ], ), - Container( - margin: EdgeInsets.all(5), - child: Align( - alignment: Alignment.topLeft, - child: RichText( + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + RichText( text: TextSpan( - text: 'SAR $productPrice', + text: ' $totalPrice SAR', style: TextStyle( fontWeight: FontWeight.bold, color: Colors.black, - fontSize: 13), + fontSize: 15), ), ), + ], + ), + ], + ), + ], + ), + ) + : Container(), +// this.isOrderDetails == true && model.order[0].orderStatusId == 30? + this.isOrderDetails == true + ? Expanded( + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Container( +// margin: EdgeInsets.all(5.0), + child: Align( + alignment: Alignment.topLeft, + child: RatingBar.readOnly( + initialRating: productRate, + size: 15.0, + filledColor: Colors.yellow[700], + emptyColor: Colors.grey[500], + isHalfAllowed: true, + halfFilledIcon: Icons.star_half, + filledIcon: Icons.star, + emptyIcon: Icons.star, + ), + ), + ), + Container( +// margin: EdgeInsets.all(5), + child: Align( +// alignment: Alignment.topLeft, + child: RichText( + text: TextSpan( + text: '($productReviews reviews)', + style: TextStyle( + fontWeight: FontWeight.bold, + color: Colors.grey, + fontSize: 13), ), ), - Container( - alignment: Alignment.topLeft, - margin: EdgeInsets.all(5), - child: Align( - child: RatingBar.readOnly( - initialRating: productRate, - size: 15.0, - filledColor: Colors.yellow[700], - emptyColor: Colors.grey[500], - isHalfAllowed: true, - halfFilledIcon: Icons.star_half, - filledIcon: Icons.star, - emptyIcon: Icons.star, - ), + ), + ), + InkWell( + onTap: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => ProductReviewPage())); + }, + child: Container( + padding: EdgeInsets.only( + left: 13.0, right: 13.0, top: 5.0), + height: 30.0, + decoration: BoxDecoration( + border: Border.all( + color: Colors.orange, + style: BorderStyle.solid, + width: 1.0), + color: Colors.transparent, + borderRadius: BorderRadius.circular(5.0)), + child: Text( + TranslationBase.of(context).writeReview, + style: TextStyle( + fontSize: 12, + color: Colors.orange, ), ), - ], + ), ), + ], + ), + ) + : Container( + child: Padding( + padding: EdgeInsets.all(8.0), + child: Row( + children: [ + Padding( + padding: EdgeInsets.only(left: 15), + child: Container( + width: 160, + height: 200, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10), + border: Border( + top: BorderSide( + width: 0.5, color: Colors.grey), + left: BorderSide( + width: 0.5, color: Colors.grey), + right: BorderSide( + width: 0.5, color: Colors.grey), + bottom: BorderSide( + width: 0.5, color: Colors.grey), + ), + color: Colors.white), + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + SizedBox( + height: 2, + ), + Container( + child: Image.network( + productImage.trim(), + fit: BoxFit.cover, + width: 80, + height: 70, + ), + ), + SizedBox( + height: 10, + ), +// Container(width: 150,height: 20,color: Colors.green,), + Container( + alignment: Alignment.centerLeft, + child: Column( + children: [ + Container( + margin: EdgeInsets.all(5), + child: Align( + alignment: Alignment.topLeft, + child: RichText( + text: TextSpan( + text: productName, + style: TextStyle( + color: Colors.black54, + fontSize: 15, + fontWeight: FontWeight.bold), + ), + ), + ), + ), + Container( + margin: EdgeInsets.all(5), + child: Align( + alignment: Alignment.topLeft, + child: RichText( + text: TextSpan( + text: 'SAR $productPrice', + style: TextStyle( + fontWeight: FontWeight.bold, + color: Colors.black, + fontSize: 13), + ), + ), + ), + ), + Container( + alignment: Alignment.topLeft, + margin: EdgeInsets.all(5), + child: Align( + child: RatingBar.readOnly( + initialRating: productRate, + size: 15.0, + filledColor: Colors.yellow[700], + emptyColor: Colors.grey[500], + isHalfAllowed: true, + halfFilledIcon: Icons.star_half, + filledIcon: Icons.star, + emptyIcon: Icons.star, + ), + ), + ), + ], + ), + ), + ], + ), + ), + ), + ], ), - ], + ), ), - ), - ), - ], - ), + ], ), ); } From e85b21c08fa5eed40fba319fa71eb2c31b416976 Mon Sep 17 00:00:00 2001 From: hussam al-habibeh Date: Wed, 9 Dec 2020 19:15:56 +0200 Subject: [PATCH 06/18] parent_categorise_page update --- lib/pages/parent_categorise_page.dart | 1734 +++++++++++++------------ 1 file changed, 888 insertions(+), 846 deletions(-) diff --git a/lib/pages/parent_categorise_page.dart b/lib/pages/parent_categorise_page.dart index 4acb3b68..414106b1 100644 --- a/lib/pages/parent_categorise_page.dart +++ b/lib/pages/parent_categorise_page.dart @@ -1,3 +1,4 @@ +import 'package:diplomaticquarterapp/config/size_config.dart'; import 'package:diplomaticquarterapp/core/viewModels/pharmacy_categorise_view_model.dart'; import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; import 'package:diplomaticquarterapp/pages/sub_categorise_page.dart'; @@ -52,766 +53,970 @@ class _ParentCategorisePageState extends State { backgroundColor: Colors.white, isShowDecPage: false, baseViewModel: model, - body: SingleChildScrollView( - child: Container( - height: MediaQuery.of(context).size.height * 5.90, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Container( - child: Image.network( - id == '1' - ? 'https://uat.hmgwebservices.com/epharmacy/content/images/thumbs/0089188_personal-care_2.png' - : id == '2' - ? 'https://uat.hmgwebservices.com/epharmacy/content/images/thumbs/0089189_skin-care_2.png' - : id == '3' - ? 'https://uat.hmgwebservices.com/epharmacy/content/images/thumbs/0089190_health-care_2.png' - : id == '4' - ? 'https://uat.hmgwebservices.com/epharmacy/content/images/thumbs/0089191_sexual-health_2.png' - : id == '5' - ? 'https://uat.hmgwebservices.com/epharmacy/content/images/thumbs/0089192_beauty_2.png' - : id == '6' - ? 'https://uat.hmgwebservices.com/epharmacy/content/images/thumbs/0089193_baby-child_2.png' - : id == '7' - ? 'https://uat.hmgwebservices.com/epharmacy/content/images/thumbs/0089194_vitamins-supplements_2.png' - : id == '8' - ? 'https://uat.hmgwebservices.com/epharmacy/content/images/thumbs/0089195_diet-nutrition_2.png' - : id == '9' - ? 'https://uat.hmgwebservices.com/epharmacy/content/images/thumbs/0089196_household_2.png' - : id == '10' - ? 'https://uat.hmgwebservices.com/epharmacy/content/images/thumbs/0089197_home-care-appliances_2.png' - : '', - fit: BoxFit.fill, - height: 160.0, - width: double.infinity), - ), - if (model.categoriseParent.length > 8) - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, + body: Container( + child: ListView( + scrollDirection: Axis.vertical, + children: [ + Container( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + child: Image.network( + id == '1' + ? 'https://uat.hmgwebservices.com/epharmacy/content/images/thumbs/0089188_personal-care_2.png' + : id == '2' + ? 'https://uat.hmgwebservices.com/epharmacy/content/images/thumbs/0089189_skin-care_2.png' + : id == '3' + ? 'https://uat.hmgwebservices.com/epharmacy/content/images/thumbs/0089190_health-care_2.png' + : id == '4' + ? 'https://uat.hmgwebservices.com/epharmacy/content/images/thumbs/0089191_sexual-health_2.png' + : id == '5' + ? 'https://uat.hmgwebservices.com/epharmacy/content/images/thumbs/0089192_beauty_2.png' + : id == '6' + ? 'https://uat.hmgwebservices.com/epharmacy/content/images/thumbs/0089193_baby-child_2.png' + : id == '7' + ? 'https://uat.hmgwebservices.com/epharmacy/content/images/thumbs/0089194_vitamins-supplements_2.png' + : id == '8' + ? 'https://uat.hmgwebservices.com/epharmacy/content/images/thumbs/0089195_diet-nutrition_2.png' + : id == '9' + ? 'https://uat.hmgwebservices.com/epharmacy/content/images/thumbs/0089196_household_2.png' + : id == '10' + ? 'https://uat.hmgwebservices.com/epharmacy/content/images/thumbs/0089197_home-care-appliances_2.png' + : '', + fit: BoxFit.fill, + height: 160.0, + width: double.infinity), + ), + if (model.categoriseParent.length > 8) + Column( + crossAxisAlignment: CrossAxisAlignment.start, children: [ - Padding( - padding: EdgeInsets.all(10.0), - child: InkWell( - child: Container( - child: Texts( - 'View All Categories', - fontWeight: FontWeight.w300, - ), - ), - onTap: () { - showModalBottomSheet( - isScrollControlled: true, - context: context, - builder: (BuildContext context) { - return Container( - height: MediaQuery.of(context) - .size - .height * - 0.89, - color: Colors.white, - child: Center( - child: ListView.builder( - scrollDirection: - Axis.vertical, - itemCount: model - .categoriseParent.length, - itemBuilder: - (BuildContext context, - int index) { - return Container( - child: Padding( - padding: - EdgeInsets.all(8.0), - child: InkWell( - child: Column( - crossAxisAlignment: - CrossAxisAlignment - .start, - children: [ - Texts(model - .categoriseParent[ - index] - .name), - Divider( - thickness: 0.6, - color: Colors - .black12, - ) - ], + Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Padding( + padding: EdgeInsets.all(10.0), + child: InkWell( + child: Container( + child: Texts( + 'View All Categories', + fontWeight: FontWeight.w300, + ), + ), + onTap: () { + showModalBottomSheet( + isScrollControlled: true, + context: context, + builder: (BuildContext context) { + return Container( + height: MediaQuery.of(context) + .size + .height * + 0.89, + color: Colors.white, + child: Center( + child: ListView.builder( + scrollDirection: + Axis.vertical, + itemCount: model + .categoriseParent + .length, + itemBuilder: + (BuildContext context, + int index) { + return Container( + child: Padding( + padding: + EdgeInsets.all( + 8.0), + child: InkWell( + child: Column( + crossAxisAlignment: + CrossAxisAlignment + .start, + children: [ + Texts(model + .categoriseParent[ + index] + .name), + Divider( + thickness: + 0.6, + color: Colors + .black12, + ) + ], + ), + onTap: () { + Navigator.push( + context, + MaterialPageRoute( + builder: + (context) => + SubCategorisePage( + title: model.categoriseParent[index].name, + id: model.categoriseParent[index].id, + parentId: id, + )), + ); + }, + ), ), - onTap: () { - Navigator.push( - context, - MaterialPageRoute( - builder: - (context) => - SubCategorisePage( - title: - model.categoriseParent[index].name, - id: model.categoriseParent[index].id, - parentId: - id, - )), - ); - }, - ), - ), - ); - }), - ), + ); + }), + ), + ); + }, ); }, - ); - }, - ), + ), + ), + Icon(Icons.arrow_forward) + ], + ), + Divider( + thickness: 1.0, + color: Colors.grey.shade400, ), - Icon(Icons.arrow_forward) ], ), - Divider( - thickness: 1.0, - color: Colors.grey.shade400, - ), - ], - ), //Expanded widget heree if nassery - Padding( - padding: EdgeInsets.only(top: 35.0), - child: Container( - height: MediaQuery.of(context).size.height * 0.2, - child: Center( - child: ListView.builder( - scrollDirection: Axis.horizontal, - itemCount: model.categoriseParent.length > 8 - ? 8 - : model.categoriseParent.length, - itemBuilder: (BuildContext context, int index) { - return Padding( - padding: - EdgeInsets.symmetric(horizontal: 8.0), - child: InkWell( - child: Column( - crossAxisAlignment: - CrossAxisAlignment.center, - children: [ - Padding( - padding: EdgeInsets.symmetric( - horizontal: 13.0), - child: Container( - height: 60.0, - width: 65.0, - decoration: BoxDecoration( - shape: BoxShape.circle, - color: Colors.orange.shade200 - .withOpacity(0.45), - ), - child: Center( - child: Icon( - Icons.apps_sharp, - size: 32.0, + Padding( + padding: EdgeInsets.only(top: 35.0), + child: Container( + height: MediaQuery.of(context).size.height * 0.2, + child: Center( + child: ListView.builder( + scrollDirection: Axis.horizontal, + itemCount: model.categoriseParent.length > 8 + ? 8 + : model.categoriseParent.length, + itemBuilder: + (BuildContext context, int index) { + return Padding( + padding: EdgeInsets.symmetric( + horizontal: 8.0), + child: InkWell( + child: Column( + crossAxisAlignment: + CrossAxisAlignment.center, + children: [ + Padding( + padding: EdgeInsets.symmetric( + horizontal: 13.0), + child: Container( + height: 60.0, + width: 65.0, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: Colors + .orange.shade200 + .withOpacity(0.45), + ), + child: Center( + child: Icon( + Icons.apps_sharp, + size: 32.0, + ), + ), ), ), - ), - ), - Container( - width: MediaQuery.of(context) - .size - .width * - 0.197, - height: MediaQuery.of(context) - .size - .height * - 0.08, - child: Center( - child: Texts( - projectViewModel.isArabic - ? model - .categoriseParent[index] - .namen - : model - .categoriseParent[index] - .name, - fontSize: 13.4, - fontWeight: FontWeight.w600, - maxLines: 3, + Container( + width: MediaQuery.of(context) + .size + .width * + 0.197, + height: MediaQuery.of(context) + .size + .height * + 0.08, + child: Center( + child: Texts( + projectViewModel.isArabic + ? model + .categoriseParent[ + index] + .namen + : model + .categoriseParent[ + index] + .name, + fontSize: 13.4, + fontWeight: FontWeight.w600, + maxLines: 3, + ), + ), ), - ), + ], ), - ], - ), - onTap: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => - SubCategorisePage( - title: model - .categoriseParent[index] - .name, - id: model - .categoriseParent[index] - .id, - parentId: id, - )), - ); - print(id); - }, - ), - ); - }), + onTap: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => + SubCategorisePage( + title: model + .categoriseParent[ + index] + .name, + id: model + .categoriseParent[ + index] + .id, + parentId: id, + )), + ); + print(id); + }, + ), + ); + }), + ), + ), ), - ), - ), - Divider( - thickness: 1.0, - color: Colors.grey.shade400, - ), - Padding( - padding: EdgeInsets.symmetric(horizontal: 8.0), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - InkWell( - child: Row( - children: [ - Icon( - Icons.wrap_text, - ), - SizedBox( - width: 10.0, - ), - Texts( - 'Refine', - fontWeight: FontWeight.w600, + Divider( + thickness: 1.0, + color: Colors.grey.shade400, + ), + Padding( + padding: EdgeInsets.symmetric(horizontal: 8.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + InkWell( + child: Row( + children: [ + Icon( + Icons.wrap_text, + ), + SizedBox( + width: 10.0, + ), + Texts( + 'Refine', + fontWeight: FontWeight.w600, + ), + ], ), - ], - ), - onTap: () { - showModalBottomSheet( - isScrollControlled: true, - context: context, - builder: (BuildContext context) { - return DraggableScrollableSheet( - initialChildSize: 0.95, - maxChildSize: 0.95, - minChildSize: 0.9, - builder: (BuildContext context, - ScrollController scrollController) { - return SingleChildScrollView( - controller: scrollController, - child: Container( - height: MediaQuery.of(context) - .size - .height * - 1.95, - child: Column( - children: [ - Padding( - padding: - EdgeInsets.all(8.0), - child: Row( - children: [ - Icon( - Icons.wrap_text, - ), - SizedBox( - width: 10.0, - ), - Texts( - 'Refine', - fontWeight: - FontWeight.w600, - ), - SizedBox( - width: 250.0, - ), - InkWell( - child: Texts( - 'Close', - color: Colors.red, - fontWeight: - FontWeight.w600, - fontSize: 15.0, - ), - onTap: () { - Navigator.pop( - context); - }, - ), - ], - ), - ), - Divider( - thickness: 1.0, - color: Colors.black12, - ), - Column( + onTap: () { + showModalBottomSheet( + isScrollControlled: true, + context: context, + builder: (BuildContext context) { + return DraggableScrollableSheet( + initialChildSize: 0.95, + maxChildSize: 0.95, + minChildSize: 0.9, + builder: (BuildContext context, + ScrollController + scrollController) { + return SingleChildScrollView( + controller: scrollController, + child: Container( + height: MediaQuery.of(context) + .size + .height * + 1.95, + child: Column( children: [ - ExpansionTile( - title: - Texts('Categorise'), - children: [ - Container( - height: 350, - child: ListView - .builder( - controller: - scrollController, - scrollDirection: - Axis - .vertical, - shrinkWrap: - true, - itemCount: model - .categoriseParent - .length, - itemBuilder: - (BuildContext - context, - int index) { - return CheckboxListTile( - tristate: - true, - title: Texts(model - .categoriseParent[index] - .name), - controlAffinity: - ListTileControlAffinity.leading, - value: - checkedCategorise, - onChanged: - (bool - value) { - setState( - () { - checkedCategorise = - value; - }); - }, - ); - }), - ) - ], + Padding( + padding: + EdgeInsets.all(8.0), + child: Row( + children: [ + Icon( + Icons.wrap_text, + ), + SizedBox( + width: 10.0, + ), + Texts( + 'Refine', + fontWeight: + FontWeight + .w600, + ), + SizedBox( + width: 250.0, + ), + InkWell( + child: Texts( + 'Close', + color: + Colors.red, + fontWeight: + FontWeight + .w600, + fontSize: 15.0, + ), + onTap: () { + Navigator.pop( + context); + }, + ), + ], + ), ), Divider( thickness: 1.0, color: Colors.black12, ), - ExpansionTile( - title: Texts('Brands'), + Column( children: [ - Container( - height: 350, - child: ListView - .builder( - scrollDirection: - Axis - .vertical, - shrinkWrap: - true, - itemCount: model - .brandsList - .length, - itemBuilder: - (BuildContext - context, - int index) { - return CheckboxListTile( - tristate: + ExpansionTile( + title: Texts( + 'Categorise'), + children: [ + Container( + height: 350, + child: ListView + .builder( + controller: + scrollController, + scrollDirection: + Axis + .vertical, + shrinkWrap: true, - title: Texts(model - .brandsList[index] - .name), - controlAffinity: - ListTileControlAffinity.leading, - value: - checkedBrands, - onChanged: - (bool - value) { - setState( - () { - checkedBrands = - value; - }); - }, - autofocus: + itemCount: model + .categoriseParent + .length, + itemBuilder: + (BuildContext context, + int index) { + return CheckboxListTile( + tristate: + true, + title: + Texts(model.categoriseParent[index].name), + controlAffinity: + ListTileControlAffinity.leading, + value: + checkedCategorise, + onChanged: + (bool value) { + setState(() { + checkedCategorise = value; + }); + }, + ); + }), + ) + ], + ), + Divider( + thickness: 1.0, + color: + Colors.black12, + ), + ExpansionTile( + title: + Texts('Brands'), + children: [ + Container( + height: 350, + child: ListView + .builder( + scrollDirection: + Axis + .vertical, + shrinkWrap: true, - ); - }), - ) - ], - ), - Divider( - thickness: 1.0, - color: Colors.black12, - ), - ExpansionTile( - title: Texts('Price'), - children: [ - Container( - color: Color( - 0xffEEEEEE), - child: Row( - mainAxisAlignment: - MainAxisAlignment - .spaceAround, - children: [ - Column( + itemCount: model + .brandsList + .length, + itemBuilder: + (BuildContext context, + int index) { + return CheckboxListTile( + tristate: + true, + title: + Texts(model.brandsList[index].name), + controlAffinity: + ListTileControlAffinity.leading, + value: + checkedBrands, + onChanged: + (bool value) { + setState(() { + checkedBrands = value; + }); + }, + autofocus: + true, + ); + }), + ) + ], + ), + Divider( + thickness: 1.0, + color: + Colors.black12, + ), + ExpansionTile( + title: + Texts('Price'), + children: [ + Container( + color: Color( + 0xffEEEEEE), + child: Row( mainAxisAlignment: MainAxisAlignment - .start, + .spaceAround, children: [ - Texts( - 'Min'), - Container( - color: Colors - .white, - width: - 200, - height: - 40, - child: - TextFormField( - decoration: - InputDecoration( - border: - OutlineInputBorder(), + Column( + mainAxisAlignment: + MainAxisAlignment + .start, + children: [ + Texts( + 'Min'), + Container( + color: + Colors.white, + width: + 200, + height: + 40, + child: + TextFormField( + decoration: + InputDecoration( + border: OutlineInputBorder(), + ), + ), ), - ), + ], ), - ], - ), - Column( - mainAxisAlignment: - MainAxisAlignment - .start, - children: [ - Texts( - 'Max'), - Container( - color: Colors - .white, - width: - 200, - height: - 40, - child: - TextFormField( - decoration: - InputDecoration( - border: - OutlineInputBorder(), + Column( + mainAxisAlignment: + MainAxisAlignment + .start, + children: [ + Texts( + 'Max'), + Container( + color: + Colors.white, + width: + 200, + height: + 40, + child: + TextFormField( + decoration: + InputDecoration( + border: OutlineInputBorder(), + ), + ), ), - ), + ], ), ], ), + ) + ], + ), + Divider( + thickness: 1.0, + color: + Colors.black12, + ), + SizedBox( + height: MediaQuery.of( + context) + .size + .height * + 0.4, + ), + Padding( + padding: + EdgeInsets.all( + 8.0), + child: Row( + mainAxisAlignment: + MainAxisAlignment + .spaceEvenly, + children: [ + Container( + width: 100, + child: Button( + label: + 'Reset', + backgroundColor: + Colors + .red, + ), + ), + SizedBox( + width: 30, + ), + Container( + width: 200, + child: Button( + label: + 'Apply', + backgroundColor: + Colors + .green, + ), + ), ], ), - ) + ), ], ), - Divider( - thickness: 1.0, - color: Colors.black12, - ), - SizedBox( - height: MediaQuery.of( - context) - .size - .height * - 0.4, - ), - Padding( - padding: - EdgeInsets.all(8.0), - child: Row( - mainAxisAlignment: - MainAxisAlignment - .spaceEvenly, - children: [ - Container( - width: 100, - child: Button( - label: 'Reset', - backgroundColor: + ], + ), + ), + ); + }); + }, + ); + }, + ), + Row( + children: [ + Container( + height: 44.0, + child: VerticalDivider( + color: Colors.black45, + thickness: 1.0, +//width: 0.3, +// indent: 0.0, + ), + ), + Padding( + padding: EdgeInsets.all(8.0), + child: InkWell( + child: styleIcon, + onTap: () { + setState(() { + if (styleOne == true) { + styleOne = false; + styleTwo = true; + styleIcon = Icon( + Icons.auto_awesome_mosaic, + color: Colors.blue, + size: 29.0, + ); + } else { + styleOne = true; + styleTwo = false; + styleIcon = Icon( + Icons.widgets_sharp, + color: Colors.blue, + size: 29.0, + ); + } + }); + }, + ), + ), + ], + ), + ], + ), + ), + Divider( + thickness: 1.0, + color: Colors.grey.shade400, + ), + styleOne == true + ? Container( + height: SizeConfig.screenHeight * 7.8, + child: GridView.builder( + physics: NeverScrollableScrollPhysics(), + gridDelegate: + SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 2, + crossAxisSpacing: 0.5, + mainAxisSpacing: 2.0, + childAspectRatio: 0.9, + ), + itemCount: model.parentProducts.length, + itemBuilder: + (BuildContext context, int index) { + return NetworkBaseView( + baseViewModel: model, + child: Card( + color: model.parentProducts[index] + .discountName != + null + ? Color(0xffFFFF00) + : Colors.white, + elevation: 0, + shape: Border( + right: BorderSide( + color: Colors.grey.shade300, + width: 1, + ), + left: BorderSide( + color: Colors.grey.shade300, + width: 1, + ), + bottom: BorderSide( + color: Colors.grey.shade300, + width: 1, + ), + top: BorderSide( + color: Colors.grey.shade300, + width: 1, + ), + ), + margin: EdgeInsets.symmetric( + horizontal: 8, + vertical: 4, + ), + child: Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.only( + topLeft: + Radius.circular(110.0), + ), + color: Colors.white, + ), + padding: EdgeInsets.symmetric( + horizontal: 0), + width: MediaQuery.of(context) + .size + .width / + 3, + child: Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + Stack( + children: [ + if (model + .parentProducts[ + index] + .discountName != + null) + RotatedBox( + quarterTurns: 4, + child: Container( + decoration: + BoxDecoration(), + child: Padding( + padding: + EdgeInsets + .only( + right: 5.0, + top: 20.0, + bottom: 5.0, + ), + child: Texts( + 'offer' + .toUpperCase(), + color: Colors.red, + fontSize: 13.0, + fontWeight: + FontWeight + .w900, ), ), - SizedBox( - width: 30, + transform: new Matrix4 + .rotationZ( + 5.837200), + ), + ), + Container( + margin: + EdgeInsets.fromLTRB( + 0, 16, 0, 0), + alignment: + Alignment.center, + child: Image.network( + model + .parentProducts[ + index] + .images + .isNotEmpty + ? model + .parentProducts[ + index] + .images[0] + .thumb + : 'https://upload.wikimedia.org/wikipedia/commons/thumb/6/6c/No_image_3x4.svg/1200px-No_image_3x4.svg.png', + fit: BoxFit.cover, + height: 80, + ), + ), + Container( + width: model + .parentProducts[ + index] + .rxMessage != + null + ? MediaQuery.of( + context) + .size + .width / + 5 + : 0, + padding: + EdgeInsets.all(4), + decoration: + BoxDecoration( + color: + Color(0xffb23838), + borderRadius: + BorderRadius.only( + topLeft: Radius + .circular( + 6)), + ), + child: Texts( + model + .parentProducts[ + index] + .rxMessage != + null + ? model + .parentProducts[ + index] + .rxMessage + : "", + color: Colors.white, + regular: true, + fontSize: 10, + fontWeight: + FontWeight.w400, + ), + ), + ], + ), + Container( + margin: + EdgeInsets.symmetric( + horizontal: 6, + vertical: 0, + ), + child: Column( + crossAxisAlignment: + CrossAxisAlignment + .start, + children: [ + if (model + .parentProducts[ + index] + .discountName != + null) + Container( + width: + double.infinity, + height: 13.0, + decoration: + BoxDecoration( + color: Color( + 0xff5AB145), ), - Container( - width: 200, - child: Button( - label: 'Apply', - backgroundColor: - Colors - .green, + child: Center( + child: Texts( + model + .parentProducts[ + index] + .discountName, + regular: true, + color: Colors + .white, + fontSize: 10.4, ), ), + ), + Texts( + model + .parentProducts[ + index] + .name, + regular: true, + fontSize: 12, + fontWeight: + FontWeight.w700, + ), + Padding( + padding: + const EdgeInsets + .only( + top: 4, + bottom: 4), + child: Texts( + "SAR ${model.parentProducts[index].price}", + bold: true, + fontSize: 14, + ), + ), + Row( + children: [ + StarRating( + totalAverage: model + .parentProducts[ + index] + .approvedRatingSum > + 0 + ? (model.parentProducts[index].approvedRatingSum.toDouble() / + model.parentProducts[index].approvedRatingSum + .toDouble()) + .toDouble() + : 0, + forceStars: + true), + Texts( + "(${model.parentProducts[index].approvedTotalReviews})", + regular: true, + fontSize: 10, + fontWeight: + FontWeight + .w400, + ) ], ), - ), - ], + ], + ), ), ], ), ), - ); - }); - }, - ); - }, - ), - Row( - children: [ - Container( - height: 44.0, - child: VerticalDivider( - color: Colors.black45, - thickness: 1.0, -//width: 0.3, -// indent: 0.0, - ), - ), - Padding( - padding: EdgeInsets.all(8.0), - child: InkWell( - child: styleIcon, - onTap: () { - setState(() { - if (styleOne == true) { - styleOne = false; - styleTwo = true; - styleIcon = Icon( - Icons.auto_awesome_mosaic, - color: Colors.blue, - size: 29.0, - ); - } else { - styleOne = true; - styleTwo = false; - styleIcon = Icon( - Icons.widgets_sharp, - color: Colors.blue, - size: 29.0, - ); - } - }); + )); }, ), - ), - ], - ), - ], - ), - ), - Divider( - thickness: 1.0, - color: Colors.grey.shade400, - ), - styleOne == true - ? Container( - height: MediaQuery.of(context).size.height * 4.89, - child: GridView.builder( - physics: NeverScrollableScrollPhysics(), - gridDelegate: - SliverGridDelegateWithFixedCrossAxisCount( - crossAxisCount: 2, - crossAxisSpacing: 0.5, - mainAxisSpacing: 2.0, - childAspectRatio: 0.9, - ), - itemCount: model.parentProducts.length, - itemBuilder: (BuildContext context, int index) { - return NetworkBaseView( - baseViewModel: model, - child: Card( - color: model.parentProducts[index] - .discountName != - null - ? Color(0xffFFFF00) - : Colors.white, - elevation: 0, - shape: Border( - right: BorderSide( - color: Colors.grey.shade300, - width: 1, - ), - left: BorderSide( - color: Colors.grey.shade300, - width: 1, - ), - bottom: BorderSide( - color: Colors.grey.shade300, - width: 1, - ), - top: BorderSide( - color: Colors.grey.shade300, - width: 1, - ), - ), - margin: EdgeInsets.symmetric( - horizontal: 8, - vertical: 4, - ), - child: Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.only( - topLeft: Radius.circular(110.0), - ), - color: Colors.white, - ), - padding: EdgeInsets.symmetric( - horizontal: 0), - width: MediaQuery.of(context) - .size - .width / - 3, - child: Column( - crossAxisAlignment: - CrossAxisAlignment.start, + ) + : Container( + height: + MediaQuery.of(context).size.height * 5.0, + child: ListView.builder( + physics: NeverScrollableScrollPhysics(), + itemCount: model.parentProducts.length, + itemBuilder: + (BuildContext context, int index) { + return Card( + child: Row( children: [ Stack( children: [ - if (model - .parentProducts[index] - .discountName != - null) - RotatedBox( - quarterTurns: 4, - child: Container( + Column( + children: [ + Container( decoration: BoxDecoration(), child: Padding( padding: EdgeInsets.only( - right: 5.0, - top: 20.0, - bottom: 5.0, - ), - child: Texts( - 'offer' - .toUpperCase(), - color: Colors.red, - fontSize: 13.0, - fontWeight: - FontWeight.w900, + left: 9.0, + top: 8.0, + right: 10.0, ), ), - transform: new Matrix4 - .rotationZ( - 5.837200), ), - ), - Container( - margin: EdgeInsets.fromLTRB( - 0, 16, 0, 0), - alignment: Alignment.center, - child: Image.network( - model - .parentProducts[ - index] - .images - .isNotEmpty - ? model - .parentProducts[ - index] - .images[0] - .thumb - : 'https://upload.wikimedia.org/wikipedia/commons/thumb/6/6c/No_image_3x4.svg/1200px-No_image_3x4.svg.png', - fit: BoxFit.cover, - height: 80, - ), + Container( + margin: + EdgeInsets.fromLTRB( + 0, 0, 0, 0), + alignment: + Alignment.center, + child: Image.network( + model + .parentProducts[ + index] + .images + .isNotEmpty + ? model + .parentProducts[ + index] + .images[0] + .thumb + : 'https://upload.wikimedia.org/wikipedia/commons/thumb/6/6c/No_image_3x4.svg/1200px-No_image_3x4.svg.png', + fit: BoxFit.contain, + height: 80, + ), + ), + ], ), - Container( - width: model - .parentProducts[ - index] - .rxMessage != - null - ? MediaQuery.of(context) - .size - .width / - 5 - : 0, - padding: EdgeInsets.all(4), - decoration: BoxDecoration( - color: Color(0xffb23838), - borderRadius: - BorderRadius.only( - topLeft: Radius - .circular(6)), - ), - child: Texts( - model + Column( + children: [ + Container( + width: model + .parentProducts[ + index] + .rxMessage != + null + ? MediaQuery.of( + context) + .size + .width / + 5 + : 0, + padding: + EdgeInsets.all(4), + decoration: + BoxDecoration( + color: + Color(0xffb23838), + borderRadius: + BorderRadius.only( + topLeft: Radius + .circular( + 6)), + ), + child: Texts( + model + .parentProducts[ + index] + .rxMessage != + null + ? model .parentProducts[ index] - .rxMessage != - null - ? model - .parentProducts[ - index] - .rxMessage - : "", - color: Colors.white, - regular: true, - fontSize: 10, - fontWeight: - FontWeight.w400, - ), + .rxMessage + : "", + color: Colors.white, + regular: true, + fontSize: 10, + fontWeight: + FontWeight.w400, + ), + ), + ], ), ], ), Container( + height: 100.0, margin: EdgeInsets.symmetric( horizontal: 6, vertical: 0, ), child: Column( + mainAxisAlignment: + MainAxisAlignment + .spaceAround, crossAxisAlignment: CrossAxisAlignment.start, children: [ - if (model - .parentProducts[ - index] - .discountName != - null) - Container( - width: double.infinity, - height: 13.0, - decoration: - BoxDecoration( - color: - Color(0xff5AB145), - ), - child: Center( - child: Texts( - model - .parentProducts[ - index] - .discountName, - regular: true, - color: Colors.white, - fontSize: 10.4, - ), - ), - ), + SizedBox( + height: 4.0, + ), Texts( model .parentProducts[index] .name, regular: true, - fontSize: 12, + fontSize: 13.2, fontWeight: - FontWeight.w700, + FontWeight.w500, + maxLines: 5, + ), + SizedBox( + height: 8.0, ), Padding( padding: @@ -855,176 +1060,13 @@ class _ParentCategorisePageState extends State { ), ], ), - ), - )); - }, - ), - ) - : Container( - height: MediaQuery.of(context).size.height * 5.0, - child: ListView.builder( - physics: NeverScrollableScrollPhysics(), - itemCount: model.parentProducts.length, - itemBuilder: - (BuildContext context, int index) { - return Card( - child: Row( - children: [ - Stack( - children: [ - Column( - children: [ - Container( - decoration: BoxDecoration(), - child: Padding( - padding: EdgeInsets.only( - left: 9.0, - top: 8.0, - right: 10.0, - ), - ), - ), - Container( - margin: EdgeInsets.fromLTRB( - 0, 0, 0, 0), - alignment: Alignment.center, - child: Image.network( - model - .parentProducts[ - index] - .images - .isNotEmpty - ? model - .parentProducts[ - index] - .images[0] - .thumb - : 'https://upload.wikimedia.org/wikipedia/commons/thumb/6/6c/No_image_3x4.svg/1200px-No_image_3x4.svg.png', - fit: BoxFit.contain, - height: 80, - ), - ), - ], - ), - Column( - children: [ - Container( - width: model - .parentProducts[ - index] - .rxMessage != - null - ? MediaQuery.of(context) - .size - .width / - 5 - : 0, - padding: EdgeInsets.all(4), - decoration: BoxDecoration( - color: Color(0xffb23838), - borderRadius: - BorderRadius.only( - topLeft: Radius - .circular(6)), - ), - child: Texts( - model - .parentProducts[ - index] - .rxMessage != - null - ? model - .parentProducts[ - index] - .rxMessage - : "", - color: Colors.white, - regular: true, - fontSize: 10, - fontWeight: - FontWeight.w400, - ), - ), - ], - ), - ], - ), - Container( - height: 100.0, - margin: EdgeInsets.symmetric( - horizontal: 6, - vertical: 0, - ), - child: Column( - mainAxisAlignment: - MainAxisAlignment.spaceAround, - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - SizedBox( - height: 4.0, - ), - Texts( - model.parentProducts[index] - .name, - regular: true, - fontSize: 13.2, - fontWeight: FontWeight.w500, - maxLines: 5, - ), - SizedBox( - height: 8.0, - ), - Padding( - padding: - const EdgeInsets.only( - top: 4, bottom: 4), - child: Texts( - "SAR ${model.parentProducts[index].price}", - bold: true, - fontSize: 14, - ), - ), - Row( - children: [ - StarRating( - totalAverage: model - .parentProducts[ - index] - .approvedRatingSum > - 0 - ? (model - .parentProducts[ - index] - .approvedRatingSum - .toDouble() / - model - .parentProducts[ - index] - .approvedRatingSum - .toDouble()) - .toDouble() - : 0, - forceStars: true), - Texts( - "(${model.parentProducts[index].approvedTotalReviews})", - regular: true, - fontSize: 10, - fontWeight: - FontWeight.w400, - ) - ], - ), - ], - ), - ), - ], - ), - ); - }), - ) - ], - ), + ); + }), + ) + ], + ), + ), + ], ), ), )); From 6ac8d67b830d19b250270ebcef1c412ad5b63d77 Mon Sep 17 00:00:00 2001 From: mosazaid Date: Sat, 12 Dec 2020 17:27:55 +0200 Subject: [PATCH 07/18] finish address add/edit/delete/select --- lib/config/config.dart | 4 + lib/config/shared_pref_kay.dart | 1 + lib/core/model/pharmacies/Country.dart | 32 + .../LakumInquiryInformationObjVersion.dart | 6 +- .../PharmacyAddressesViewModel.dart | 109 ++- .../screens/cart-order-preview.dart | 25 +- .../screens/pharmacy_module_page.dart | 5 +- .../pharmacyAddresses/AddAddress.dart | 165 ++--- .../pharmacyAddresses/PharmacyAddresses.dart | 622 ++++++++---------- .../pharmacyAddress_service.dart | 116 +++- lib/widgets/buttons/borderedButton.dart | 32 +- lib/widgets/dialogs/confirm_dialog.dart | 4 +- .../pickupLocation/PickupLocationFromMap.dart | 60 +- 13 files changed, 660 insertions(+), 521 deletions(-) create mode 100644 lib/core/model/pharmacies/Country.dart diff --git a/lib/config/config.dart b/lib/config/config.dart index 7fe198b1..7334dbf7 100644 --- a/lib/config/config.dart +++ b/lib/config/config.dart @@ -357,6 +357,7 @@ const GET_E_REFERRALS = "Services/Patients.svc/REST/GetEReferrals"; // pharmacy const PHARMACY_VERIFY_CUSTOMER = "epharmacy/api/VerifyCustomer"; +const PHARMACY_GET_COUNTRY = "epharmacy/api/countries"; const PHARMACY_CREATE_CUSTOMER = "epharmacy/api/CreateCustomer"; const GET_PHARMACY_BANNER = "epharmacy/api/promotionbanners"; const GET_PHARMACY_TOP_MANUFACTURER = "epharmacy/api/topmanufacturer"; @@ -366,6 +367,9 @@ const GET_CUSTOMERS_ADDRESSES = "epharmacy/api/Customers/"; const GET_WISHLIST = "epharmacy/api/shopping_cart_items/"; const GET_ORDER = "orders?"; const GET_ORDER_DETAILS = "epharmacy/api/orders/"; +const ADD_CUSTOMER_ADDRESS = "epharmacy/api/addcustomeraddress"; +const EDIT_CUSTOMER_ADDRESS = "epharmacy/api/editcustomeraddress"; +const DELETE_CUSTOMER_ADDRESS = "epharmacy/api/deletecustomeraddress"; const GET_ADDRESS = "epharmacy/api/Customers/272843?fields=addresses"; const GET_SHOPPING_CART = "epharmacy/api/shopping_cart_items/"; const GET_SHIPPING_OPTIONS = "epharmacy/api/get_shipping_option/"; diff --git a/lib/config/shared_pref_kay.dart b/lib/config/shared_pref_kay.dart index 9e57990c..6a65ac26 100644 --- a/lib/config/shared_pref_kay.dart +++ b/lib/config/shared_pref_kay.dart @@ -21,3 +21,4 @@ const THEME_VALUE = 'is_vibration'; const MAIN_USER = 'main-user'; const PHARMACY_LAST_VISITED_PRODUCTS = 'last-visited'; const PHARMACY_CUSTOMER_ID = 'costumer-id'; +const PHARMACY_SELECTED_ADDRESS = 'selected-address'; diff --git a/lib/core/model/pharmacies/Country.dart b/lib/core/model/pharmacies/Country.dart new file mode 100644 index 00000000..77f519d3 --- /dev/null +++ b/lib/core/model/pharmacies/Country.dart @@ -0,0 +1,32 @@ +class CountryData { + int id; + String name; + String namen; + String twoLetterIsoCode; + String threeLetterIsoCode; + + CountryData( + {this.id, + this.name, + this.namen, + this.twoLetterIsoCode, + this.threeLetterIsoCode}); + + CountryData.fromJson(Map json) { + id = json['id']; + name = json['name']; + namen = json['namen']; + twoLetterIsoCode = json['two_letter_iso_code']; + threeLetterIsoCode = json['three_letter_iso_code']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['name'] = this.name; + data['namen'] = this.namen; + data['two_letter_iso_code'] = this.twoLetterIsoCode; + data['three_letter_iso_code'] = this.threeLetterIsoCode; + return data; + } +} diff --git a/lib/core/model/pharmacies/LakumInquiryInformationObjVersion.dart b/lib/core/model/pharmacies/LakumInquiryInformationObjVersion.dart index 809277e1..c609fa0b 100644 --- a/lib/core/model/pharmacies/LakumInquiryInformationObjVersion.dart +++ b/lib/core/model/pharmacies/LakumInquiryInformationObjVersion.dart @@ -27,9 +27,9 @@ class LakumInquiryInformationObjVersion { int transferPoints; List transferPointsAmountPerYear; List transferPointsDetails; - int waitingPoints; - int loyalityAmount; - int loyalityPoints; + dynamic waitingPoints; + dynamic loyalityAmount; + dynamic loyalityPoints; int purchaseRate; LakumInquiryInformationObjVersion( diff --git a/lib/core/viewModels/pharmacyModule/PharmacyAddressesViewModel.dart b/lib/core/viewModels/pharmacyModule/PharmacyAddressesViewModel.dart index 75a178fa..485c92fb 100644 --- a/lib/core/viewModels/pharmacyModule/PharmacyAddressesViewModel.dart +++ b/lib/core/viewModels/pharmacyModule/PharmacyAddressesViewModel.dart @@ -1,24 +1,117 @@ - +import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacies/Addresses.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacies/Country.dart'; import 'package:diplomaticquarterapp/services/pharmacy_services/pharmacyAddress_service.dart'; import 'package:diplomaticquarterapp/core/model/pharmacies/PharmacyAddressesModel.dart'; +import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; +import 'package:google_maps_place_picker/google_maps_place_picker.dart'; import '../../../locator.dart'; import '../base_view_model.dart'; class PharmacyAddressesViewModel extends BaseViewModel { - PharmacyAddressService _PharmacyAddressService = locator(); + PharmacyAddressService _pharmacyAddressService = + locator(); + + List get addresses => _pharmacyAddressService.addresses; - List get address => _PharmacyAddressService.address; + int get selectedAddressIndex => _pharmacyAddressService.selectedAddressIndex; + CountryData get country => _pharmacyAddressService.country; + + setSelectedAddressIndex(int index) { + _pharmacyAddressService.selectedAddressIndex = index; + } - Future getAddress() async { + Future getAddressesList() async { setState(ViewState.Busy); - await _PharmacyAddressService.getAddress(); - if (_PharmacyAddressService.hasError) { - error = _PharmacyAddressService.error; + await _pharmacyAddressService.getAddresses(); + if (_pharmacyAddressService.hasError) { + error = _pharmacyAddressService.error; + setState(ViewState.Error); + } else { + setState(ViewState.Idle); + } + } + +/* Future getCountries(String countryName) async { + setState(ViewState.Busy); + await _pharmacyAddressService.getCountries(countryName); + if (_pharmacyAddressService.hasError) { + error = _pharmacyAddressService.error; + // setState(ViewState.Error); + } else { + // setState(ViewState.Idle); + } + }*/ + + Future addEditAddress(PickResult value, Addresses editedAddress) async { + setState(ViewState.Busy); + + Addresses sendingAddress; + + if (editedAddress == null) { + sendingAddress = Addresses(); + sendingAddress.id = "0"; + sendingAddress.firstName = user.firstName; + sendingAddress.lastName = user.lastName; + sendingAddress.email = user.emailAddress; + sendingAddress.company = null; + } else { + sendingAddress = editedAddress; + } + value.addressComponents.forEach((element) { + if (element.types.contains("country")) { + sendingAddress.country = element.longName; + } + if (element.types.contains("administrative_area_level_1")) { + sendingAddress.city = element.longName; + } + if (element.types.contains("postal_code")) { + sendingAddress.zipPostalCode = element.longName; + } + if (element.types.contains("administrative_area_level_2")) { + sendingAddress.province = element.longName; + } + }); + sendingAddress.latLong = value.geometry.location.toString(); + + await _pharmacyAddressService.getCountries(sendingAddress.country); + sendingAddress.countryId = country.id; + sendingAddress.stateProvinceId = null; + sendingAddress.address1 = value.formattedAddress; + sendingAddress.address2 = ""; + sendingAddress.phoneNumber = user.mobileNumber; + sendingAddress.faxNumber = user.faxNumber; + sendingAddress.customerAttributes = ""; + sendingAddress.createdOnUtc = DateTime.now().toString(); + + if (editedAddress == null) { + await _pharmacyAddressService.addCustomerAddress(sendingAddress); + } else { + await _pharmacyAddressService.editCustomerAddress(sendingAddress); + } + + if (_pharmacyAddressService.hasError) { + error = _pharmacyAddressService.error; setState(ViewState.Error); } else { + setState(ViewState.Idle); + } + } + Future deleteAddresses(Addresses sendingAddress) async { + setState(ViewState.Busy); + await _pharmacyAddressService.deleteCustomerAddress(sendingAddress); + if (_pharmacyAddressService.hasError) { + error = _pharmacyAddressService.error; + setState(ViewState.Error); + } else { + setState(ViewState.Idle); } } -} \ No newline at end of file + + Future saveSelectedAddressLocally(Addresses selectedAddress) async { + await sharedPref.setObject(PHARMACY_SELECTED_ADDRESS, selectedAddress); + } +} diff --git a/lib/pages/pharmacies/screens/cart-order-preview.dart b/lib/pages/pharmacies/screens/cart-order-preview.dart index 39d06ea8..f052c54e 100644 --- a/lib/pages/pharmacies/screens/cart-order-preview.dart +++ b/lib/pages/pharmacies/screens/cart-order-preview.dart @@ -8,6 +8,7 @@ import 'package:diplomaticquarterapp/pages/pharmacies/screens/address-select-pag import 'package:diplomaticquarterapp/pages/pharmacies/screens/payment-method-select-page.dart'; import 'package:diplomaticquarterapp/pages/pharmacies/screens/pharmacy_module_page.dart'; import 'package:diplomaticquarterapp/pages/pharmacies/widgets/ProductOrderPreviewItem.dart'; +import 'package:diplomaticquarterapp/pages/pharmacy/pharmacyAddresses/PharmacyAddresses.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; @@ -242,12 +243,14 @@ class _SelectAddressWidgetState extends State { Addresses address; _navigateToAddressPage() { - Navigator.push( - context, FadePage(page: AddressSelectPageTest(widget.addresses))) + Navigator.push(context, FadePage(page: PharmacyAddressesPage())) .then((result) { - address = result; - widget.model.paymentCheckoutData.address = address; - widget.model.getInformationsByAddress(); + if (result != null) { + address = result; + widget.model.paymentCheckoutData.address = address; + widget.model.getInformationsByAddress(); + } + /* setState(() { if (result != null) { address = result; @@ -610,7 +613,9 @@ class _LakumWidgetState extends State { fontWeight: FontWeight.bold, ), Container( - margin: projectProvider.isArabic ? EdgeInsets.only(right: 4) : EdgeInsets.only(left: 4), + margin: projectProvider.isArabic + ? EdgeInsets.only(right: 4) + : EdgeInsets.only(left: 4), width: 60, height: 50, child: TextField( @@ -687,11 +692,11 @@ class _LakumWidgetState extends State { shape: BoxShape.rectangle, borderRadius: projectProvider.isArabic ? BorderRadius.only( - topLeft: Radius.circular(6), - bottomLeft: Radius.circular(6)) + topLeft: Radius.circular(6), + bottomLeft: Radius.circular(6)) : BorderRadius.only( - topRight: Radius.circular(6), - bottomRight: Radius.circular(6)), + topRight: Radius.circular(6), + bottomRight: Radius.circular(6)), border: Border.fromBorderSide(BorderSide( color: Color(0xff3666E0), width: 0.8, diff --git a/lib/pages/pharmacies/screens/pharmacy_module_page.dart b/lib/pages/pharmacies/screens/pharmacy_module_page.dart index 9155516c..1e94ae81 100644 --- a/lib/pages/pharmacies/screens/pharmacy_module_page.dart +++ b/lib/pages/pharmacies/screens/pharmacy_module_page.dart @@ -7,6 +7,7 @@ import 'package:diplomaticquarterapp/pages/pharmacies/screens/lakum-main-page.da import 'package:diplomaticquarterapp/pages/pharmacies/widgets/BannerPager.dart'; import 'package:diplomaticquarterapp/pages/pharmacies/widgets/ProductTileItem.dart'; import 'package:diplomaticquarterapp/pages/pharmacies/widgets/manufacturerItem.dart'; +import 'package:diplomaticquarterapp/pages/pharmacy/pharmacyAddresses/PharmacyAddresses.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/buttons/borderedButton.dart'; import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; @@ -188,7 +189,9 @@ class GridViewButtons extends StatelessWidget { opacity: 0, hasColorFilter: false, child: GridViewCard(TranslationBase.of(context).myPrescriptions, - 'assets/images/pharmacy_module/prescription_icon.png', () {}), + 'assets/images/pharmacy_module/prescription_icon.png', () { + Navigator.push(context, FadePage(page: PharmacyAddressesPage())); + }), ), DashboardItem( imageName: 'pharmacy_module/bg_4.png', diff --git a/lib/pages/pharmacy/pharmacyAddresses/AddAddress.dart b/lib/pages/pharmacy/pharmacyAddresses/AddAddress.dart index 30fd4cd6..7e8763e1 100644 --- a/lib/pages/pharmacy/pharmacyAddresses/AddAddress.dart +++ b/lib/pages/pharmacy/pharmacyAddresses/AddAddress.dart @@ -1,127 +1,82 @@ -import 'package:diplomaticquarterapp/widgets/avatar/large_avatar.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacies/Addresses.dart'; +import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/PharmacyAddressesViewModel.dart'; +import 'package:diplomaticquarterapp/pages/base/base_view.dart'; +import 'package:diplomaticquarterapp/widgets/buttons/borderedButton.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; +import 'package:diplomaticquarterapp/widgets/pickupLocation/PickupLocationFromMap.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_html/style.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; -import 'package:google_maps_flutter/google_maps_flutter.dart'; +import 'package:geolocator/geolocator.dart'; +import 'package:google_maps_place_picker/google_maps_place_picker.dart'; class AddAddressPage extends StatefulWidget { + final Addresses editedAddress; + final Function(PickResult) onPick; + + AddAddressPage(this.editedAddress, this.onPick); + @override - _AddAddressState createState() => _AddAddressState(); + _AddAddressPageState createState() => _AddAddressPageState(); } -class _AddAddressState extends State { +class _AddAddressPageState extends State { + double _latitude; + double _longitude; - void onMapCreated(controller){ - setState(() { - mapController= controller; - }); - } - void _getAddressFromLatLng() {} - _onMapTypeButtonPressed(){} - _onAddMarkerButtonPressed(){} - - LatLng _initialPosition; - GoogleMapController mapController; @override void initState() { - // TODO: implement initState - _initialPosition = LatLng(24.662617030, 46.7334844); super.initState(); + if (widget.editedAddress != null && + widget.editedAddress.latLong != null && + widget.editedAddress.latLong != "") { + List latLng = widget.editedAddress.latLong.split(","); + _latitude = double.parse(latLng[0]); + _longitude = double.parse(latLng[1]); + } else { + _getCurrentLocation(); + } } - void _onMapCreated(GoogleMapController controller) { - mapController = controller; + _getCurrentLocation() async { + await Geolocator.getLastKnownPosition().then((value) { + _latitude = value.latitude; + _longitude = value.longitude; + }).catchError((e) { + _longitude = 0; + _latitude = 0; + }); } - @override Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - centerTitle: true, - title: Text(TranslationBase.of(context).addNewAddress, style: TextStyle(color:Colors.white)), - backgroundColor: Colors.green, - ), - body: Stack( - children: [ - GoogleMap( - zoomControlsEnabled: true, - myLocationButtonEnabled: true, - myLocationEnabled: true, - onMapCreated: _onMapCreated, - onCameraMove: (object) { -// widget.currentLat = object.target.latitude; -// widget.currentLong = object.target.longitude; - }, - onCameraIdle: _getAddressFromLatLng, - padding: EdgeInsets.only(bottom: 90.0), - initialCameraPosition: CameraPosition( - target: _initialPosition, - zoom: 13.0, - ), - ), -// Align( -// alignment: Alignment.topRight, -// child: Column( -// children: [ -// button(_onMapTypeButtonPressed,Icons.map), -// SizedBox( -// height:16.0, -// ), -// button(_onAddMarkerButtonPressed, Icons.add_location) -// ], -// ), -// ), - ] - ), - bottomSheet: InkWell( - onTap: () { - Navigator.push( - context, - MaterialPageRoute(builder: (context) { - return AddAddressPage(); - }), - ); - }, - child: Container( - height: 50.0, - color: Colors.green, - child: Container( - decoration: BoxDecoration( - border: Border.all( - color: Colors.green, - style: BorderStyle.solid, - width: 1.0 - ), - color: Colors.green, - borderRadius: BorderRadius.circular(10.0) - ), - child: Center( - child: Text(TranslationBase.of(context).confirmLocation, - style: TextStyle( - color: Colors.white, - fontSize: 15.0, - fontWeight: FontWeight.bold, - ), - ), - ), + PreferredSizeWidget appBarWidget = AppBarWidget( + "${TranslationBase.of(context).changeAddress}", null, true); + final mediaQuery = MediaQuery.of(context); + final height = mediaQuery.size.height - + appBarWidget.preferredSize.height - + mediaQuery.padding.top; + + return BaseView( + builder: (_, model, wi) => AppScaffold( + appBarTitle: TranslationBase.of(context).changeAddress, + isShowAppBar: true, + isPharmacy: true, + backgroundColor: Colors.white, + appBarWidget: appBarWidget, + body: Container( + height: height * 1, + child: PickupLocationFromMap( + latitude: _latitude, + longitude: _longitude, + isWithAppBar: false, + buttonColor: Color(0xFF5AB145), + buttonLabel: TranslationBase.of(context).save, + onPick: (value) { + widget.onPick(value); + }, ), ), ), - ); + ); } - - -// Widget button(Function function, IconData icon){ -// return FloatingActionButton( -// onPressed: function, -// materialTapTargetSize: MaterialTapTargetSize.padded, -// backgroundColor: Colors.red, -// child: Icon( -// icon, -// size: 18.0, -// ),); -// } - } - diff --git a/lib/pages/pharmacy/pharmacyAddresses/PharmacyAddresses.dart b/lib/pages/pharmacy/pharmacyAddresses/PharmacyAddresses.dart index 44df964d..3ec7c831 100644 --- a/lib/pages/pharmacy/pharmacyAddresses/PharmacyAddresses.dart +++ b/lib/pages/pharmacy/pharmacyAddresses/PharmacyAddresses.dart @@ -1,380 +1,320 @@ - +import 'package:diplomaticquarterapp/core/model/pharmacies/Addresses.dart'; import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/PharmacyAddressesViewModel.dart'; import 'package:diplomaticquarterapp/pages/base/base_view.dart'; +import 'package:diplomaticquarterapp/uitl/app_toast.dart'; +import 'package:diplomaticquarterapp/widgets/buttons/borderedButton.dart'; +import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; +import 'package:diplomaticquarterapp/widgets/dialogs/confirm_dialog.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; +import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_svg/flutter_svg.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/pages/pharmacy/pharmacyAddresses/AddAddress.dart'; -import 'package:diplomaticquarterapp/config/config.dart'; import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; -import 'package:diplomaticquarterapp/services/pharmacy_services/pharmacyAddress_service.dart'; +import 'package:google_maps_place_picker/google_maps_place_picker.dart'; -class PharmacyAddressesPage extends StatefulWidget{ +class PharmacyAddressesPage extends StatefulWidget { @override _PharmacyAddressesState createState() => _PharmacyAddressesState(); - } - -class _PharmacyAddressesState extends State{ - - int selectedRadio; - bool _value = false; - - AppSharedPreferences sharedPref = AppSharedPreferences(); - +} - @override - void initState(){ -// WidgetsBinding.instance.addPostFrameCallback((_) => getAllAddress()); +class _PharmacyAddressesState extends State { - super.initState(); - selectedRadio=0; - } - setSelectedRadio(int val){ - setState(() { - selectedRadio = val; - }); + void navigateToAddressPage( + BuildContext ctx, PharmacyAddressesViewModel model, Addresses address) { + Navigator.push( + ctx, + FadePage( + page: AddAddressPage(address, (pickResult) { + model.addEditAddress(pickResult, address); + }))); } - Widget build (BuildContext context){ + Widget build(BuildContext context) { + PreferredSizeWidget appBarWidget = AppBarWidget( + "${TranslationBase.of(context).changeAddress}", null, true); + final mediaQuery = MediaQuery.of(context); + final height = mediaQuery.size.height - + appBarWidget.preferredSize.height - + mediaQuery.padding.top; + return BaseView( - onModelReady: (model) => model.getAddress(), - builder: (_,model, wi )=> AppScaffold( - appBarTitle: "", -// centerTitle: true, -// title: Text(TranslationBase.of(context).changeAddress, style: TextStyle(color:Colors.white)), -// backgroundColor: Colors.green, + onModelReady: (model) => model.getAddressesList(), + builder: (_, model, wi) => AppScaffold( + appBarTitle: TranslationBase.of(context).changeAddress, isShowAppBar: true, - isPharmacy:true , + isPharmacy: true, + backgroundColor: Colors.white, + appBarWidget: appBarWidget, body: Container( - child:SingleChildScrollView( + height: height * 0.90, + child: SingleChildScrollView( child: Column( - children:[ - ListView.builder( - scrollDirection: Axis.vertical, - shrinkWrap: true, - physics: ScrollPhysics(), - itemCount: 5 , - itemBuilder: (context, index){ - return Container( - child: Padding( - padding:EdgeInsets.only(top:10.0, left:5.0, right:5.0, bottom:5.0,), - child: Column( - children: [ - Row( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - InkWell( - onTap: () { - setState(() { - _value = !_value; - }); - }, - child: Container( - margin: EdgeInsets.only(right: 20), - - child: Padding( - padding: const EdgeInsets.all(5.0), - child: _value - ? Container( - child: SvgPicture.asset( - 'assets/images/pharmacy/check_icon.svg', - height: 25, - width: 25,), - ) - : Container( - child: SvgPicture.asset( - 'assets/images/pharmacy/check_icon.svg', - height: 23, - width: 23, - color: Colors.transparent, - ), - decoration: BoxDecoration( - border: Border.all( - color: Colors.grey, - style: BorderStyle.solid, - width: 1.0 - ), - color: Colors.transparent, - borderRadius: BorderRadius.circular(50.0) - ), - ), - ), - ), - ), - ], - ), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text('NAME', - style: TextStyle(fontSize: 15.0, fontWeight: FontWeight.bold, - ), - ), - SizedBox( - height: 5,), - Text('Address', - style: TextStyle(fontSize: 15.0, color: Colors.grey, - ), - ), - SizedBox( - height: 5,), - Row( - children: [ - Container( - margin: EdgeInsets.only(bottom: 8), - child: SvgPicture.asset( - 'assets/images/pharmacy/mobile_number_icon.svg', - height: 13,), - ), - Container( - margin: EdgeInsets.only(left: 10, bottom: 8), - child: Text('588888778', - style: TextStyle(fontSize: 15.0, - ), - ), - ), - ], - ), - SizedBox( - height: 15,), - Row( - children: [ - Column( - children: [ - InkWell( - onTap: () { - Navigator.push( - context, - MaterialPageRoute(builder: (context) { - return AddAddressPage(); - }), - ); - }, - child: Row( - children: [ - Container( - margin: EdgeInsets.only(right:10, bottom: 15), - child: SvgPicture.asset( - 'assets/images/pharmacy/edit_icon.svg', - height: 15,), - ), - Container( - margin: EdgeInsets.only(right:5, bottom: 15), - padding: EdgeInsets.only(right: 10.0), - child: Text(TranslationBase.of(context).edit, - style: TextStyle(fontSize: 15.0, - color: Colors.blue, - ), - ), - decoration: BoxDecoration( - border: Border( - right: BorderSide( - color: Colors.grey, - width: 1.0, - ), - ), - ), - ), - ], - ), - ), - ], - ), - Column( - children: [ - InkWell( - onTap: () { -// confirmDelete(snapshot.data[index]["id"]); - confirmDelete("address"); - }, - child: Row( - children: [ - Container( - margin: EdgeInsets.only(left: 15, right: 10, bottom: 15), - child: SvgPicture.asset( - 'assets/images/pharmacy/delete_red_icon.svg', - height: 15,), - ), - Container( - margin: EdgeInsets.only(bottom: 15), - child: Text(TranslationBase.of(context).delete, - style: TextStyle(fontSize: 15.0, - color: Colors.redAccent, - ), - ), - ), - ], - ), - ), - ], - ) - ], - ), - ], - ), - SizedBox( - height: 10, - ), - ], - ), - Divider( - color: Colors.grey[350], - height: 20, - thickness: 6, - indent: 0, - endIndent: 0, - ), - ], - ), - ), - ); - } - ), - SizedBox( - height: 10, - ), - InkWell( - onTap: () { - Navigator.push( - context, - MaterialPageRoute(builder: (context) { - return AddAddressPage(); + children: [ + ...List.generate( + model.addresses != null ? model.addresses.length : 0, + (index) => AddressItemWidget( + model, + model.addresses[index], + () { + setState(() { + model.setSelectedAddressIndex(index); + }); + }, + model.selectedAddressIndex == index, + (address) { + navigateToAddressPage(context, model, address); }), - ); - }, - child: Container( - margin: EdgeInsets.only(bottom: 100.0), - height: 50.0, - color: Colors.transparent, - child: Container( - decoration: BoxDecoration( - border: Border.all( - color: Colors.green, - style: BorderStyle.solid, - width: 1.0 - ), - color: Colors.transparent, - borderRadius: BorderRadius.circular(5.0) - ), - child: Center( - child: Text( - TranslationBase.of(context).addAddress, - style: TextStyle( - color: Colors.green, - fontWeight: FontWeight.bold, - ), - ), - ), - ), + ), + Container( + color: Colors.white, + margin: EdgeInsets.all(8), + child: BorderedButton( + TranslationBase.of(context).addAddress, + hasBorder: true, + borderColor: Color(0xFF0fca6d), + textColor: Color(0xFF0fca6d), + fontWeight: FontWeight.bold, + backgroundColor: Colors.white, + fontSize: 14, + vPadding: 12, + hasShadow: true, + handler: () { + navigateToAddressPage(context, model, null); + }, ), ), ], ), ), ), - bottomSheet: InkWell( - onTap: () { - Navigator.push( - context, - MaterialPageRoute(builder: (context) { - return AddAddressPage(); - }), - ); - }, - child: Container( - height: 50.0, - color: Colors.green, - child: Container( - decoration: BoxDecoration( - border: Border.all( - color: Colors.green, - style: BorderStyle.solid, - width: 1.0 - ), - color: Colors.green, - borderRadius: BorderRadius.circular(5.0) + bottomSheet: Container( + height: height * 0.10, + color: Colors.white, + child: Column( + children: [ + Divider( + color: Colors.grey.shade300, + height: 1, + thickness: 1, + indent: 0, + endIndent: 0, ), - child: Center( - child: Text(TranslationBase.of(context).confirmAddress, - style: TextStyle( - color: Colors.white, - fontWeight: FontWeight.bold, - ), + Container( + padding: EdgeInsets.symmetric(horizontal: 12, vertical: 8), + child: BorderedButton( + TranslationBase.of(context).confirmAddress, + hasBorder: true, + borderColor: Color(0xFF5AB145), + textColor: Colors.white, + fontWeight: FontWeight.bold, + backgroundColor: Color(0xFF5AB145), + fontSize: 14, + vPadding: 12, + handler: () { + model.saveSelectedAddressLocally( + model.addresses[model.selectedAddressIndex]); + Navigator.pop(context, + model.addresses[model.selectedAddressIndex]); + }, ), ), - ), + ], ), ), ), ); } - confirmDelete(address){ - showDialog( - context: context, - builder: (BuildContext context)=> AlertDialog( - title: Text(TranslationBase.of(context).confirmDeleteMsg, - style: TextStyle( - fontWeight: FontWeight.bold, - ),), - content: Text("address"), - actions:[ - FlatButton( - child: Text(TranslationBase.of(context).cancel, - style: TextStyle( - color: Colors.red, - fontWeight: FontWeight.bold, - fontSize: 16, - ),), - onPressed: (){ - Navigator.pop(context); - }, - ), - FlatButton( - child: Text(TranslationBase.of(context).confirmDelete, - style: TextStyle( - color: Colors.grey, - fontWeight: FontWeight.bold, - fontSize: 16, - ),), - onPressed: (){ -// http.delete("https://uat.hmgwebservices.com/epharmacy/api/Customers/272843?fields=addresses/$id"); - Navigator.push(context, - MaterialPageRoute(builder: (context)=> PharmacyAddressesPage() )); - }, - ), - ], - ) - ); - } -} - -getAllAddress() { -// print("ADDRESSES"); -// PharmacyAddressService service = new PharmacyAddressService(); -// service.getAddress(AppGlobal.context).then((res) { -// print(res); -// }); - } +class AddressItemWidget extends StatelessWidget { + final PharmacyAddressesViewModel model; + final Addresses address; + final Function selectAddress; + final bool isSelected; + final Function(Addresses) onTabEditAddress; + AddressItemWidget(this.model, this.address, this.selectAddress, + this.isSelected, this.onTabEditAddress); - getConfirmAddress(){ - - } - getEditAddress(){ - - } - getDeleteAddress(){ - + @override + Widget build(BuildContext context) { + return Container( + color: Colors.white, + child: Padding( + padding: EdgeInsets.symmetric(vertical: 8, horizontal: 0), + child: Column( + children: [ + Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + InkWell( + onTap: selectAddress, + child: Container( + margin: EdgeInsets.only(left: 16, right: 16), + child: Padding( + padding: const EdgeInsets.all(5.0), + child: Container( + decoration: new BoxDecoration( + color: !isSelected ? Colors.white : Colors.green, + shape: BoxShape.circle, + border: Border.all( + color: Colors.grey, + style: BorderStyle.solid, + width: 1.0), + ), + child: Padding( + padding: const EdgeInsets.all(0.0), + child: Icon( + Icons.check, + color: isSelected + ? Colors.white + : Colors.transparent, + size: 25, + ), + ), + ), + ), + ), + ), + ], + ), + Expanded( + child: Container( + child: Container( + margin: + EdgeInsets.symmetric(vertical: 12, horizontal: 12), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.symmetric(vertical: 0), + child: Texts( + "${address.firstName} ${address.lastName}", + fontSize: 14, + fontWeight: FontWeight.bold, + color: Colors.black, + ), + ), + Padding( + padding: const EdgeInsets.symmetric(vertical: 4), + child: Texts( + "${address.address1} ${address.address2} ${address.address2},, ${address.city}, ${address.country} ${address.zipPostalCode}", + fontSize: 12, + fontWeight: FontWeight.normal, + color: Colors.grey.shade500, + ), + ), + Row( + children: [ + Container( + margin: const EdgeInsets.only(right: 8), + child: Icon( + Icons.phone, + size: 20, + color: Colors.black, + ), + ), + Texts( + "${address.phoneNumber}", + fontSize: 14, + fontWeight: FontWeight.bold, + color: Colors.grey, + ), + ], + ), + SizedBox( + height: 10, + ), + Container( + height: 25, + child: Row( + children: [ + BorderedButton( + TranslationBase.of(context).edit, + backgroundColor: Colors.transparent, + hasBorder: true, + borderColor: Colors.transparent, + textColor: Color(0x990000FF), + handler: () { + onTabEditAddress(address); + }, + icon: Icon( + Icons.edit, + size: 15, + color: Color(0x990000FF), + ), + ), + Padding( + padding: + const EdgeInsets.symmetric(horizontal: 8), + child: SizedBox( + child: Container( + width: 1, + color: Colors.grey.shade400, + ), + ), + ), + BorderedButton( + TranslationBase.of(context).delete, + backgroundColor: Colors.transparent, + hasBorder: true, + borderColor: Colors.transparent, + textColor: Color(0x99FF0000), + handler: () { + ConfirmDialog dialog = new ConfirmDialog( + context: context, + title: "Are you sure want to delete", + confirmMessage: + "${address.address1} ${address.address2}", + okText: + TranslationBase.of(context).delete, + cancelText: TranslationBase.of(context) + .cancel_nocaps, + okFunction: () => { + model + .deleteAddresses(address) + .then((_) { + ConfirmDialog.closeAlertDialog( + context); + AppToast.showErrorToast( + message: + "Address has been deleted"); + }) + }, + cancelFunction: () => {}); + dialog.showAlertDialog(context); + }, + icon: Icon( + Icons.delete, + size: 15, + color: Color(0x99FF0000), + ), + ), + ], + ), + ), + ], + ), + ), + ), + ), + ], + ), + Divider( + color: Colors.grey.shade200, + height: 10, + thickness: 10, + indent: 0, + endIndent: 0, + ), + ], + ), + ), + ); + } } - - - - - diff --git a/lib/services/pharmacy_services/pharmacyAddress_service.dart b/lib/services/pharmacy_services/pharmacyAddress_service.dart index eae5ac8c..1bb6571c 100644 --- a/lib/services/pharmacy_services/pharmacyAddress_service.dart +++ b/lib/services/pharmacy_services/pharmacyAddress_service.dart @@ -1,36 +1,102 @@ import 'package:diplomaticquarterapp/config/config.dart'; import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacies/Addresses.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacies/Country.dart'; import 'package:diplomaticquarterapp/core/service/base_service.dart'; -import 'package:diplomaticquarterapp/models/Authentication/authenticated_user.dart'; import 'package:diplomaticquarterapp/services/authentication/auth_provider.dart'; -import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; -import 'package:flutter/material.dart'; -import 'package:diplomaticquarterapp/core/model/pharmacies/PharmacyAddressesModel.dart'; +class PharmacyAddressService extends BaseService { + List addresses = List(); + CountryData country; + int selectedAddressIndex = 0; -class PharmacyAddressService extends BaseService{ - List get address => address; + Future getAddresses() async { + var customerId = await sharedPref.getString(PHARMACY_CUSTOMER_ID); + Map queryParams = {'fields': 'addresses'}; + hasError = false; + Addresses selectedAddress; + try { + await baseAppClient.get("$GET_CUSTOMERS_ADDRESSES$customerId", + onSuccess: (dynamic response, int statusCode) async { + addresses.clear(); + var savedAddress = + await sharedPref.getObject(PHARMACY_SELECTED_ADDRESS); + if (savedAddress != null) { + selectedAddress = Addresses.fromJson(savedAddress); + } + int index = 0; + response['customers'][0]['addresses'].forEach((item) { + Addresses address = Addresses.fromJson(item); + if (selectedAddress != null && selectedAddress.id == item["id"]) { + selectedAddressIndex = index; + } + addresses.add(address); + index++; + }); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, queryParams: queryParams); + } catch (error) { + throw error; + } + } + + Future getCountries(String countryName) async { + hasError = false; + try { + await baseAppClient.get("$PHARMACY_GET_COUNTRY", + onSuccess: (dynamic response, int statusCode) { + // countries.clear(); + response['countries'].forEach((item) { + if (CountryData.fromJson(item).name == countryName || + CountryData.fromJson(item).namen == countryName) { + country = CountryData.fromJson(item); + } + // countries.add(CountryData.fromJson(item)); + }); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }); + } catch (error) { + throw error; + } + } - AppSharedPreferences sharedPref = AppSharedPreferences(); - AppGlobal appGlobal = new AppGlobal(); - AuthenticatedUser authUser = new AuthenticatedUser(); - AuthProvider authProvider = new AuthProvider(); + Future addCustomerAddress(Addresses address) async { + makeCustomerAddress(address, ADD_CUSTOMER_ADDRESS); + } - List _addressList = List(); - List get reviewList => _addressList; + Future editCustomerAddress(Addresses address) async { + makeCustomerAddress(address, EDIT_CUSTOMER_ADDRESS); + } + Future deleteCustomerAddress(Addresses address) async { + makeCustomerAddress(address, DELETE_CUSTOMER_ADDRESS); + } - Future getAddress() async { - print("step 1"); + Future makeCustomerAddress(Addresses address, String url) async { + var customerId = await sharedPref.getString(PHARMACY_CUSTOMER_ID); hasError = false; - await baseAppClient.getPharmacy(GET_ORDER, - onSuccess: (dynamic response, int statusCode) { - _addressList.clear(); - response['customers'].forEach((item) { - _addressList.add(PharmacyAddressesModel.fromJson(item)); - }); - }, onFailure: (String error, int statusCode) { - hasError = true; - super.error = error; - }); - }} \ No newline at end of file + super.error = ""; + + Map customerObject = Map(); + customerObject["addresses"] = [address]; + customerObject["id"] = customerId; + customerObject["email"] = address.email; + customerObject["role_ids"] = [3]; + Map body = Map(); + body["customer"] = customerObject; + + await baseAppClient.post("$url", onSuccess: (response, statusCode) async { + addresses.clear(); + response['customers'][0]['addresses'].forEach((item) { + addresses.add(Addresses.fromJson(item)); + }); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: body); + } +} diff --git a/lib/widgets/buttons/borderedButton.dart b/lib/widgets/buttons/borderedButton.dart index e297a10e..b0bbdaf0 100644 --- a/lib/widgets/buttons/borderedButton.dart +++ b/lib/widgets/buttons/borderedButton.dart @@ -18,6 +18,7 @@ class BorderedButton extends StatelessWidget { final double fontSize; final Widget icon; final FontWeight fontWeight; + final bool hasShadow; BorderedButton( this.text, { @@ -36,6 +37,7 @@ class BorderedButton extends StatelessWidget { this.fontSize = 0, this.icon, this.fontWeight, + this.hasShadow = false, }); @override @@ -46,14 +48,21 @@ class BorderedButton extends StatelessWidget { }, child: Container( decoration: BoxDecoration( - shape: BoxShape.rectangle, - color: backgroundColor ?? Colors.white, - borderRadius: BorderRadius.circular(radius), - border: Border.fromBorderSide(BorderSide( - color: hasBorder ? borderColor : Colors.white, - width: 0.8, - )), - ), + shape: BoxShape.rectangle, + color: backgroundColor ?? Colors.white, + borderRadius: BorderRadius.circular(radius), + border: Border.fromBorderSide(BorderSide( + color: hasBorder ? borderColor : Colors.white, + width: 0.8, + )), + boxShadow: [ + BoxShadow( + color: !hasShadow ? Colors.transparent : Colors.grey.withOpacity(0.5), + // spreadRadius: 5, + blurRadius: 15.0, + offset: Offset(0.0, 0.75) // changes position of shadow + ), + ]), child: Container( child: Row( mainAxisAlignment: MainAxisAlignment.center, @@ -69,8 +78,11 @@ class BorderedButton extends StatelessWidget { text, textAlign: TextAlign.center, style: TextStyle( - fontSize: fontSize == 0 ? SizeConfig.textMultiplier * 1.6 : fontSize, - fontWeight: fontWeight != null ? fontWeight : FontWeight.normal, + fontSize: fontSize == 0 + ? SizeConfig.textMultiplier * 1.6 + : fontSize, + fontWeight: + fontWeight != null ? fontWeight : FontWeight.normal, color: textColor ?? Color(0xffc4aa54)), ), ), diff --git a/lib/widgets/dialogs/confirm_dialog.dart b/lib/widgets/dialogs/confirm_dialog.dart index 8f1192a5..02b208ad 100644 --- a/lib/widgets/dialogs/confirm_dialog.dart +++ b/lib/widgets/dialogs/confirm_dialog.dart @@ -6,6 +6,7 @@ import 'package:flutter/material.dart'; class ConfirmDialog { final BuildContext context; + final title; final confirmMessage; final okText; final cancelText; @@ -14,6 +15,7 @@ class ConfirmDialog { ConfirmDialog( {@required this.context, + this.title, @required this.confirmMessage, @required this.okText, @required this.cancelText, @@ -31,7 +33,7 @@ class ConfirmDialog { // set up the AlertDialog AlertDialog alert = AlertDialog( - title: Text(TranslationBase.of(context).confirm), + title: title != null ? Text(title) : Text(TranslationBase.of(context).confirm), content: Text(this.confirmMessage), actions: [ cancelButton, diff --git a/lib/widgets/pickupLocation/PickupLocationFromMap.dart b/lib/widgets/pickupLocation/PickupLocationFromMap.dart index d8c93441..563de5d7 100644 --- a/lib/widgets/pickupLocation/PickupLocationFromMap.dart +++ b/lib/widgets/pickupLocation/PickupLocationFromMap.dart @@ -1,6 +1,7 @@ import 'package:diplomaticquarterapp/config/config.dart'; import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:diplomaticquarterapp/widgets/buttons/borderedButton.dart'; import 'package:diplomaticquarterapp/widgets/buttons/secondary_button.dart'; import 'package:diplomaticquarterapp/widgets/others/close_back.dart'; import 'package:flutter/cupertino.dart'; @@ -13,24 +14,36 @@ class PickupLocationFromMap extends StatelessWidget { final Function(PickResult) onPick; final double latitude; final double longitude; + final bool isWithAppBar; + final String buttonLabel; + final Color buttonColor; - const PickupLocationFromMap({Key key, this.onPick, this.latitude, this.longitude}) + const PickupLocationFromMap( + {Key key, + this.onPick, + this.latitude, + this.longitude, + this.isWithAppBar = true, + this.buttonLabel, + this.buttonColor}) : super(key: key); @override Widget build(BuildContext context) { ProjectViewModel projectViewModel = Provider.of(context); return Scaffold( - appBar: AppBar( - elevation: 0, - textTheme: TextTheme( - headline6: - TextStyle(color: Colors.white, fontWeight: FontWeight.bold), - ), - title: Text('Location'), - leading: CloseBack(), - centerTitle: true, - ), + appBar: isWithAppBar + ? AppBar( + elevation: 0, + textTheme: TextTheme( + headline6: + TextStyle(color: Colors.white, fontWeight: FontWeight.bold), + ), + title: Text('Location'), + leading: CloseBack(), + centerTitle: true, + ) + : null, body: PlacePicker( apiKey: GOOGLE_API_KEY, enableMyLocationButton: true, @@ -57,17 +70,30 @@ class PickupLocationFromMap extends StatelessWidget { child: state == SearchingState.Searching ? Center(child: CircularProgressIndicator()) : Container( - margin: EdgeInsets.all(12), - child: SecondaryButton( - color: Colors.grey[800], + margin: EdgeInsets.all(12), + child: BorderedButton( + buttonLabel != null ? buttonLabel : TranslationBase.of(context).next, textColor: Colors.white, - onTap: () { + fontWeight: FontWeight.bold, + backgroundColor: buttonColor != null ? buttonColor : Colors.grey[800], + fontSize: 14, + vPadding: 12, + radius: 10, + handler: () { onPick(selectedPlace); Navigator.of(context).pop(); }, - label: TranslationBase.of(context).next, ), - ), + /* SecondaryButton( + color: Colors.grey[800], + textColor: Colors.white, + onTap: () { + onPick(selectedPlace); + Navigator.of(context).pop(); + }, + label: TranslationBase.of(context).next, + ),*/ + ), ); }, initialPosition: LatLng(latitude, longitude), From c058cf0e93709fe48b4d7cf22e0082c26c9803da Mon Sep 17 00:00:00 2001 From: mosazaid Date: Sun, 13 Dec 2020 12:05:33 +0200 Subject: [PATCH 08/18] finish address add/edit/delete/select --- lib/pages/pharmacy/pharmacyAddresses/PharmacyAddresses.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/pages/pharmacy/pharmacyAddresses/PharmacyAddresses.dart b/lib/pages/pharmacy/pharmacyAddresses/PharmacyAddresses.dart index 3ec7c831..d542606d 100644 --- a/lib/pages/pharmacy/pharmacyAddresses/PharmacyAddresses.dart +++ b/lib/pages/pharmacy/pharmacyAddresses/PharmacyAddresses.dart @@ -45,6 +45,7 @@ class _PharmacyAddressesState extends State { appBarTitle: TranslationBase.of(context).changeAddress, isShowAppBar: true, isPharmacy: true, + baseViewModel: model, backgroundColor: Colors.white, appBarWidget: appBarWidget, body: Container( From 4a8448369842a1516b5ba096527bed72a842ac28 Mon Sep 17 00:00:00 2001 From: Fatimah Alshammari Date: Wed, 16 Dec 2020 12:50:41 +0300 Subject: [PATCH 09/18] fixed order details --- assets/images/pharmacy/user.svg | 3 + lib/config/config.dart | 1 + lib/config/localized_values.dart | 3 +- .../order_model_view_model.dart | 48 +- lib/locator.dart | 2 + lib/pages/pharmacy/order/Order.dart | 42 +- lib/pages/pharmacy/order/OrderDetails.dart | 116 ++- lib/pages/pharmacy/order/ProductReview.dart | 343 +++---- lib/pages/pharmacy/profile/profile.dart | 850 ++++++++++-------- .../cancelOrder_service.dart | 21 +- .../orderDetails_service.dart | 2 +- .../pharmacy_services/order_service.dart | 8 +- .../writeReview_service.dart | 40 + lib/uitl/translations_delegate_base.dart | 1 + lib/widgets/pharmacy/product_tile.dart | 26 +- 15 files changed, 864 insertions(+), 642 deletions(-) create mode 100644 assets/images/pharmacy/user.svg create mode 100644 lib/services/pharmacy_services/writeReview_service.dart diff --git a/assets/images/pharmacy/user.svg b/assets/images/pharmacy/user.svg new file mode 100644 index 00000000..8e978105 --- /dev/null +++ b/assets/images/pharmacy/user.svg @@ -0,0 +1,3 @@ + + + diff --git a/lib/config/config.dart b/lib/config/config.dart index 52cdd95c..d3fda732 100644 --- a/lib/config/config.dart +++ b/lib/config/config.dart @@ -368,6 +368,7 @@ const GET_ORDER = "orders?"; const GET_ORDER_DETAILS = "epharmacy/api/orders/"; const GET_ADDRESS = "Customers/"; const GET_Cancel_ORDER = "cancelorder/"; +const WRITE_REVIEW = "Content-Type" + "text/plain; charset=utf-8"; const GET_SHOPPING_CART = "epharmacy/api/shopping_cart_items/"; const GET_SHIPPING_OPTIONS = "epharmacy/api/get_shipping_option/"; const DELETE_SHOPPING_CART = "epharmacy/api/delete_shopping_cart_items/"; diff --git a/lib/config/localized_values.dart b/lib/config/localized_values.dart index c3962b5b..c52739f2 100644 --- a/lib/config/localized_values.dart +++ b/lib/config/localized_values.dart @@ -658,6 +658,7 @@ const Map localizedValues = { "compare": {"en": " Compare", "ar": "مقارنه"}, "medicationsRefill": {"en": " Medication Refill", "ar": "اعادة تعبئة الدواء"}, "myPrescription": {"en": " My Prescriptions", "ar": "وصفاتي"}, + "quantity": {"en": " QTY ", "ar": "الكمية"}, "backMyAccount": { "en": "BACK TO MY ACCOUNT ", "ar": " الرجوع لحسابي الشخصي" @@ -672,7 +673,7 @@ const Map localizedValues = { "ar": " تقييمك سوف يساعد الأخرين في اختيار المنتج الأفضل" }, "shippedMethod": {"en": "SHIP BY:", "ar": " الشحن بواسطة:"}, - "orderDetail": {"en": "Order Detail", "ar": " تفاصيل الطلب"}, + "orderDetail": {"en": "Order Details", "ar": " تفاصيل الطلب"}, "orderSummary": {"en": "Order Summary", "ar": " تفاصيل المنتج"}, "subtotal": {"en": "Subtotal", "ar": " المجموع"}, "shipping": {"en": "Shipping", "ar": " الشحن"}, diff --git a/lib/core/viewModels/pharmacyModule/order_model_view_model.dart b/lib/core/viewModels/pharmacyModule/order_model_view_model.dart index 04cbe8e3..f3262ba3 100644 --- a/lib/core/viewModels/pharmacyModule/order_model_view_model.dart +++ b/lib/core/viewModels/pharmacyModule/order_model_view_model.dart @@ -1,9 +1,13 @@ -//import 'dart:html'; import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; +import 'package:diplomaticquarterapp/pages/pharmacy/order/Order.dart'; +import 'package:diplomaticquarterapp/pages/pharmacy/order/OrderDetails.dart'; +import 'package:diplomaticquarterapp/services/pharmacy_services/cancelOrder_service.dart'; import 'package:diplomaticquarterapp/services/pharmacy_services/orderDetails_service.dart'; import 'package:diplomaticquarterapp/services/pharmacy_services/order_service.dart'; import 'package:diplomaticquarterapp/core/model/pharmacies/order_model.dart'; +import 'package:diplomaticquarterapp/uitl/app_toast.dart'; +import 'package:flutter/material.dart'; import '../../../locator.dart'; import '../base_view_model.dart'; @@ -15,20 +19,24 @@ class OrderModelViewModel extends BaseViewModel { OrderDetailsService _orderDetailsService = locator(); List get orderDetails => _orderDetailsService.orderDetails; + CancelOrderService _cancelOrderService = locator(); + List get cancelOrder => _cancelOrderService.cancelOrderList; - Future getOrder(id, pageId) async { + + Future getOrder(customerId, pageID) async { + print("this is customer id"+ customerId); setState(ViewState.Busy); - await _orderService.getOrder(id,pageId); + await _orderService.getOrder(customerId, pageID); if (_orderService.hasError) { error = _orderService.error; setState(ViewState.Error); } else { //order = _orderService.orderList; - print(order.length); setState(ViewState.Idle); } + } Future getOrderDetails(orderId) async { @@ -38,23 +46,47 @@ class OrderModelViewModel extends BaseViewModel { error = _orderDetailsService.error; setState(ViewState.Error); } else { - + setState(ViewState.Idle); } } - Future getProductReview(orderId) async { + Future getProductReview() async { setState(ViewState.Busy); - await _orderService.getProductReview(orderId); + await _orderService.getProductReview(); if (_orderService.hasError) { error = _orderService.error; setState(ViewState.Error); } else { //order = _orderService.orderList; - print(order.length); setState(ViewState.Idle); } } + Future getCanceledOrder(order, context) async { + print("this is order id"+ order); + setState(ViewState.Busy); + dynamic res; + await _cancelOrderService.getCanceledOrder(order).then((value) { + res = value['success']['SuccessEndUserMsg']; + print(value['success']['SuccessEndUserMsg']); + AppToast.showSuccessToast(message: "Request Sent Successfully"); +// Navigator.pop(context); + + }); + if (_cancelOrderService.hasError) { + error = _cancelOrderService.error; + setState(ViewState.Error); + AppToast.showErrorToast(message: error); + } else { + setState(ViewState.Idle); +// AppToast.showSuccessToast(message: "Request Sent Successfully"); +// Navigator.push(context, +// MaterialPageRoute(builder: (context) => OrderPage())); + + } + + return res; + } } \ No newline at end of file diff --git a/lib/locator.dart b/lib/locator.dart index 6d2375e7..c9ecdb06 100644 --- a/lib/locator.dart +++ b/lib/locator.dart @@ -6,6 +6,7 @@ import 'package:diplomaticquarterapp/core/viewModels/AlHabibMedicalService/home_ import 'package:diplomaticquarterapp/core/viewModels/dashboard_view_model.dart'; import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/PharmacyAddressesViewModel.dart'; import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/order_model_view_model.dart'; +import 'package:diplomaticquarterapp/services/pharmacy_services/cancelOrder_service.dart'; import 'package:diplomaticquarterapp/services/pharmacy_services/order_service.dart'; import 'package:diplomaticquarterapp/uitl/navigation_service.dart'; import 'package:get_it/get_it.dart'; @@ -173,6 +174,7 @@ void setupLocator() { locator.registerLazySingleton(() => OrderDetailsService()); locator.registerLazySingleton(() => CustomerAddressesService()); locator.registerLazySingleton(() => TermsConditionService()); + locator.registerLazySingleton(() => CancelOrderService()); /// View Model locator.registerFactory(() => HospitalViewModel()); diff --git a/lib/pages/pharmacy/order/Order.dart b/lib/pages/pharmacy/order/Order.dart index f46eb08f..f153dd35 100644 --- a/lib/pages/pharmacy/order/Order.dart +++ b/lib/pages/pharmacy/order/Order.dart @@ -1,4 +1,5 @@ import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/order_model_view_model.dart'; +import 'package:diplomaticquarterapp/models/Authentication/authenticated_user.dart'; import 'package:diplomaticquarterapp/pages/base/base_view.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:flutter/material.dart'; @@ -11,17 +12,24 @@ import 'package:diplomaticquarterapp/pages/pharmacy/order/OrderDetails.dart'; import 'package:diplomaticquarterapp/core/model/pharmacies/order_model.dart'; import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; + class OrderPage extends StatefulWidget { // orderList({this.customerId, this.pageId}); var languageID ; + String customerID; + + OrderPage({@required this.customerID}); + @override _OrderPageState createState() => _OrderPageState(); } class _OrderPageState extends State with SingleTickerProviderStateMixin{ - String customerId=""; - String page_id=""; + + String pageID= "1"; + String customerId = ""; + String order =""; List orderList = [] ; List deliveredOrderList = [] ; @@ -31,19 +39,23 @@ class _OrderPageState extends State with SingleTickerProviderStateMix TabController _tabController; AppSharedPreferences sharedPref = AppSharedPreferences(); + getLanguageID() async { + return await sharedPref.getStringWithDefaultValue(APP_LANGUAGE, 'ar'); + } @override void initState() { -// WidgetsBinding.instance.addPostFrameCallback((_) => getOrder()); getLanguageID(); super.initState(); + _tabController = new TabController(length: 4, vsync: this,); } @override Widget build(BuildContext context) { + print( "customerID" + widget.customerID); return BaseView( - onModelReady: (model) => model.getOrder(customerId, page_id), + onModelReady: (model) => model.getOrder(widget.customerID, pageID), builder: (_,model, wi )=> AppScaffold( appBarTitle:TranslationBase.of(context).order, baseViewModel: model, @@ -181,7 +193,7 @@ class _OrderPageState extends State with SingleTickerProviderStateMix indent: 0, endIndent: 0, ), - Row( + Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Container( @@ -196,7 +208,8 @@ class _OrderPageState extends State with SingleTickerProviderStateMix color: Colors.blue[700], borderRadius: BorderRadius.circular(30.0) ), - child: Text( + child: deliveredOrderList[index].orderStatusId == 30 + ? Text( // deliveredOrderList[0].orderStatus.toString().substring(12), TranslationBase.of(context).deliveredOrder, style: TextStyle( @@ -204,7 +217,15 @@ class _OrderPageState extends State with SingleTickerProviderStateMix fontSize: 15.0, fontWeight: FontWeight.bold, ), - ), + ) + : Text( + deliveredOrderList[index].orderStatus.toString().substring(12), + style: TextStyle( + color: Colors.white, + fontSize: 15.0, + fontWeight: FontWeight.bold, + ), + ) ), Container( margin: EdgeInsets.only(left: 8, right: 8, top: 1, bottom: 8), @@ -1073,12 +1094,7 @@ class _OrderPageState extends State with SingleTickerProviderStateMix ); } - getLanguageID() async { - var languageID = await sharedPref.getString(APP_LANGUAGE); - setState(() { - widget.languageID = languageID; - }); - } + } diff --git a/lib/pages/pharmacy/order/OrderDetails.dart b/lib/pages/pharmacy/order/OrderDetails.dart index 94b1aba2..57cddeca 100644 --- a/lib/pages/pharmacy/order/OrderDetails.dart +++ b/lib/pages/pharmacy/order/OrderDetails.dart @@ -6,6 +6,7 @@ import 'package:diplomaticquarterapp/widgets/dialogs/confirm_dialog.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:flutter/material.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:diplomaticquarterapp/widgets/in_app_browser/InAppBrowser.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:diplomaticquarterapp/widgets//pharmacy/product_tile.dart'; import 'package:diplomaticquarterapp/config/config.dart'; @@ -19,11 +20,11 @@ import 'package:diplomaticquarterapp/uitl/app_toast.dart'; + class OrderDetailsPage extends StatefulWidget { var languageID ; - OrderModel orderModel; OrderDetailsPage({ @required this.orderModel @@ -34,10 +35,18 @@ class OrderDetailsPage extends StatefulWidget { } class _OrderDetailsPageState extends State { + + getLanguageID() async { + return await sharedPref.getStringWithDefaultValue(APP_LANGUAGE, 'ar'); + } + AppSharedPreferences sharedPref = AppSharedPreferences(); - String customerId=""; - String page_id=""; - String orderId="3516"; + String orderId=""; + + String customerId; + List orderList = [] ; + List cancelledOrderList = []; +// String orderId="3516"; var model; var isCancel = false; var isRefund = false; @@ -48,10 +57,10 @@ class _OrderDetailsPageState extends State { @override void initState() { super.initState(); + print(widget.orderModel.orderItems.length); getLanguageID(); - getCancelOrder(widget.orderModel.id); -// cancelOrderDetail(widget.orderModel.id); +// cancelOrderDetail(order) } @override @@ -98,10 +107,11 @@ class _OrderDetailsPageState extends State { color: getStatusBackgroundColor(), borderRadius: BorderRadius.circular(30.0) ), - child: Text(widget.orderModel.orderStatus.toString().substring(12), -// widget.languageID == "ar" -// ? widget.orderModel.orderStatusn.toString() -// : widget.orderModel.orderStatus.toString().substring(12) , + child: Text( +// widget.orderModel.orderStatus.toString().substring(12), + widget.languageID == "ar" + ? widget.orderModel.orderStatusn.toString() + : widget.orderModel.orderStatus.toString().substring(12) , // TranslationBase.of(context).delivered, style: TextStyle( color: Colors.white, @@ -117,7 +127,7 @@ class _OrderDetailsPageState extends State { child: Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text(model.order[0].shippingAddress.firstName.toString().substring(10) + ' ' +model.order[0].shippingAddress.lastName.toString().substring(9), + Text(widget.orderModel.shippingAddress.firstName.toString().substring(10) + ' ' +model.order[0].shippingAddress.lastName.toString().substring(9), style: TextStyle(fontSize: 15.0, fontWeight: FontWeight.bold, ), ), @@ -125,12 +135,12 @@ class _OrderDetailsPageState extends State { ), ), Container( - margin: EdgeInsets.fromLTRB(10.0, 5.0, 1.0, 5.0), + margin: EdgeInsets.fromLTRB(11.0, 5.0, 1.0, 5.0), child: Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text(model.order[0].shippingAddress.address1.toString().substring(9), - style: TextStyle(fontSize: 15.0, fontWeight: FontWeight.bold, + Text(widget.orderModel.shippingAddress.address1.toString().substring(9), + style: TextStyle(fontSize: 11.0, fontWeight: FontWeight.bold, color: Colors.grey, ), ), @@ -142,8 +152,10 @@ class _OrderDetailsPageState extends State { child: Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text(model.order[0].shippingAddress.address2.toString().substring(9), - style: TextStyle(fontSize: 15.0, fontWeight: FontWeight.bold, + Text(widget.orderModel.shippingAddress.address2.toString().substring(9) + + ' ' + widget.orderModel.shippingAddress.country.toString() + + ' ' + widget.orderModel.shippingAddress.zipPostalCode.toString(), + style: TextStyle(fontSize: 10.0, fontWeight: FontWeight.bold, color: Colors.grey, ), ), @@ -161,7 +173,7 @@ class _OrderDetailsPageState extends State { ), Container( margin: EdgeInsets.only(top: 5.0, bottom: 5.0), - child: Text(model.order[0].shippingAddress.phoneNumber.toString(), + child: Text(widget.orderModel.shippingAddress.phoneNumber.toString(), style: TextStyle(fontSize: 15.0, ), ), @@ -193,7 +205,7 @@ class _OrderDetailsPageState extends State { ), ), Container( - child: model.order[0].shippingRateComputationMethodSystemName == "Shipping.FixedOrByWeight" + child: widget.orderModel.shippingRateComputationMethodSystemName == "Shipping.FixedOrByWeight" ? Container( margin: EdgeInsets.only(bottom: 10.0, top: 10.0), child: SvgPicture.asset( @@ -236,7 +248,7 @@ class _OrderDetailsPageState extends State { ), Container( margin: EdgeInsets.only(bottom: 10.0, top: 10.0), - child:Text(model.order[0].paymentName.toString().substring(12), + child:Text(widget.orderModel.paymentName.toString().substring(12), style: TextStyle(fontSize: 13.0, fontWeight: FontWeight.bold, ), ), @@ -274,8 +286,11 @@ class _OrderDetailsPageState extends State { productPrice: widget.orderModel.orderItems[index].product.price.toString(), productRate: widget.orderModel.orderItems[index].product.approvedRatingSum.toDouble(), productReviews:widget.orderModel.orderItems[index].product.approvedTotalReviews, - totalPrice: widget.orderModel.orderItems[index].priceExclTax.toString(), - qyt: widget.orderModel.orderItems[index].quantity.toString(),), + totalPrice: "${(widget.orderModel.orderItems[index].product.price + * widget.orderModel.orderItems[index].quantity).toStringAsFixed(2)}", + qyt: widget.orderModel.orderItems[index].quantity.toString(), + img:widget.orderModel.orderItems[index].product.images[0].src.toString(), + status: widget.orderModel.orderStatusId,), ); } ), @@ -318,7 +333,7 @@ class _OrderDetailsPageState extends State { ), ), ), - Text(model.order[0].orderSubtotalExclTax.toString(), + Text(widget.orderModel.orderSubtotalExclTax.toString(), style: TextStyle(fontSize: 13.0, ), ), @@ -352,7 +367,7 @@ class _OrderDetailsPageState extends State { ), ), ), - Text(model.order[0].orderShippingExclTax.toString(), + Text(widget.orderModel.orderShippingExclTax.toString(), style: TextStyle(fontSize: 13.0, ), ), @@ -418,7 +433,7 @@ class _OrderDetailsPageState extends State { ), ), ), - Text(model.order[0].orderTotal.toString(), + Text(widget.orderModel.orderTotal.toString(), style: TextStyle(fontSize: 15.0, fontWeight: FontWeight.bold, ), ), @@ -428,8 +443,9 @@ class _OrderDetailsPageState extends State { ], ), widget.orderModel.orderStatusId == 10 ? InkWell( - onTap: (){ - // payOnline link + onTap: () { +// Navigator.push(context, +// MaterialPageRoute(builder: (context) => InAppBrowser())); }, child: Container( // margin: EdgeInsets.only(top: 20.0), @@ -458,12 +474,11 @@ class _OrderDetailsPageState extends State { ), ), ) : Container(), - // getCancelOrder(canCancel, canRefund), isCancel ? InkWell( onTap: () { - Navigator.push(context, - MaterialPageRoute(builder: (context) => presentConfirmDialog())); + presentConfirmDialog(model,widget.orderModel.id);//(widget.orderModel.id)); +// }, child: Container( // padding: EdgeInsets.only(left: 13.0, right: 13.0, top: 5.0), @@ -537,37 +552,40 @@ class _OrderDetailsPageState extends State { } } - presentConfirmDialog(){ +// .getCanceledOrder + presentConfirmDialog(cancelFunction, id){ ConfirmDialog dialog = new ConfirmDialog( context: context, confirmMessage: TranslationBase.of(context).confirmCancellation, okText: TranslationBase.of(context).confirm, cancelText: TranslationBase.of(context).cancel_nocaps, - okFunction: () => { -// cancelOrderDetail(widget.orderModel.id), - ConfirmDialog.closeAlertDialog(context) - }, - cancelFunction: () => {}); + okFunction: () => cancelFunction.getCanceledOrder(id, context).then((value){ + print(":D"); + print(value); +// Navigator.pop(context); + Navigator.push(context, + MaterialPageRoute(builder: (context) => + OrderPage(customerID: widget.orderModel.customerId.toString())), + );}), + + cancelFunction: () => {} + ); dialog.showAlertDialog(context); } -// cancelOrderDetail(order){ -// if(widget.orderModel.canCancel && widget.orderModel.canRefund == false){ -//// setState(() { -// cancelOrderDetail(order); + getCanceledOrder(order){ + Navigator.pop(context); + if(widget.orderModel.canCancel && widget.orderModel.canRefund == false){ +// getCanceledOrder(order); // AppToast.showSuccessToast(message: "Request Sent Successfully"); -//// }); -//// return OrderPage(); -// } -// else{} -// } +// Navigator.push(context, +// MaterialPageRoute(builder: (context) => OrderPage())); + + } - getLanguageID() async { - var languageID = await sharedPref.getString(APP_LANGUAGE); - setState(() { - widget.languageID = languageID; - }); } + + } diff --git a/lib/pages/pharmacy/order/ProductReview.dart b/lib/pages/pharmacy/order/ProductReview.dart index 0f9217b7..37ede97c 100644 --- a/lib/pages/pharmacy/order/ProductReview.dart +++ b/lib/pages/pharmacy/order/ProductReview.dart @@ -1,19 +1,21 @@ + import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/order_model_view_model.dart'; import 'package:diplomaticquarterapp/pages/base/base_view.dart'; +import 'package:diplomaticquarterapp/pages/pharmacy/profile/profile.dart'; +import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:flutter/material.dart'; -import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; -import 'package:flutter_svg/flutter_svg.dart'; -import 'package:diplomaticquarterapp/config/config.dart'; -import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; -import 'package:diplomaticquarterapp/services/pharmacy_services/order_service.dart'; -import 'package:diplomaticquarterapp/pages/pharmacy/profile/profile.dart'; -import 'package:rating_bar/rating_bar.dart'; import 'package:diplomaticquarterapp/core/model/pharmacies/order_model.dart'; -import 'package:diplomaticquarterapp/widgets//pharmacy/product_tile.dart'; +import 'package:flutter_svg/svg.dart'; +import 'package:rating_bar/rating_bar.dart'; class ProductReviewPage extends StatefulWidget { + OrderModel orderModel; + ProductReviewPage({ + @required this.orderModel + }); @override _ProductReviewPageState createState() => _ProductReviewPageState(); } @@ -26,193 +28,212 @@ class _ProductReviewPageState extends State { String submitTxt =""; var doctorRating= ""; var reviewObj = {}; + AppSharedPreferences sharedPref = AppSharedPreferences(); @override Widget build(BuildContext context) { return BaseView( - onModelReady: (model)=>model.getProductReview(orderId), + onModelReady: (model)=>model.getOrderDetails(widget.orderModel.id), builder: (_,model, wi )=> AppScaffold( appBarTitle: TranslationBase.of(context).writeReview, isShowAppBar: true, isPharmacy:true , - body: Container( - color: Colors.white, - child: SingleChildScrollView( - child: Column( - children: [ -// Container( -// child: productTile(productName: 'Panadol Extra 500 MG', productPrice: '10.00', productRate: 3.00, -// productReviews:4, ), -// ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - Container( - margin: EdgeInsets.only(left: 10), - child: SvgPicture.asset( -// model.order[0].orderItems[0].product.images[0].src.toString(), + body: Container( + color: Colors.white, + child: SingleChildScrollView( + child: Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + ListView.builder( + scrollDirection: Axis.vertical, + shrinkWrap: true, + physics: ScrollPhysics(), + itemCount:widget.orderModel.orderItems.length, + itemBuilder: (context, index){ + return Container( + margin: EdgeInsets.only(top :15.0, bottom: 15.0), + child: Row( + children:[ + Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + Container( + margin: EdgeInsets.only(left: 10), + child: SvgPicture.asset( +// widget.orderModel.orderItems[index].product.images[index].src.toString(), 'assets/images/al-habib_onlne_pharmacy_bg.png', - fit: BoxFit.cover, - width: 80, - height: 80, + fit: BoxFit.cover, + width: 80, + height: 80, ), - ),] - ), - Container( - margin: EdgeInsets.only(top :15.0, bottom: 15.0), - child: Column( - children: [ - Row( - children: [ - Text(model.order[0].orderItems[0].product.name.toString(), - style: TextStyle(fontSize: 16.0, + ), + ] ), - ), - ], - ), - Row( - children: [ - Container( - margin: EdgeInsets.only(left: 5), - child: Text(model.order[0].orderItems[0].product.price.toString(), - style: TextStyle(fontSize: 16.0, fontWeight: FontWeight.bold, + ], + ), + Column( + children: [ + Row( + children: [ + Text(widget.orderModel.orderItems[index].product.name.toString(), + style: TextStyle(fontSize: 16.0, + ), ), - ), + ], ), - Container( - margin: EdgeInsets.only(left: 5), - child: Text(TranslationBase.of(context).sar, - style: TextStyle(fontSize: 16.0, fontWeight: FontWeight.bold, + Row( + children: [ + Container( + margin: EdgeInsets.only(left: 5), + child: Text(widget.orderModel.orderItems[index].product.price.toString(), + style: TextStyle(fontSize: 16.0, fontWeight: FontWeight.bold, + ), + ), ), - ), - ), - ], - ), - Row( - children: [ - Container( - margin: EdgeInsets.all(5), - child: Align( - alignment: Alignment.topLeft, - child: RatingBar.readOnly( - initialRating: 3, - size: 15.0, - filledColor: Colors.yellow[700], - emptyColor: Colors.grey[500], - isHalfAllowed: true, - halfFilledIcon: Icons.star_half, - filledIcon: Icons.star, - emptyIcon: Icons.star, + Container( + margin: EdgeInsets.only(left: 5), + child: Text(TranslationBase.of(context).sar, + style: TextStyle(fontSize: 16.0, fontWeight: FontWeight.bold, + ), + ), ), - ), + ], ), - Container( - child: Text(model.order[0].orderItems[0].product.approvedRatingSum.toString(), - style: TextStyle(fontSize: 14.0, fontWeight: FontWeight.bold, + Row( + children: [ + Container( + margin: EdgeInsets.all(5), + child: Align( + alignment: Alignment.topLeft, + child: RatingBar.readOnly( + initialRating: 3, + size: 15.0, + filledColor: Colors.yellow[700], + emptyColor: Colors.grey[500], + isHalfAllowed: true, + halfFilledIcon: Icons.star_half, + filledIcon: Icons.star, + emptyIcon: Icons.star, + ), + ), ), - ), - ), - Container( - margin: EdgeInsets.only(left: 5), - child: Text("(" + model.order[0].orderItems[0].product.approvedTotalReviews.toString() - + ' ' + TranslationBase.of(context).review +")", - style: TextStyle(fontSize: 12.0, + Container( + child: Text(widget.orderModel.orderItems[index].product.approvedRatingSum.toString(), + style: TextStyle(fontSize: 14.0, fontWeight: FontWeight.bold, + ), + ), ), - ), + Container( + margin: EdgeInsets.only(left: 5), + child: Text("(" + widget.orderModel.orderItems[index].product.approvedTotalReviews.toString() + + ' ' + TranslationBase.of(context).review +")", + style: TextStyle(fontSize: 12.0, + ), + ), + ), + ], ), ], ), - ], - ), - ), - Divider( - color: Colors.grey[350], - height: 20, - thickness: 8, - indent: 0, - endIndent: 0, + ] + ), + ); + } ), - Container( - margin: EdgeInsets.only( top: 12.0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.spaceBetween, - mainAxisSize: MainAxisSize.max, - children: [ - RatingBar( - // initialRating: - // this.doctor.actualDoctorRate.toDouble(), - size: 40.0, - filledColor: Colors.yellow[700], - emptyColor: Colors.grey[500], - isHalfAllowed: true, - halfFilledIcon: Icons.star_half, - filledIcon: Icons.star, - emptyIcon: Icons.star, - ), - ], + ]), + + Divider( + color: Colors.grey[350], + height: 20, + thickness: 8, + indent: 0, + endIndent: 0, + ), + Container( + margin: EdgeInsets.only( top: 12.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + mainAxisSize: MainAxisSize.max, + children: [ + RatingBar( + // initialRating: + // this.doctor.actualDoctorRate.toDouble(), + size: 40.0, + filledColor: Colors.yellow[700], + emptyColor: Colors.grey[500], + isHalfAllowed: true, + halfFilledIcon: Icons.star_half, + filledIcon: Icons.star, + emptyIcon: Icons.star, ), - ), - Container( - padding: EdgeInsets.fromLTRB(8.0, 20.0, 8.0,20.0), - child: Column( - children: [ - TextFormField ( - decoration: InputDecoration( - contentPadding: const EdgeInsets.symmetric(vertical: 60.0), - border: InputBorder.none, - hintText: 'Tell us more about product!', - focusedBorder: OutlineInputBorder( - borderRadius: BorderRadius.circular(5.0), - borderSide: BorderSide(width: 1, color: Colors.grey[400]), - ), - enabledBorder: OutlineInputBorder( - borderRadius: BorderRadius.all(Radius.circular(5.0)), - borderSide: BorderSide(color: Colors.grey[400], width: 1), - ), - ), + ], + ), + ), + Container( + padding: EdgeInsets.fromLTRB(8.0, 20.0, 8.0,20.0), + child: Column( + children: [ + TextFormField ( + decoration: InputDecoration( + contentPadding: const EdgeInsets.symmetric(vertical: 60.0), + border: InputBorder.none, + hintText: 'Tell us more about product!', + focusedBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(5.0), + borderSide: BorderSide(width: 1, color: Colors.grey[400]), ), - ], + enabledBorder: OutlineInputBorder( + borderRadius: BorderRadius.all(Radius.circular(5.0)), + borderSide: BorderSide(color: Colors.grey[400], width: 1), + ), + ), ), - ), - InkWell( - onTap: () { + ], + ), + ), + InkWell( + onTap: () { // Navigator.push(context, // MaterialPageRoute(builder: (context) => )); - }, - child: Container( - height: 50.0, - width: 400.0, - color: Colors.transparent, - child: Container( - decoration: BoxDecoration( - border: Border.all( - color: Colors.yellow[700], - style: BorderStyle.solid, - width: 1.0 - ), + }, + child: Container( + height: 50.0, + width: 400.0, + color: Colors.transparent, + child: Container( + decoration: BoxDecoration( + border: Border.all( color: Colors.yellow[700], - borderRadius: BorderRadius.circular(5.0) + style: BorderStyle.solid, + width: 1.0 ), - child: Center( - child: Text( - TranslationBase.of(context).shareReview, - style: TextStyle( - color: Colors.white, - fontSize: 16.0, - fontWeight: FontWeight.bold, - ), - ), + color: Colors.yellow[700], + borderRadius: BorderRadius.circular(5.0) + ), + child: Center( + child: Text( + TranslationBase.of(context).shareReview, + style: TextStyle( + color: Colors.white, + fontSize: 16.0, + fontWeight: FontWeight.bold, ), ), ), ), - ], - ), + ), ), - ),), - ); + ], + ), + ), + ),), + ); } @@ -346,4 +367,4 @@ class _ProductReviewPageState extends State { submitProductReview(){ } -} +} \ No newline at end of file diff --git a/lib/pages/pharmacy/profile/profile.dart b/lib/pages/pharmacy/profile/profile.dart index 0336370c..e52d059b 100644 --- a/lib/pages/pharmacy/profile/profile.dart +++ b/lib/pages/pharmacy/profile/profile.dart @@ -1,21 +1,18 @@ +import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; +import 'package:diplomaticquarterapp/models/Authentication/authenticated_user.dart'; import 'package:diplomaticquarterapp/pages/ContactUs/LiveChat/livechat_page.dart'; import 'package:diplomaticquarterapp/pages/ContactUs/findus/findus_page.dart'; import 'package:diplomaticquarterapp/pages/DrawerPages/family/my-family.dart'; import 'package:diplomaticquarterapp/pages/medical/prescriptions/prescriptions_home_page.dart'; +import 'package:diplomaticquarterapp/pages/pharmacies/screens/lakum-main-page.dart'; import 'package:diplomaticquarterapp/pages/pharmacies/wishlist.dart'; import 'package:diplomaticquarterapp/pages/pharmacy/order/Order.dart'; import 'package:diplomaticquarterapp/pages/pharmacy/pharmacyAddresses/PharmacyAddresses.dart'; -import 'package:diplomaticquarterapp/widgets/avatar/large_avatar.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_svg/flutter_svg.dart'; +import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; -import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/order_model_view_model.dart'; -import 'package:diplomaticquarterapp/pages/base/base_view.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; -import 'package:diplomaticquarterapp/config/config.dart'; -import 'package:diplomaticquarterapp/core/model/pharmacies/order_model.dart'; -import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; - +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; class PharmacyProfilePage extends StatefulWidget { @override @@ -24,416 +21,501 @@ class PharmacyProfilePage extends StatefulWidget { class _ProfilePageState extends State { AppSharedPreferences sharedPref = AppSharedPreferences(); - String customerId=""; - String page_id=""; + + AuthenticatedUser user; + bool isLogin = false; + String firstName; + String customerId; + _ProfilePageState({this.customerId}); + + getCustomer() async { + String custID; + custID = await sharedPref.getString(PHARMACY_CUSTOMER_ID); + + setState(() { + customerId = custID; + }); + print("customer Id is"+ customerId); + return customerId; + } + + getUser() async { + var userData = await sharedPref.getObject(USER_PROFILE); + if (userData != null) user = AuthenticatedUser.fromJson(userData); + setState(() { + firstName = user.firstName.toString(); + print("this is user" + user.firstName.toString()); + }); +// this.isLogin = user != null; + } + void initState() { + getCustomer(); + super.initState(); + getUser(); + } @override Widget build(BuildContext context) { - return BaseView( - onModelReady: (model) => model.getOrder(customerId, page_id), - builder: (_,model, wi )=> AppScaffold( - appBarTitle: TranslationBase.of(context).myAccount, - isShowAppBar: true, - isPharmacy:true , - body: Container( - child:SingleChildScrollView( - child: Column( - children:[ - Container( - child:Row( - children: [ - Container( - padding:EdgeInsets.only(top:20.0, left:10.0, right:10.0, bottom:10.0,), - child: LargeAvatar(name: "profile", url:'' ,), - ), - Container( - child: Column( + return AppScaffold( + appBarTitle: TranslationBase.of(context).myAccount, + isShowAppBar: true, + isPharmacy: true, + body: Container( + child: SingleChildScrollView( + child: Column( + children: [ + Container( + child: Row( + children: [ +// Container( +// padding:EdgeInsets.only(top:20.0, left:10.0, right:10.0, bottom:10.0,), +// child: LargeAvatar( +// name: "", +// url: "" ,), +// ), + Row( + children: [ + Column( + children: [ + Container( + padding:EdgeInsets.only(top:10.0, left:10.0, right:10.0, bottom:15.0,), + child: SvgPicture.asset( + 'assets/images/pharmacy/user.svg', + width: 60, + height: 60, + ), + ),] + ), + Column( + crossAxisAlignment: CrossAxisAlignment.center, children: [ Text( TranslationBase.of(context).welcome, - style: TextStyle(fontSize: 14.0, + style: TextStyle( + fontSize: 14.0, fontWeight: FontWeight.bold, - color:Colors.grey - ), + color: Colors.grey), ), - Text("Name", -// model.order[0].customer.firstName.toString(), + Text( + user.firstName.toString()+ " " + user.lastName.toString(), style: TextStyle( - fontSize: 16.0, - fontWeight: FontWeight.bold - ), + fontSize: 14.0, fontWeight: FontWeight.bold), ), ], ), - ) - ], - ), - ), - Divider( - color: Colors.grey[350], - height: 20, - thickness: 5, - indent: 0, - endIndent: 0, - ), - SizedBox( - height: 15, + ], + ) + ], ), - Container( - child:Row( - children: [ - Expanded( - child: InkWell( - onTap: () { - Navigator.push(context, - MaterialPageRoute(builder: (context) => OrderPage())); - }, - child: Column( - children: [ - SvgPicture.asset( - 'assets/images/pharmacy/orders_icon.svg', - width: 50, - height: 50,), - SizedBox( - height: 5, - ), - Text( - TranslationBase.of(context).orders, - style: TextStyle(fontSize: 13.0, - fontWeight: FontWeight.bold,), - ), - ], - ), + ), + Divider( + color: Colors.grey[350], + height: 20, + thickness: 5, + indent: 0, + endIndent: 0, + ), + SizedBox( + height: 15, + ), + Container( + child: Row( + children: [ + Expanded( + child: InkWell( + onTap: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => OrderPage(customerID: customerId))); + }, + child: Column( + children: [ +// Image(image: AssetImage('assets/images/pharmacy/orders_icon.svg')), + SvgPicture.asset( + 'assets/images/pharmacy/orders_icon.svg', + width: 50, + height: 50, ), - ), - Expanded( - child: InkWell( - child: Column( - children: [ - SvgPicture.asset( - 'assets/images/pharmacy/lakum_icon.svg', - width: 50, - height: 50,), - SizedBox( - height: 5, - ), - Text( - TranslationBase.of(context).lakum, - style: TextStyle(fontSize: 13.0, - fontWeight: FontWeight.bold - ), - ), - ], - ), - ), - ), - Expanded( - child: InkWell( - onTap: () { - Navigator.push(context, - MaterialPageRoute(builder: (context) => WishlistPage())); - }, - child: Column( - children: [ - SvgPicture.asset( - 'assets/images/pharmacy/wishlist_icon.svg', - width: 50, - height: 50,), - SizedBox( - height: 5, - ), - Text( - TranslationBase.of(context).wishlist, - style: TextStyle(fontSize: 13.0, - fontWeight: FontWeight.bold,), - ), - ], - ), + SizedBox( + height: 5, ), - ), - Expanded( - child: InkWell( - child: Column( - children: [ - SvgPicture.asset( - 'assets/images/pharmacy/review_icon.svg', - width: 50, - height: 50,), - SizedBox( - height: 5, - ), - Text( - TranslationBase.of(context).reviews, - style: TextStyle(fontSize: 13.0, - fontWeight: FontWeight.bold,), - ), - ], + Text( + TranslationBase.of(context).orders, + style: TextStyle( + fontSize: 13.0, + fontWeight: FontWeight.bold, ), ), - ), - ], - ) - ), - SizedBox( - height: 15, - ), - Divider( - color: Colors.grey[350], - height: 20, - thickness: 5, - indent: 0, - endIndent: 0, - ), - SizedBox( - height: 10, - ), - Container( - padding: EdgeInsets.only(left: 10.0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - TranslationBase.of(context).myAccount, - style: TextStyle( - fontSize: 16.0, - fontWeight: FontWeight.bold - ), - ), - SizedBox( - height: 10, + ], ), - Divider( - color: Colors.grey, - height: 20, - ), - InkWell( - onTap: () { - Navigator.push(context, - MaterialPageRoute(builder: (context) => HomePrescriptionsPage())); + ), + ), + Expanded( + child: InkWell( + onTap: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => LakumMainPage())); }, - child: Row( - children: [ - SvgPicture.asset( - 'assets/images/pharmacy/my_prescription_icon.svg', - width: 28, - height: 28,), - SizedBox( - width: 15, - ), - Text(TranslationBase.of(context).myPrescription, - style: TextStyle(fontSize: 13.0, - ), - ), - ], - ), - ), - SizedBox( - height: 5, - ), - Divider( - color: Colors.grey, - height: 20, + child: Column( + children: [ + SvgPicture.asset( + 'assets/images/pharmacy/lakum_icon.svg', + width: 50, + height: 50, + ), + SizedBox( + height: 5, + ), + Text( + TranslationBase.of(context).lakum, + style: TextStyle( + fontSize: 13.0, fontWeight: FontWeight.bold), + ), + ], ), - InkWell( - onTap: () { - Navigator.push(context, - MaterialPageRoute(builder: (context) => MyFamily())); - }, - child: Row( - children: [ - SvgPicture.asset( - 'assets/images/pharmacy/compare.png', - width: 28, - height: 28,), - SizedBox( - width: 15, - ), - Text(TranslationBase.of(context).compare, - style: TextStyle(fontSize: 13.0, - ), + ), + ), + Expanded( + child: InkWell( + onTap: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => WishlistPage())); + }, + child: Column( + children: [ + SvgPicture.asset( + 'assets/images/pharmacy/wishlist_icon.svg', + width: 50, + height: 50, + ), + SizedBox( + height: 5, + ), + Text( + TranslationBase.of(context).wishlist, + style: TextStyle( + fontSize: 13.0, + fontWeight: FontWeight.bold, ), - ], - ), - ), - SizedBox( - height: 5, - ), - Divider( - color: Colors.grey, - height: 20, + ), + ], ), - InkWell( - onTap: () { - Navigator.push(context, - MaterialPageRoute(builder: (context) => HomePrescriptionsPage())); - }, - child: Row( - children: [ - SvgPicture.asset( - 'assets/images/pharmacy/medication_refill_icon.svg', - width: 30, - height: 30,), - SizedBox( - width: 20, - ), - Text(TranslationBase.of(context).medicationsRefill, - style: TextStyle(fontSize: 13.0, - ), + ), + ), + Expanded( + child: InkWell( + child: Column( + children: [ + SvgPicture.asset( + 'assets/images/pharmacy/review_icon.svg', + width: 50, + height: 50, + ), + SizedBox( + height: 5, + ), + Text( + TranslationBase.of(context).reviews, + style: TextStyle( + fontSize: 13.0, + fontWeight: FontWeight.bold, ), - ], - ), - ), - SizedBox( - height: 5, - ), - Divider( - color: Colors.grey, - height: 20, + ), + ], ), - InkWell( - onTap: () { - Navigator.push(context, - MaterialPageRoute(builder: (context) => MyFamily())); - }, - child: Row( - children: [ - SvgPicture.asset( - 'assets/images/pharmacy/my_family_icon.svg', - width: 20, - height: 20,), - SizedBox( - width: 20, - ), - Text(TranslationBase.of(context).family, - style: TextStyle(fontSize: 13.0, - ), + ), + ), + ], + )), + SizedBox( + height: 15, + ), + Divider( + color: Colors.grey[350], + height: 20, + thickness: 5, + indent: 0, + endIndent: 0, + ), + SizedBox( + height: 10, + ), + Container( + padding: EdgeInsets.only(left: 10.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + TranslationBase.of(context).myAccount, + style: TextStyle( + fontSize: 16.0, fontWeight: FontWeight.bold), + ), + SizedBox( + height: 10, + ), + Divider( + color: Colors.grey, + height: 20, + ), + InkWell( + onTap: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => HomePrescriptionsPage())); + }, + child: Row( + children: [ + SvgPicture.asset( + 'assets/images/pharmacy/my_prescription_icon.svg', + width: 28, + height: 28, + ), + SizedBox( + width: 15, + ), + Text( + TranslationBase.of(context).myPrescription, + style: TextStyle( + fontSize: 13.0, ), - ], - ), + ), + ], ), - SizedBox( - height: 5, + ), + SizedBox( + height: 5, + ), + Divider( + color: Colors.grey, + height: 20, + ), + InkWell( + onTap: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => MyFamily())); + }, + child: Row( + children: [ + Image.asset('assets/images/pharmacy/compare.png', + width: 35, height: 35), + SizedBox( + width: 15, + ), + Text( + TranslationBase.of(context).compare, + style: TextStyle( + fontSize: 13.0, + ), + ), + ], ), - Divider( - color: Colors.grey, - height: 20, + ), + SizedBox( + height: 5, + ), + Divider( + color: Colors.grey, + height: 20, + ), + InkWell( + onTap: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => HomePrescriptionsPage())); + }, + child: Row( + children: [ + SvgPicture.asset( + 'assets/images/pharmacy/medication_refill_icon.svg', + width: 30, + height: 30, + ), + SizedBox( + width: 20, + ), + Text( + TranslationBase.of(context).medicationsRefill, + style: TextStyle( + fontSize: 13.0, + ), + ), + ], ), - InkWell( - onTap: () { - Navigator.push(context, - MaterialPageRoute(builder: (context) => PharmacyAddressesPage())); - }, - child: Row( - children: [ - SvgPicture.asset( - 'assets/images/pharmacy/shipping_addresses_icon.svg', - width: 30, - height: 30,), - SizedBox( - width: 20, + ), + SizedBox( + height: 5, + ), + Divider( + color: Colors.grey, + height: 20, + ), + InkWell( + onTap: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => MyFamily())); + }, + child: Row( + children: [ + SvgPicture.asset( + 'assets/images/pharmacy/my_family_icon.svg', + width: 20, + height: 20, + ), + SizedBox( + width: 20, + ), + Text( + TranslationBase.of(context).family, + style: TextStyle( + fontSize: 13.0, ), - Text(TranslationBase.of(context).shippingAddresses, - style: TextStyle(fontSize: 13.0, - ), + ), + ], + ), + ), + SizedBox( + height: 5, + ), + Divider( + color: Colors.grey, + height: 20, + ), + InkWell( + onTap: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => PharmacyAddressesPage())); + }, + child: Row( + children: [ + SvgPicture.asset( + 'assets/images/pharmacy/shipping_addresses_icon.svg', + width: 30, + height: 30, + ), + SizedBox( + width: 20, + ), + Text( + TranslationBase.of(context).shippingAddresses, + style: TextStyle( + fontSize: 13.0, ), - ], - ), + ), + ], ), - ], - ), - ), - SizedBox( - height: 10, - ), - Divider( - color: Colors.grey[350], - height: 20, - thickness: 5, - indent: 0, - endIndent: 0, - ), - SizedBox( - height: 10, + ), + ], ), - Container( - padding: EdgeInsets.only(left: 10.0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - TranslationBase.of(context).reachUs, - style: TextStyle( - fontSize: 16.0, - fontWeight: FontWeight.bold - ), - ), - SizedBox( - height: 5, - ), - Divider( - color: Colors.grey, - height: 20, - ), - InkWell( - onTap: () { - Navigator.push(context, - MaterialPageRoute(builder: (context) => LiveChatPage())); - }, - child: Row( - children: [ - SvgPicture.asset( - 'assets/images/pharmacy/contact_us_icon.svg', - width: 20, - height: 20,), - SizedBox( - width: 20, - ), - Text( - TranslationBase.of(context).contactUs, - style: TextStyle(fontSize: 13.0), - ), - ], - ), - ), - SizedBox( - height: 5, + ), + SizedBox( + height: 10, + ), + Divider( + color: Colors.grey[350], + height: 20, + thickness: 5, + indent: 0, + endIndent: 0, + ), + SizedBox( + height: 10, + ), + Container( + padding: EdgeInsets.only(left: 10.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + TranslationBase.of(context).reachUs, + style: TextStyle( + fontSize: 16.0, fontWeight: FontWeight.bold), + ), + SizedBox( + height: 5, + ), + Divider( + color: Colors.grey, + height: 20, + ), + InkWell( + onTap: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => LiveChatPage())); + }, + child: Row( + children: [ + SvgPicture.asset( + 'assets/images/pharmacy/contact_us_icon.svg', + width: 20, + height: 20, + ), + SizedBox( + width: 20, + ), + Text( + TranslationBase.of(context).contactUs, + style: TextStyle(fontSize: 13.0), + ), + ], ), - Divider( - color: Colors.grey, - height: 20, + ), + SizedBox( + height: 5, + ), + Divider( + color: Colors.grey, + height: 20, + ), + InkWell( + onTap: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => FindUsPage())); + }, + child: Row( + children: [ + SvgPicture.asset( + 'assets/images/pharmacy/our_locations_icon.svg', + width: 30, + height: 30, + ), + SizedBox( + width: 20, + ), + Text( + TranslationBase.of(context).ourLocations, + style: TextStyle(fontSize: 13.0), + ), + ], ), - InkWell( - onTap: () { - Navigator.push(context, - MaterialPageRoute(builder: (context) => FindUsPage())); - }, - child: Row( - children: [ - SvgPicture.asset( - 'assets/images/pharmacy/our_locations_icon.svg', - width: 30, - height: 30,), - SizedBox( - width: 20, - ), - Text( - TranslationBase.of(context).ourLocations, - style: TextStyle(fontSize: 13.0), - ), - ], - ), - ) - ], - ), - ) - ], - ), + ) + ], + ), + ) + ], ), ), ), ); - }} - - - - + } +// getUser() async { +// var userData = await sharedPref.getObject(USER_PROFILE); +// if (userData != null) user = AuthenticatedUser.fromJson(userData); +// } +} diff --git a/lib/services/pharmacy_services/cancelOrder_service.dart b/lib/services/pharmacy_services/cancelOrder_service.dart index de80a473..f848c2ff 100644 --- a/lib/services/pharmacy_services/cancelOrder_service.dart +++ b/lib/services/pharmacy_services/cancelOrder_service.dart @@ -16,24 +16,29 @@ class CancelOrderService extends BaseService{ AuthenticatedUser authUser = new AuthenticatedUser(); AuthProvider authProvider = new AuthProvider(); - List get orderDetails => orderDetails; - List _orderList = List(); - List get orderList => _orderList; + List _cancelOrderList = List(); + List get cancelOrderList => _cancelOrderList; String url =""; - Future cancelOrderDetail(order) async { + Future getCanceledOrder(order) async { print("step 1"); hasError = false; + + dynamic res; + await baseAppClient.getPharmacy(GET_Cancel_ORDER+order, onSuccess: (dynamic response, int statusCode) { - _orderList.clear(); - response['orders'].forEach((item) { - _orderList.add(OrderModel.fromJson(item)); - }); + res = response; + print(res); +// _cancelOrderList.clear(); +// response['success'].forEach((item) { +// _cancelOrderList.add(OrderModel.fromJson(item)); +// }); }, onFailure: (String error, int statusCode) { hasError = true; super.error = error; }); + return res; } } \ No newline at end of file diff --git a/lib/services/pharmacy_services/orderDetails_service.dart b/lib/services/pharmacy_services/orderDetails_service.dart index fb58097f..5adbbc24 100644 --- a/lib/services/pharmacy_services/orderDetails_service.dart +++ b/lib/services/pharmacy_services/orderDetails_service.dart @@ -23,7 +23,7 @@ class OrderDetailsService extends BaseService{ Future getOrderDetails(orderId) async { - print("step 1"); + print("step 2" + orderId); hasError = false; await baseAppClient.getPharmacy(GET_ORDER_DETAILS+orderId, onSuccess: (dynamic response, int statusCode) { diff --git a/lib/services/pharmacy_services/order_service.dart b/lib/services/pharmacy_services/order_service.dart index 70523da1..e426b801 100644 --- a/lib/services/pharmacy_services/order_service.dart +++ b/lib/services/pharmacy_services/order_service.dart @@ -18,12 +18,12 @@ class OrderService extends BaseService{ List get orderList => _orderList; String url =""; - Future getOrder(custmerId, page_id) async { - print("step 1"); + Future getOrder(customerId, pageId) async { hasError = false; - url =GET_ORDER+"customer=1,fields=id,order_total,order_status,order_statusn,order_status_id,created_on_utc&page=1&limit=200&customer_id=1367368"; -// url =GET_ORDER+"customer=1,fields=id,order_total,order_status,order_statusn,order_status_id,created_on_utc&page=$page_id&limit=200&customer_id=$custmerId"; + // url =GET_ORDER+"customer=1,fields=id,order_total,order_status,order_statusn,order_status_id,created_on_utc&page=1&limit=200&customer_id=1367368"; + url =GET_ORDER+"customer=1,fields=id,order_total,order_status,order_statusn,order_status_id,created_on_utc&page=$pageId&limit=200&customer_id=$customerId"; print(url); + await baseAppClient.getPharmacy(url, onSuccess: (dynamic response, int statusCode) { _orderList.clear(); diff --git a/lib/services/pharmacy_services/writeReview_service.dart b/lib/services/pharmacy_services/writeReview_service.dart new file mode 100644 index 00000000..573095eb --- /dev/null +++ b/lib/services/pharmacy_services/writeReview_service.dart @@ -0,0 +1,40 @@ + +import 'package:diplomaticquarterapp/config/config.dart'; +import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacies/order_model.dart'; +import 'package:diplomaticquarterapp/core/service/base_service.dart'; +import 'package:diplomaticquarterapp/models/Authentication/authenticated_user.dart'; +import 'package:diplomaticquarterapp/services/authentication/auth_provider.dart'; +import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; +import 'package:flutter/material.dart'; + + +class writeReviewService extends BaseService{ + + + + AppSharedPreferences sharedPref = AppSharedPreferences(); + AppGlobal appGlobal = new AppGlobal(); + + AuthenticatedUser authUser = new AuthenticatedUser(); + AuthProvider authProvider = new AuthProvider(); + + List get writeReview => writeReview; + List _writeReviewList = List(); + List get orderList => _writeReviewList; + + + Future getProductReview() async { + hasError = false; + await baseAppClient.getPharmacy(WRITE_REVIEW, + onSuccess: (dynamic response, int statusCode) { + _writeReviewList.clear(); + response[''].forEach((item) { + _writeReviewList.add(OrderModel.fromJson(item)); + }); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }); + } +} \ No newline at end of file diff --git a/lib/uitl/translations_delegate_base.dart b/lib/uitl/translations_delegate_base.dart index 7be0a051..d10cb542 100644 --- a/lib/uitl/translations_delegate_base.dart +++ b/lib/uitl/translations_delegate_base.dart @@ -773,6 +773,7 @@ class TranslationBase { String get compare => localizedValues['compare'][locale.languageCode]; String get medicationsRefill => localizedValues['medicationsRefill'][locale.languageCode]; String get myPrescription => localizedValues['myPrescription'][locale.languageCode]; + String get quantity => localizedValues['quantity'][locale.languageCode]; // pharmacy module diff --git a/lib/widgets/pharmacy/product_tile.dart b/lib/widgets/pharmacy/product_tile.dart index f16ff7e5..b56fc625 100644 --- a/lib/widgets/pharmacy/product_tile.dart +++ b/lib/widgets/pharmacy/product_tile.dart @@ -17,11 +17,14 @@ class productTile extends StatelessWidget { final String qyt; final String totalPrice; final bool isOrderDetails; + final String img; + final int status; productTile({this.productName, this.productPrice, this.productRate, - this.qyt, this.totalPrice, this.productReviews, - this.isOrderDetails=true}); + this.qyt, this.totalPrice, this.productReviews, this.img, + this.isOrderDetails=true, this.status}); + @override Widget build(BuildContext context) { @@ -37,13 +40,10 @@ class productTile extends StatelessWidget { children: [ Container( margin: EdgeInsets.only(left: 10), - child: Image( - image: - AssetImage('assets/images/al-habib_onlne_pharmacy_bg.png'), - fit: BoxFit.cover, - width: 80, - height: 80, - ), + child: Image.network(img), +// fit: BoxFit.cover, + width: 80, + height: 80, ), Expanded( flex: 5, @@ -119,7 +119,7 @@ class productTile extends StatelessWidget { margin: EdgeInsets.only(bottom: 5.0), child: RichText( text: TextSpan( - text: 'QYT: $qyt', + text: TranslationBase.of(context).quantity+"" +'$qyt', style: TextStyle( fontWeight: FontWeight.bold, color: Colors.grey, @@ -163,8 +163,8 @@ class productTile extends StatelessWidget { ), ): Container(), // this.isOrderDetails == true && model.order[0].orderStatusId == 30? - this.isOrderDetails == true? - Expanded( + + if(status ==30 && this.isOrderDetails == true ) Expanded( child: Row( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ @@ -227,7 +227,7 @@ class productTile extends StatelessWidget { ), ], ), - ) : Container(), + ), ], ), ); From 359eba2da01cacfac40d478248c6d09da8ff9dd0 Mon Sep 17 00:00:00 2001 From: mosazaid Date: Wed, 16 Dec 2020 18:10:38 +0200 Subject: [PATCH 10/18] make some updates in firebase version and update gradle, finish review order --- android/app/build.gradle | 12 +- android/build.gradle | 2 +- .../gradle/wrapper/gradle-wrapper.properties | 2 +- lib/config/config.dart | 1 + .../order_model_view_model.dart | 34 +- lib/pages/pharmacy/order/OrderDetails.dart | 605 ++++++++++-------- lib/pages/pharmacy/order/ProductReview.dart | 373 ++++++----- .../orderDetails_service.dart | 36 ++ lib/widgets/pharmacy/product_tile.dart | 11 +- pubspec.yaml | 2 +- 10 files changed, 593 insertions(+), 485 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 54ea9373..abcdcf6f 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -72,9 +72,17 @@ flutter { dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" - implementation "com.google.firebase:firebase-messaging:20.3.0" + /* implementation ("com.google.firebase:firebase-messaging:21.0.0", { + // protobuf-lite that firebase-config and Tink depends on. + exclude group: 'com.google.protobuf',module: 'protobuf-javalite' +// exclude group: 'com.google.protobuf',module: 'protobuf-lite' + }) + implementation ('com.google.firebase:firebase-inappmessaging-display:19.1.2',{ + // protobuf-lite that firebase-config and Tink depends on. + exclude group: 'com.google.protobuf',module: 'protobuf-javalite' +// exclude group: 'com.google.protobuf',module: 'protobuf-lite' + })*/ implementation 'pub.devrel:easypermissions:0.4.0' - implementation 'com.google.firebase:firebase-inappmessaging-display:17.2.0' implementation 'com.google.guava:guava:27.0.1-android' // Dependency on local binaries implementation fileTree(dir: 'libs', include: ['*.jar']) diff --git a/android/build.gradle b/android/build.gradle index 8e56476b..433bc8ad 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -8,7 +8,7 @@ buildscript { dependencies { classpath 'com.android.tools.build:gradle:4.0.1' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - classpath 'com.google.gms:google-services:4.3.2' + classpath 'com.google.gms:google-services:4.3.4' } } diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties index 5660070d..c935be88 100644 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.7.1-all.zip diff --git a/lib/config/config.dart b/lib/config/config.dart index d3fda732..3269962b 100644 --- a/lib/config/config.dart +++ b/lib/config/config.dart @@ -410,6 +410,7 @@ const GET_PATIENT_ALL_PRES_ORD = 'Services/Patients.svc/REST/PatientER_GetPatientAllPresOrders'; const PATIENT_ER_INSERT_PRES_ORDER = 'Services/Patients.svc/REST/PatientER_InsertPresOrder'; +const PHARMACY_MAKE_REVIEW = 'epharmacy/api/insertreviews'; // External API const ADD_ADDRESS_INFO = diff --git a/lib/core/viewModels/pharmacyModule/order_model_view_model.dart b/lib/core/viewModels/pharmacyModule/order_model_view_model.dart index f3262ba3..301adea1 100644 --- a/lib/core/viewModels/pharmacyModule/order_model_view_model.dart +++ b/lib/core/viewModels/pharmacyModule/order_model_view_model.dart @@ -1,4 +1,3 @@ - import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; import 'package:diplomaticquarterapp/pages/pharmacy/order/Order.dart'; import 'package:diplomaticquarterapp/pages/pharmacy/order/OrderDetails.dart'; @@ -12,21 +11,20 @@ import '../../../locator.dart'; import '../base_view_model.dart'; class OrderModelViewModel extends BaseViewModel { - OrderService _orderService = locator(); + List get order => _orderService.orderList; OrderDetailsService _orderDetailsService = locator(); + List get orderDetails => _orderDetailsService.orderDetails; CancelOrderService _cancelOrderService = locator(); - List get cancelOrder => _cancelOrderService.cancelOrderList; - - + List get cancelOrder => _cancelOrderService.cancelOrderList; Future getOrder(customerId, pageID) async { - print("this is customer id"+ customerId); + print("this is customer id" + customerId); setState(ViewState.Busy); await _orderService.getOrder(customerId, pageID); if (_orderService.hasError) { @@ -36,7 +34,6 @@ class OrderModelViewModel extends BaseViewModel { //order = _orderService.orderList; setState(ViewState.Idle); } - } Future getOrderDetails(orderId) async { @@ -52,7 +49,7 @@ class OrderModelViewModel extends BaseViewModel { Future getProductReview() async { setState(ViewState.Busy); - await _orderService.getProductReview(); + // await _orderService.getProductReview(); if (_orderService.hasError) { error = _orderService.error; setState(ViewState.Error); @@ -63,7 +60,7 @@ class OrderModelViewModel extends BaseViewModel { } Future getCanceledOrder(order, context) async { - print("this is order id"+ order); + print("this is order id" + order); setState(ViewState.Busy); dynamic res; await _cancelOrderService.getCanceledOrder(order).then((value) { @@ -71,14 +68,13 @@ class OrderModelViewModel extends BaseViewModel { print(value['success']['SuccessEndUserMsg']); AppToast.showSuccessToast(message: "Request Sent Successfully"); // Navigator.pop(context); - }); if (_cancelOrderService.hasError) { error = _cancelOrderService.error; setState(ViewState.Error); AppToast.showErrorToast(message: error); } else { - setState(ViewState.Idle); + setState(ViewState.Idle); // AppToast.showSuccessToast(message: "Request Sent Successfully"); // Navigator.push(context, // MaterialPageRoute(builder: (context) => OrderPage())); @@ -86,7 +82,19 @@ class OrderModelViewModel extends BaseViewModel { } return res; - } -} \ No newline at end of file + Future makeReview(Product product, double rating, String reviewText) async { + setState(ViewState.Busy); + await _orderDetailsService.makeReview(product, rating, reviewText); + if (_orderDetailsService.hasError) { + error = _orderDetailsService.error; + setState(ViewState.Error); + AppToast.showErrorToast(message: error); + } else { + setState(ViewState.Idle); + AppToast.showSuccessToast( + message: "Your review has been Submitted successfully"); + } + } +} diff --git a/lib/pages/pharmacy/order/OrderDetails.dart b/lib/pages/pharmacy/order/OrderDetails.dart index 57cddeca..1be292c2 100644 --- a/lib/pages/pharmacy/order/OrderDetails.dart +++ b/lib/pages/pharmacy/order/OrderDetails.dart @@ -1,51 +1,41 @@ - import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/order_model_view_model.dart'; import 'package:diplomaticquarterapp/pages/base/base_view.dart'; import 'package:diplomaticquarterapp/pages/pharmacy/order/Order.dart'; import 'package:diplomaticquarterapp/widgets/dialogs/confirm_dialog.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; -import 'package:flutter/material.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; -import 'package:diplomaticquarterapp/widgets/in_app_browser/InAppBrowser.dart'; +import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:diplomaticquarterapp/widgets//pharmacy/product_tile.dart'; -import 'package:diplomaticquarterapp/config/config.dart'; import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; -import 'package:diplomaticquarterapp/services/pharmacy_services/orderDetails_service.dart'; import 'package:diplomaticquarterapp/core/model/pharmacies/order_model.dart'; import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; -import 'package:diplomaticquarterapp/widgets/dialogs/confirm_dialog.dart'; -import 'package:diplomaticquarterapp/uitl/app_toast.dart'; - - - - +import 'package:flutter/src/widgets/image.dart' as flutterImage; class OrderDetailsPage extends StatefulWidget { - - var languageID ; + var languageID; OrderModel orderModel; - OrderDetailsPage({ - @required this.orderModel -}); + + OrderDetailsPage({@required this.orderModel}); @override _OrderDetailsPageState createState() => _OrderDetailsPageState(); } class _OrderDetailsPageState extends State { - getLanguageID() async { return await sharedPref.getStringWithDefaultValue(APP_LANGUAGE, 'ar'); } AppSharedPreferences sharedPref = AppSharedPreferences(); - String orderId=""; + String orderId = ""; String customerId; - List orderList = [] ; - List cancelledOrderList = []; + List orderList = []; + + List cancelledOrderList = []; + // String orderId="3516"; var model; var isCancel = false; @@ -53,11 +43,10 @@ class _OrderDetailsPageState extends State { var dataIsCancel; var dataIsRefund; - @override void initState() { super.initState(); - print(widget.orderModel.orderItems.length); + print(widget.orderModel.orderItems.length); getLanguageID(); getCancelOrder(widget.orderModel.id); // cancelOrderDetail(order) @@ -66,115 +55,139 @@ class _OrderDetailsPageState extends State { @override Widget build(BuildContext context) { return BaseView( - onModelReady:(model) => model.getOrderDetails(widget.orderModel.id), - builder: (_,model, wi )=> AppScaffold( + onModelReady: (model) => model.getOrderDetails(widget.orderModel.id), + builder: (_, model, wi) => AppScaffold( appBarTitle: TranslationBase.of(context).orderDetail, isShowAppBar: true, - isPharmacy:true , + isPharmacy: true, body: Container( color: Colors.white, child: SingleChildScrollView( child: Column( - children: [ + children: [ Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Container( - margin: EdgeInsets.fromLTRB(10.0, 15.0, 1.0, 5.0), - child: Row( - children: [ - SvgPicture.asset( - 'assets/images/pharmacy/shipping_mark_icon.svg', - width: 28, - height: 28,), - Text(TranslationBase.of(context).shippingAddress, - style: TextStyle(fontSize: 13.0, fontWeight: FontWeight.bold, - ), - ), - ], - ), - ), - Container( - - margin: EdgeInsets.only(top: 15.0, right: 10.0), - padding: EdgeInsets.only(left: 11.0, right: 11.0), - decoration: BoxDecoration( - border: Border.all( - color: getStatusBackgroundColor(), - style: BorderStyle.solid, - width: 5.0, + children: [ + Container( + margin: EdgeInsets.fromLTRB(10.0, 15.0, 1.0, 5.0), + child: Row( + children: [ + SvgPicture.asset( + 'assets/images/pharmacy/shipping_mark_icon.svg', + width: 28, + height: 28, + ), + Text( + TranslationBase.of(context).shippingAddress, + style: TextStyle( + fontSize: 13.0, + fontWeight: FontWeight.bold, ), + ), + ], + ), + ), + Container( + margin: EdgeInsets.only(top: 15.0, right: 10.0), + padding: EdgeInsets.only(left: 11.0, right: 11.0), + decoration: BoxDecoration( + border: Border.all( color: getStatusBackgroundColor(), - borderRadius: BorderRadius.circular(30.0) - ), - child: Text( + style: BorderStyle.solid, + width: 5.0, + ), + color: getStatusBackgroundColor(), + borderRadius: BorderRadius.circular(30.0)), + child: Text( // widget.orderModel.orderStatus.toString().substring(12), - widget.languageID == "ar" - ? widget.orderModel.orderStatusn.toString() - : widget.orderModel.orderStatus.toString().substring(12) , + widget.languageID == "ar" + ? widget.orderModel.orderStatusn.toString() + : widget.orderModel.orderStatus + .toString() + .substring(12), // TranslationBase.of(context).delivered, - style: TextStyle( - color: Colors.white, - fontSize: 13.0, - fontWeight: FontWeight.bold, - ), + style: TextStyle( + color: Colors.white, + fontSize: 13.0, + fontWeight: FontWeight.bold, ), ), + ), ], ), Container( margin: EdgeInsets.only(left: 10.0, top: 13.0), child: Row( crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text(widget.orderModel.shippingAddress.firstName.toString().substring(10) + ' ' +model.order[0].shippingAddress.lastName.toString().substring(9), - style: TextStyle(fontSize: 15.0, fontWeight: FontWeight.bold, - ), - ), - ] - ), + children: [ + Text( + widget.orderModel.shippingAddress.firstName + .toString() + .substring(10) + + ' ' + + model.order[0].shippingAddress.lastName + .toString() + .substring(9), + style: TextStyle( + fontSize: 15.0, + fontWeight: FontWeight.bold, + ), + ), + ]), ), Container( margin: EdgeInsets.fromLTRB(11.0, 5.0, 1.0, 5.0), - child: Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text(widget.orderModel.shippingAddress.address1.toString().substring(9), - style: TextStyle(fontSize: 11.0, fontWeight: FontWeight.bold, - color: Colors.grey, - ), - ), - ], + child: Text( + widget.orderModel.shippingAddress.address1 + .toString() + .substring(9), + style: TextStyle( + fontSize: 11.0, + fontWeight: FontWeight.bold, + color: Colors.grey, + ), ), ), Container( margin: EdgeInsets.fromLTRB(10.0, 5.0, 1.0, 5.0), child: Row( crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text(widget.orderModel.shippingAddress.address2.toString().substring(9) - + ' ' + widget.orderModel.shippingAddress.country.toString() - + ' ' + widget.orderModel.shippingAddress.zipPostalCode.toString(), - style: TextStyle(fontSize: 10.0, fontWeight: FontWeight.bold, - color: Colors.grey, - ), - ), - ] - ), + children: [ + Text( + widget.orderModel.shippingAddress.address2 + .toString() + .substring(9) + + ' ' + + widget.orderModel.shippingAddress.country + .toString() + + ' ' + + widget.orderModel.shippingAddress.zipPostalCode + .toString(), + style: TextStyle( + fontSize: 10.0, + fontWeight: FontWeight.bold, + color: Colors.grey, + ), + ), + ]), ), Container( child: Row( - children: [ + children: [ Container( margin: EdgeInsets.fromLTRB(10.0, 5.0, 8.0, 5.0), child: SvgPicture.asset( 'assets/images/pharmacy/mobile_number_icon.svg', - height: 13,), + height: 13, + ), ), Container( margin: EdgeInsets.only(top: 5.0, bottom: 5.0), - child: Text(widget.orderModel.shippingAddress.phoneNumber.toString(), - style: TextStyle(fontSize: 15.0, + child: Text( + widget.orderModel.shippingAddress.phoneNumber + .toString(), + style: TextStyle( + fontSize: 15.0, ), ), ), @@ -189,38 +202,56 @@ class _OrderDetailsPageState extends State { endIndent: 0, ), Row( - children: [ + children: [ Container( margin: EdgeInsets.fromLTRB(10.0, 10.0, 5.0, 10.0), child: SvgPicture.asset( 'assets/images/pharmacy/shipping_truck_icon.svg', height: 20, - width: 20,), + width: 20, + ), ), Container( margin: EdgeInsets.all(10.0), - child:Text(TranslationBase.of(context).shippedMethod, - style: TextStyle(fontSize: 13.0, fontWeight: FontWeight.bold, + child: Text( + TranslationBase.of(context).shippedMethod, + style: TextStyle( + fontSize: 13.0, + fontWeight: FontWeight.bold, ), ), ), Container( - child: widget.orderModel.shippingRateComputationMethodSystemName == "Shipping.FixedOrByWeight" - ? Container( - margin: EdgeInsets.only(bottom: 10.0, top: 10.0), - child: SvgPicture.asset( - 'assets/images/pharmacy/hmg_shipping_logo.svg', - height: 25, - width: 25,), - ) - : Container( - margin: EdgeInsets.only(bottom: 10.0, top: 10.0), - child: SvgPicture.asset( - 'assets/images/pharmacy/aramex_shipping_logo.svg', - height: 25, - width: 25,), + child: flutterImage.Image.asset( + widget.orderModel + .shippingRateComputationMethodSystemName == + "Shipping.FixedOrByWeight" + ? "assets/images/pharmacy_module/payment/hmg_shipping_logo.png" + : "assets/images/pharmacy_module/payment/aramex_shipping_logo.png", + fit: BoxFit.contain, ), ), + Container( + child: widget.orderModel + .shippingRateComputationMethodSystemName == + "Shipping.FixedOrByWeight" + ? Container( + margin: EdgeInsets.only(bottom: 10.0, top: 10.0), + child: SvgPicture.asset( + 'assets/images/pharmacy_module/payment/hmg_shipping_logo.png', + height: 25, + width: 25, + ), + ) + : Container( + margin: EdgeInsets.only(bottom: 10.0, top: 10.0), + child: SvgPicture.asset( + 'assets/images/pharmacy_module/payment/aramex_shipping_logo.png', + height: 25, + width: 25, + ), + ), + ), ], ), Divider( @@ -231,25 +262,22 @@ class _OrderDetailsPageState extends State { endIndent: 0, ), Row( - children: [ - Container( - margin: EdgeInsets.fromLTRB(10.0, 10.0, 1.0, 10.0), - child: SvgPicture.asset( - 'assets/images/pharmacy/credit_card_icon.svg', - height: 20, - width: 20,), - ), + children: [ Container( margin: EdgeInsets.all(10.0), child: SvgPicture.asset( 'assets/images/pharmacy/credit_card_icon.svg', height: 20, - width: 20,), + width: 20, + ), ), Container( margin: EdgeInsets.only(bottom: 10.0, top: 10.0), - child:Text(widget.orderModel.paymentName.toString().substring(12), - style: TextStyle(fontSize: 13.0, fontWeight: FontWeight.bold, + child: Text( + widget.orderModel.paymentName.toString().substring(12), + style: TextStyle( + fontSize: 13.0, + fontWeight: FontWeight.bold, ), ), ), @@ -268,10 +296,13 @@ class _OrderDetailsPageState extends State { child: Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text(TranslationBase.of(context).orderDetail, - style: TextStyle(fontSize: 15.0, fontWeight: FontWeight.bold, - ), + Text( + TranslationBase.of(context).orderDetail, + style: TextStyle( + fontSize: 15.0, + fontWeight: FontWeight.bold, ), + ), ], ), ), @@ -279,21 +310,33 @@ class _OrderDetailsPageState extends State { scrollDirection: Axis.vertical, shrinkWrap: true, physics: ScrollPhysics(), - itemCount:widget.orderModel.orderItems.length, - itemBuilder: (context, index){ - return Container( - child: productTile(productName: widget.orderModel.orderItems[index].product.name.toString(), - productPrice: widget.orderModel.orderItems[index].product.price.toString(), - productRate: widget.orderModel.orderItems[index].product.approvedRatingSum.toDouble(), - productReviews:widget.orderModel.orderItems[index].product.approvedTotalReviews, - totalPrice: "${(widget.orderModel.orderItems[index].product.price - * widget.orderModel.orderItems[index].quantity).toStringAsFixed(2)}", - qyt: widget.orderModel.orderItems[index].quantity.toString(), - img:widget.orderModel.orderItems[index].product.images[0].src.toString(), - status: widget.orderModel.orderStatusId,), - ); - } - ), + itemCount: widget.orderModel.orderItems.length, + itemBuilder: (context, index) { + return Container( + child: productTile( + productName: widget + .orderModel.orderItems[index].product.name + .toString(), + productPrice: widget + .orderModel.orderItems[index].product.price + .toString(), + productRate: widget.orderModel.orderItems[index] + .product.approvedRatingSum + .toDouble(), + productReviews: widget.orderModel.orderItems[index] + .product.approvedTotalReviews, + totalPrice: + "${(widget.orderModel.orderItems[index].product.price * widget.orderModel.orderItems[index].quantity).toStringAsFixed(2)}", + qyt: widget.orderModel.orderItems[index].quantity + .toString(), + img: widget.orderModel.orderItems[index].product + .images[0].src + .toString(), + status: widget.orderModel.orderStatusId, + product: widget.orderModel.orderItems[index].product, + ), + ); + }), Container( padding: EdgeInsets.only(bottom: 10.0), @@ -301,19 +344,22 @@ class _OrderDetailsPageState extends State { child: Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text(TranslationBase.of(context).orderSummary, - style: TextStyle(fontSize: 15.0, fontWeight: FontWeight.bold, - ), + Text( + TranslationBase.of(context).orderSummary, + style: TextStyle( + fontSize: 15.0, + fontWeight: FontWeight.bold, ), + ), ], ), ), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ + children: [ Container( padding: EdgeInsets.only(bottom: 10.0), - margin: EdgeInsets.only(top: 5.0, left: 10.0 ), + margin: EdgeInsets.only(top: 5.0, left: 10.0), child: Text( TranslationBase.of(context).subtotal, style: TextStyle( @@ -328,13 +374,17 @@ class _OrderDetailsPageState extends State { children: [ Container( margin: EdgeInsets.only(right: 5.0), - child: Text(TranslationBase.of(context).sar, - style: TextStyle(fontSize: 13.0, + child: Text( + TranslationBase.of(context).sar, + style: TextStyle( + fontSize: 13.0, ), ), ), - Text(widget.orderModel.orderSubtotalExclTax.toString(), - style: TextStyle(fontSize: 13.0, + Text( + widget.orderModel.orderSubtotalExclTax.toString(), + style: TextStyle( + fontSize: 13.0, ), ), ], @@ -344,10 +394,10 @@ class _OrderDetailsPageState extends State { ), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ + children: [ Container( padding: EdgeInsets.only(bottom: 10.0), - margin: EdgeInsets.only(top: 5.0, left: 10.0 ), + margin: EdgeInsets.only(top: 5.0, left: 10.0), child: Text( TranslationBase.of(context).shipping, style: TextStyle( @@ -362,13 +412,17 @@ class _OrderDetailsPageState extends State { children: [ Container( margin: EdgeInsets.only(right: 5.0), - child: Text(TranslationBase.of(context).sar, - style: TextStyle(fontSize: 13.0, + child: Text( + TranslationBase.of(context).sar, + style: TextStyle( + fontSize: 13.0, ), ), ), - Text(widget.orderModel.orderShippingExclTax.toString(), - style: TextStyle(fontSize: 13.0, + Text( + widget.orderModel.orderShippingExclTax.toString(), + style: TextStyle( + fontSize: 13.0, ), ), ], @@ -378,10 +432,10 @@ class _OrderDetailsPageState extends State { ), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ + children: [ Container( padding: EdgeInsets.only(bottom: 10.0), - margin: EdgeInsets.only(top: 5.0,left: 10.0 ), + margin: EdgeInsets.only(top: 5.0, left: 10.0), child: Text( TranslationBase.of(context).vat, style: TextStyle( @@ -396,13 +450,17 @@ class _OrderDetailsPageState extends State { children: [ Container( margin: EdgeInsets.only(right: 5.0), - child: Text(TranslationBase.of(context).sar, - style: TextStyle(fontSize: 13.0, + child: Text( + TranslationBase.of(context).sar, + style: TextStyle( + fontSize: 13.0, ), ), ), - Text(model.order[0].orderTax.toString(), - style: TextStyle(fontSize: 13.0, + Text( + model.order[0].orderTax.toString(), + style: TextStyle( + fontSize: 13.0, ), ), ], @@ -412,13 +470,14 @@ class _OrderDetailsPageState extends State { ), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ + children: [ Container( - margin: EdgeInsets.only(top: 5.0,left: 10.0 ), + margin: EdgeInsets.only(top: 5.0, left: 10.0), child: Text( TranslationBase.of(context).total, style: TextStyle( - fontSize: 15.0,fontWeight: FontWeight.bold, + fontSize: 15.0, + fontWeight: FontWeight.bold, ), ), ), @@ -428,13 +487,19 @@ class _OrderDetailsPageState extends State { children: [ Container( margin: EdgeInsets.only(right: 5.0), - child: Text(TranslationBase.of(context).sar, - style: TextStyle(fontSize: 15.0,fontWeight: FontWeight.bold, + child: Text( + TranslationBase.of(context).sar, + style: TextStyle( + fontSize: 15.0, + fontWeight: FontWeight.bold, ), ), ), - Text(widget.orderModel.orderTotal.toString(), - style: TextStyle(fontSize: 15.0, fontWeight: FontWeight.bold, + Text( + widget.orderModel.orderTotal.toString(), + style: TextStyle( + fontSize: 15.0, + fontWeight: FontWeight.bold, ), ), ], @@ -442,60 +507,62 @@ class _OrderDetailsPageState extends State { ), ], ), - widget.orderModel.orderStatusId == 10 ? InkWell( - onTap: () { + widget.orderModel.orderStatusId == 10 + ? InkWell( + onTap: () { // Navigator.push(context, // MaterialPageRoute(builder: (context) => InAppBrowser())); - }, - child: Container( + }, + child: Container( // margin: EdgeInsets.only(top: 20.0), - height: 50.0, - color: Colors.transparent, - child: Container( - padding: EdgeInsets.only(left: 150.0, right: 150.0), - decoration: BoxDecoration( - border: Border.all( - color: Colors.green, - style: BorderStyle.solid, - width: 1.0 - ), - color: Colors.green, - borderRadius: BorderRadius.circular(5.0) - ), - child: Center( - child: Text( - TranslationBase.of(context).payOnline, - style: TextStyle( - color: Colors.white, - fontWeight: FontWeight.bold, + height: 50.0, + color: Colors.transparent, + child: Container( + padding: EdgeInsets.only(left: 150.0, right: 150.0), + decoration: BoxDecoration( + border: Border.all( + color: Colors.green, + style: BorderStyle.solid, + width: 1.0), + color: Colors.green, + borderRadius: BorderRadius.circular(5.0)), + child: Center( + child: Text( + TranslationBase.of(context).payOnline, + style: TextStyle( + color: Colors.white, + fontWeight: FontWeight.bold, + ), + ), + ), ), ), - ), - ), - ), - ) : Container(), + ) + : Container(), // getCancelOrder(canCancel, canRefund), - isCancel ? InkWell( - onTap: () { - presentConfirmDialog(model,widget.orderModel.id);//(widget.orderModel.id)); + isCancel + ? InkWell( + onTap: () { + presentConfirmDialog(model, + widget.orderModel.id); //(widget.orderModel.id)); // - }, - child: Container( + }, + child: Container( // padding: EdgeInsets.only(left: 13.0, right: 13.0, top: 5.0), - height: 50.0, - color: Colors.transparent, - child: Center( - child: Text( - TranslationBase.of(context).cancelOrder, - style: TextStyle( - color: Colors.red[900], - fontWeight: FontWeight.bold, - decoration: TextDecoration.underline + height: 50.0, + color: Colors.transparent, + child: Center( + child: Text( + TranslationBase.of(context).cancelOrder, + style: TextStyle( + color: Colors.red[900], + fontWeight: FontWeight.bold, + decoration: TextDecoration.underline), + ), + ), ), - ), - ), - ), - ) : Container(), + ) + : Container(), ], ), ), @@ -504,90 +571,80 @@ class _OrderDetailsPageState extends State { ); } - - Color getStatusBackgroundColor() { - print(widget.orderModel.orderStatusId); + print(widget.orderModel.orderStatusId); // if(orderStatus == 'delivered') - if(widget.orderModel.orderStatusId == 30 ||widget.orderModel.orderStatusId == 997 - ||widget.orderModel.orderStatusId == 994) + if (widget.orderModel.orderStatusId == 30 || + widget.orderModel.orderStatusId == 997 || + widget.orderModel.orderStatusId == 994) return Colors.blue[700]; - else if (widget.orderModel.orderStatusId == 20 ||widget.orderModel.orderStatusId == 995 - ||widget.orderModel.orderStatusId == 998 ||widget.orderModel.orderStatusId == 999) - return Colors.green; - else if (widget.orderModel.orderStatusId == 10) - return Colors.orange[300]; - else if (widget.orderModel.orderStatusId == 40 ||widget.orderModel.orderStatusId == 996 - ||widget.orderModel.orderStatusId == 200) - return Colors.red[900]; + else if (widget.orderModel.orderStatusId == 20 || + widget.orderModel.orderStatusId == 995 || + widget.orderModel.orderStatusId == 998 || + widget.orderModel.orderStatusId == 999) + return Colors.green; + else if (widget.orderModel.orderStatusId == 10) + return Colors.orange[300]; + else if (widget.orderModel.orderStatusId == 40 || + widget.orderModel.orderStatusId == 996 || + widget.orderModel.orderStatusId == 200) return Colors.red[900]; } - - getCancelOrder(dataIsCancel){ - if(widget.orderModel.canCancel && widget.orderModel.canRefund) - { - setState(() { - isCancel = true; - isRefund = false; - }); - } - else if (widget.orderModel.canCancel ){ - setState(() { - isCancel = true; - isRefund = false; - }); - - } - else if (widget.orderModel.canRefund){ - setState(() { - isCancel = false; - isRefund = true; - }); - } - else { - setState(() { - isCancel = false; - isRefund = false; - }); - } -} + getCancelOrder(dataIsCancel) { + if (widget.orderModel.canCancel && widget.orderModel.canRefund) { + setState(() { + isCancel = true; + isRefund = false; + }); + } else if (widget.orderModel.canCancel) { + setState(() { + isCancel = true; + isRefund = false; + }); + } else if (widget.orderModel.canRefund) { + setState(() { + isCancel = false; + isRefund = true; + }); + } else { + setState(() { + isCancel = false; + isRefund = false; + }); + } + } // .getCanceledOrder - presentConfirmDialog(cancelFunction, id){ + presentConfirmDialog(cancelFunction, id) { ConfirmDialog dialog = new ConfirmDialog( context: context, confirmMessage: TranslationBase.of(context).confirmCancellation, okText: TranslationBase.of(context).confirm, cancelText: TranslationBase.of(context).cancel_nocaps, - okFunction: () => cancelFunction.getCanceledOrder(id, context).then((value){ - print(":D"); - print(value); + okFunction: () => + cancelFunction.getCanceledOrder(id, context).then((value) { + print(":D"); + print(value); // Navigator.pop(context); - Navigator.push(context, - MaterialPageRoute(builder: (context) => - OrderPage(customerID: widget.orderModel.customerId.toString())), - );}), - - cancelFunction: () => {} - ); + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => OrderPage( + customerID: widget.orderModel.customerId.toString())), + ); + }), + cancelFunction: () => {}); dialog.showAlertDialog(context); } - getCanceledOrder(order){ + getCanceledOrder(order) { Navigator.pop(context); - if(widget.orderModel.canCancel && widget.orderModel.canRefund == false){ + if (widget.orderModel.canCancel && widget.orderModel.canRefund == false) { // getCanceledOrder(order); // AppToast.showSuccessToast(message: "Request Sent Successfully"); // Navigator.push(context, // MaterialPageRoute(builder: (context) => OrderPage())); } - } - - } - - - - diff --git a/lib/pages/pharmacy/order/ProductReview.dart b/lib/pages/pharmacy/order/ProductReview.dart index 37ede97c..4d09191c 100644 --- a/lib/pages/pharmacy/order/ProductReview.dart +++ b/lib/pages/pharmacy/order/ProductReview.dart @@ -1,4 +1,3 @@ - import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/order_model_view_model.dart'; import 'package:diplomaticquarterapp/pages/base/base_view.dart'; import 'package:diplomaticquarterapp/pages/pharmacy/profile/profile.dart'; @@ -8,145 +7,133 @@ import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:flutter/material.dart'; import 'package:diplomaticquarterapp/core/model/pharmacies/order_model.dart'; import 'package:flutter_svg/svg.dart'; +import 'package:intl/intl.dart'; import 'package:rating_bar/rating_bar.dart'; +import 'package:flutter/src/widgets/image.dart' as flutterImage; class ProductReviewPage extends StatefulWidget { + final Product product; + + ProductReviewPage(this.product); - OrderModel orderModel; - ProductReviewPage({ - @required this.orderModel - }); @override _ProductReviewPageState createState() => _ProductReviewPageState(); } class _ProductReviewPageState extends State { - String orderId ="3516"; - var pharmacyUser =""; - var product =""; - var CustomerId =""; - String submitTxt =""; - var doctorRating= ""; - var reviewObj = {}; - AppSharedPreferences sharedPref = AppSharedPreferences(); + double currentRating = 0; + String reviewText = ""; + TextEditingController _reviewController = new TextEditingController(); + bool finishReview = false; @override Widget build(BuildContext context) { + double ratingValue = double.parse("${widget.product.approvedRatingSum}"); return BaseView( - onModelReady: (model)=>model.getOrderDetails(widget.orderModel.id), - builder: (_,model, wi )=> AppScaffold( + builder: (_, model, wi) => AppScaffold( appBarTitle: TranslationBase.of(context).writeReview, isShowAppBar: true, - isPharmacy:true , + isPharmacy: true, body: Container( color: Colors.white, - child: SingleChildScrollView( + child: !finishReview ? SingleChildScrollView( child: Column( - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - ListView.builder( - scrollDirection: Axis.vertical, - shrinkWrap: true, - physics: ScrollPhysics(), - itemCount:widget.orderModel.orderItems.length, - itemBuilder: (context, index){ - return Container( - margin: EdgeInsets.only(top :15.0, bottom: 15.0), - child: Row( - children:[ - Column( - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - Container( - margin: EdgeInsets.only(left: 10), - child: SvgPicture.asset( -// widget.orderModel.orderItems[index].product.images[index].src.toString(), - 'assets/images/al-habib_onlne_pharmacy_bg.png', - fit: BoxFit.cover, - width: 80, - height: 80, - ), - ), - ] - ), - ], - ), - Column( - children: [ - Row( - children: [ - Text(widget.orderModel.orderItems[index].product.name.toString(), - style: TextStyle(fontSize: 16.0, - ), + children: [ + Container( + margin: EdgeInsets.symmetric(vertical: 8, horizontal: 16), + child: Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + widget.product.images != null + ? flutterImage.Image.network( + widget.product.images[0].src, + fit: BoxFit.cover, + height: 80, + ) + : flutterImage.Image.asset( + "assets/images/no_image.png", + fit: BoxFit.cover, + height: 80, + ), + Expanded( + child: Container( + child: Column( + children: [ + Container( + margin: EdgeInsets.all(5), + child: Align( + alignment: Alignment.topLeft, + child: RichText( + text: TextSpan( + text: widget.product.name, + style: TextStyle( + color: Colors.black, + fontSize: 14, + fontWeight: FontWeight.normal), ), - ], + ), ), - Row( - children: [ - Container( - margin: EdgeInsets.only(left: 5), - child: Text(widget.orderModel.orderItems[index].product.price.toString(), - style: TextStyle(fontSize: 16.0, fontWeight: FontWeight.bold, - ), - ), - ), - Container( - margin: EdgeInsets.only(left: 5), - child: Text(TranslationBase.of(context).sar, - style: TextStyle(fontSize: 16.0, fontWeight: FontWeight.bold, - ), - ), + ), + Container( + margin: EdgeInsets.all(5), + child: Align( + alignment: Alignment.topLeft, + child: RichText( + text: TextSpan( + text: + '${widget.product.price} ${TranslationBase.of(context).sar}', + style: TextStyle( + fontWeight: FontWeight.bold, + color: Colors.black, + fontSize: 13), ), - ], + ), ), - Row( - children: [ - Container( - margin: EdgeInsets.all(5), - child: Align( - alignment: Alignment.topLeft, - child: RatingBar.readOnly( - initialRating: 3, - size: 15.0, - filledColor: Colors.yellow[700], - emptyColor: Colors.grey[500], - isHalfAllowed: true, - halfFilledIcon: Icons.star_half, - filledIcon: Icons.star, - emptyIcon: Icons.star, - ), - ), - ), - Container( - child: Text(widget.orderModel.orderItems[index].product.approvedRatingSum.toString(), - style: TextStyle(fontSize: 14.0, fontWeight: FontWeight.bold, - ), + ), + Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Container( + child: Align( + alignment: Alignment.topLeft, + child: RatingBar.readOnly( + initialRating: ratingValue, + size: 15.0, + filledColor: Colors.yellow[700], + emptyColor: Colors.grey[500], + isHalfAllowed: true, + halfFilledIcon: Icons.star_half, + filledIcon: Icons.star, + emptyIcon: Icons.star, ), ), - Container( - margin: EdgeInsets.only(left: 5), - child: Text("(" + widget.orderModel.orderItems[index].product.approvedTotalReviews.toString() - + ' ' + TranslationBase.of(context).review +")", - style: TextStyle(fontSize: 12.0, + ), + SizedBox( + width: 20, + ), + Container( + child: Align( + child: RichText( + text: TextSpan( + text: + '(${widget.product.approvedTotalReviews} reviews)', + style: TextStyle( + fontWeight: FontWeight.bold, + color: Colors.grey, + fontSize: 13), ), ), ), - ], - ), - ], - ), - ] + ), + ], + ), + ], ), - ); - } - ), - ]), - + ), + ), + ]), + ), Divider( color: Colors.grey[350], height: 20, @@ -155,15 +142,13 @@ class _ProductReviewPageState extends State { endIndent: 0, ), Container( - margin: EdgeInsets.only( top: 12.0), + margin: EdgeInsets.only(top: 12.0), child: Column( crossAxisAlignment: CrossAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisSize: MainAxisSize.max, children: [ RatingBar( - // initialRating: - // this.doctor.actualDoctorRate.toDouble(), size: 40.0, filledColor: Colors.yellow[700], emptyColor: Colors.grey[500], @@ -171,51 +156,79 @@ class _ProductReviewPageState extends State { halfFilledIcon: Icons.star_half, filledIcon: Icons.star, emptyIcon: Icons.star, + onRatingChanged: (rating) { + currentRating = rating; + }, ), ], ), ), Container( - padding: EdgeInsets.fromLTRB(8.0, 20.0, 8.0,20.0), + padding: EdgeInsets.symmetric(horizontal: 16, vertical: 16), child: Column( - children: [ - TextFormField ( + children: [ + TextFormField( + controller: _reviewController, + maxLines: 6, + minLines: 4, decoration: InputDecoration( - contentPadding: const EdgeInsets.symmetric(vertical: 60.0), border: InputBorder.none, hintText: 'Tell us more about product!', focusedBorder: OutlineInputBorder( borderRadius: BorderRadius.circular(5.0), - borderSide: BorderSide(width: 1, color: Colors.grey[400]), + borderSide: + BorderSide(width: 1, color: Colors.grey[400]), ), enabledBorder: OutlineInputBorder( - borderRadius: BorderRadius.all(Radius.circular(5.0)), - borderSide: BorderSide(color: Colors.grey[400], width: 1), + borderRadius: + BorderRadius.all(Radius.circular(5.0)), + borderSide: + BorderSide(color: Colors.grey[400], width: 1), ), ), + onChanged: (value) { + setState(() { + reviewText = value; + }); + }, + textAlign: TextAlign.start, + textAlignVertical: TextAlignVertical.top, ), ], ), ), InkWell( - onTap: () { -// Navigator.push(context, -// MaterialPageRoute(builder: (context) => )); - }, + onTap: reviewText != null && reviewText != "" + ? () { + model + .makeReview( + widget.product, ratingValue, reviewText) + .then((value) { + setState(() { + finishReview = true; + }); + }); + } + : null, child: Container( + margin: EdgeInsets.symmetric(vertical: 8, horizontal: 16), height: 50.0, width: 400.0, color: Colors.transparent, child: Container( decoration: BoxDecoration( border: Border.all( - color: Colors.yellow[700], + color: _reviewController.value.text != null && + _reviewController.value.text != "" + ? Colors.yellow[700] + : Color(0xFFf5d69c), style: BorderStyle.solid, - width: 1.0 - ), - color: Colors.yellow[700], - borderRadius: BorderRadius.circular(5.0) - ), + width: 1.0), + color: _reviewController.value.text != null && + _reviewController.value.text != "" + ? Colors.yellow[700] + : Color(0xFFf5d69c), + borderRadius: BorderRadius.circular(5.0)), child: Center( child: Text( TranslationBase.of(context).shareReview, @@ -231,85 +244,89 @@ class _ProductReviewPageState extends State { ), ], ), - ), - ),), + ) : getReviewedProduct(), + ), + ), ); } - - - //new screen is showing after submitting the review - Widget getReviewedProduct(){ + Widget getReviewedProduct() { return Column( mainAxisAlignment: MainAxisAlignment.center, - children: [ + children: [ Row( mainAxisAlignment: MainAxisAlignment.center, - children: [ + children: [ SvgPicture.asset( 'assets/images/pharmacy/check_icon.svg', width: 28, - height: 28,), + height: 28, + ), Container( - margin: EdgeInsets.only(left: 10.0), - child: Text(TranslationBase.of(context).reviewSuccessful, - style: TextStyle(fontSize: 20.0, fontWeight: FontWeight.bold, + margin: EdgeInsets.symmetric(horizontal: 8), + child: Text( + TranslationBase.of(context).reviewSuccessful, + style: TextStyle( + fontSize: 20.0, + fontWeight: FontWeight.bold, ), ), ), ], ), Container( - margin: EdgeInsets.only(top:5.0, bottom: 20.0 ), - child: Text(TranslationBase.of(context).reviewShared, - style: TextStyle(fontSize: 15.0, + margin: EdgeInsets.symmetric(horizontal: 8, vertical: 8), + child: Text( + TranslationBase.of(context).reviewShared, + style: TextStyle( + fontSize: 15.0, ), ), ), Container( - margin: EdgeInsets.only(bottom: 30.0, top: 30.0 ), + margin: EdgeInsets.only(bottom: 30.0, top: 30.0), child: SvgPicture.asset( 'assets/images/pharmacy/success_review_icon.svg', width: 100, - height: 100,), + height: 100, + ), ), Container( - margin: EdgeInsets.only(left: 20.0, right: 20.0), + margin: EdgeInsets.symmetric(horizontal: 16), child: Column( - children: [ + children: [ Row( mainAxisAlignment: MainAxisAlignment.start, - children: [ + children: [ SvgPicture.asset( 'assets/images/pharmacy/quote_start.svg', width: 15, - height: 15,), - ], - ), - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text(TranslationBase.of(context).reviewComment, - style: TextStyle(fontSize: 15.0, - ), + height: 15, ), ], ), + Text( + TranslationBase.of(context).reviewComment, + style: TextStyle( + fontSize: 15.0, + ), + ), Row( mainAxisAlignment: MainAxisAlignment.end, - children: [ + children: [ SvgPicture.asset( 'assets/images/pharmacy/quote_end.svg', width: 15, - height: 15,), + height: 15, + ), ], ), ], ), ), Container( - margin: EdgeInsets.only(top: 20.0 ), + margin: EdgeInsets.only(top: 20.0), child: InkWell( onTap: () { Navigator.push( @@ -320,17 +337,16 @@ class _ProductReviewPageState extends State { ); }, child: Container( - height: 50.0, color: Colors.transparent, + height: 50.0, + color: Colors.transparent, child: Container( decoration: BoxDecoration( border: Border.all( color: Colors.orange, style: BorderStyle.solid, - width: 1.0 - ), + width: 1.0), color: Colors.transparent, - borderRadius: BorderRadius.circular(5.0) - ), + borderRadius: BorderRadius.circular(5.0)), child: Center( child: Text( TranslationBase.of(context).backMyAccount, @@ -348,23 +364,4 @@ class _ProductReviewPageState extends State { ); } -// submit(){ -// this.orderId.id = "0"; -// this.reviewObj.position = 0; -// this.reviewObj.customerId = this.pharmacyUser.CustomerId; -// this.reviewObj.productId = this.product.id; -// this.reviewObj.storeId = 2; -// this.reviewObj.isApproved = false; -// this.reviewObj.title =''; -// this.reviewObj.reviewText = this.submitTxt; -// this.reviewObj.rating = this.doctorRating; -// this.reviewObj.replyText = null; -// this.reviewObj.helpfulYesTotal = 0; -// this.reviewObj.helpfulNoTotal = 0; -// this.reviewObj.createdOnUtc = new Date().toString(); -// this.submitProductReview(); -// } - submitProductReview(){ - - } -} \ No newline at end of file +} diff --git a/lib/services/pharmacy_services/orderDetails_service.dart b/lib/services/pharmacy_services/orderDetails_service.dart index 5adbbc24..a3bb9976 100644 --- a/lib/services/pharmacy_services/orderDetails_service.dart +++ b/lib/services/pharmacy_services/orderDetails_service.dart @@ -36,4 +36,40 @@ class OrderDetailsService extends BaseService{ super.error = error; }); } + + Future makeReview(Product product, double rating, String reviewText) async { + hasError = false; + super.error = ""; + + var customerId = await sharedPref.getString(PHARMACY_CUSTOMER_ID); + + + Map body = Map(); + Map reviewBody = Map(); + reviewBody["created_on_utc"] = DateTime.now().toString(); + reviewBody["customer_id"] = customerId; + reviewBody["helpful_no_total"] = 0; + reviewBody["helpful_yes_total"] = 0; + reviewBody["id"] = 0; + reviewBody["is_approved"] = false; + reviewBody["position"] = 0; + reviewBody["product_id"] = product.id; + reviewBody["rating"] = rating; + reviewBody["reply_text"] = reviewText; + reviewBody["store_id"] = 2; + reviewBody["title"] = ""; + body['review'] = reviewBody; + await baseAppClient.post("$PHARMACY_MAKE_REVIEW", + onSuccess: (response, statusCode) async { + /* + "success": { + "SuccessEndUserMsg": "Your request has been completed successfuly.", + "SuccessEndUserMsgN": "تمت العملية بنجاح" + } + */ + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: body); + } } \ No newline at end of file diff --git a/lib/widgets/pharmacy/product_tile.dart b/lib/widgets/pharmacy/product_tile.dart index b56fc625..6a31a3ab 100644 --- a/lib/widgets/pharmacy/product_tile.dart +++ b/lib/widgets/pharmacy/product_tile.dart @@ -1,3 +1,4 @@ +import 'package:diplomaticquarterapp/core/model/pharmacies/order_model.dart'; import 'package:diplomaticquarterapp/pages/pharmacy/order/ProductReview.dart'; import 'package:flutter/material.dart'; import 'package:flutter_html/style.dart'; @@ -5,7 +6,7 @@ import 'package:flutter_html/style.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:rating_bar/rating_bar.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; - +import 'package:flutter/src/widgets/image.dart' as flutterImage; @@ -19,11 +20,11 @@ class productTile extends StatelessWidget { final bool isOrderDetails; final String img; final int status; - + final Product product; productTile({this.productName, this.productPrice, this.productRate, this.qyt, this.totalPrice, this.productReviews, this.img, - this.isOrderDetails=true, this.status}); + this.isOrderDetails=true, this.status, this.product}); @override @@ -40,7 +41,7 @@ class productTile extends StatelessWidget { children: [ Container( margin: EdgeInsets.only(left: 10), - child: Image.network(img), + child: flutterImage.Image.network(img), // fit: BoxFit.cover, width: 80, height: 80, @@ -202,7 +203,7 @@ class productTile extends StatelessWidget { InkWell( onTap: () { Navigator.push(context, - MaterialPageRoute(builder: (context) => ProductReviewPage())); + MaterialPageRoute(builder: (context) => ProductReviewPage(product))); }, child: Container( padding: EdgeInsets.only(left: 13.0, right: 13.0, top: 5.0), diff --git a/pubspec.yaml b/pubspec.yaml index dee882e6..18a8330a 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -45,7 +45,7 @@ dependencies: url_launcher: ^5.5.0 shared_preferences: ^0.5.8 flutter_flexible_toast: ^0.1.4 - firebase_messaging: ^7.0.0 + firebase_messaging: ^7.0.3 android_intent: ^0.3.7+7 # Progress bar progress_hud_v2: ^2.0.0 From 0237d71931e2598281bfbd7e6d0462a18a6ddb18 Mon Sep 17 00:00:00 2001 From: mosazaid Date: Thu, 17 Dec 2020 09:37:30 +0200 Subject: [PATCH 11/18] make firebase-in app messaging commented to solve problem Duplicate class com.google.protobuf.WireFormat$Utf8Validation$3 found in modules jetified-protobuf-javalite-3.11.0.jar (com.google.protobuf:protobuf-javalite:3.11.0) and jetified-protobuf-lite-3.0.1.jar (com.google.protobuf:protobuf-lite:3.0.1) --- android/app/build.gradle | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index abcdcf6f..d3e44cb9 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -72,16 +72,11 @@ flutter { dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" - /* implementation ("com.google.firebase:firebase-messaging:21.0.0", { - // protobuf-lite that firebase-config and Tink depends on. - exclude group: 'com.google.protobuf',module: 'protobuf-javalite' + implementation "com.google.firebase:firebase-messaging:21.0.0" +// implementation ('com.google.firebase:firebase-inappmessaging-display:19.1.2',{ +// exclude group: 'com.google.protobuf',module: 'protobuf-javalite' // exclude group: 'com.google.protobuf',module: 'protobuf-lite' - }) - implementation ('com.google.firebase:firebase-inappmessaging-display:19.1.2',{ - // protobuf-lite that firebase-config and Tink depends on. - exclude group: 'com.google.protobuf',module: 'protobuf-javalite' -// exclude group: 'com.google.protobuf',module: 'protobuf-lite' - })*/ +// }) implementation 'pub.devrel:easypermissions:0.4.0' implementation 'com.google.guava:guava:27.0.1-android' // Dependency on local binaries From fda101840ab4fa1b29431413702a42c27b678594 Mon Sep 17 00:00:00 2001 From: Fatimah Alshammari Date: Mon, 21 Dec 2020 10:17:17 +0300 Subject: [PATCH 12/18] fixed order isuues --- assets/images/pharmacy/arrow-left-png.png | Bin 0 -> 2208 bytes assets/images/pharmacy/arrow-left.png | Bin 0 -> 2208 bytes assets/images/pharmacy/arrow-right-png.png | Bin 0 -> 2214 bytes assets/images/pharmacy/arrow.png | Bin 0 -> 2214 bytes assets/images/pharmacy/arrow_lef.png | Bin 0 -> 2214 bytes assets/images/pharmacy/arrow_left.svg | 6 + assets/images/pharmacy/terms.png | Bin 0 -> 1782 bytes lib/config/localized_values.dart | 7 +- .../order_model_view_model.dart | 35 ++++-- lib/pages/pharmacy/order/Order.dart | 118 ++++++++++++------ lib/pages/pharmacy/order/OrderDetails.dart | 36 +++--- lib/pages/pharmacy/profile/profile.dart | 103 ++++++++++++++- lib/uitl/translations_delegate_base.dart | 5 + lib/widgets/pharmacy/product_tile.dart | 31 +++-- 14 files changed, 258 insertions(+), 83 deletions(-) create mode 100644 assets/images/pharmacy/arrow-left-png.png create mode 100644 assets/images/pharmacy/arrow-left.png create mode 100644 assets/images/pharmacy/arrow-right-png.png create mode 100644 assets/images/pharmacy/arrow.png create mode 100644 assets/images/pharmacy/arrow_lef.png create mode 100644 assets/images/pharmacy/arrow_left.svg create mode 100644 assets/images/pharmacy/terms.png diff --git a/assets/images/pharmacy/arrow-left-png.png b/assets/images/pharmacy/arrow-left-png.png new file mode 100644 index 0000000000000000000000000000000000000000..18d58c8789d9d62cf07226a8667a3040ca9dc413 GIT binary patch literal 2208 zcmV;R2w(S!P) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=KFcH=kgD``9xqV+T<^3UcG6+!c<^D6&9leN(Jmc^*zfgp{C4?xuY`+m zj{n*GdMtH+bp1OhV03{!_RbF`-f)fPh0z1fTu_E}C2utw?io+*s$a8nr`s!dr@Je5 zTRH0aGYYrGqd~l4bkvi4&2AC8>=B(ke|n&4E8FF9$!_*E=h&kwA%awNM^GQ3tUELW z&cN%nh*R+|xYu=NoaUxMu?{sW&gLkS2hB-=Iu)8UR@tbbi@^`CD7|l`+f(x%=k5jZC3Q_yqI!B;3iBEFNG(1tleoaD_n-ced@z4*NvQwxL;j;xRd z0|;V;AjlsL2{}}RB{&g@qLL&_i5x?e7^6m;ql&Ty6^*KzG;2wmLXs4drj&9j*=NQS zCOKwxIpv&7fztxh1#cI$D5d(!HB_mwYE3oQ(vUtaG-)FN$hFBcOqp@&Of%1NQteRnvubpu-1n-{p_(ZcRy#ebhHBLh6J*ng zm}XGS2ZG{i3Lv4qX|^Q_!JBfX*_J&9g?Ok&V&Zf%#h_pqgFUorJKK} zoHOZuLOEyB9m?J6_JwM_tQCcqKsE}E>BbWi8ybvMd@8mky)_b3gDl(-xt$9irGn$9#2V9gi zDOuB2vtquRb|2A529}Vrx^q*ydk>y1cSA@7nnCC2adL&$Lo`c;=8RYnow?@4^Y^xMDm-h}icC0a#LxfCajFf@OAwcg(>HFZTqz zfNR?o!QbPhd*%hfxZ#m3z57rdOAzFLjngt4n=?qw1O2hM9-t+C^v_-dOSUCQ(`oqF zSS@@=4_)-MZlHHV8Jxwqvg>>gSHD((IWH*KpkWMEDb5 zGrdLT(X>abAhn+su7QXU7*kF?;1Q>!Vq1Ddx{o}F5<0-);0%gS(db7uneIUgR>Nw7DS#A=3sYE zlI1F5QKj=D&8J0rZ9?|+ur;~|+aDdY-h}1ohag=Vx)19CRPJE)Eh>B?looBU!b6z* zU^O4AbBpGKh8u^IcUk=rMsKllS9$d^EB68GT~>dT(Mzn{oiX?{D|ek(ud;IbFEDzF zmHW+n^)M@UZxBAq$~`>0{{W+hSh)x1_HS5Gt7>16SVS9E(oNS#sqe=!+M>C}t^*9= z+V&hE2zJ3-+~^5+e)C4>71YCz2kK0jdP00006VoOIv00000008+z zyMF)x010qNS#tmYE+YT{E+YYWr9XB6000McNliru;{*W*ASKH8geYKa?tvDwHA$^nj)m6{+INfABAzf5FFrk4hW{1ietTNm_{uNJS+L zhd7e8+TB#juI)AZN_&c9=Y4iOGwUQkqehJyH40x^>!gZ#TQxA=2e1cV4Zt~oPt5$M ztof6`%|8P062K~e34k7e!!p-M0yn>JjN9r)51_z209=;2)>44xpO`&A$r zT>w;I{)m}}QC5LD<|iimpGH{*Z(#ldGY_g*I|*dZdok}FfXViIzRY_CFsIbPg?VoP zwAMRw%zt!Y-b)$OT0a2rJjeVsfcMNia`kx<$L2Q+?!0sJPRpP%e+WQ@V&2&nFk!!+ zV}7>hott+8z?eTM7;@w);W^I%TI=l_m_PB^i?k{>{~~1bl>w-W`APuP$$aSmwAPPJ zZ(j@Zr6xhs-qy-|X%S%c_E{POc*o2?5ujTCv-yR$fY!QW9&Bo9zKl+A%S2IDB)tyZ zd>H^*0B+^Hb{|0S02ZwR$H@Pp;;Gj9S?B=NB5xLvF%g}ZyWP$h(j%foM9xD6P*xdS z0q_dbZ*a5p1;AHkzKSXWtVsAvL_+}EIeDcAphHAM5xI`C6J+LJ0N$ALmsc?kqKp75 z5-y2o1mIx~+zldH6Oq#>0n`zKs$x4E1sb*&T8s)!7u1Ykk9Fo`iM5;`G3 zP*qM|2MDU_1uO{tj1s8;+$Ey6F9^!TB34e=N zLAhMaKsYnop`8LSgW$A8D%T-r9-w9rZf7LN4I=7_$d4!iSP(`QgtXR)Xjw!CQ36Qi zgg$`fj3HeY5WE4fAPjs$@CqOV2;Kpts>8hk2rD9T79{}dP-S2sw9G@4ea+hDL6iV8 z5~ITOw?y{UA)+M_xd`q=s4SV2rMJjGZQdz!y&(TDz|6nrK!_W_90=c|%>e}^a$;`Q iH)cLYqehJym85^pV00xQrb2T70000j literal 0 HcmV?d00001 diff --git a/assets/images/pharmacy/arrow-left.png b/assets/images/pharmacy/arrow-left.png new file mode 100644 index 0000000000000000000000000000000000000000..18d58c8789d9d62cf07226a8667a3040ca9dc413 GIT binary patch literal 2208 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 iH)cLYqehJym85^pV00xQrb2T70000j literal 0 HcmV?d00001 diff --git a/assets/images/pharmacy/arrow-right-png.png b/assets/images/pharmacy/arrow-right-png.png new file mode 100644 index 0000000000000000000000000000000000000000..19af7c0bac23d17d77e5bd6d791c729609adba9b GIT binary patch literal 2214 zcmV;X2wC@uP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+SQj^lJYnVh2OP`SwiHS?B)2Ts@cITe~wHVXrO5b z|2#}m#KCbS>pSu#H2?Wq=`S3vq>Vz9oJvX?j!;5z6*qZ19jB7Fu&(O}`y>4SR!`># z4pkndKmAQ}Z(mU#FE7ac0=Mt=Bz?D&cSHMwFN5AZJKXH;@@~kxQ$6qhsqF97a23w} z)9%*e*iMgb{|5n#5n<0ea?`Wla82gLqX)kDiqhlCo}JY&?t_oGdY>P&qx0^Q$gntYiZP}rF~<^X@+qX4Qj%nIR245lq9hT?Qlw^|LykFR$vKx? ziz^;eSS+asm0U`x6;3NmSG--(qSoe`Z=uDOnzYA9C)hZ}xi_>VM% zMjmC<$rGtG!;CXcnR%936}hHfgGNm%nzd*>tG289T{XT@?zw8bt7eLY)lM#|p<3k2 z1lx2HO*1Iw0z+{z1(49rG}|(V;7mEwY%30fB08wX(Zm^Sib26J*+u2Eb{FNI>P9iV zrJMUnIWp<~gmPrk?aJNj_CU2!*NWnoKsE}E>E;y^8yd`9U9Pq!9WLop1HT(;HR~p# zy-n2>jcQ7G*xO(YqH`qm4MEQ+fZY(ihb+FR@Wi;0I59@C7(=DV5zu?eW@;25R9Njp zJ!I4^jh;NuDI+y3kXRP#>dHqYz19$&>^!VrPMZ~wuhfRjg7mC0E6rY3q&$Cy&Nj@y@8E2nk~gGqHQC5K?5H%0xiN0<= zEuR=-2nMgL7Kg~3e#Mb2G@cfSpM4KR9nCYY&uG!(tazUmU2uI?(kl&Lp+y&5pV6Y< z#?Y&@=uvVVDe1izex^l_lIsX9dOj3ir$x_);_D?H#d}MOo)5*>Y0;|_*Kf4w)rsqa z`RF}b^y$>rSo#?OH#yvb_I>MwVb9{v0rM~kY|Li*m5EK(XnTkF-@I*jM8z< zQqiM0?4#Ry`AJDXH;5}gvTf3arN`RbAQ9S1kS)zVAp`nj;Z!R7W@k?hJtv1h4W%Vn zEjMsa`C&N-C&&)u(eeR=NDO%3+06rhSmt3TW%ur2rhupG7Kd!XkmE?G0d_FA#H;Y zScKpEMy5aXk^LVTvJX}I7h!|UJ5_~sTL1t624YJ`L;wH)0002_L%V+f000SaNLh0L z04^f{04^f|c%?sf00007bV*G`2jc?^2rVWsk+Amw00PEIL_t(|+U=UlZqq;%hQGwA zDzQVN7s{=o66gp-D<~V@VxDx~p`wDq5`@kMmIx%EnV|56t5 zSTpl~Gd^=p9B9?5RjXFz${5pKmbrFHHogk%0c$`Ce6rSlj~PJOEA;}n1)KvnfS1OY z?dt^K=G^yl;AzYd$_9`vxE3{pvH^VbT)%+uFg5^5nVqR>Dk2kL({szZh@7eFaU%gZ z2m=vG9fU=v%vwwkk}5h?)uD(Cf!nb|NUG{sRYwINoQ8&wRM~j}225sO0V~#-vP#$C%|J*a|V2A><+lZ zd7f#(#m)0?tUSRW!GQ9V7nXetdB}ZNAR(@LNoO(5ye}(^dz98mnONEUw zdpYJuF5uN}z7_z^yzl>kL$~r{0;v<&{9#D*l>%4>^OXTG#ykhMbIiXktDcVzfLr-{ zp601DKPD3ON;WUR9pKM`<_tKB$$S-gzyr_q%oR2%k*SV6AX@WP0QkI2=1VV!RrQyM ooB*r9SKvcz&wQ&^ty<0MFCu`1o^i+R`v3p{07*qoM6N<$f*QIMG5`Po literal 0 HcmV?d00001 diff --git a/assets/images/pharmacy/arrow.png b/assets/images/pharmacy/arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..19af7c0bac23d17d77e5bd6d791c729609adba9b GIT binary patch literal 2214 zcmV;X2wC@uP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+SQj^lJYnVh2OP`SwiHS?B)2Ts@cITe~wHVXrO5b z|2#}m#KCbS>pSu#H2?Wq=`S3vq>Vz9oJvX?j!;5z6*qZ19jB7Fu&(O}`y>4SR!`># z4pkndKmAQ}Z(mU#FE7ac0=Mt=Bz?D&cSHMwFN5AZJKXH;@@~kxQ$6qhsqF97a23w} z)9%*e*iMgb{|5n#5n<0ea?`Wla82gLqX)kDiqhlCo}JY&?t_oGdY>P&qx0^Q$gntYiZP}rF~<^X@+qX4Qj%nIR245lq9hT?Qlw^|LykFR$vKx? ziz^;eSS+asm0U`x6;3NmSG--(qSoe`Z=uDOnzYA9C)hZ}xi_>VM% zMjmC<$rGtG!;CXcnR%936}hHfgGNm%nzd*>tG289T{XT@?zw8bt7eLY)lM#|p<3k2 z1lx2HO*1Iw0z+{z1(49rG}|(V;7mEwY%30fB08wX(Zm^Sib26J*+u2Eb{FNI>P9iV zrJMUnIWp<~gmPrk?aJNj_CU2!*NWnoKsE}E>E;y^8yd`9U9Pq!9WLop1HT(;HR~p# zy-n2>jcQ7G*xO(YqH`qm4MEQ+fZY(ihb+FR@Wi;0I59@C7(=DV5zu?eW@;25R9Njp zJ!I4^jh;NuDI+y3kXRP#>dHqYz19$&>^!VrPMZ~wuhfRjg7mC0E6rY3q&$Cy&Nj@y@8E2nk~gGqHQC5K?5H%0xiN0<= zEuR=-2nMgL7Kg~3e#Mb2G@cfSpM4KR9nCYY&uG!(tazUmU2uI?(kl&Lp+y&5pV6Y< z#?Y&@=uvVVDe1izex^l_lIsX9dOj3ir$x_);_D?H#d}MOo)5*>Y0;|_*Kf4w)rsqa z`RF}b^y$>rSo#?OH#yvb_I>MwVb9{v0rM~kY|Li*m5EK(XnTkF-@I*jM8z< zQqiM0?4#Ry`AJDXH;5}gvTf3arN`RbAQ9S1kS)zVAp`nj;Z!R7W@k?hJtv1h4W%Vn zEjMsa`C&N-C&&)u(eeR=NDO%3+06rhSmt3TW%ur2rhupG7Kd!XkmE?G0d_FA#H;Y zScKpEMy5aXk^LVTvJX}I7h!|UJ5_~sTL1t624YJ`L;wH)0002_L%V+f000SaNLh0L z04^f{04^f|c%?sf00007bV*G`2jc?^2rVWsk+Amw00PEIL_t(|+U=UlZqq;%hQGwA zDzQVN7s{=o66gp-D<~V@VxDx~p`wDq5`@kMmIx%EnV|56t5 zSTpl~Gd^=p9B9?5RjXFz${5pKmbrFHHogk%0c$`Ce6rSlj~PJOEA;}n1)KvnfS1OY z?dt^K=G^yl;AzYd$_9`vxE3{pvH^VbT)%+uFg5^5nVqR>Dk2kL({szZh@7eFaU%gZ z2m=vG9fU=v%vwwkk}5h?)uD(Cf!nb|NUG{sRYwINoQ8&wRM~j}225sO0V~#-vP#$C%|J*a|V2A><+lZ zd7f#(#m)0?tUSRW!GQ9V7nXetdB}ZNAR(@LNoO(5ye}(^dz98mnONEUw zdpYJuF5uN}z7_z^yzl>kL$~r{0;v<&{9#D*l>%4>^OXTG#ykhMbIiXktDcVzfLr-{ zp601DKPD3ON;WUR9pKM`<_tKB$$S-gzyr_q%oR2%k*SV6AX@WP0QkI2=1VV!RrQyM ooB*r9SKvcz&wQ&^ty<0MFCu`1o^i+R`v3p{07*qoM6N<$f*QIMG5`Po literal 0 HcmV?d00001 diff --git a/assets/images/pharmacy/arrow_lef.png b/assets/images/pharmacy/arrow_lef.png new file mode 100644 index 0000000000000000000000000000000000000000..19af7c0bac23d17d77e5bd6d791c729609adba9b GIT binary patch literal 2214 zcmV;X2wC@uP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+SQj^lJYnVh2OP`SwiHS?B)2Ts@cITe~wHVXrO5b z|2#}m#KCbS>pSu#H2?Wq=`S3vq>Vz9oJvX?j!;5z6*qZ19jB7Fu&(O}`y>4SR!`># z4pkndKmAQ}Z(mU#FE7ac0=Mt=Bz?D&cSHMwFN5AZJKXH;@@~kxQ$6qhsqF97a23w} z)9%*e*iMgb{|5n#5n<0ea?`Wla82gLqX)kDiqhlCo}JY&?t_oGdY>P&qx0^Q$gntYiZP}rF~<^X@+qX4Qj%nIR245lq9hT?Qlw^|LykFR$vKx? ziz^;eSS+asm0U`x6;3NmSG--(qSoe`Z=uDOnzYA9C)hZ}xi_>VM% zMjmC<$rGtG!;CXcnR%936}hHfgGNm%nzd*>tG289T{XT@?zw8bt7eLY)lM#|p<3k2 z1lx2HO*1Iw0z+{z1(49rG}|(V;7mEwY%30fB08wX(Zm^Sib26J*+u2Eb{FNI>P9iV zrJMUnIWp<~gmPrk?aJNj_CU2!*NWnoKsE}E>E;y^8yd`9U9Pq!9WLop1HT(;HR~p# zy-n2>jcQ7G*xO(YqH`qm4MEQ+fZY(ihb+FR@Wi;0I59@C7(=DV5zu?eW@;25R9Njp zJ!I4^jh;NuDI+y3kXRP#>dHqYz19$&>^!VrPMZ~wuhfRjg7mC0E6rY3q&$Cy&Nj@y@8E2nk~gGqHQC5K?5H%0xiN0<= zEuR=-2nMgL7Kg~3e#Mb2G@cfSpM4KR9nCYY&uG!(tazUmU2uI?(kl&Lp+y&5pV6Y< z#?Y&@=uvVVDe1izex^l_lIsX9dOj3ir$x_);_D?H#d}MOo)5*>Y0;|_*Kf4w)rsqa z`RF}b^y$>rSo#?OH#yvb_I>MwVb9{v0rM~kY|Li*m5EK(XnTkF-@I*jM8z< zQqiM0?4#Ry`AJDXH;5}gvTf3arN`RbAQ9S1kS)zVAp`nj;Z!R7W@k?hJtv1h4W%Vn zEjMsa`C&N-C&&)u(eeR=NDO%3+06rhSmt3TW%ur2rhupG7Kd!XkmE?G0d_FA#H;Y zScKpEMy5aXk^LVTvJX}I7h!|UJ5_~sTL1t624YJ`L;wH)0002_L%V+f000SaNLh0L z04^f{04^f|c%?sf00007bV*G`2jc?^2rVWsk+Amw00PEIL_t(|+U=UlZqq;%hQGwA zDzQVN7s{=o66gp-D<~V@VxDx~p`wDq5`@kMmIx%EnV|56t5 zSTpl~Gd^=p9B9?5RjXFz${5pKmbrFHHogk%0c$`Ce6rSlj~PJOEA;}n1)KvnfS1OY z?dt^K=G^yl;AzYd$_9`vxE3{pvH^VbT)%+uFg5^5nVqR>Dk2kL({szZh@7eFaU%gZ z2m=vG9fU=v%vwwkk}5h?)uD(Cf!nb|NUG{sRYwINoQ8&wRM~j}225sO0V~#-vP#$C%|J*a|V2A><+lZ zd7f#(#m)0?tUSRW!GQ9V7nXetdB}ZNAR(@LNoO(5ye}(^dz98mnONEUw zdpYJuF5uN}z7_z^yzl>kL$~r{0;v<&{9#D*l>%4>^OXTG#ykhMbIiXktDcVzfLr-{ zp601DKPD3ON;WUR9pKM`<_tKB$$S-gzyr_q%oR2%k*SV6AX@WP0QkI2=1VV!RrQyM ooB*r9SKvcz&wQ&^ty<0MFCu`1o^i+R`v3p{07*qoM6N<$f*QIMG5`Po literal 0 HcmV?d00001 diff --git a/assets/images/pharmacy/arrow_left.svg b/assets/images/pharmacy/arrow_left.svg new file mode 100644 index 00000000..00fa7556 --- /dev/null +++ b/assets/images/pharmacy/arrow_left.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/assets/images/pharmacy/terms.png b/assets/images/pharmacy/terms.png new file mode 100644 index 0000000000000000000000000000000000000000..76cfacab5761812815688012dadd0001543f321c GIT binary patch literal 1782 zcmb`I=Rezv0>*!d#4(zxRm6%BajYte5Sq63MeH=y5arrLuXS82aw@9jq(=Lx)jHJ* zTH3@ZYE)2^+M`BAj}fz48m=I&>yNlEp6C1S`{H@?WV^ZA!^GfX006)o9c(;K>2?}- z5#iIebx{*J1t`|T{wh#6q_hqI!fzaHu6X?h+A4GLSTdLCbqwZD$48H>K$>2XI7QNN zD-h)bcI7x~Ee32PZk^!bYPbM-tnBSJxd17cL$obbh#j6JI))J{gRWXE~hX zGbC?wye+(~p*5^j!asTYQpY?RgTW-blwANf)z?cu{KO?!HPPBa^GppS>;hMJc5a_6 zFF!Z?-WLc8l51;kzl=rh-PSFJCffvy6I0Sl4Zg$95#Q1toSZ$Up>fvrCYwflj@Jy` z)}>yS6ddw%{FQVY>2$i~@brtUr_eRY_|(D=1|wJG98z=!zX)G*lfC8!ON&Xrz>jTa zv3~Bo3sn+z>#($kGApF05h}{cWfp%7=7f{Uug`{*OcN0;6#kUB&`jc0=BD1jji@pQq?y*^Gnue<3nP-?Yx0H_dQi1AFx zuwM=-PDf4Rllq*_pwTh~^VIqd(+V~0{Lqz_aCl%eUNv6aENay~_)8xyKOIIiOKpOP^7nbED%Pt?p*WFVV(?8N#nc+@vW1m6+wKpo8hG=q-~G8Y>tYV5U~3dQ zVPbO(JuvUeC3yzQ4VlwMoacw2Kk|vMXNVR*z^I_muZ@ho#K)6mxIiVSNaJhE`Ajh(QjW)!o6HORv zbQ)uMK^i-nqOZq(mXR+I1&~Hh4uKKr!l3hjQxIkkRF2Z_(*p`W{a-qGCA;cfioG}1->^njKIm2QtfA8fD3~5jWn)- zO(t9eLb1lSypUd}uUw0~4<^)7g4r!)-`z+WZ06xRift{#X#uOSV~k5GpyHyoe*ZOs z^OtA$^Jkk#W7c@$!XMV3Ytpz?*7bnA~Rtd6c2)4-=tRp1v10EG}*B`@RToQ)!8|o$6TYdVF&-$ryY< zq%>QXd!#Xcrbw#(kZFyLk?+)yE^!w|kl}{>n!ndIeV!gq9Ar8$**lhScu6i&@u;VG zy>nJRk$ZL-XE7{;LS5$z_FEG}G=3UwQ`iSErZXg*B=9>=;jCdib8@{CLN0MHN(|-> zG%#~R-Go&L4qwm3+99&Hoe()mo-;A$78#fKl@E)&s;iE`t0f6SA`(`wb@nil2yr-6 z61q?7#AP&uS>7)RSIw%?0wY;pwv{lmbV!xBO=u&6C-$xZR49lH4oONnxZ3PdC(Rp? zobBrBvS(NSnf6__gPuO}3Es*4b5p$Dw{i3)=_bHWCH0o z^McV6S*b!+F9X-h2xJPzH&+(s1K7`_|556WoZXd<3SS7$a9utb7V805&4fPqIK`yr zIHbB}j9aHH**Err8DDtnl*6FP6u+L5d+<7vEIy_SDnNTU6-T4t$F*({vVFOgcR>z|q##rtT_<`achOH?sf$ literal 0 HcmV?d00001 diff --git a/lib/config/localized_values.dart b/lib/config/localized_values.dart index c52739f2..b60a0f45 100644 --- a/lib/config/localized_values.dart +++ b/lib/config/localized_values.dart @@ -654,9 +654,12 @@ const Map localizedValues = { "writeReview": {"en": "Write Review", "ar": " اكتب تقييمك"}, "shareReview": {"en": "SHARE REVIEW", "ar": " اكتب تقييمك"}, "review": {"en": " reviews", "ar": " تقييمات"}, + "pendingOrder": {"en": " PENDING", "ar": " معلقة"}, "deliveredOrder": {"en": " DELIVERED", "ar": " تم التوصيل"}, + "processingOrder": {"en": " PROCESSING", "ar": "قيد التنفيذ"}, + "cancelledOrder": {"en": " CANCELLED", "ar": "ملغي"}, "compare": {"en": " Compare", "ar": "مقارنه"}, - "medicationsRefill": {"en": " Medication Refill", "ar": "اعادة تعبئة الدواء"}, + "medicationsRefill": {"en": " Medication Refill", "ar": "طلب أعادة صرف"}, "myPrescription": {"en": " My Prescriptions", "ar": "وصفاتي"}, "quantity": {"en": " QTY ", "ar": "الكمية"}, "backMyAccount": { @@ -683,6 +686,8 @@ const Map localizedValues = { "cancelOrder": {"en": "CANCEL ORDER", "ar": "الغاء الطلب "}, "confirmAddress": {"en": "CONFIRM ADDRESS ", "ar": " تأكيد العنوان "}, "confirmLocation": {"en": "CONFIRM LOCATION ", "ar": " تأكيد الموقع "}, + "conditionsHMG": {"en": "Terms & Conditions ", "ar": "الشروط و الأحكام "}, + "conditions": {"en": "Terms & Conditions of Lakum", "ar": "شروط و احكام لكم"}, "confirmDeleteMsg": { "en": "Are you sure! want to delete ", "ar": "هل انت متأكد تريد الحذف " diff --git a/lib/core/viewModels/pharmacyModule/order_model_view_model.dart b/lib/core/viewModels/pharmacyModule/order_model_view_model.dart index f3262ba3..3ee6d0cf 100644 --- a/lib/core/viewModels/pharmacyModule/order_model_view_model.dart +++ b/lib/core/viewModels/pharmacyModule/order_model_view_model.dart @@ -1,5 +1,10 @@ import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacies/Addresses.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacies/LacumAccountInformation.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacies/ShoppingCartResponse.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacies/payment-checkout-data.dart'; +import 'package:diplomaticquarterapp/core/service/parmacyModule/order-preview-service.dart'; import 'package:diplomaticquarterapp/pages/pharmacy/order/Order.dart'; import 'package:diplomaticquarterapp/pages/pharmacy/order/OrderDetails.dart'; import 'package:diplomaticquarterapp/services/pharmacy_services/cancelOrder_service.dart'; @@ -23,6 +28,14 @@ class OrderModelViewModel extends BaseViewModel { List get cancelOrder => _cancelOrderService.cancelOrderList; + OrderPreviewService _orderServices = locator(); + List get addresses => _orderServices.addresses; + LacumAccountInformation get lacumInformation => + _orderServices.lacumInformation; + ShoppingCartResponse cartResponse = ShoppingCartResponse(); + PaymentCheckoutData paymentCheckoutData = PaymentCheckoutData(); + double totalAdditionalShippingCharge = 0; + Future getOrder(customerId, pageID) async { @@ -50,17 +63,6 @@ class OrderModelViewModel extends BaseViewModel { } } - Future getProductReview() async { - setState(ViewState.Busy); - await _orderService.getProductReview(); - if (_orderService.hasError) { - error = _orderService.error; - setState(ViewState.Error); - } else { - //order = _orderService.orderList; - setState(ViewState.Idle); - } - } Future getCanceledOrder(order, context) async { print("this is order id"+ order); @@ -89,4 +91,15 @@ class OrderModelViewModel extends BaseViewModel { } + Future makeOrder() async { + setState(ViewState.Busy); + await _orderServices.makeOrder(paymentCheckoutData, cartResponse.shoppingCarts); + if (_orderServices.hasError) { + error = _orderServices.error; + setState(ViewState.Error); + } else { + setState(ViewState.Idle); + } + } + } \ No newline at end of file diff --git a/lib/pages/pharmacy/order/Order.dart b/lib/pages/pharmacy/order/Order.dart index f153dd35..576bf2a0 100644 --- a/lib/pages/pharmacy/order/Order.dart +++ b/lib/pages/pharmacy/order/Order.dart @@ -1,6 +1,5 @@ import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/order_model_view_model.dart'; import 'package:diplomaticquarterapp/models/Authentication/authenticated_user.dart'; -import 'package:diplomaticquarterapp/pages/base/base_view.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:flutter/material.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; @@ -11,12 +10,13 @@ import 'package:diplomaticquarterapp/services/pharmacy_services/order_service.da import 'package:diplomaticquarterapp/pages/pharmacy/order/OrderDetails.dart'; import 'package:diplomaticquarterapp/core/model/pharmacies/order_model.dart'; import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; +import 'package:diplomaticquarterapp/pages/base/base_view.dart'; - +dynamic languageID; class OrderPage extends StatefulWidget { // orderList({this.customerId, this.pageId}); - var languageID ; + String customerID; OrderPage({@required this.customerID}); @@ -38,9 +38,9 @@ class _OrderPageState extends State with SingleTickerProviderStateMix List pendingOrderList = []; TabController _tabController; - AppSharedPreferences sharedPref = AppSharedPreferences(); +// AppSharedPreferences sharedPref = AppSharedPreferences(); getLanguageID() async { - return await sharedPref.getStringWithDefaultValue(APP_LANGUAGE, 'ar'); + languageID = await sharedPref.getString(APP_LANGUAGE); } @override @@ -48,6 +48,7 @@ class _OrderPageState extends State with SingleTickerProviderStateMix getLanguageID(); super.initState(); + _tabController = new TabController(length: 4, vsync: this,); } @@ -179,7 +180,9 @@ class _OrderPageState extends State with SingleTickerProviderStateMix MaterialPageRoute(builder: (context) => OrderDetailsPage(orderModel:deliveredOrderList[index]))); }, child: SvgPicture.asset( - 'assets/images/pharmacy/arrow_right.svg', + languageID == "ar" + ? 'assets/images/pharmacy/arrow_left.svg' + :'assets/images/pharmacy/arrow_right.svg', height: 20, width: 20,), ), @@ -219,7 +222,9 @@ class _OrderPageState extends State with SingleTickerProviderStateMix ), ) : Text( - deliveredOrderList[index].orderStatus.toString().substring(12), + languageID == "ar" + ? deliveredOrderList[index].orderStatusn.toString(): + deliveredOrderList[index].orderStatus.toString(), style: TextStyle( color: Colors.white, fontSize: 15.0, @@ -388,7 +393,9 @@ class _OrderPageState extends State with SingleTickerProviderStateMix MaterialPageRoute(builder: (context) => OrderDetailsPage(orderModel:processingOrderList[index]))); }, child: SvgPicture.asset( - 'assets/images/pharmacy/arrow_right.svg', + languageID == "ar" + ? 'assets/images/pharmacy/arrow_left.svg' + :'assets/images/pharmacy/arrow_right.svg', height: 20, width: 20,), ), @@ -417,14 +424,26 @@ class _OrderPageState extends State with SingleTickerProviderStateMix color: Colors.green, borderRadius: BorderRadius.circular(30.0) ), - child: Text( - processingOrderList[index].orderStatus.toString().substring(12), - style: TextStyle( - color: Colors.white, - fontSize: 15.0, - fontWeight: FontWeight.bold, - ), - ), + child: processingOrderList[index].orderStatusId == 20 + ? Text( +// deliveredOrderList[0].orderStatus.toString().substring(12), + TranslationBase.of(context).processingOrder, + style: TextStyle( + color: Colors.white, + fontSize: 15.0, + fontWeight: FontWeight.bold, + ), + ) + : Text( + languageID == "ar" + ? processingOrderList[index].orderStatusn.toString(): + processingOrderList[index].orderStatus.toString(), + style: TextStyle( + color: Colors.white, + fontSize: 15.0, + fontWeight: FontWeight.bold, + ), + ) ), Container( margin: EdgeInsets.only(left: 8, right: 8, top: 1, bottom: 8), @@ -765,7 +784,9 @@ class _OrderPageState extends State with SingleTickerProviderStateMix MaterialPageRoute(builder: (context) => OrderDetailsPage(orderModel:pendingOrderList[index]))); }, child: SvgPicture.asset( - 'assets/images/pharmacy/arrow_right.svg', + languageID == "ar" + ? 'assets/images/pharmacy/arrow_left.svg' + :'assets/images/pharmacy/arrow_right.svg', height: 20, width: 20,), ), @@ -794,16 +815,26 @@ class _OrderPageState extends State with SingleTickerProviderStateMix color: Colors.orange[300], borderRadius: BorderRadius.circular(30.0) ), - child: Text( - widget.languageID == "ar" - ? pendingOrderList[index].orderStatusn.toString() - : pendingOrderList[index].orderStatus.toString().substring(12), - style: TextStyle( - color: Colors.white, - fontSize: 15.0, - fontWeight: FontWeight.bold, - ), - ), + child: pendingOrderList[index].orderStatusId == 10 + ? Text( +// deliveredOrderList[0].orderStatus.toString().substring(12), + TranslationBase.of(context).pendingOrder, + style: TextStyle( + color: Colors.white, + fontSize: 15.0, + fontWeight: FontWeight.bold, + ), + ) + : Text( + languageID == "ar" + ? pendingOrderList[index].orderStatusn.toString(): + pendingOrderList[index].orderStatus.toString(), + style: TextStyle( + color: Colors.white, + fontSize: 15.0, + fontWeight: FontWeight.bold, + ), + ) ), Container( margin: EdgeInsets.all(8.0), @@ -969,7 +1000,9 @@ class _OrderPageState extends State with SingleTickerProviderStateMix MaterialPageRoute(builder: (context) => OrderDetailsPage(orderModel:cancelledOrderList[index]))); }, child: SvgPicture.asset( - 'assets/images/pharmacy/arrow_right.svg', + languageID == "ar" + ? 'assets/images/pharmacy/arrow_left.svg' + :'assets/images/pharmacy/arrow_right.svg', height: 20, width: 20,), ), @@ -998,15 +1031,26 @@ class _OrderPageState extends State with SingleTickerProviderStateMix color: Colors.red[900], borderRadius: BorderRadius.circular(30.0) ), - child: Text( widget.languageID == "ar" - ? cancelledOrderList[index].orderStatusn.toString() - : cancelledOrderList[index].orderStatus.toString().substring(12), - style: TextStyle( - color: Colors.white, - fontSize: 15.0, - fontWeight: FontWeight.bold, - ), - ), + child: cancelledOrderList[index].orderStatusId == 40 + ? Text( +// deliveredOrderList[0].orderStatus.toString().substring(12), + TranslationBase.of(context).cancelledOrder, + style: TextStyle( + color: Colors.white, + fontSize: 15.0, + fontWeight: FontWeight.bold, + ), + ) + : Text( + languageID == "ar" + ? cancelledOrderList[index].orderStatusn.toString(): + cancelledOrderList[index].orderStatus.toString(), + style: TextStyle( + color: Colors.white, + fontSize: 15.0, + fontWeight: FontWeight.bold, + ), + ) ), Container( margin: EdgeInsets.only(left: 8, right: 8, top: 1, bottom: 8), diff --git a/lib/pages/pharmacy/order/OrderDetails.dart b/lib/pages/pharmacy/order/OrderDetails.dart index 57cddeca..b7d92543 100644 --- a/lib/pages/pharmacy/order/OrderDetails.dart +++ b/lib/pages/pharmacy/order/OrderDetails.dart @@ -2,11 +2,11 @@ import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/order_model_view_model.dart'; import 'package:diplomaticquarterapp/pages/base/base_view.dart'; import 'package:diplomaticquarterapp/pages/pharmacy/order/Order.dart'; +import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; import 'package:diplomaticquarterapp/widgets/dialogs/confirm_dialog.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:flutter/material.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; -import 'package:diplomaticquarterapp/widgets/in_app_browser/InAppBrowser.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:diplomaticquarterapp/widgets//pharmacy/product_tile.dart'; import 'package:diplomaticquarterapp/config/config.dart'; @@ -16,15 +16,14 @@ import 'package:diplomaticquarterapp/core/model/pharmacies/order_model.dart'; import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; import 'package:diplomaticquarterapp/widgets/dialogs/confirm_dialog.dart'; import 'package:diplomaticquarterapp/uitl/app_toast.dart'; +import 'package:provider/provider.dart'; - +dynamic languageID; class OrderDetailsPage extends StatefulWidget { - var languageID ; - OrderModel orderModel; OrderDetailsPage({ @required this.orderModel @@ -37,12 +36,11 @@ class OrderDetailsPage extends StatefulWidget { class _OrderDetailsPageState extends State { getLanguageID() async { - return await sharedPref.getStringWithDefaultValue(APP_LANGUAGE, 'ar'); + languageID = await sharedPref.getString(APP_LANGUAGE); } - AppSharedPreferences sharedPref = AppSharedPreferences(); +// AppSharedPreferences sharedPref = AppSharedPreferences(); String orderId=""; - String customerId; List orderList = [] ; List cancelledOrderList = []; @@ -56,9 +54,9 @@ class _OrderDetailsPageState extends State { @override void initState() { + getLanguageID(); super.initState(); print(widget.orderModel.orderItems.length); - getLanguageID(); getCancelOrder(widget.orderModel.id); // cancelOrderDetail(order) } @@ -109,9 +107,9 @@ class _OrderDetailsPageState extends State { ), child: Text( // widget.orderModel.orderStatus.toString().substring(12), - widget.languageID == "ar" - ? widget.orderModel.orderStatusn.toString() - : widget.orderModel.orderStatus.toString().substring(12) , +// languageID == "ar" +// ? widget.orderModel.orderStatusn.toString(): + widget.orderModel.orderStatus.toString().substring(12) , // TranslationBase.of(context).delivered, style: TextStyle( color: Colors.white, @@ -140,7 +138,7 @@ class _OrderDetailsPageState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text(widget.orderModel.shippingAddress.address1.toString().substring(9), - style: TextStyle(fontSize: 11.0, fontWeight: FontWeight.bold, + style: TextStyle(fontSize: 10.0, fontWeight: FontWeight.bold, color: Colors.grey, ), ), @@ -289,7 +287,10 @@ class _OrderDetailsPageState extends State { totalPrice: "${(widget.orderModel.orderItems[index].product.price * widget.orderModel.orderItems[index].quantity).toStringAsFixed(2)}", qyt: widget.orderModel.orderItems[index].quantity.toString(), - img:widget.orderModel.orderItems[index].product.images[0].src.toString(), + imgs: widget.orderModel.orderItems[index].product.images != null && + widget.orderModel.orderItems[index].product.images.length != 0 + ? widget.orderModel.orderItems[index].product.images [0].src.toString() + : null, status: widget.orderModel.orderStatusId,), ); } @@ -444,20 +445,19 @@ class _OrderDetailsPageState extends State { ), widget.orderModel.orderStatusId == 10 ? InkWell( onTap: () { -// Navigator.push(context, -// MaterialPageRoute(builder: (context) => InAppBrowser())); + model.makeOrder(); }, child: Container( // margin: EdgeInsets.only(top: 20.0), height: 50.0, color: Colors.transparent, child: Container( - padding: EdgeInsets.only(left: 150.0, right: 150.0), + padding: EdgeInsets.only(left: 130.0, right: 130.0), decoration: BoxDecoration( border: Border.all( color: Colors.green, style: BorderStyle.solid, - width: 1.0 + width: 4.0 ), color: Colors.green, borderRadius: BorderRadius.circular(5.0) @@ -584,9 +584,9 @@ class _OrderDetailsPageState extends State { } } +} -} diff --git a/lib/pages/pharmacy/profile/profile.dart b/lib/pages/pharmacy/profile/profile.dart index e52d059b..eccf9e6a 100644 --- a/lib/pages/pharmacy/profile/profile.dart +++ b/lib/pages/pharmacy/profile/profile.dart @@ -3,35 +3,45 @@ import 'package:diplomaticquarterapp/models/Authentication/authenticated_user.da import 'package:diplomaticquarterapp/pages/ContactUs/LiveChat/livechat_page.dart'; import 'package:diplomaticquarterapp/pages/ContactUs/findus/findus_page.dart'; import 'package:diplomaticquarterapp/pages/DrawerPages/family/my-family.dart'; +import 'package:diplomaticquarterapp/pages/login/welcome.dart'; import 'package:diplomaticquarterapp/pages/medical/prescriptions/prescriptions_home_page.dart'; import 'package:diplomaticquarterapp/pages/pharmacies/screens/lakum-main-page.dart'; +import 'package:diplomaticquarterapp/pages/pharmacies/screens/lakum-terms-conditions-page.dart'; +import 'package:diplomaticquarterapp/pages/pharmacies/screens/pharmacy-terms-conditions-page.dart'; import 'package:diplomaticquarterapp/pages/pharmacies/wishlist.dart'; import 'package:diplomaticquarterapp/pages/pharmacy/order/Order.dart'; import 'package:diplomaticquarterapp/pages/pharmacy/pharmacyAddresses/PharmacyAddresses.dart'; -import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; +import 'package:diplomaticquarterapp/pages/base/base_view.dart'; + +dynamic languageID ; class PharmacyProfilePage extends StatefulWidget { @override _ProfilePageState createState() => _ProfilePageState(); } class _ProfilePageState extends State { - AppSharedPreferences sharedPref = AppSharedPreferences(); + AuthenticatedUser user; bool isLogin = false; String firstName; String customerId; + String lastName, mobileNo, identificationNo; + int languageId; + _ProfilePageState({this.customerId}); + getLanguageID() async { + languageID = await sharedPref.getString(APP_LANGUAGE); + } getCustomer() async { String custID; custID = await sharedPref.getString(PHARMACY_CUSTOMER_ID); - setState(() { customerId = custID; }); @@ -41,15 +51,26 @@ class _ProfilePageState extends State { getUser() async { var userData = await sharedPref.getObject(USER_PROFILE); - if (userData != null) user = AuthenticatedUser.fromJson(userData); + if (userData != null){ user = AuthenticatedUser.fromJson(userData); setState(() { firstName = user.firstName.toString(); print("this is user" + user.firstName.toString()); + print("this is user" + user.firstNameN.toString()); }); -// this.isLogin = user != null; + } else{ + if(userData == null){ + Navigator.push(context, + MaterialPageRoute(builder: (context) => + WelcomeLogin()), + ); + } + } + +// this.isLogin = user != null; } void initState() { getCustomer(); + getLanguageID(); super.initState(); getUser(); } @@ -97,7 +118,9 @@ class _ProfilePageState extends State { color: Colors.grey), ), Text( - user.firstName.toString()+ " " + user.lastName.toString(), + languageID == "ar" + ? user.firstNameN.toString()+ " " + user.lastNameN.toString() + : user.firstName.toString()+ " " + user.lastName.toString(), style: TextStyle( fontSize: 14.0, fontWeight: FontWeight.bold), ), @@ -417,6 +440,74 @@ class _ProfilePageState extends State { ], ), ), + SizedBox( + height: 5, + ), + Divider( + color: Colors.grey, + height: 20, + ), + InkWell( + onTap: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => PharmacyTermsConditions())); + }, + child: Row( + children: [ + Image.asset('assets/images/pharmacy/terms.png', + width: 25, + height: 25, + ), + + SizedBox( + width: 10, + ), + Text( + TranslationBase.of(context).conditionsHMG, + style: TextStyle( + fontSize: 13.0, + ), + ), + ], + ), + ), + SizedBox( + height: 5, + ), + Divider( + color: Colors.grey, + height: 20, + ), + InkWell( + onTap: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => LakumTermsConditions(this.identificationNo, this.firstName, this.lastName, + this.mobileNo, this.languageId))); + }, + child: Row( + children: [ + Image.asset('assets/images/pharmacy/terms.png', + width: 25, + height: 25, + ), +// IconButton(icon: Icon(Icons.error_outline), iconSize: 30, +// color: Colors.black,), + SizedBox( + width: 10, + ), + Text( + TranslationBase.of(context).conditions, + style: TextStyle( + fontSize: 13.0, + ), + ), + ], + ), + ), ], ), ), diff --git a/lib/uitl/translations_delegate_base.dart b/lib/uitl/translations_delegate_base.dart index d10cb542..f60d010f 100644 --- a/lib/uitl/translations_delegate_base.dart +++ b/lib/uitl/translations_delegate_base.dart @@ -770,10 +770,15 @@ class TranslationBase { String get noOrder => localizedValues['noOrder'][locale.languageCode]; String get review => localizedValues['review'][locale.languageCode]; String get deliveredOrder => localizedValues['deliveredOrder'][locale.languageCode]; + String get pendingOrder => localizedValues['pendingOrder'][locale.languageCode]; + String get processingOrder => localizedValues['processingOrder'][locale.languageCode]; + String get cancelledOrder => localizedValues['cancelledOrder'][locale.languageCode]; String get compare => localizedValues['compare'][locale.languageCode]; String get medicationsRefill => localizedValues['medicationsRefill'][locale.languageCode]; String get myPrescription => localizedValues['myPrescription'][locale.languageCode]; String get quantity => localizedValues['quantity'][locale.languageCode]; + String get conditionsHMG => localizedValues['conditionsHMG'][locale.languageCode]; + String get conditions => localizedValues['conditions'][locale.languageCode]; // pharmacy module diff --git a/lib/widgets/pharmacy/product_tile.dart b/lib/widgets/pharmacy/product_tile.dart index b56fc625..bdb45cb3 100644 --- a/lib/widgets/pharmacy/product_tile.dart +++ b/lib/widgets/pharmacy/product_tile.dart @@ -1,14 +1,14 @@ -import 'package:diplomaticquarterapp/pages/pharmacy/order/ProductReview.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_html/style.dart'; -import 'package:font_awesome_flutter/font_awesome_flutter.dart'; -import 'package:rating_bar/rating_bar.dart'; -import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:diplomaticquarterapp/pages/pharmacy/order/ProductReview.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:flutter/material.dart'; +import 'package:font_awesome_flutter/font_awesome_flutter.dart'; +import 'package:rating_bar/rating_bar.dart'; + class productTile extends StatelessWidget { final String productName; final String productPrice; @@ -18,12 +18,13 @@ class productTile extends StatelessWidget { final String totalPrice; final bool isOrderDetails; final String img; + final String imgs; final int status; productTile({this.productName, this.productPrice, this.productRate, this.qyt, this.totalPrice, this.productReviews, this.img, - this.isOrderDetails=true, this.status}); + this.isOrderDetails=true, this.status, this.imgs}); @override @@ -38,13 +39,23 @@ class productTile extends StatelessWidget { children: [ Row( children: [ - Container( + this.imgs != null && this.imgs.length > 0 + ? Container( margin: EdgeInsets.only(left: 10), - child: Image.network(img), + child: Image.network(imgs), // fit: BoxFit.cover, width: 80, height: 80, - ), + ) + : Container( + margin: EdgeInsets.only(left: 10), + child: Image.asset( + "assets/images/no_image.png", + width: 80, + height: 80, + ) +// fit: BoxFit.cover, + ), Expanded( flex: 5, child: Column( From 5fa5e9b7c847029212d7357e8f860c39caf92d38 Mon Sep 17 00:00:00 2001 From: Fatimah Alshammari Date: Tue, 29 Dec 2020 11:47:52 +0300 Subject: [PATCH 13/18] fixed orders and profile --- assets/images/pharmacy/Logo Parmacy-green.png | Bin 0 -> 38549 bytes .../pharmacy/hmg_shipping_greenlogo.svg | 25 +++++ .../payment/LogoParmacyGreen.png | Bin 0 -> 38549 bytes lib/pages/pharmacy/order/OrderDetails.dart | 89 +++++++++--------- 4 files changed, 69 insertions(+), 45 deletions(-) create mode 100644 assets/images/pharmacy/Logo Parmacy-green.png create mode 100644 assets/images/pharmacy/hmg_shipping_greenlogo.svg create mode 100644 assets/images/pharmacy_module/payment/LogoParmacyGreen.png diff --git a/assets/images/pharmacy/Logo Parmacy-green.png b/assets/images/pharmacy/Logo Parmacy-green.png new file mode 100644 index 0000000000000000000000000000000000000000..72862b330df17999c5094e379a72e46bb0c558ff GIT binary patch literal 38549 zcmdRVgb4(wImHNH>BA3J3^8rz6b}(m6Cr8+11eT|*8?4kBGc*B~h! z0}Kq`;a`{r?|RQ?)wlBGq;#Yp5QzM>!pnCc5K$BeL=bR| z82AgsZ<`7D@4CH$jw1*}d+YKaLHFZ*DG-PS^!nus4Y%Y!GcX&Y!<6k46}`Kk+k@V` zesVJrL?1GwF+JY2#!@V6QONaFp@A=Ac!vVxq~Izf_+VA3Y*6`4n5AV!>*GXXYB5~_ zCCmczkTBoOsEo;$?G&ZaXZli%z7yY#*Ze<1g=O!Pk6a&0FDx-cN$y0POQiLS%x#}| zr&9dPRA#_=^<%yIPm6q+i3q*koE&chCh}8nSuy{51i^prX3-)2av}ct z&C+-)<|MV#N@drLQ;PEM$ds{@I%lTI5?>(KqgM1Z@+Xg%wGsbDrX0oX6MW<>=1ja9 z_2kJDk^;fYmkBiA>0{i9Ce6iU53v9PFyVq@F%Npe|6Y^cQtBt^dO|-_77RR3ZkLLo z#!>0Nmq60b3L-kR=*gp{7!R41-oACY3we8+;oprVGsfWwiOI=l`>zC_zjG63X1MUc z$6fh*@7{LZt1C+bP>ySne;1ZMAXsYDjNfi;@>N~fJzI2Z&IJ?w?MM$fc9)ixjPCsJ%F}5cBhEh`$S>E}Y#Dy?40ZMIDBoYaEZ-?sz zOs8hg?c>M2!p``MCqIjI>pte_G#Ss~+Y6i>YP&HH;gN@#2a8qLE?xSvv510Mn|C|u zm)j_$l-_TjyOI?~mBPi}X09LCZ-yoszrNk? z25ox?Dm<8Bl}8j-98nkIeREE~xM~LA|BUB$dZvMC887X&;b=mppg4YcaU0shj9*}W zJnH(_{6NOxT8*BV2%*k8j!D20>~=4rXaU=(r;4l`5aZIML43p z^go=f1;GZ2z=fKFD|i2Pc(*4HJCJw4XUZ+?YGIBGU^^r*<5(^|8dTK3`2?mPQS%~h z;X^N^B#}E5i7)JL{JnWi9T!>)xQ0hZXWG$)JcDMDc8kehg9klTpMy9DfBHPuwa*?U zws`E$9+r##_i8^p=p3VF4ndWlwa056{9DyaN{HTqUXPa>gW^4}tDnqnd%Cn7;8At78qN!@ay zw&1nD^B$u#3QKx{;K+{JP^ejEA#JJAASFK$ye@L)W64s zQ8NAOLBlHk&$&2d-2P2mJ8r}YCpo>+MyTej+U07bhcEYtEq!7_XW#zf!E#Ssr55z8rCfG-p^2my znbg!W1qALlYe){-o;Ahc$9O93NY zL|>7?Y@cmA_;TcOwe&jJl8&RzVr`w*Nrk0Bc`F$&^Xf!w*W0me_pO19D8do3hWZ{t zi8;XY8uI!HK8Y(nORwm&V%k_4Hb*yUk9v z)5*e8CeM7_{9JE;YKe(@mNXpq_MW5VmU%=!N%w|cLrW-c2H_1!Y^EICJ#Gav#Mv zXhPqkXnPvAo2>iNq?l2!U=c+7AW*rmms6uH8yh!ruY%UCv!m3oSbnsqKm4p}#BTlP z+PA*#1kzmzOU3=W1ZDAkDTn?Lbv|nX(4I_8C(e+bU*+u$Ab{Rei@ESCFxj8c@@OOx z$$t#ks5Ga($?w8DD9F?x={;(vt0M03X`#E;lVk0B|3=#&=q=whj|QxXniz`58+iBM9avnuvCmZqnellfHM z9(b}ohx-98=6mIx>2Ck4oAF`|k~#$Lz3YONg)rZs6~GiTj$6uQo`OzXe`o!=+C?pM zX?djUV+g@Y^PP}JZxATG>{_JX`#r)XRDH0eiP}ev|N6AAQa*~eg;!O{$G7Lc$M08v zefk}CsLsKIfsiN<I-}t%$s#mDWv?33N6HME!_!o={gdKeR8Oa~oZ0@-@?jKGB zqG+WW=X-gi-Ty`|-}a}f@5-*Sh@=@+wAwTvxrf;=?(m5}WWVz_L`ByQ$K_7^l=hF+ zpL*{yyBp}f`^PP};p9M0a>Mjrpu3IjS288JUA-UqqH<|6Cjm=iuGaIhE_YpwCV>tgEZLSM|AE zM9^V6S;TX!iqpVK(01HdSF0*^DW;dPv@*^diKczIU23>r429-+M}0A>UZJb2v<`6P zG&6B=8EZV=D{XZ2m%Nj*xtSy09QP&i0TM>%*`u#5PVN@bXQ!wq+)p%6y|^>@U{;dK zV86!2?&m^m<}Lh+Yz6+tD&Km9vYENEyr;a`il=&cxh<84-RzCKLRJ?aPEuojc5qY` zfxZq+i5QPP(=$&^zT4Fy>9gHUR2oDa8nq*AR(~>k>F*&-Ow2;KkhEuie%SO6s4wSe z(MZ(|vA6+2A;Cud_ED6$wU5KW`WhoHPSW}^E{yuB3Gp;A!+=F&e}YaD25;?4_X}

BB9C0S`G=LMqO(0#Mpim+CfGr@1Szl*@#{_Kh`qLR zvEJXm;#Mw}zSlra#hT-Sm`|0I)A*mL$Q7=tDvXqu%y?>dxtHMMm2nzGAQE|s4+sN` z)J~!X5?I+P-$!$;xQUqyi*?Md2TB)J?`+mTPoX{+>w#vDaIWT}BLw@wn7sG@+~ebO zWF4vr-fpMjnu}1*{4%6($%Oet;v&z=ab> zvWCYoU*{Oz9>&hQv3f^3tJ@p(r@6oIRFi7xdV&@a=BWzY~qXh;qM9X-lSU56W9FOMnl`(;&s1>YYQ zIBZJANip#W-eKU*cC6^@6_uwoIlGabY!!g{nQ)y3E_?r46htGIlKODMV}<7PMsUG3 z0^k+q4_DLY&_|GXxVjPCj1J}xxQbqpDDJ;Uqh4F^Lv|%qxGmDdDOLSgE$7E~UcKty zPajH1eVZ-Ut`2!g#|>W>TkCJ=8$6Xb^#)I&KowwmhF{|w55f@UKpfg8vmjpJ^_6h| zhdp}HtU}OtG|QM%)J+i0EjpL~=2@?=V~N}_#*q3sh$@AtJ@*`>(X2wTc$edf!sJ(L zy`I_9NJDA{X3rIBJHPrM#PnDj&My}Tv(gHQv!(FcxqO5Qp{-M#=A!weI!G0Q^sb?z z)sh?%2Re@1EQAW(K$J|_w!14RWYBzynM*fZ4Dp9Y#ua0b(!<(36w(-XFgY zBsbrNhsS2e$O{aW8#7@3eN?uDHbFzhfQ!X@u z_L+Q!WdxpdS}j-Tlq2sB3*o1LK3O&P$n84MZxfTq4mzcgR0`)3PZO_cF?5jSc@`9i zkc2HHzA{z@gH}z|byIqviM&O^lwm5$QcLUoro34Z+l2r=yYjWQZ)WQwRakqj@VfT_ z%<%yaNR$*6$w+Sb<{nPZns4bK-3O!Uju(g=mmrd z3be||auFeA%_K%uYY^n6Wu*PioVW|uAok51BJ@FXMzA^I!KQm;5E#8xQ9g-t_#FcN zRtjINm+3!Nq9EVd*veus zZEbF@QgqszladC=7_JUDp?DTTPbZ&B6Z__COl-hKH48%@PGVNg>uEZM5o!V?pfJnF z^6?;@ur0QU2{_Kc7-{Q9uD_dZ;wsmdnhBQ^itZ>NW25xH@ENua`)2dSANFzo8F;N`HJqG&HNsj{BDl6vv(vs5+_>~3=jdI+0u*tqQ zI$8^=7c;LNwgiB&4vNA9=?|L~&IvYmx}$*Q%1q8y_Ewc>o1B{|D_-^G=}VTdK7W>C zr!g4I4;JJ$uxefqy?1|=SkCrkf2i1ub39eV2GVc#9o6klW0}QD@&OQ~^9Cf0${L)x6Yjno4 z4p?*V-o_ufx6*t7;AFYNMK@aBhYw7${0wT1PpQ^AnVCd9u0CH~FSOB9r2rW#p+s@_ z4K$d{6}=r2hPHFrmuCC?rft(^QE=i*n5pXeMZEg`8j$thzJ$oPBnI}O8&W&8as;3x zzLmW@4~uLbi4*&p)tcGs=W;3JR;AOms$I-`YEGd&e!j7j3xM3iaUatDoce+(WBz^V zW48)U$47C(Ju=!rj>$$+EhOtxZ18r}fl8tV>p?d3`|~7NqgtSCsV7i`m#=)ae>5*K z)Fb;cKcFjft~|Fq8{xmq!KGtrX?kT{R!Qg$W+%0#r(*l9R* zyBUa*Rw#L+uAwOJ8FF}7!PfnL#oTNU@mgWxr+VJ_Z-Llnrh`nNlNRk7cP_4Ev>Fp| zo=g@V^%5Q)jvi@zIb~>eHFdz1an&5|s9r4q;JD03uE!cwN(Esdg{6$F6Yu$GuSJ=x z=-TAl=&#&jfodq{suY*)WpY9cK)ZDtxn6;&UvV1yXHKU>PxpuFcI99tvG;YSDHX^T zcvX1=sdv}3vX4-Mo1Dsbbdvdgz5Fa7!=_`4TdiG{h?&a%g-ki)Y=}aIN)`jVT;WPDc*24Z0d=C zXmjW#%--uLhFXVKmMa7nrY+xNGGu+y?ZM>~VS24;C~i5xtQGU2ZqjjZg-I@l=DLEG zY6EG|Dz>O(xz(?WX2Bs`U#Nqwte2)N6fH2o+1A@c>{&wJQK7*abiHLwIqX$!?lQuD zSi`+!<6#*4eJ+#8>idxs`ew3$i{S)|cOKt;YYhuIk#Jvc)_+;zNu-O)$iEgfY-+7l zp5^$1vo6+?JsSY&udHP>MuA{yn6AYyG~g7BTIr*~6La*;Q`<7!D&;}l zpjNhLBupfbDYbv7Owrj^WzII$b|ZqIm2>uJ@fUYqg@n!<>tsIa``Kd-v9E3gZwRPU zPc>>WuG~1{1<~pO=bk8Wg^U{mA39Dn{gAF zW$|I$z1%2>uF!Ki6ctWHRMXI-gGq3DVl-x!n6*X}UB}GAAn6e(MEP0Njcq!V)ibbK+{O=oE)Yin^`09DbuRWwt^FV_gn0>l8Hq620;yPA%e1W1ERff zAQLhnCc??5aQi_g^rCABM8pNf+{NSmmT?3QLNvJrY;7NA?ex=hVbvf7c{u=u35o=IF zvyj4GhIjm;pMXY(V8`LfP_+tL8gwmlKHi18i=!12KLezkePh)1ynQ$gg+sY8UF9M_ zyFnTq5pkb~PNU`93I2f>WSdN9FS185hxlRK-DjjHJ_~LG>5lgoc)d&_gECXizrfU( z?j}*mAgg*J23x7G#-9+WQiOQT>ubDjdL`j>4Hwv`1E}3T6*(ABkN)<^pX}n4Manzah0QkeKs-|7 z2Jfb5=~Ix3juk^@NI-r7Q4L5mWvD!0bM zP)t&ZQLkQ*K8yHUU-mytTb=_a0Rr*r9kNWVBILeQ&jtDB57!=V0LidiJR)m@+IGUC{AlnT{g zpA>p$d5?63BZ3lVXrxBYX6G>(CBq)^==#j+x`-0WO{0j>s9^%o z8GHVr+}6&tw*~0hYEMPWw!tz0ut3iHp3i(bL4n5|6IB-G$0(s*_SFJVYxZ(^7YcDY ztK46$`$c`_rfa?TuL}=a)|Is z^B%UZguIW};49|WBy{i(BN}geAX<#&>rsk+)qALiKLJl=*V4kVKYxCYlkC5!;yy2%?$O$K1TLq2DMS}>Fb|e{Io?uc zn8(C_OhMnOaWgi?+9*w2U`BO&r_u7Dc4)U5pb8&JUirE|5vpOuA*||Kv|h_YlWIO( zA8Y(}e6~Qx>cEQ{%v2g=i98B|j6RPftYU^j>iJP|lQfr0L~7|3oVTe6AtPR#Id-<< z$Y<`bMSI&GNY8+Df=C^(KDHmGl8`Dx_!)s6w#rh_h%-P|8a9M_P%&^fKbzqsuxAy2 z8%<0`$Nz`X1D^51OqX!DY?(L#*Vs*R=w$6=WjJeymLYw3)>4(5Bk(RJWlUMWl8T}5 zRF;}UjmhaaKaouHJA~zW{ZIVvJVl*}|2KA=%OM5-$Txv)^w$ct=yzj|cv+;kVaLUv z-*wJcGJ{{q&2Z!IO25#_f{e0<6E4=LT6@(wv`rU%-sj^ZkKo2k&ROc`fgKnQbcWKH z#hto5eQTqSoCl){Cp{m7^3CU9C37psCE%o<)3Ikq_dbTCqOK38zj%?IYeAhr+z6-K zA$gG)im&`aSfGV|tSs~nV4>UsEWIsN3yrgE!qVJFDbER+vCCuDTx|}af7b4b3V-ya z&-L$;HS$nCzxX*YoYRoXa^cit$(h9)F?UlA!WiM+ZL@Iq2Xo=9BldCRWT3^I6?36n zU=x4Sh-?^VXPl)$p1~&H$os7D(S4a?!$v9q)lT;hw~MF z#(lbdi$Cg}))~+n>C%a;%{`N6L>GC?6y+)GZPGe5*fu<4E&PtVU6%2&u7lke-{ z%@xQ_Dd|FnCuU6~Lb4~e+MT~ORR|!7B0_y6Ui*9G<(Zo0(m`EX!=XKA0gfqXI;c^M z5Gfn;>IuTpuQ_6$tiv)x@GynT8uy4OKhZq{ozQN5!xO3m@k$tV)}^jRXtKS?sM9T= zj_4e3IA!h~y^;vpTiK-OOBgIzsGq9dJd$)AJ}h)cN9zTmo(`w?rd8y=a32AG`Ig%f zr5Qig>-jyD54P}NCfagzt#QuYLb{>4VXEOp==12Y^s-9tG&HlSciK1YpAxq9YLWH# z8)3=ouOPMyUyrqJ%a<3_ze-CB8nw39!{jRr)v2$<^RvhGC0D~rD)Xg_kg1J4lD38^ z!iE$01xKW&`R!7WmbUt`V`C&Fr4Wd_PluWg3LOqrvp%6^f`akxqE`7aE9F-D%aNb$ z+**n+M3WeY1;m=d9rc{1tr_yr@f~e5BnW8bvrq8ujZAgW7PCCaIE!cxD3e^lG1%!l z3*jj0Ub!W+!pbs|5C!VPv&xOR9C>vEvBVN|s_^^uS;(xlG8rLLJb6fK)VJX$$cy!5 zpG?+F8ok5j6WA9D@&hnqE~zBg*3=zRKraVPqQUPPZqy&;+TJ~|6R1VU z&B`J*k!j`!x*Uxx`lG96wK=8*TD*nxl@l2FdTX*dHPf_iUc}qv<-Xpd{<6MDI)m=I z87a-_T81T0EY*$I5*de!3aB`ezbzY)U>cXv4K(YD7ka1#xFN{)k6C$3x5;R!LPnM!L`t|8bg^qiHAyuUutJ#@HD3tS}n| z?yj^$I8yTctOsn@Jy{aP7OIjW?68RKwcP;J2fYzOvt3CyLDJWzJYBT|KtZ>yn7@5c zXf|Jcy5ZynZ3~mXkSw2z62aQy)vb@?JIi6>}4`a{ra#S>Dy|D(4__GsX9~>H>5kbD+El(RGTH6C4A-AX4 zz*TjpwL=ZOj3w)0jAZLC(!STNzw)&IQzHfP&8MQWOEEHfdGSb?SoM)EOR1qfCvdP8 zTt!JUT-JRQ64-?e3ePVVS8HkibSSHryHenPoTy(X8_r-Cr{!8d%*~Q=e$dK9rfUW>aD!|r3!03i4E{r>b*19$uT7ohwnYLi<6Ir81#y5VdD=?dx z$W+IE+SeY?*yBO@Gkvregy^ws|0*^Jg0}dr-v=t&EQF*>`lBe)BPu#3CaIwV zVyi=+^CF%wkJ~i48yS>g4?4X$#phQWHi!L#0QdroP_r#XLHsPbCd<)R;&ba|LF#f0 z1lGn8|2`yiMGqgNC1q?DIkSvO`Ver0J;ppl~^&$6iWEd$n&r0{NtP>sUC^lJn4 zVCQ|?!jgA6V+kiu+f16Iw)ss@I^tGndKPO5Dl(#70I=ll{J!-BXZ}o|$1^0P2mi$! zxgSMSr8kV|oSqy*%;U@&H~jk?>IGNlf^y!h8W2W(0~SKh;8b|SdwdC=z}D%?G1*lveFMXcpId(Nv|P7M zarpB#91W3>T>6g%T4&8|^qX;t!2H0gl*}oR5l_K4WpUq`DI{BD-0vlByhieAfbGAA zdU@-yt?pAF&>b=X(7|dD%OQOU0TjzsKrD*bi;wD$o6k?A3Yb@0HV<;tmw#f;6Skgm z@x);zTTrv^9UG4NQS6aICG}#JP|uI=(`^NuhL|?!o&%UP5AVslGUGZYu+pCv1+nvr zKu{Cqj-oe+P?@3G4>i}g10>p1xJdnb&zy{dcHtv%Ft@Ov!1)teAK0uV+z~lH-ovbp zS}q(X$d(*PsbugJ5 zvSGFtw5#F|2D6NkMOrt{*`2FWk$!@viha271nsK(df6XHKaRN|WvAADX5;Q_lYbt_ z^w^6dK#pt_b3EVWH*^)XP_mGA5P75v);0sNNiP#{fI#^<^T+ZiTyIPijg+zG=w@V} zO(DWhn39S1yX`0aVci08LnS1$0RX4>cU=PucoGvO6DE&PEu$)Y6zVH}@ON%!00zp1 z%+$AIec=(z>zn&B)~6{eVN8$3r?Kf;Kh>B5Nr1d;|E!F4|9mBd!8+UV>Iu2Vv9obL00(ePYdQZ}*xemx-Z~*`i8<7^ zAm`PDkG39C03MhZmtqpjpTD^vP@#P8rek~x0@IzJvrRGUXu1*h4H1%88WVwhw$;(S3r5ODxoo45K zi;gzzilMjV*cbl~;1NMxfWoyp~7j9ZR9gUfjXQOS!T-nbPwAOXpyl-EBZ>aZnjOk&)?bqH9)9$$+ zVb~>Mbgsw__?f-iMc3%4V*Tgo)Rslf-l2$68kDHp>HwI!i$O>lzqVh$hz6>ugXNLxgl+D$iVU|$nVdpg;=b9!XilswWK<6+?#c*+ya?0oKDMr#WY5KF& z;7azU`jfZG$KI9Aj=#HOmOJU~mU?B^3c3};R@FL40OtY?PG9`8nY<9cc+vvJ8M|K6 zkxRRHCG1e_l!p=)pxT?&OXl4$@CNm{Tppkr&XdRe76=W@{|OS`Qa=3t7a}kvui9`FVt!0H2*E1`a#PUcT5`DFxnq{H%o+?hhPq|7rOqWRZ4F84>e$V=jr}|Fj-QB2<(!d1ayMy?+`j>8^P< zKw2~b&cE?j-T=~IYT+%rdr1plHg;fy{B61;vj6@Hw>pd9y)1Lpm!{6&1`DWvw!*X`|v6tmUy%OwVG9GqusXcn~gcwk#ME_HOSf<1$ z%=bcD0SQvqmTQem$LapEKL-DUg!I(glq}NS&EKrt_`hODw&I#usf|MkL!TMa*(Ks4 zyUjgaE&USBUKxTxQal2H*p0nA#!N>Y03+dn8RJB^SD_n>01KCv52yNf+ zc6eL4t08ZL&kVh`hEyE%@Zb99XX_G}Rp{f``ex*d+*NulQ6F+8Kdf(+2S{Z{yh2FI6e!J6h z9&sqv)NC?7?R37rh$LXmmk2u*BXnRD@ADJtPZg-FtTa2?D-v-$TK_hch(JUIwDlbw zy=yc?jtQ+8tt3>M_W($A_TtE>uysgpYV!GP_ko4cf7C194tpa7s?Dx|kjV~aDFvM_ zV;z)sxAK_8*)c^*T~yvS|Kww{c#KMG5NiWd zJezuOh||3$JLk8*+MGM3whDJtdA3(l;Spk1C+K7GMs7S}X^l_K^Uv~T<@$DMz73XM zC%KZ=a3xWKh8ExWYGgL;SU2{W0HF9of3O<56tN*q&E47##s{wmeLsmPL9a$tY6r|*FW#nBBZQ^S;6 zkAVX0JW!;*Qzs%O?$ge|Aa=0pV1N??PKnsUAMXKCPgtai_strt4WC{^%?AYZ@OY() zwlivErsg#=&4kFC__E4Am1b$Hhji=*D&A%Qa?Bxn2q^tDu%dbBLdgBXe&AA6Nfwa$ za`gsy&?1G%q)O|X%pD?1u_rc1bZPB^2`3>~ibIL`HHS>zK`b$h^4D=W(>xSuuRpWXwyi{YsWyI7-| z`&v_ADvVut#~9rUiAYy|9fzWzU7Pa=%rT?8pa|c>;bEVm{TWc-#NLw?{J*>giw1Ne z2&5|tOrSNy|6`BD?bL3P%3ge+0ivc&DMUWRFWuleoZG5pK@_Cr@EOzjD&SUFMrbbT8oce;H5nx~cDz@F@Ft}|P#KQ2~7K!{jP0eEc{wVPE0F z!R(mlcw#$m+M_9vu@7EKSCJ%p0Jh30l^GLWN*Mf74~sjhlUr%nKG@91xmv;my-OT} zf9}*o(d?rD4(i{Wo8Rqhcc3Z3;hTKJ1dB;NMqRGOv9g z(TjLx5!iRj62Rm5#)BC@`Nm!A=~8S*+~&%sSDmgp0}`Q;Br_q@rb%jZc606%Uf39> zN}Q0lp+Iq~a8Rbbdf4@#z$ob5BN?~DJ2z#)KXl8sN}DCeH0;IEb8bKA7z(LhCHO-a z)8NlFjq!081CYz?ykY+CZ<&6~U9LaOv4T>@qguM^WutdEq4lhz^PExYH35MI55vD* zR_IXlvr;7m(H;_(%EON2?T2+?y3X761aCIH-{_80zAV+E@E$u|mCYPR&q{%3-)SxKjI~Wng?uIn9 zym!=2CJVlANsMX=BJ)ny&D4Cd7A&$kTWT5lZZN^p%}d;C^c|CJQI;mrIHov)rU58xH2eeKppDN5gHwkU{Y+0)Nb)O_83>A~#dUE(qiz5$U zwjCu3c!+XIuO0r@YJ+zlr6RV*WriE~1C|~ZG?!1BF1eeCgXIe021bD$Y|mRUx7D@R zxHZ+s#yk2>BL}01qTR&OAiO2t8rVJ|PIb6#X4fCcCj=Y6TtvC?te=|Zt3Rlp| zv7W%)cyOT)rCNX5Eh2lKrKekRQ{|w}I=if;`7O18v}UvO)JZ3Wm$UMiGvZ5Z;Hl8n zF74I!o64W`_MBC5U+q>v|sgzJ(;{HI>@l)N= z+uBD+Yy+IIwk)_#CF$LK8e>}iw(6zlXLd{3O9}76`6x80{etI zK`sC-D<&H=2}e$PyL|KjBxyO`eGzWXYr%P6B)^!JfWkdyH9keVuuxWOy`Pjgq7BtG zS^xEZE;z>#!PMx0w+SzK?IBGGrWwBQ3!7N2!c01hFJ9_K*A2)xyT=FK5Q~-85k+BwDWNM?w9HzY89O?Na3D6 zpkYKRFEB7LvjGqT zjzir8O0J$JRUSA@E2zKtin;gNWRAnvvF~i_=hydS7gk{BAxw5H!tm%eH5g{FAmhgo z#kyVcA>Il6l2Go@a<*=9kVTpB7I>}E?O?kXAY4jEU)+UXoBTEyid9<^SSQ8=aW zx@YcstOldbB_I_t`emd!Unq)3#)>#ld6Hu)FXIdK;<+>nm&f>s!lQEA_m%T-o=t69 zaSOCNZ$B#GieDQm)0qkH6mDG<`x5GRrTwS#pUKV)(>hx#PB_nTQ27cndPLx8tgbOM zO^>LhUg`v>Yh-LS@43MIz0|}4o*zgpz&u z(0%b|1h90hs-01OG?-cv&dx>})YTusWZxt>vtv%3J%XuE80ft=>~u?rCNy$~YI9g)(HmUi68$+kdC_gOj6+{gSVv zNB$p1AGj)YFkSm3`(x$c7u_-|=F`ZU`smqM)KEJ(Ir1PS54I8 z9o;AO$$ncdsPGvTn|}+jvexT}hhHyb2z|L=1zBV!!u$ zF#ziQ?SzvR0|7)@3pdfX19Lz+-rl^xfrz#9KoSve?BeKMFRAI-cVK>MRQ?qpnhvpO z4d?4;1lZy!X!5;-5}4B`Rt0{uQo06>m;4~L2(+H8ZDz0UyR}}!_%bc))#=rh(UF6n zKe&F$3M6nj+4riJAraZ*?D|FoB1xf>B%}nI00fXhK8OBX-5My%#y(KT3@teFPomq_&97 zxiWC%KI}d;(fOc-#Q-O=nmYvRw*ebjrYQnbM`C&&Q^a_{B@x~<2hlNxjV(4%Eu|F5 z4`-$C<*uB2KM#3q7RulJ7WW^KWFcHkw;Bs$uAgFw{X91}PLqtCo{e*dLDJw^YmVXU zz*dQndqHE2%zVo9vezN#;d5~dhpW@1Vb>l|KEe7+g-vOU=jy~--eS<|h`OROC0p)9}_0OnRdn zeb$!i_=+q^gZXTs+nn?&8AJGED+=q6}T&xv%2w1wbu ztMoLvqPiySsTq0iCYZh_S+}I6r*{evX`w6z?LPJOU)_$2ja7jcoON6cczBCx%0F!K z&2InL^*O5?0p&@W)rnKS2HHnG@;RwYRg>^+YNk7s`o&+mmG5NUM=C)bqg6^mOkVIg z>c{NY)5Jl|CX&qiwJ(}x2{Yji$dwYg9zTzfeXSO&1mM#j#1T0_bUiL@-rd{qp9(Ww z05q(TIvO_@9OP_Vi^h$CDV*vDtC7A*S|0&o-!_JQ1sh^fu8AwF z3>|^D3vg7d;l+JLm{9{H>iIoRFZ@5fs>NJgLi6W^jo@q zs-H9oTfWg&g{d0JN5Yw%AVr3iCKdyAu5Mk^Xh$isHP+i&KNjmv9Kb)HjBX2YHHX;~ zrkTZ?7J3xc{D|*8Nm$~Df|eRkZ0Z+#=$}^~f*x|4{Ni|X{p&w1K#8AxF|3p)XySe^ z*f#OR3Z^ILaeEZ+n?T_THA%B>v|)cIQo7%?xlmPJRG>;dDPQ7qEZQH$#YRB$&d30~ z7Tck?5}61b`6R)m>vm_~N~010JyXh*76X+Bp{cx^J}cuU;}~t>dUfM${@N?=?K02$ zvcgj?=;f(hEo#b&Bmq7rX(#(qP%m>A(c#`YTUIMGe1Gn0TKR#MzHkJ;68Ep#Be{Y8 z!ISq3xCK(PZ<2OXG)LcxlQvm1u8ZIvaj%GPZrkY?e)G?eU@eh1MJxTz?RWk|g@oSR zD;PAKQESRuCF^6S1giyvb=HBiabI_ET}XQo5W|H+J(j)uy3jWQ^{9Cbt1Cg6a9;P0CVnZSG z_4a}N3uF`&Tz;yg;U4>`FyeJQ;G>J<3#TEqbxgr)1n=XC<^d~NG4gtez&T*I_pB=lWFL z)R?Q_%~D;2Q1^FJMo51+u~xE08i&nmzVLYRYto1Kt##N)()HUfD@|@jGUP9bh(vZP z^BH|9v43Ro;u-8zYC*9+^`84!RaLh7NsP;nb&tC=zv~Nl6E>4``+pV_<%^D*D^a{M z*c7+2ln8ni`XIDx`%5uNaETyOH9sN56(+f@tjcNit;|KIR`ZiP@G^l_V3X=uvS#*jss`ZMGK|!@g4ju; zjqXal-`bd!`4p~7hJSf|VR~V=l=L3c)YVO9uua2}To%_yASzIO4_aenc!`p|y>gWi zf>=Lddl5EA(~kJq+;{HoPB}g?Ydd4O83)wU+3%zuF9OH>)4K@9JEx7enDRK*NZ#pG zNZe3omH7@)j@d8S5#HQy0}zhtT%O^HIYXEsv6_7{+CPHFDGe~bzQQJT$U#hT+O+(t zj{=|ivhJyz(RWP>P3#SPbh+sJ4BzTcBXi?pxtF9_<$e^2<6Q3hj2twTwWnV#aQ^iq zA_OA4G4uHJh=KW$w8=sO4W#i)SZUH=9no&?1BxL)S@n{Xry`SOac6wruvBR(q9VfI zT;@Z3Jk43bZZ# z>VjxbP1mH8<0M`rr3)L=goM zm2SlVX#-F?L<~|G9U{_kT!O5>fqC-&;qf5QwRZS}1pM#!UbIFzYC(nxa{PF(<64JZr>JD=vvL*asrf zGb_X78=mnLpn>JVjP+flHLO>f$16Xx@zd7=@u$mu-u|-yL%vJPHHw>JFwU)@8WTzi zYFuS(T;6XAs@O@C9++>!HkXrP3F&}+#-=-;j>{*Hh@d#+d$jEaZPNPP1L&%$42fAg z{$|_W6}Gd`#mJ~&#!yy(Mndmk#`s)l*9I+vSO&r5p%hi#=7uZ7lf$ldo=yyZu8%sx zIFaPxKEw7234)0fG=qL{e0@W3;vec&LA+)HB1k`N808LPB2bkad=jhS?~T*%#yj@-1z@@`X4EgC_l`~gW*$%0@9z0SN_=WTAg z5qx?JN5XZH;-T6__1sG_vJ{B?H}_%$S6o6dv*A#=)+tAc2r#N);aM&FyVSCG2J0nx z!3yca2aFm3<%?+wUh%H*lU?H{*3!A>hv0O3gd8OC`sa~v4=gdKM(YZ?B}v>P-uhsl zUCi0DYO9SR1?e|xQA1k4Zg$EG-ieeWMrTSbaMg=skRt%4ir_@Mm%Kwu zi$qyppg~PpVKTQ4rybw)Wh6Agr;UBSX5)R(Px8grgvlZ*{g6p+;m_pah+x^lg)4?k z&m|>HlEofFDdZg8zf@8sfweZ-HZ54_O`eZQdfiJ$qSK}vOMZwQMp23N(NckBO=;g8 z)Z9wvyHgu5DOAYGK})3#C~EtCwCHmG^iCP%q)>1Tp1X@!U;H{7R=)#ju1xMWE}vm> z9&O0~9{MF02p!L8O6i<%aAH{Q&btQ2v`M>3FVK1;AI>*c0qw=$PH$n%xPq9qIBVHW zXofpW8!W14`)h=X{;Ol_-*J|BgLbk~5BLOb6_C9(E&ek$`1(FEhZvw3Xr%U5m92t! zLP)xLl856bi@LS^ypha0S?=z(YBo5iL!>!md;wLie`9dr2EQLv_}yuVQ7Axf;Hii5 zZyXl<$+C`m_xk(i)%+A%EKo7XL`gi_;Q7@Qj^|X_Nz0`g%wzOA1kSj}0*;pF7@xa| zYr)mFm0FI8W<4-Gwt%sCYI#bNsdNgbva}IPnaMl%QXPAucnOh|P{uDK!}vUP<$Qp` zQT0-7*qGvMVb9jW(mgEvO0V^Vu7mA)o6cDA9O{1@&S^p$#*ED36%Y=ptB<#CB63vp z_n9Kbf6f5dUlM6eQ=A(=+X7B~>9wJ;a!Vgo0r^?CM=|*RQ(LA%d8DCM7L^?G%t1B6 z_Ob5W#gnQVbP~XU`@(?_eZy4S%+{_yn+T*e1vn{@UpBop0L{>TaBxJch{#nsc^S6TIAy;l;9<^>JaB3weZXNPn- zXp8L5o(V;22bC7%Ma-GgL8mUx3 z>ge4=_uE=ab2v%Y!-0CNtJvUlYHe2oZiu`9 za+!q9+I;yEz6euhf}xf0Y$*M}^RXm`vxJFYS?UIINe*45(;Krxo`UZ?LVb5bo91Xe z?6Ii})qmuh6p+uSi}O@(+{;dpt!pq*=NvZmsjy%Fv{M(7NLEz%qkQhDYv22_Eil6= z%$D29x7NG31zwcwheY1YDecO3U0C>6*|bP$Tq`~NNq(4lLmF(XQp*U*8IADO6~Fk% ze;wfP{C-M|4iSJmgz7?WXkY(dCRTrMM=9mG#$?t!SEPyWp=Y)-Xqo^yk zS*#Bit^ODYy;WyBX<)1v8~ilNrShfhhC2nh8RM;QC0o;zAoA1?<4|9HKGCKM3t+gP%?~G|UCbyefU8Tbo z-%SjSp6h&wDCK5Gina~JrWSi(gVzdO#AA0jZ>rFw{)6n`x&dgwl%c7m)uL`SO8R#| zw4C6qj&|?gTT!bP(mN{Snv%1UO`KlPwwC+}$GJb*E?TY6HKbp-w6X<;*;r&l3X8fm z^F{86ttSB$2|21>fxp)M4+vneaSglE$|C%)`Ic+l&3ZSU)wd+lEC8PTp;_#;&L7>pnOkA7cIhra@W`r_t0Q_ zAN+j*-NGUda3x3M&dwBzu#$n()OuzBSn%aJyu#Mh)cC?(4G-}Cr?7`s;L$n`v!l6P zp~83ZjNQI2Iq)CAEEVGQ%+B7gZ=YDn=>v&IgdNOk0($N3e!<|3!@z3FcPrI(*l{0C z`;m|6n@O5jI}t}#y;VsSkLId%9U6O^8LSihs$z$f0t@T;>~ z`ijW44xGrqmupIB?K}!AyG^NlOqw7w!mgw*Ig2y;l6IE^|Ms30xYCQ$sAX=}VybQp z-D0#rT1*45KlEBNKMt!%&mIua;Z%gwzB1!t7@LyzlC$11@M$(!Nokt=hN)HSy8-=? z)_0IN@N*4!(5J+dtB0(Guv2k<=f3el`6%<^kNPXl?+Wesd=u&Ou6~`B)LXxg{HZ-J za1}(HZJ(}pylcgA$&}e!a_GEoSIPwh=ljX07!}&YL1$r|8sb*Z8D^1PxWmz2lkZ)- zocUhRW#~DpJuO89@D$-+{g*<>z45d+F*1E*}}mVoC-5H;GSt^S`F z^i_a48^t=(Wyh$aU#zwsMl&@UDiD2PmL@>I(U|!r;>lfl=OlKxtG_(iW^^l=y ztw90xFg798(jR`Oz4g&BVlYQ%sATd7P3GSQ9CzUBl`>oiW4Gi%x85SEgy%43h@@Tj zcz6QSAg;`Smb-H;mS3)n!|3ux(=qD9NAt!f;`bPD^Gk+mlvC~Sw)OYv5J+P82;4ng zlk0UrE9T{%r@r$W;uYXvEKS7PC-#$sFvHbdGCHrNqpgZE4)aq4i_Jt%72TW zuq{D5zhm-+82yt(tLpFK2Y( zm0@N-z!)F0Id{HR{pZaLznRgbyY0(rch@Rx7tqry&6EYBJ0P@=U^JRDaVT|!B$A$?2)|hjIYX_j)C?^a^mm5kf|fNKB(hi%MW-=0P?vv zg+89};KXdsXsML^FwaWxpGd0}epqnfy3?ZoLe8dD;h?Wy=-)V)pPcJ zNMR31eepAi&kJkZJoArQ9fc?i-3OTOmkGebE}Zp*Bw!uc!#J;OpY;_Yj?uqe2Yx63 zCN)XZ0D70k5XCCDUTdKwC@Xg}CreA-{Qjh$#VyZ--;CMSp*>Uz+Ce{#qJv9v<|YFw zZWvvPaR`jRIYI9M)Z9Y0w!Rtd=DP0MxtB6xJVSBv3}Am+>+}ly@gG>~N?XV+T`xcX zHHDQuy>&I@uy$ii-ermOMuv}#oOf)$k4TMGW)HV6EM>Qr0Y*{!hZ^$j+>kJ%gj8f5 z_`P4*73BKhKqlAq*vdGJS@O{6+gPSLhh3=5t?|m#y6|!_GfR2Vu{*^oZVPS<(koyH z%V$OELGan9SbcwEnPRQj=EF#qbSh4`weO}Qd$htaP=5_JgHs2;2e4DyUnZx&4(5ON zE@Uk0@pvug79mPun~bL27y`*;BY4{)<9S$1VONjRcR0R7Uks>%#>RVbFr&83Uq4WV z^^E75amlYA=JRh47-EFNT{{IeW|+WE`my_4BA}jc7ZbC#s->I=X3&QJOUr znHWK;MvY0PsByxkfqDLR+0-o+L9UwKxeI@+rf|gId#8WolD0~pQ?WbjrssRXfO<<4 zyDt0k$s$g(7uNn5~18|YlYJjde%HV8z9@@JK%fa&Q7MJwCa3)hs%4);NgZ= zV`R>aPxQ%ii005Ov_$)y-z$z0Le$>O)i&X8T>A>dyyDmnfg`=+lUdw??L~q7z3=VZ zNX1BQ5Sf_k!nj=x=weICZRE}^2XM~T^nk9%4BwOCG-Shp<5H8Z}_Qx-7@(id10Rm;fxhed22wy4|W}{W)`sc=CbnsQewKuRvI+IR2! zf+KQW^%DEi6O|z#VLcoEx+AeG{37*4=juOOqcaf{)Y^Jxv);G<;`X}CSThrt{{RDM z4A%Pj#l6gIW(fFVJ}=;Sn+o06c4oJ@4F`PJyv>e$b#sJkN)m74$9zW)v3M7)gmiii zQ;DIRtB2G!nVEoB+as$O@fuW6p|znVIjdJOypl2TIvsn7t>*UJ4uSH>1M2au$AjdTIU38IwUa$=>5qEZ1CmpX6GjWJc#6>mD__%k$j@$t@d!2Q zwjChKpOr{n9qa~qCdmLYk`Px*LR)(S7TVZq_O#yw0&UtG4+ALN&0m9FhLV5edULO zmyrm`%^yT=t-&PrTdbSuZHM88*c4Xl!aRu4A>$z+i6zZ z^-oYtJ~0WIw7hy$EHmYd&H>NNx(0NJ%loJni$Tj&Ox`CzEHdy+mTj2=#ePOhRwjI8 zVA`k4K2D6a>m@SE&T}tdL#SU@ITHE53@$TMAI9Zelg}P%M7=BG@lFFy2>n`W7s1&= zJB2#bz8y!`J=b>q$Cea4-^{=VZkZ-&8Z>e=vxj`W4gfu9(uxKSJ4Y21## zfyTAUr4X)2o4cg}xtxi=BH16(>%9?2v(7QpF4s>TgOO>M#XwwkOF04?k6LRt;z=f^ zK5)?W+^n`KHvP-^e{!}3c`?FerG2k)r;zk?Sdw_k^%lW`?f~Lw5X8dF4FJeu;L%$Pjs5P zyl;APSm~=OPBnCR#2{pZ+ZD8szR*wuh^+d-RCi~Ac{|QYlOPdevt(w-BdSQKEFM3P zUj|CYN<~K6^!09!wy4ry$xLbKzhrEP1i)^xc|W{JpG)rIbr0nJIv>Mt`kjS#91GSS ztG7qA8W%4ulW_$3A=&*ILOpo*rB*Ua)hH_9V+`JR^>jV%`g&J zdr+#>=5?|STK{;^RnX-3i8O{16wPU>xq;hkVuc>?4n>OV1_JFL-9T)y2x#QT*Lb3TtQ5vEd^Ie{mK+5e>d<2mOqMP!c+1Fn~gnr0e2;V3ekwSF* zDXdmn&eJ!7KKU7AXG}oXJ8Vs>+MQRG1Z2f!7h;}qu9L=PmgO~Dte@2LGC-Bqif>M} zXe8K9P;8k8WYm*Jl*RCIH-UJ+~biX3J_d5WjRF9g% z)~u;8yOezM{^R5O8JHlcv{@`a9q6uOk%k@PgIIvwaXxYifbOr(`mT~HL+J$u&RT(JY+B)= zMsmiY4P~X30QJ>hXH;5T|58_11wQe&NOl(0ds|Nl5Z0}h}Ej8r!o zMNG#Xbx&~ zc3cnC{W@C+a1;g@KT0kUcb5g^(s&G<;e2iufzcaIiH&zE<-(Yx0N_#qojF+`%T3%zp=3fouPR7ybyuubGdY% z=4Y))wn=<33){}<_MvHf%MYm*Ty^!Xq5-x#7u^9h)))Gz`<|dqTW-H|+lZmnvP~gU z9?nzzdblI{fNAf>7QE5j^&G1YcshkVL(;TBt35P_d=AEPHP?ff5HlS=Q&>Dv=7g4a zjv~!=fPxAj=$E15C*6%{^~=^XuEd~UZ!E=@(?P@A%Ukd^nfHUC_ujuv^JSade(|B& z$i9L{oi+=LS@@KnuYQ#TNtW4ljy1Klsv0n6GiV;xXYC2ZRBr&K$MUQ)wH1B?Z@1Qi z2pymi3*cL+h%K(xeyWy!Q zU#x2w1#hvUe39vQBgSIA2G4P$N%ZBH*nL3KMnIAB!Z|0FqqzWUGCdgZ6!KZVw#>fGwgx|?#J ztPTI4^>v&g;6PCIpYv_pGvMkV@c+bEca;Hig%!ZI@ZU3#$*BR>!oB~w$p*6DeQ`BT z{69Sw%YEQV`TxJ-2Cj7f|0|XN^KZakbofvC^?7kxvLYEsfhLJv;;50=PB-ql{`cd@ zT24|DqS_}(d@uY|W_1a|!+L`OI`>VB59D*QjFPfcOW1)+rn> z2O9mSOL`L*jOO9N4;o@KjgQ`+FP;K&-$O>SUXK56a3#7~=7ac)L~z~7zZ(nw_x%?@ z^=|t=QCWZ&5H)7%w;VjA1Lyv!um64CwEmM)38%AF5JIr}^Qyq(pZxcXpN@|y*PAE~ zwi&082%oA*_yCPX8P&+q~5L z;~_%uiFlbo7lE~{>wVHd$%RcjfwDhI@R=v+#F%2n1=vt-=kph50e5{LTPL*$_CUwT-r@IcC?K5~+s76ZUIF9Gm#9x?U*T!DKeX|tSw zxzP@D7&wWQA?)|7KBFg#Go{)%ckPfRjmxGyL>RAAxXS`G4ZqW+@P$m%v%Sc(OgNDY z%YCPEkC~n$#P@_|m@DMsFLmCFtC#M=|AFc+j{tweoyLFL5spKrPG% z_JI}%oB_6}?F%+`4KqLZq7$#-))t=#j~l)*AS7ngQ0zR3q-@u||S>_~YTE?@DsO80>_dN|ht?5;pHV61M?NEh47z}+^F%-hJq zQhoAF(I7V={rVSFF*qx#gmuV4{O(qX4lO|>Th2B&Z)d<8rEaTfhBCAdA=3cwJnEGM zyOkqr?Ah#S$E;NTH+FQhRvb!WQF-2bSu$A_z1&`nG3hvYRl?1vLjJozbGnY-vZYB z1F9%=@FKyDZfxRWQ-X)pZ1&L3~W*UKV4{`P~q_Yu@&?I zsU5LyI&j6C>?&Y@`@c;k#{|7NNrcj^lu3BfC|>{g@&5(h*0@v5Xs)I(m~5tKcz@}u zq9D9Nrbi`?^5e+JA@emAo)yZQ(T!i}=p2?izveR`zKCxb7k*6{8^K~$Oe%`rx(#dq zP25zi<`+1hY+n~B;l{CvQd2?Yu>FPG!g^UOs=!yqCeGN+CcP6;`E}~BUFoZ|_F>cd z%7iwOS|(NFt@(s-Jij~M2!DeW&Rr*-l9uK+%<=M0nY!WCX4G`r6VFi!rhNbOJTT&C zCHCl7w`LCwTgd5pMIQ+nlc?V#1*VoM6Gk$AkA>bQ2<65)^0RSqFuAKdpLKMTDsHdr z7^2enRuW92B*@$3~B+l-HTFN*+sE=Xu&g)p^Krwq^1_)DAU z_MwHa6pqaJ*|>2MTdz#o^KuLJU$sc8qxtS`b~NJXzmwsE--K5DjuOwMg9yIQh;lZr zv7I^Io<|-(JI(HEQuiN&fX{U2*OP?$&ogAAQCO~k0S+P(b>{+p;VlbyD{9;bcC>{3 zX>cd}eMdI z1@mGK7_Fr?h9u*K16C^5-HX-BUjvl;v)yafH=DGe=FtNEQvLKwlc^A2>Z z&xrM{Z7Ky%p5p!R&ewZdp7-!y9NJw>T2-`r*dTMDK^{GvxsV2^wdV6BOP1_+w=qal zgg&&*Vdiwok?#SPi}A&lmuP9wqzWqFHFEK+Ke2(qRNn-zn*1E4q&2GAdVf@crh&6| zUgjXYXO6VL5ACrw5|QN8Svd++A;{uaWb0 zK4m4wbic*mB<;%IHgt(vlodN`Lx zUM+EPN@H_2?OTP;lY>ZyjBmZ~Fdx?W-}YRCkLfL>q1rXJYwhPhAJv(DP_ae}`Rn+t zmV90MAsxJ-OW6EmJa#qoEmNqDaRGIx7v{1ryJ=>J(3)Fzwgxuxy>JxY0W3R8!O#*> zXekr0S+&W?K=L&t+=MG=z9Y>(WeJ@@ij=AT%IM(deGsVHK}Tk9+ly46oG7cEd}$A8m=G#kDd`W)n9G>)Su33OFv8%|{G( zxAG0)8hyS<49eX8&nz)fN2j$XfL6M*2DcWUsN8JTUu4ijXEQbZPO#I zypBQQY{8>x%EKJ_1FSr&9A2sP?tD%u+xe&y*{;L^mlRFZxejzPVq=oTOW_$h&jMX{ zJ%x8Y2qrVgr}SH{O{9Q_y7w=)-n}bz_2~yk73vuG4=o45)X1;`oJhS=)is`j^+&yiAKIe)!&JPUi1gs{iy+iY2RZ^ze^v)f>`cm^!82>LCV^ zPR9{9f}X>NQ>k&xG;CBNLRSD&TccVq?^!H|tbse`*$gko2FYNJ8$FZ=U&{KQ2Dj(2 zJ$uFxuod8M_TKlVp$ElNA~T8Up1-2|8nMLWB^#F^vBks+lh1Wy?*8FhWLC>zEr>BVAEoc{cN49%Qx;EB*jxlk{F%A!Aef}EOVEmiS?JaRHD(lI( z|8G|^u&Iq>z3n$(LBQHkYVJ)Ln{&V4OvRH{Ty%0NUxf9WUXZvUF_&%t8TZ}$jlH0a z*}>3MwI+r;s%mPgl)kW$QFKPR^X(Z`(C-CLG>$FDX-H@q=ObQ<^^;#VrO&%wfQ;=SCDl>^Dz-DN~gR zfB)GVMzKpJ-RkPewRQn?s=IZ6WE?u?a;~gS&*U3Z{2S&FExmp@8GSAm(DWzz&JFI7 z;0*`$K=&m`v~F!7A~nq(b^nm`db0emeXBG(T5Xy*oFgJ&qL0@4XqjE=FFYI?(S8*K zZJ7SzMDI0!&@|lvd6$v|F~i!Y#vWDS~>0ws!ES(=xEKj@)s5`GmYrQO{d- z3@LY(8o1NDMKCb8M+MAYWta<}yGjHihrY&Zr)^YPwQGE7P<fw@!{;eVsXU!{p+#XH=swj&m=FN7@A~n^XM8 z0j6;A?H)7w^%g5nSQ5%Fdlk3oYLt<;$SLRj?*J%;+b~KzuA`RC?a`^uSh0I4FyO=y z+>S3@#mRW-cWk{dPCI2vEbe@t6OW&dewU>Y`+bW4LkEaXRjhd3&p_ClA69Ddb)O&R zH`rzb9QsLw)gOw?0g%Sm4DJiVdBd(2Lt8eWR7?HLS;up-yRUwmp0B<4LzX<9pSw0{ z+i`3bYP)kB)pRbiBh;fRYYy`E4=m-gUExCdMCGWfUz}(?yrN?f;TYl#zYN6PwJdN* z_6gTT;~U68|3`wx?e#}Ge@&i4u$y1GC^Gk3_3rt(X`S--=bC4b<{iR*;VW0#Hf*Z+ z=3eaAjY`p-=4TI=yju_dM3-Xw?YW5#(WIiqbk=Ri4$_Jvq*E~m3f#;*jVH`U!EMh} zaW74(y__;)HdppKvonN4+6jM87BG)f~Ob-Ge{>MpcGP< zMaCZqHJ(G5h)Xo}w>)b9#=C!%Zzzr`d7YCB@KbytDZTHtn54)x6;0KqaG!46xIRfe z8l0>)DXFyA^Yj%%?I^w%R`J>RCIvbCq_|C}k6DgqUsk;lQea!d5n!e2f=Ljt=bB<> z(tNpw8i@=}C5x@VOmE8WXK%GX;F@#58iEDezDhlF z8py1GYUi(>4x02FC)-U*1Q0NKVrLeb^!~-8W=`@uhP^QTlYNY$tUyE4~9Zq z#;-RQ{5e>sbbN1glcLA`zH9g=!Dg8=TZ%*ld4H^;{YO0jVPKi$e{&G(>wlUTztY6? zo^;*+PO4OwXrioJ0O(@B8`Zsy8vuE(!%seVR zVneZwg6f^$BQ07LT{%+gs!m$89UViw6}TV2@h|LnmneTJZA;>%7!|rt()kYfn-xa! z+SXZFf)8ZnUcdw2CJ4b6Q^zk_WcR90=*k*32xnQUen5Ou@~b!{m~Vhbianz8(CPCJ zuDRczE;zhgGBj1$6j8u7Q9a*scw_>kEHYHljWdbhr=W{4Z3ds>*g+Ql?OKL!1kjm; zX+3ex5JoCjW0j=nt@$Izxibq&6O%vyHS5mEw;hu1u}(hfkHYrXB3o_w%N@X5sR|=T zmJIH|gG&l~G?3B@))y_G&7NROsKc9>8uqE`auRC=V0RIprJEOHEy}XMWyq-h6uv{r z$L6U0x;j47J=V^9*{C@gz(Gp}2~-Rpabd2^%w~KW#@2r{V-f zym9i`Wc)EUn@btDxh$fd0G2v>?4n;iLJ^0$(7M$28J)vVy6_lN!RS;eN!$n zHcyKda)|OV4e*UxaJA`yFFeckk>(lQS8NW!ohdfOn)C#GYbvxr(A=Spt-&TZKl@|5 zEPa0X!FndD;E_TUFo7JjIG6`osRzYF4tzqvi=BPegjA3#D;Ty3N}Vuljq@4 zhwhI$Yl_3KZcgV!`UTu+0a9>k7xNG11&7AX(3pE$6r8Y0`m3gm9t=ro)qR4=t_vgf zmx^1;+dq4^$Z|qDAxi@cinW{yh3{}L@JvfjL|&a!?@!v1%Jyh?!yRDOhgRJ}!9vpt zAVHn%Emfuo+}kf1ToEmq*$M8qrC+*N*%oc^Nr62zS3idGT<7OIcUhph6fkhOXIjv^ zdXppVI9J|I^mZhihL2s)HtoFCrE2A`=3!N8ban}%fAOS)R+{C{tP#htf!t>E)yGl` z#J#`Q(?Ejk2Vvm~eyVBftcTYMYpHv9^CruUyYve(c7$ZCCP%)R7i?in#$AXTQIg@s zxXCDcp<}*QyfcaG2hMe{m8c` zJnQggqnTdkt5Rm8bn%#p0VT)C>RLSz!z}jUTnU(XR#g7<_3|3W$C``~KfY+Ex=gbWk8f}?sQ=02(pZyJ$ z&$)}3723!LYsO!~JgOQUTq&-d=v!{cmsyOWVv}q>5xb$5Wj zli>tsPM`MM5;E`cDzNrl&#XWqJmW$(!C2;qw%z>WwW8VFZIUBZscGg$CMluWnl77q z6sU-2o_h}fK*e@HH7CXF>mBjPdXXbvTc*Dk0yyf0Y zijE#A>sA1%B=Gl+ngYFqEPAms&F`^BYt1hrDAVp)m8vVo!=}yCV0v>f8&{N0-)X{# zQna}~rsqNcOJ7gKU;3QD|F{2|mm=so5TQ~@C)^=LRj~}cucgELr~D3!>QjFZ=a^8( zCpp8n6%J1b+_5wMjqw0bX5ru2eoD8>AnM`sq4)SqKG~113;A+ohmSrZ;NovBgpQq! zqL(dG595zJhfL~aQEe8mT`H6T1}x%~ZYp7ZxedR-IO!=QlM7+oUuaT_{>~{sIjp5F zev&y`eXkY@2(&7osR?an?e8_Me$Pvvjt(#0=GB)i zskD38T+b4^y!{eyz5L}<$4L37Pg|3`pXW|Hf3>7*gAbbPaue^PAodAB;?o%3!c;Z2 zsp<mzI5{Qxh46aKT<7clFv-JTHP zg6{ct^r^(3K4wAX!o5;mNESmU{}s3BkAiNC#R&dqe-63c3fZzjcT}13o=GRNSK;fB za%AexbHqm1ATK>n5zn?wt}A7gaVXz6+RRfe?V^%*X!qE1*5o+N9hQmw zrC+G>Z|z!;*AN}zhAS;!Xczt)?D_%P3i=9j1f+LC#HI}zA7I113i@eqzrOp%(v~lK z6%51#{GN^W6G%T#M3V^%8;RCETg#SvRUNnfyK=N6>zn$dCHxEiJ4(p;1JU>!ks%(9!}We3`J@kEgNH{*uoij%(5G*Z6?RUe*mU$YL79a$(uO*&c|Wb%oGg zX^w*v7JP%7ry^JTQ%RC5Ra*+L$yEF}K0b(EVc1Fj~;_S#g9cFX8n988d zA|jPyUZZ~h?DzXzl!h0p3u@G7%)|0uuJJWsn3hK&+F~lQYo1n?-HmHXVzMRMgC|?@ zK1b9!+N2lV1*BLyy)>-RWf!n)gFB}^EY1G1xTL{;#}vR>-GY@Q#_LHjcNL7<^fWzm z=nZAhpWz1*Ye(0vE%l<~0Iu+j32bne{u@ z)-``|8{C>4ugI@#ltr({2-ksf!!6Y#m^q#umOFBUEK9FPZONM|`AdE=`68q1qi$ji z39J9Qgq0+!ty50%%TAoq{|y-HW0;G)C&RLLU%KgWn(l}Gq8tbR&R9opLm`_PB9D7t z%k|Jt4?rBT|9Ta;VLK~7+0bs=s6V@vJ|E{Qh{2cc(f|>x_ms)HTyrV@BuAM^)Bj;U z*F@)I6>YMDzR@P8a9AMUvhzH@P;*n!I~ArXZ}QK?41d(@osC+CJKbmTRjV|QM4=YC z>yI?M(nI$dJFRwXif|CjF|t5-8d26<-mB!8t%0BoJP2Ew74nCnhc>CL$^vSCY#xzF zc}d=vHNf}vi(>@kXe(*$&TCYy(@mT=E##4JPnX3*>4(->War(+U6|zWIgim@_C|P0 z#d$=hQg)2Av{wvG?u%>pCpl~Y)1Z2=D@$s5#(Ol+c5wQEo}&?W6k35imbI~w?(r?Q zGu;KD7Mp%J*z&IkF2A6cMMOCGti6cA_h(o-kROHf(D@Mk%}MXX#h%uo53m6i6$Dbe zUC!It=lX19HzfX@iV&+ochy+u3jkzH;nzR%^+fqr<>+Kv7uenasT+_LM0FU}Ib!fR zZ3^P>tqQG;DM8QxU-A*ZAww0o#l{YiU2eQcxR-7sS%j#Oee8f{`a(v=$n^G=ymo5w z&uSx;O;3kt@>w6J(mzig7YfA}za^6CBcl?Z?C5Qg@8PkI_68_j(^?o0NEUXs9FSN_ zhygR{u>1zAitAWz$+wKz*<_;zT@GInVgp>;;3+@Diq`}?r|hgv2VBgR(E0o0FKks5 zPrk=!iL8cWsXoG_NgJ-V14LVAroGeLo#hw~SvxA;Z&RLAY{L6&ex!XxXRhy_WxexTa=A2V@eLV`0 zq=CdvnZINrg~=kc%nFP#c+h*QHF`DPD{txgHan#jo+>a^*gR6IPGp2-A+VTb{h*(u zCau-%V7Bzr5 zMbY2sBN=?9v*xL!R$<}0H=z$m=D(;OAF-TU?D25(xqjfL=*_*KJKmpzE3ed!_|4Lf z20AWfoIm!XWU2Li_4m!o7`7EY5MriM6^c?G`Hm;^-`EpYz@^k=jFnQCnAG6xcb<*y z*3G`weqz-Y4(>N#n*RgocvKG~bw?LLL3Zi4Ov7?!L8moFB$vi+kNTzVXxtvG!5#x-EkYKhkTNvXNCUUd!aF z7djrz*_`I!xZLEyfRC9xLHxxAQ_j&~#IG3M33&REgO*-zR#jUtBnAmPD{vl_Ra6UP zf7iI9qyB5#L8TBwuKs`}Q(4YD7yUc>cTBiMB1X~>Rj|{o+Fx#7eF0fzB^Zv1OKQfT zTJ}m3PtK+q?B+L0XTD-9#2AnlzSPa%F5P$t?5a1LSBS@{jyBgn2#gpy#i&7ha_Ah= z<&d&GYAW>|!(28EULdbARb0Bztx3-hu_WY`&-l?UJ@Du!afzpQ1apO^9~I=!>U^hX zk=i7pm!j>ARyLHGT&ZOsYU5ooLIyW^R21^zC9N%5txU8y@CQZWbXV-u*HKuZ>0C`r z6sd)80Qbv3Ks}V+0M6=4OpjxNJ=0wLy{845gc9{MGV)J~g$~BTES1K^3fzmRwaa)Q zS3^1Q*i*43Rt%pFd>^4@0K1gkr)!8!5B4ha4c&W-btI@IZi!O2*}q&y7B7gCQkDsS zLho6ad_lVKuk42y1Z2i^|EWATSo3_ugM^-FkbUZRB+l)04{y_BYUb@QwNn7BZ*7P; zUg9dKt=LdTmxBMalnxT%qC*lM-6#APS2Mepgeu&>Mh9VXScx1J%SL7@z3<+@hcRWw zHP>v!^DXA{lD~pOMx)6biJf)wk_(>IG+QS%y8y6e6FuI2z{Ow731hiPnaEt&U|;MR zrZwu`0bV$|HSeFVw$AC_S^_T!d^tfwCC%_LC)G8&;m)>i&%$_S#7QZ6yL-U)(Sl73 zxO}kQh6Q9?{^Zv;)wxn!v-|kk+`al3EQyp;ptkKhI+XyiY7|4~gC7(_}M4_HkuBW#BbFQT^RI=dYls( z$#G5|u3Dm%YNz8zW`ZT;Af`PkJv2jVx#pRYWq>f)HJA`@aQ*EmJpFXj*$`n*)I5qmMn0Es zS|Iejj>`-e4CmV>QazO&ur4quBMfHDT^n)1EC>8;@6x<=2URdG0B`4)jdO~2>S>P< zXwHjvXg_0^V-&N65Y%ty=?|S^@ZzW2n~|p&*f%=8nPc5AQgpVDBXk>+_;5Uv62zfd z%&dP!-dPjS%W(KJgAFs_vPt48tLfR#JG>n4>3!grf4Z;LBXaTgGKUtu-+EaV&UcJ( z_+a`(?VSA{cKsdyaHU|&pzRz`C#3nSf-7K}mf}NI5p_u;^)rM)w>j*CiIYdgiqcW& za^v&n&Q&d^CftQXRvj?P$3YOnadW08nVKxo&9j@u>IOmY)3xc`{&MHGxH?#8fOH8r zW)f5MX^Qi&imP)LVBtj4;2Aq6QME{ucQmvm;Sl7LD zm~Yt1mL{hs#n{|ey*Nh*C?@a(p_c|JbZ`==+nk!GjHVLN$t^HKa%f`iV0o66qr>svdc z2PrXd;$0uVfX~k*{H;~0zj%?3{X6g&YPd7VQGd)I^~9#G&1>4=;k?Z6mDuksbfDY6 zcv=VAXSH~}>^+Ba7qI)B$NEFDZUVT>ZyOU+y#_XJ_=QbT$zA2i6|jt=-*S%ty1-md zN(14GvGltmnPlfFFzCyE9pW!*U4D*>%<#)G^*j9hd;cWU2&t{q^wB;WS+fmIM9sJ! zjTSC5%Zbfa{D0kD`#;m)A0H~LK2f=bN#zov+;eH@DAjuvIY9-C}e`vbUJFsKIcYq4n2@?nRQ*d^WHU83ozAT@S$;adDfN?g^9Ys{jH}) z%2{&*ZBI1+!R&v>zmG4zJ*;*KoHNN?Yrw)!ig{gSt^EirK(l0?<{dFGgPaX1F*zLJ z&Oz^gL~mjuF-ZB)3=v8W!80zZc<1(G_`ew8sJlw09&RsSN}2|s9io?Z07<+;zuccJ}dQZyy6oB@wF2vfHD z&-fu5S~>74TRoB{76fl*u^EE&El zKM<4@uHlA<6Hp8lPT%|?xsXis^=&p8wLNi?+hqr|a!8OFeaFu)DQ|AyYkknxawFS{ zBoRf(ER^0G(&Cc%)ETXW$KF~sU8zKgqlEU!1F#^pqyrF%SU6gd_5P6>eeNcPa7X9O zTmLOdych5LTUs_&TQ1Ig&IC74Ep^~V9?QccOLgp&wD%ylf#@D*zy>;Ve=3$rF)HMt| z1&)?G{lM7djQola2qa}|^-yQXCb>q3ChZec3JU${2)z<>p9O#s<}2;CB%d*8rj4yG z+(x`9pEzSxlZ7CT%C9x>d^k=X;Ox0^=G~bRm<8z}E4kzB?AT{Yn6FT+@ZZ|Y@ul%? zO+8Va?$nor1||)~g0EE8Cf6?OogQB8_{1Px{p=^d=6Y`ufMSjV+fzYqqGI`EP*O|z zuzkKG_=C>@%Xdf)-Pxv=b^V7FPxG|v5H?rqo0bb*vp`NXHLyPHS=-Qog+cuRL-xyy zFM==nahm{aJ=2FS{$pDyuOf4yzuUtitXDMPW5u9zPmpt8 zE#wwhVq>UOAce*wW-76}K0;PUbj^=U=r$lNq@zzkOsFJ_JK z?cY}2a|`9NX_bh`LEF)(?$8KeN3NA10*?G*oFGlVI`afhM!lUR=VV0jb@u=R(!R{! zvh@9j%*=AbbYk4{Ok_D0Z1<%g^6HhYvval&gg~h$s1l;>62Rw^Yf1_(&jl!!F|zfc z=SqssP~}Ghw_qGBZW`L1*DVjdX-xy-f)}?7fuFuU0&G>LkJE9v<3~dQikBCzHE@7u zhJr%u!^rBb(UY5(9s#|y+WDBSMvX07?q)3&>b^1*+RABpq$M{Y6w&btU`km}8X1rv zKAW2*ALwv8@Ik7H4QNm*}0>@olkt=Zki;3^IHDt79aQNSf$)G z|0L~#2#7mb1c+5`)Og>%N=wQ}XeKcx?{6S-0e9S~A%O8ZnWj6|*MQhmOvD#L-^uA( zHBl)6$WY@+iyB5cnRlH>ObqiYXh^}Eyx&v>E4Q7)XBi*)WvT3Pjd)YRQe>UJdOa=Q z!N`c`CiASXnVTOs__0CS0RqMR1&M89d{sg$k#3w-uuR{jC?P9o0VM*Q+sz*Ois0yb zkACQ{#7d%5Jf1YR$H(*9u#Z)&1!zbo@eSzbcL%f4FVi)F=^*J^|E}l-Tfb4OYvyU? z0ds7%trcVj=auAXFp zmuuYAa!~b3X7^jbczVQJoBh<`YPQ|o%1f0-iv?Ipm*!n-2w&92^O6yr#fD~&pSy4# zXs#t6+|C`G6)Lzyfj90fN?H?cuq@0f9 zv0_7BCLMP|TZkuAe3?TyxQg#@Z2r377vI>!v}?d4UxB~tIr|qtdxHe1b;Ou10{J8< z;py6pVEk}oH(XZJ{Cf5rJVseCsw|J8AQpR<;vuz(nJtrERWG4Y`X98kz9+B-JWmie zZxb!jc|tZyhcLBh!pn$Of+mcT0Q+EF1qw87nOYK;dmU8#xZl01j1c_s405COyT7*U z5-mBu8ESwj>6DQC4;YtUurntF|CkMFQk*+qPw9s8&4u&?^=ttSxd{`X2FNlK)fH$% zT3lI0#UbH9L9W=TW@hFdb!&-P65gw-LiD7$`A(y-Viik)C6c&Ua+pvv&OuWf0S0so zD=^>5sAyR7ewOe*AB+*ylH1(Kc&8veD{=K$Jz4}k<8fUfUde@k1e_q^Ts&eGdsm_Rqsm}o% zfsUjtb2PM(G{#hiq6BzNqn&Pv9HcQOiJKO&kY%GYkOAe6Ygj@Q6tZ|q0+E}K2u4I^ zyTSs{w>BB=)kpbbWqav&yd%Lm(CWde@iDduZBOnyjuFy8txhub!D%` z-KP1X##_Og&VI_#ybL9KuBTqdXcdu0VxfH3oR)1!N`!IQnh za6eef51J9K2qB3-{J7o-JDW5As + + diff --git a/assets/images/pharmacy_module/payment/LogoParmacyGreen.png b/assets/images/pharmacy_module/payment/LogoParmacyGreen.png new file mode 100644 index 0000000000000000000000000000000000000000..72862b330df17999c5094e379a72e46bb0c558ff GIT binary patch literal 38549 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 { getLanguageID(); super.initState(); print(widget.orderModel.orderItems.length); - getLanguageID(); - print(widget.orderModel.orderItems.length); getCancelOrder(widget.orderModel.id); // cancelOrderDetail(order) } @@ -110,9 +105,8 @@ class _OrderDetailsPageState extends State { color: getStatusBackgroundColor(), borderRadius: BorderRadius.circular(30.0)), child: Text( -// widget.orderModel.orderStatus.toString().substring(12), -// languageID == "ar" -// ? widget.orderModel.orderStatusn.toString(): + languageID == "ar" + ? widget.orderModel.orderStatusn.toString(): widget.orderModel.orderStatus.toString().substring(12) , // TranslationBase.of(context).delivered, style: TextStyle( @@ -134,7 +128,7 @@ class _OrderDetailsPageState extends State { .toString() .substring(10) + ' ' + - model.order[0].shippingAddress.lastName + widget.orderModel.shippingAddress.lastName .toString() .substring(9), style: TextStyle( @@ -145,16 +139,20 @@ class _OrderDetailsPageState extends State { ]), ), Container( - margin: EdgeInsets.fromLTRB(11.0, 5.0, 1.0, 5.0), - child: Text( - widget.orderModel.shippingAddress.address1 - .toString() - .substring(9), - style: TextStyle( - fontSize: 10.0, - fontWeight: FontWeight.bold, - color: Colors.grey, - ), + margin: EdgeInsets.fromLTRB(10.0, 5.0, 1.0, 5.0), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + widget.orderModel.shippingAddress.address1 + .toString() + .substring(9), + style: TextStyle( + fontSize: 10.0, + fontWeight: FontWeight.bold, + color: Colors.grey, + ), + ),] ), ), Container( @@ -232,35 +230,36 @@ class _OrderDetailsPageState extends State { ), Container( child: flutterImage.Image.asset( - widget.orderModel - .shippingRateComputationMethodSystemName == - "Shipping.FixedOrByWeight" - ? "assets/images/pharmacy_module/payment/hmg_shipping_logo.png" + widget.orderModel.shippingRateComputationMethodSystemName != + "Shipping.Aramex" + ? "assets/images/pharmacy_module/payment/LogoParmacyGreen.png" : "assets/images/pharmacy_module/payment/aramex_shipping_logo.png", fit: BoxFit.contain, +// height: 100, + width: 100, ), ), - Container( - child: widget.orderModel - .shippingRateComputationMethodSystemName == - "Shipping.FixedOrByWeight" - ? Container( - margin: EdgeInsets.only(bottom: 10.0, top: 10.0), - child: SvgPicture.asset( - 'assets/images/pharmacy_module/payment/hmg_shipping_logo.png', - height: 25, - width: 25, - ), - ) - : Container( - margin: EdgeInsets.only(bottom: 10.0, top: 10.0), - child: SvgPicture.asset( - 'assets/images/pharmacy_module/payment/aramex_shipping_logo.png', - height: 25, - width: 25, - ), - ), - ), +// Container( +// child: widget.orderModel +// .shippingRateComputationMethodSystemName == +// "Shipping.FixedOrByWeight" +// ? Container( +// margin: EdgeInsets.only(bottom: 10.0, top: 10.0), +// child: SvgPicture.asset( +// 'assets/images/pharmacy_module/payment/hmg_shipping_logo.png', +// height: 25, +// width: 25, +// ), +// ) +// : Container( +// margin: EdgeInsets.only(bottom: 10.0, top: 10.0), +// child: SvgPicture.asset( +// 'assets/images/pharmacy_module/payment/aramex_shipping_logo.png', +// height: 25, +// width: 25, +// ), +// ), +// ), ], ), Divider( @@ -459,7 +458,7 @@ class _OrderDetailsPageState extends State { ), ), Text( - model.order[0].orderTax.toString(), + widget.orderModel.orderTax.toString(), style: TextStyle( fontSize: 13.0, ), From 10734d5994499fb9bf278fc2c4a6f41923cfc6ec Mon Sep 17 00:00:00 2001 From: enadhilal Date: Tue, 5 Jan 2021 14:40:32 +0300 Subject: [PATCH 14/18] connecting pages. trnaslate. calling API. review page. product details page. Wishlist page. Brands page. --- assets/images/new-design/empty_box.png | Bin 0 -> 4247 bytes lib/config/config.dart | 8 +- lib/config/localized_values.dart | 46 + .../pharmacyModule/brand_view_model.dart | 16 + .../product_detail_view_model.dart | 79 +- lib/main.dart | 6 +- lib/models/pharmacy/addToCartModel.dart | 924 ++++++++ lib/models/pharmacy/brandModel.dart | 26 +- lib/models/pharmacy/specification.dart | 61 + lib/models/pharmacy/topBrandsModel.dart | 10 +- lib/pages/landing/landing_page_pharmcy.dart | 4 +- .../pharmacies/ProductCheckTypeWidget.dart | 19 +- lib/pages/pharmacies/compare-list.dart | 36 + lib/pages/pharmacies/compare.dart | 773 +++---- lib/pages/pharmacies/my_reviews.dart | 113 +- lib/pages/pharmacies/product-brands.dart | 240 +-- lib/pages/pharmacies/product_detail.dart | 1864 +++++++++++++---- .../screens/pharmacy_module_page.dart | 5 +- lib/pages/pharmacies/search_brands_page.dart | 145 ++ .../pharmacies/widgets/ProductTileItem.dart | 3 +- lib/pages/pharmacies/wishlist.dart | 86 +- lib/pages/pharmacy/profile/profile.dart | 435 ++-- .../pharmacy_services/brands_service.dart | 29 + .../product_detail_service.dart | 125 +- .../pharmacy_services/review_service.dart | 12 +- .../pharmacy_services/wishList_service.dart | 3 +- lib/uitl/translations_delegate_base.dart | 12 + .../others/app_scafold_detail_page.dart | 241 +++ lib/widgets/pharmacy/product_tile.dart | 158 +- 29 files changed, 3952 insertions(+), 1527 deletions(-) create mode 100644 assets/images/new-design/empty_box.png create mode 100644 lib/models/pharmacy/addToCartModel.dart create mode 100644 lib/models/pharmacy/specification.dart create mode 100644 lib/pages/pharmacies/compare-list.dart create mode 100644 lib/pages/pharmacies/search_brands_page.dart create mode 100644 lib/widgets/others/app_scafold_detail_page.dart diff --git a/assets/images/new-design/empty_box.png b/assets/images/new-design/empty_box.png new file mode 100644 index 0000000000000000000000000000000000000000..af3551fdbd3930209898c0ab4149d3172db686d5 GIT binary patch literal 4247 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 literal 0 HcmV?d00001 diff --git a/lib/config/config.dart b/lib/config/config.dart index 02b1fa77..c0565ad8 100644 --- a/lib/config/config.dart +++ b/lib/config/config.dart @@ -6,7 +6,8 @@ import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; const MAX_SMALL_SCREEN = 660; -const BASE_URL = 'https://hmgwebservices.com/'; +//const BASE_URL = 'https://hmgwebservices.com/'; +const BASE_URL = 'https://uat.hmgwebservices.com/'; //const BASE_PHARMACY_URL = 'http://swd-pharapp-01:7200/api/'; const BASE_PHARMACY_URL = 'https://uat.hmgwebservices.com/epharmacy/api/'; const PHARMACY_BASE_URL = 'https://uat.hmgwebservices.com/epharmacy/api/'; @@ -245,7 +246,7 @@ const UPDATE_HEALTH_TERMS = const CHANNEL = 3; const GENERAL_ID = 'Cs2020@2016\$2958'; const IP_ADDRESS = '10.20.10.20'; -const VERSION_ID = 5.6; +const VERSION_ID = 6.1; const SETUP_ID = '91877'; const LANGUAGE = 2; const PATIENT_OUT_SA = 0; @@ -413,11 +414,14 @@ const PATIENT_ER_INSERT_PRES_ORDER = //Pharmacy wishlist const GET_WISHLIST = "shopping_cart_items/"; +const DELETE_WISHLIST = "delete_shopping_cart_item_by_product?customer_id="; const GET_REVIEW = "customerreviews/"; const GET_BRANDS = "manufacturer"; const GET_TOP_BRANDS = "topmanufacturer?page=1&limit=8"; const GET_PRODUCT_DETAIL = "products/"; const GET_LOCATION = "Services/Patients.svc/REST/GetPharmcyListBySKU"; +const GET_SPECIFICATION = "productspecification/"; +const GET_BRAND_ITEMS = "products?ManufacturerId="; // External API const ADD_ADDRESS_INFO = diff --git a/lib/config/localized_values.dart b/lib/config/localized_values.dart index c3962b5b..7c124afc 100644 --- a/lib/config/localized_values.dart +++ b/lib/config/localized_values.dart @@ -1157,4 +1157,50 @@ const Map localizedValues = { "en": "Select Home Health Care Services", "ar": " حدد خدمات الرعاية الصحية المنزلية" }, + "topBrands":{ + "en":"Top Brands", + "ar":"اعلى العلامات التجارية" + }, + + "notifyMe":{ + "en":"notify me", + "ar":"اعلمني" + }, + "specification":{ + "en":"Specification", + "ar":"تخصيص" + }, + + "details":{ + "en":"Details", + "ar":"تفاصيل" + }, + + "availability":{ + "en":"Availability", + "ar":"التوفر" + }, + + "quantity":{ + "en":"Quantity", + "ar":"التوفر" + }, + "quantitySize":{ + "en":"Quantity", + "ar":"كميه" + }, + "addToCart":{ + "en":"add to cart", + "ar":"إضفة للسلة" + }, + "buyNow":{ + "en":"buy now", + "ar":"إشتري الان" + }, + "quantityShortcut":{ + "en":"QTY", + "ar":"كمية" + }, + + }; diff --git a/lib/core/viewModels/pharmacyModule/brand_view_model.dart b/lib/core/viewModels/pharmacyModule/brand_view_model.dart index 2984632b..c981b2b3 100644 --- a/lib/core/viewModels/pharmacyModule/brand_view_model.dart +++ b/lib/core/viewModels/pharmacyModule/brand_view_model.dart @@ -14,6 +14,9 @@ class BrandsViewModel extends BaseViewModel{ BrandsService _topBrandsService = locator(); List get topBrandsListList => _topBrandsService.topBrandsList; + List get searchList => + _brandsService.searchList; + bool hasError = false; @@ -38,4 +41,17 @@ class BrandsViewModel extends BaseViewModel{ } else setState(ViewState.Idle); } + + + Future searchProducts({String productName}) async { + hasError = false; + _brandsService.clearSearchList(); + setState(ViewState.Busy); + await _brandsService.searchProducts(productName: productName); + if (_brandsService.hasError) { + error = _brandsService.error; + setState(ViewState.ErrorLocal); + } else + setState(ViewState.Idle); + } } \ No newline at end of file diff --git a/lib/core/viewModels/pharmacyModule/product_detail_view_model.dart b/lib/core/viewModels/pharmacyModule/product_detail_view_model.dart index aa693602..47a3bb11 100644 --- a/lib/core/viewModels/pharmacyModule/product_detail_view_model.dart +++ b/lib/core/viewModels/pharmacyModule/product_detail_view_model.dart @@ -1,26 +1,36 @@ import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; import 'package:diplomaticquarterapp/core/viewModels/base_view_model.dart'; +import 'package:diplomaticquarterapp/models/pharmacy/Wishlist.dart'; import 'package:diplomaticquarterapp/models/pharmacy/locationModel.dart'; import 'package:diplomaticquarterapp/models/pharmacy/productDetailModel.dart'; import 'package:diplomaticquarterapp/services/pharmacy_services/product_detail_service.dart'; +import 'package:diplomaticquarterapp/models/pharmacy/specification.dart'; import '../../../locator.dart'; class ProductDetailViewModel extends BaseViewModel{ ProductDetailService _productDetailService = locator(); + ProductDetailService _productLocationService = locator(); + ProductDetailService _productWishlistService = locator(); + ProductDetailService _productSpecification = locator(); List get productDetailService => _productDetailService.productDetailList; - List get productLocationService => _productDetailService.productLocationList; + List get productLocationService => _productLocationService.productLocationList; + + List get wishListItems => _productWishlistService.wishListProducts; + + List get productSpecification => _productSpecification.productSpecification; bool hasError = false; - Future getProductReviewsData() async { + Future getProductReviewsData(productID) async { + print('ENAD REview'); hasError = false; setState(ViewState.Busy); - await _productDetailService.getProductReviews(); + await _productDetailService.getProductReviews(productID); if (_productDetailService.hasError) { error = _productDetailService.error; setState(ViewState.ErrorLocal); @@ -29,15 +39,72 @@ class ProductDetailViewModel extends BaseViewModel{ } Future getProductLocationData() async { + print('ENAD in model view'); hasError = false; setState(ViewState.Busy); - await _productDetailService.getProductAvailabiltyDetail(); - if (_productDetailService.hasError) { - error = _productDetailService.error; + await _productLocationService.getProductAvailabiltyDetail(); + if (_productLocationService.hasError) { + error = _productLocationService.error; + setState(ViewState.ErrorLocal); + } else + setState(ViewState.Idle); + } + + Future addToCartData(quantity, itemID) async { + hasError = false; + setState(ViewState.Busy); + await _productLocationService.addToCart(quantity, itemID); + if (_productLocationService.hasError) { + error = _productLocationService.error; + setState(ViewState.ErrorLocal); + } else + setState(ViewState.Idle); + } + + Future addToWishlistData(itemID) async { + hasError = false; + setState(ViewState.Busy); + await _productLocationService.addToWishlist(itemID); + if (_productLocationService.hasError) { + error = _productLocationService.error; + setState(ViewState.ErrorLocal); + } else + setState(ViewState.Idle); + } + + Future checkWishlistData() async { + hasError = false; + setState(ViewState.Busy); + await _productWishlistService.getWishlistItems(); + if (_productWishlistService.hasError) { + error = _productWishlistService.error; + setState(ViewState.ErrorLocal); + } else + setState(ViewState.Idle); + } + + + Future deletWishlistData(itemID) async { + hasError = false; + setState(ViewState.Busy); + await _productWishlistService.delteItemFromWishlist(itemID); + if (_productWishlistService.hasError) { + error = _productWishlistService.error; setState(ViewState.ErrorLocal); } else setState(ViewState.Idle); } + Future productSpecificationData(itemID) async { + hasError = false; + setState(ViewState.Busy); + await _productWishlistService.productSpecificationData(itemID); + if (_productWishlistService.hasError) { + error = _productWishlistService.error; + setState(ViewState.ErrorLocal); + } else + setState(ViewState.Idle); + } + } \ No newline at end of file diff --git a/lib/main.dart b/lib/main.dart index 218fbf07..9d2e0566 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -10,9 +10,11 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:hexcolor/hexcolor.dart'; import 'package:provider/provider.dart'; + import 'config/size_config.dart'; import 'core/viewModels/project_view_model.dart'; import 'locator.dart'; +import 'pages/pharmacies/compare-list.dart'; void main() async { setupLocator(); @@ -45,7 +47,9 @@ class MyApp extends StatelessWidget { StreamProvider.value( value: RobotProvider().intStream(), initialData: RobotProvider().setValue({}), - ) + ), + ChangeNotifierProvider( + create: (context) => CompareList()), ], child: Consumer( builder: (context, projectProvider, child) => MaterialApp( diff --git a/lib/models/pharmacy/addToCartModel.dart b/lib/models/pharmacy/addToCartModel.dart new file mode 100644 index 00000000..3253e6f7 --- /dev/null +++ b/lib/models/pharmacy/addToCartModel.dart @@ -0,0 +1,924 @@ +// To parse this JSON data, do +// +// final shoppingCart = shoppingCartFromJson(jsonString); + +import 'dart:convert'; + +ShoppingCart shoppingCartFromJson(String str) => ShoppingCart.fromJson(json.decode(str)); + +String shoppingCartToJson(ShoppingCart data) => json.encode(data.toJson()); + +class ShoppingCart { + ShoppingCart({ + this.itemCount, + this.quantityCount, + this.subtotal, + this.subtotalWithVat, + this.subtotalVatAmount, + this.subtotalVatRate, + this.shoppingCarts, + }); + + int itemCount; + int quantityCount; + double subtotal; + double subtotalWithVat; + double subtotalVatAmount; + int subtotalVatRate; + List shoppingCarts; + + factory ShoppingCart.fromJson(Map json) => ShoppingCart( + itemCount: json["item_count"], + quantityCount: json["quantity_count"], + subtotal: json["subtotal"].toDouble(), + subtotalWithVat: json["subtotal_with_vat"].toDouble(), + subtotalVatAmount: json["subtotal_vat_amount"].toDouble(), + subtotalVatRate: json["subtotal_vat_rate"], + shoppingCarts: List.from(json["shopping_carts"].map((x) => ShoppingCartElement.fromJson(x))), + ); + + Map toJson() => { + "item_count": itemCount, + "quantity_count": quantityCount, + "subtotal": subtotal, + "subtotal_with_vat": subtotalWithVat, + "subtotal_vat_amount": subtotalVatAmount, + "subtotal_vat_rate": subtotalVatRate, + "shopping_carts": List.from(shoppingCarts.map((x) => x.toJson())), + }; +} + +class ShoppingCartElement { + ShoppingCartElement({ + this.languageId, + this.id, + this.productAttributes, + this.customerEnteredPrice, + this.quantity, + this.discountAmountInclTax, + this.subtotal, + this.subtotalWithVat, + this.subtotalVatAmount, + this.subtotalVatRate, + this.currency, + this.currencyn, + this.rentalStartDateUtc, + this.rentalEndDateUtc, + this.createdOnUtc, + this.updatedOnUtc, + this.shoppingCartType, + this.productId, + this.product, + this.customerId, + this.customer, + }); + + int languageId; + String id; + List productAttributes; + int customerEnteredPrice; + int quantity; + dynamic discountAmountInclTax; + String subtotal; + String subtotalWithVat; + String subtotalVatAmount; + String subtotalVatRate; + String currency; + String currencyn; + dynamic rentalStartDateUtc; + dynamic rentalEndDateUtc; + DateTime createdOnUtc; + DateTime updatedOnUtc; + String shoppingCartType; + int productId; + Product product; + int customerId; + Customer customer; + + factory ShoppingCartElement.fromJson(Map json) => ShoppingCartElement( + languageId: json["language_id"], + id: json["id"], + productAttributes: List.from(json["product_attributes"].map((x) => x)), + customerEnteredPrice: json["customer_entered_price"], + quantity: json["quantity"], + discountAmountInclTax: json["discount_amount_incl_tax"], + subtotal: json["subtotal"], + subtotalWithVat: json["subtotal_with_vat"], + subtotalVatAmount: json["subtotal_vat_amount"], + subtotalVatRate: json["subtotal_vat_rate"], + currency: json["currency"], + currencyn: json["currencyn"], + rentalStartDateUtc: json["rental_start_date_utc"], + rentalEndDateUtc: json["rental_end_date_utc"], + createdOnUtc: DateTime.parse(json["created_on_utc"]), + updatedOnUtc: DateTime.parse(json["updated_on_utc"]), + shoppingCartType: json["shopping_cart_type"], + productId: json["product_id"], + product: Product.fromJson(json["product"]), + customerId: json["customer_id"], + customer: Customer.fromJson(json["customer"]), + ); + + Map toJson() => { + "language_id": languageId, + "id": id, + "product_attributes": List.from(productAttributes.map((x) => x)), + "customer_entered_price": customerEnteredPrice, + "quantity": quantity, + "discount_amount_incl_tax": discountAmountInclTax, + "subtotal": subtotal, + "subtotal_with_vat": subtotalWithVat, + "subtotal_vat_amount": subtotalVatAmount, + "subtotal_vat_rate": subtotalVatRate, + "currency": currency, + "currencyn": currencyn, + "rental_start_date_utc": rentalStartDateUtc, + "rental_end_date_utc": rentalEndDateUtc, + "created_on_utc": createdOnUtc.toIso8601String(), + "updated_on_utc": updatedOnUtc.toIso8601String(), + "shopping_cart_type": shoppingCartType, + "product_id": productId, + "product": product.toJson(), + "customer_id": customerId, + "customer": customer.toJson(), + }; +} + +class Customer { + Customer({ + this.billingAddress, + this.shippingAddress, + this.addresses, + this.id, + this.username, + this.email, + this.firstName, + this.lastName, + this.languageId, + this.adminComment, + this.isTaxExempt, + this.hasShoppingCartItems, + this.active, + this.deleted, + this.isSystemAccount, + this.systemName, + this.lastIpAddress, + this.createdOnUtc, + this.lastLoginDateUtc, + this.lastActivityDateUtc, + this.registeredInStoreId, + this.roleIds, + }); + + Address billingAddress; + Address shippingAddress; + List

addresses; + String id; + String username; + String email; + dynamic firstName; + dynamic lastName; + dynamic languageId; + dynamic adminComment; + bool isTaxExempt; + bool hasShoppingCartItems; + bool active; + bool deleted; + bool isSystemAccount; + dynamic systemName; + String lastIpAddress; + DateTime createdOnUtc; + DateTime lastLoginDateUtc; + DateTime lastActivityDateUtc; + int registeredInStoreId; + List roleIds; + + factory Customer.fromJson(Map json) => Customer( + billingAddress: Address.fromJson(json["billing_address"]), + shippingAddress: Address.fromJson(json["shipping_address"]), + addresses: List
.from(json["addresses"].map((x) => Address.fromJson(x))), + id: json["id"], + username: json["username"], + email: json["email"], + firstName: json["first_name"], + lastName: json["last_name"], + languageId: json["language_id"], + adminComment: json["admin_comment"], + isTaxExempt: json["is_tax_exempt"], + hasShoppingCartItems: json["has_shopping_cart_items"], + active: json["active"], + deleted: json["deleted"], + isSystemAccount: json["is_system_account"], + systemName: json["system_name"], + lastIpAddress: json["last_ip_address"], + createdOnUtc: DateTime.parse(json["created_on_utc"]), + lastLoginDateUtc: DateTime.parse(json["last_login_date_utc"]), + lastActivityDateUtc: DateTime.parse(json["last_activity_date_utc"]), + registeredInStoreId: json["registered_in_store_id"], + roleIds: List.from(json["role_ids"].map((x) => x)), + ); + + Map toJson() => { + "billing_address": billingAddress.toJson(), + "shipping_address": shippingAddress.toJson(), + "addresses": List.from(addresses.map((x) => x.toJson())), + "id": id, + "username": username, + "email": email, + "first_name": firstName, + "last_name": lastName, + "language_id": languageId, + "admin_comment": adminComment, + "is_tax_exempt": isTaxExempt, + "has_shopping_cart_items": hasShoppingCartItems, + "active": active, + "deleted": deleted, + "is_system_account": isSystemAccount, + "system_name": systemName, + "last_ip_address": lastIpAddress, + "created_on_utc": createdOnUtc.toIso8601String(), + "last_login_date_utc": lastLoginDateUtc.toIso8601String(), + "last_activity_date_utc": lastActivityDateUtc.toIso8601String(), + "registered_in_store_id": registeredInStoreId, + "role_ids": List.from(roleIds.map((x) => x)), + }; +} + +class Address { + Address({ + this.id, + this.firstName, + this.lastName, + this.email, + this.company, + this.countryId, + this.country, + this.stateProvinceId, + this.city, + this.address1, + this.address2, + this.zipPostalCode, + this.phoneNumber, + this.faxNumber, + this.customerAttributes, + this.createdOnUtc, + this.province, + this.latLong, + }); + + String id; + FirstName firstName; + LastName lastName; + Email email; + dynamic company; + int countryId; + Country country; + dynamic stateProvinceId; + City city; + String address1; + String address2; + String zipPostalCode; + String phoneNumber; + dynamic faxNumber; + String customerAttributes; + DateTime createdOnUtc; + dynamic province; + String latLong; + + factory Address.fromJson(Map json) => Address( + id: json["id"], + firstName: firstNameValues.map[json["first_name"]], + lastName: lastNameValues.map[json["last_name"]], + email: emailValues.map[json["email"]], + company: json["company"], + countryId: json["country_id"], + country: countryValues.map[json["country"]], + stateProvinceId: json["state_province_id"], + city: cityValues.map[json["city"]], + address1: json["address1"], + address2: json["address2"], + zipPostalCode: json["zip_postal_code"], + phoneNumber: json["phone_number"], + faxNumber: json["fax_number"], + customerAttributes: json["customer_attributes"], + createdOnUtc: DateTime.parse(json["created_on_utc"]), + province: json["province"], + latLong: json["lat_long"], + ); + + Map toJson() => { + "id": id, + "first_name": firstNameValues.reverse[firstName], + "last_name": lastNameValues.reverse[lastName], + "email": emailValues.reverse[email], + "company": company, + "country_id": countryId, + "country": countryValues.reverse[country], + "state_province_id": stateProvinceId, + "city": cityValues.reverse[city], + "address1": address1, + "address2": address2, + "zip_postal_code": zipPostalCode, + "phone_number": phoneNumber, + "fax_number": faxNumber, + "customer_attributes": customerAttributes, + "created_on_utc": createdOnUtc.toIso8601String(), + "province": province, + "lat_long": latLong, + }; +} + +enum City { CALIFORNIA, RIYADH, AL_OYUN } + +final cityValues = EnumValues({ + "Al Oyun": City.AL_OYUN, + "California": City.CALIFORNIA, + "Riyadh": City.RIYADH +}); + +enum Country { UNITED_STATES, SAUDI_ARABIA } + +final countryValues = EnumValues({ + "Saudi Arabia": Country.SAUDI_ARABIA, + "United States": Country.UNITED_STATES +}); + +enum Email { TAMER_FANASHEH_GMAIL_COM, TAMER_DASDASDAS_GMAIL_COM, TAMER_F_CLOUDSOLUTION_SA_COM } + +final emailValues = EnumValues({ + "Tamer.dasdasdas@gmail.com": Email.TAMER_DASDASDAS_GMAIL_COM, + "Tamer.fanasheh@gmail.com": Email.TAMER_FANASHEH_GMAIL_COM, + "Tamer.F@cloudsolution-sa.com": Email.TAMER_F_CLOUDSOLUTION_SA_COM +}); + +enum FirstName { TAMER, TAMER_FANASHEH } + +final firstNameValues = EnumValues({ + "TAMER": FirstName.TAMER, + "TAMER FANASHEH": FirstName.TAMER_FANASHEH +}); + +enum LastName { FANASHEH, MUSA } + +final lastNameValues = EnumValues({ + "FANASHEH": LastName.FANASHEH, + "MUSA": LastName.MUSA +}); + +class Product { + Product({ + this.id, + this.visibleIndividually, + this.name, + this.namen, + this.localizedNames, + this.shortDescription, + this.shortDescriptionn, + this.fullDescription, + this.fullDescriptionn, + this.markasNew, + this.showOnHomePage, + this.metaKeywords, + this.metaDescription, + this.metaTitle, + this.allowCustomerReviews, + this.approvedRatingSum, + this.notApprovedRatingSum, + this.approvedTotalReviews, + this.notApprovedTotalReviews, + this.sku, + this.isRx, + this.prescriptionRequired, + this.rxMessage, + this.rxMessagen, + this.manufacturerPartNumber, + this.gtin, + this.isGiftCard, + this.requireOtherProducts, + this.automaticallyAddRequiredProducts, + this.isDownload, + this.unlimitedDownloads, + this.maxNumberOfDownloads, + this.downloadExpirationDays, + this.hasSampleDownload, + this.hasUserAgreement, + this.isRecurring, + this.recurringCycleLength, + this.recurringTotalCycles, + this.isRental, + this.rentalPriceLength, + this.isShipEnabled, + this.isFreeShipping, + this.shipSeparately, + this.additionalShippingCharge, + this.isTaxExempt, + this.isTelecommunicationsOrBroadcastingOrElectronicServices, + this.useMultipleWarehouses, + this.manageInventoryMethodId, + this.stockQuantity, + this.stockAvailability, + this.stockAvailabilityn, + this.displayStockAvailability, + this.displayStockQuantity, + this.minStockQuantity, + this.notifyAdminForQuantityBelow, + this.allowBackInStockSubscriptions, + this.orderMinimumQuantity, + this.orderMaximumQuantity, + this.allowedQuantities, + this.allowAddingOnlyExistingAttributeCombinations, + this.disableBuyButton, + this.disableWishlistButton, + this.availableForPreOrder, + this.preOrderAvailabilityStartDateTimeUtc, + this.callForPrice, + this.price, + this.oldPrice, + this.productCost, + this.specialPrice, + this.specialPriceStartDateTimeUtc, + this.specialPriceEndDateTimeUtc, + this.customerEntersPrice, + this.minimumCustomerEnteredPrice, + this.maximumCustomerEnteredPrice, + this.basepriceEnabled, + this.basepriceAmount, + this.basepriceBaseAmount, + this.hasTierPrices, + this.hasDiscountsApplied, + this.discountName, + this.discountNamen, + this.discountDescription, + this.discountDescriptionn, + this.discountPercentage, + this.currency, + this.currencyn, + this.weight, + this.length, + this.width, + this.height, + this.availableStartDateTimeUtc, + this.availableEndDateTimeUtc, + this.displayOrder, + this.published, + this.deleted, + this.createdOnUtc, + this.updatedOnUtc, + this.productType, + this.parentGroupedProductId, + this.roleIds, + this.discountIds, + this.storeIds, + this.manufacturerIds, + this.reviews, + this.images, + this.attributes, + this.specifications, + this.associatedProductIds, + this.tags, + this.vendorId, + this.seName, + }); + + String id; + bool visibleIndividually; + String name; + String namen; + List localizedNames; + String shortDescription; + String shortDescriptionn; + String fullDescription; + String fullDescriptionn; + bool markasNew; + bool showOnHomePage; + String metaKeywords; + String metaDescription; + String metaTitle; + bool allowCustomerReviews; + int approvedRatingSum; + int notApprovedRatingSum; + int approvedTotalReviews; + int notApprovedTotalReviews; + String sku; + bool isRx; + bool prescriptionRequired; + dynamic rxMessage; + dynamic rxMessagen; + dynamic manufacturerPartNumber; + dynamic gtin; + bool isGiftCard; + bool requireOtherProducts; + bool automaticallyAddRequiredProducts; + bool isDownload; + bool unlimitedDownloads; + int maxNumberOfDownloads; + dynamic downloadExpirationDays; + bool hasSampleDownload; + bool hasUserAgreement; + bool isRecurring; + int recurringCycleLength; + int recurringTotalCycles; + bool isRental; + int rentalPriceLength; + bool isShipEnabled; + bool isFreeShipping; + bool shipSeparately; + int additionalShippingCharge; + bool isTaxExempt; + bool isTelecommunicationsOrBroadcastingOrElectronicServices; + bool useMultipleWarehouses; + int manageInventoryMethodId; + int stockQuantity; + String stockAvailability; + String stockAvailabilityn; + bool displayStockAvailability; + bool displayStockQuantity; + int minStockQuantity; + int notifyAdminForQuantityBelow; + bool allowBackInStockSubscriptions; + int orderMinimumQuantity; + int orderMaximumQuantity; + dynamic allowedQuantities; + bool allowAddingOnlyExistingAttributeCombinations; + bool disableBuyButton; + bool disableWishlistButton; + bool availableForPreOrder; + dynamic preOrderAvailabilityStartDateTimeUtc; + bool callForPrice; + double price; + int oldPrice; + double productCost; + dynamic specialPrice; + dynamic specialPriceStartDateTimeUtc; + dynamic specialPriceEndDateTimeUtc; + bool customerEntersPrice; + int minimumCustomerEnteredPrice; + int maximumCustomerEnteredPrice; + bool basepriceEnabled; + int basepriceAmount; + int basepriceBaseAmount; + bool hasTierPrices; + bool hasDiscountsApplied; + dynamic discountName; + dynamic discountNamen; + dynamic discountDescription; + dynamic discountDescriptionn; + dynamic discountPercentage; + String currency; + String currencyn; + double weight; + int length; + int width; + int height; + dynamic availableStartDateTimeUtc; + dynamic availableEndDateTimeUtc; + int displayOrder; + bool published; + bool deleted; + DateTime createdOnUtc; + DateTime updatedOnUtc; + String productType; + int parentGroupedProductId; + List roleIds; + List discountIds; + List storeIds; + List manufacturerIds; + List reviews; + List images; + List attributes; + List specifications; + List associatedProductIds; + List tags; + int vendorId; + String seName; + + factory Product.fromJson(Map json) => Product( + id: json["id"], + visibleIndividually: json["visible_individually"], + name: json["name"], + namen: json["namen"], + localizedNames: List.from(json["localized_names"].map((x) => LocalizedName.fromJson(x))), + shortDescription: json["short_description"], + shortDescriptionn: json["short_descriptionn"], + fullDescription: json["full_description"], + fullDescriptionn: json["full_descriptionn"], + markasNew: json["markas_new"], + showOnHomePage: json["show_on_home_page"], + metaKeywords: json["meta_keywords"] == null ? null : json["meta_keywords"], + metaDescription: json["meta_description"] == null ? null : json["meta_description"], + metaTitle: json["meta_title"] == null ? null : json["meta_title"], + allowCustomerReviews: json["allow_customer_reviews"], + approvedRatingSum: json["approved_rating_sum"], + notApprovedRatingSum: json["not_approved_rating_sum"], + approvedTotalReviews: json["approved_total_reviews"], + notApprovedTotalReviews: json["not_approved_total_reviews"], + sku: json["sku"], + isRx: json["is_rx"], + prescriptionRequired: json["prescription_required"], + rxMessage: json["rx_message"], + rxMessagen: json["rx_messagen"], + manufacturerPartNumber: json["manufacturer_part_number"], + gtin: json["gtin"], + isGiftCard: json["is_gift_card"], + requireOtherProducts: json["require_other_products"], + automaticallyAddRequiredProducts: json["automatically_add_required_products"], + isDownload: json["is_download"], + unlimitedDownloads: json["unlimited_downloads"], + maxNumberOfDownloads: json["max_number_of_downloads"], + downloadExpirationDays: json["download_expiration_days"], + hasSampleDownload: json["has_sample_download"], + hasUserAgreement: json["has_user_agreement"], + isRecurring: json["is_recurring"], + recurringCycleLength: json["recurring_cycle_length"], + recurringTotalCycles: json["recurring_total_cycles"], + isRental: json["is_rental"], + rentalPriceLength: json["rental_price_length"], + isShipEnabled: json["is_ship_enabled"], + isFreeShipping: json["is_free_shipping"], + shipSeparately: json["ship_separately"], + additionalShippingCharge: json["additional_shipping_charge"], + isTaxExempt: json["is_tax_exempt"], + isTelecommunicationsOrBroadcastingOrElectronicServices: json["is_telecommunications_or_broadcasting_or_electronic_services"], + useMultipleWarehouses: json["use_multiple_warehouses"], + manageInventoryMethodId: json["manage_inventory_method_id"], + stockQuantity: json["stock_quantity"], + stockAvailability: json["stock_availability"], + stockAvailabilityn: json["stock_availabilityn"], + displayStockAvailability: json["display_stock_availability"], + displayStockQuantity: json["display_stock_quantity"], + minStockQuantity: json["min_stock_quantity"], + notifyAdminForQuantityBelow: json["notify_admin_for_quantity_below"], + allowBackInStockSubscriptions: json["allow_back_in_stock_subscriptions"], + orderMinimumQuantity: json["order_minimum_quantity"], + orderMaximumQuantity: json["order_maximum_quantity"], + allowedQuantities: json["allowed_quantities"], + allowAddingOnlyExistingAttributeCombinations: json["allow_adding_only_existing_attribute_combinations"], + disableBuyButton: json["disable_buy_button"], + disableWishlistButton: json["disable_wishlist_button"], + availableForPreOrder: json["available_for_pre_order"], + preOrderAvailabilityStartDateTimeUtc: json["pre_order_availability_start_date_time_utc"], + callForPrice: json["call_for_price"], + price: json["price"].toDouble(), + oldPrice: json["old_price"], + productCost: json["product_cost"].toDouble(), + specialPrice: json["special_price"], + specialPriceStartDateTimeUtc: json["special_price_start_date_time_utc"], + specialPriceEndDateTimeUtc: json["special_price_end_date_time_utc"], + customerEntersPrice: json["customer_enters_price"], + minimumCustomerEnteredPrice: json["minimum_customer_entered_price"], + maximumCustomerEnteredPrice: json["maximum_customer_entered_price"], + basepriceEnabled: json["baseprice_enabled"], + basepriceAmount: json["baseprice_amount"], + basepriceBaseAmount: json["baseprice_base_amount"], + hasTierPrices: json["has_tier_prices"], + hasDiscountsApplied: json["has_discounts_applied"], + discountName: json["discount_name"], + discountNamen: json["discount_namen"], + discountDescription: json["discount_description"], + discountDescriptionn: json["discount_Descriptionn"], + discountPercentage: json["discount_percentage"], + currency: json["currency"], + currencyn: json["currencyn"], + weight: json["weight"].toDouble(), + length: json["length"], + width: json["width"], + height: json["height"], + availableStartDateTimeUtc: json["available_start_date_time_utc"], + availableEndDateTimeUtc: json["available_end_date_time_utc"], + displayOrder: json["display_order"], + published: json["published"], + deleted: json["deleted"], + createdOnUtc: DateTime.parse(json["created_on_utc"]), + updatedOnUtc: DateTime.parse(json["updated_on_utc"]), + productType: json["product_type"], + parentGroupedProductId: json["parent_grouped_product_id"], + roleIds: List.from(json["role_ids"].map((x) => x)), + discountIds: List.from(json["discount_ids"].map((x) => x)), + storeIds: List.from(json["store_ids"].map((x) => x)), + manufacturerIds: List.from(json["manufacturer_ids"].map((x) => x)), + reviews: List.from(json["reviews"].map((x) => x)), + images: List.from(json["images"].map((x) => Image.fromJson(x))), + attributes: List.from(json["attributes"].map((x) => x)), + specifications: List.from(json["specifications"].map((x) => Specification.fromJson(x))), + associatedProductIds: List.from(json["associated_product_ids"].map((x) => x)), + tags: List.from(json["tags"].map((x) => x)), + vendorId: json["vendor_id"], + seName: json["se_name"], + ); + + Map toJson() => { + "id": id, + "visible_individually": visibleIndividually, + "name": name, + "namen": namen, + "localized_names": List.from(localizedNames.map((x) => x.toJson())), + "short_description": shortDescription, + "short_descriptionn": shortDescriptionn, + "full_description": fullDescription, + "full_descriptionn": fullDescriptionn, + "markas_new": markasNew, + "show_on_home_page": showOnHomePage, + "meta_keywords": metaKeywords == null ? null : metaKeywords, + "meta_description": metaDescription == null ? null : metaDescription, + "meta_title": metaTitle == null ? null : metaTitle, + "allow_customer_reviews": allowCustomerReviews, + "approved_rating_sum": approvedRatingSum, + "not_approved_rating_sum": notApprovedRatingSum, + "approved_total_reviews": approvedTotalReviews, + "not_approved_total_reviews": notApprovedTotalReviews, + "sku": sku, + "is_rx": isRx, + "prescription_required": prescriptionRequired, + "rx_message": rxMessage, + "rx_messagen": rxMessagen, + "manufacturer_part_number": manufacturerPartNumber, + "gtin": gtin, + "is_gift_card": isGiftCard, + "require_other_products": requireOtherProducts, + "automatically_add_required_products": automaticallyAddRequiredProducts, + "is_download": isDownload, + "unlimited_downloads": unlimitedDownloads, + "max_number_of_downloads": maxNumberOfDownloads, + "download_expiration_days": downloadExpirationDays, + "has_sample_download": hasSampleDownload, + "has_user_agreement": hasUserAgreement, + "is_recurring": isRecurring, + "recurring_cycle_length": recurringCycleLength, + "recurring_total_cycles": recurringTotalCycles, + "is_rental": isRental, + "rental_price_length": rentalPriceLength, + "is_ship_enabled": isShipEnabled, + "is_free_shipping": isFreeShipping, + "ship_separately": shipSeparately, + "additional_shipping_charge": additionalShippingCharge, + "is_tax_exempt": isTaxExempt, + "is_telecommunications_or_broadcasting_or_electronic_services": isTelecommunicationsOrBroadcastingOrElectronicServices, + "use_multiple_warehouses": useMultipleWarehouses, + "manage_inventory_method_id": manageInventoryMethodId, + "stock_quantity": stockQuantity, + "stock_availability": stockAvailability, + "stock_availabilityn": stockAvailabilityn, + "display_stock_availability": displayStockAvailability, + "display_stock_quantity": displayStockQuantity, + "min_stock_quantity": minStockQuantity, + "notify_admin_for_quantity_below": notifyAdminForQuantityBelow, + "allow_back_in_stock_subscriptions": allowBackInStockSubscriptions, + "order_minimum_quantity": orderMinimumQuantity, + "order_maximum_quantity": orderMaximumQuantity, + "allowed_quantities": allowedQuantities, + "allow_adding_only_existing_attribute_combinations": allowAddingOnlyExistingAttributeCombinations, + "disable_buy_button": disableBuyButton, + "disable_wishlist_button": disableWishlistButton, + "available_for_pre_order": availableForPreOrder, + "pre_order_availability_start_date_time_utc": preOrderAvailabilityStartDateTimeUtc, + "call_for_price": callForPrice, + "price": price, + "old_price": oldPrice, + "product_cost": productCost, + "special_price": specialPrice, + "special_price_start_date_time_utc": specialPriceStartDateTimeUtc, + "special_price_end_date_time_utc": specialPriceEndDateTimeUtc, + "customer_enters_price": customerEntersPrice, + "minimum_customer_entered_price": minimumCustomerEnteredPrice, + "maximum_customer_entered_price": maximumCustomerEnteredPrice, + "baseprice_enabled": basepriceEnabled, + "baseprice_amount": basepriceAmount, + "baseprice_base_amount": basepriceBaseAmount, + "has_tier_prices": hasTierPrices, + "has_discounts_applied": hasDiscountsApplied, + "discount_name": discountName, + "discount_namen": discountNamen, + "discount_description": discountDescription, + "discount_Descriptionn": discountDescriptionn, + "discount_percentage": discountPercentage, + "currency": currency, + "currencyn": currencyn, + "weight": weight, + "length": length, + "width": width, + "height": height, + "available_start_date_time_utc": availableStartDateTimeUtc, + "available_end_date_time_utc": availableEndDateTimeUtc, + "display_order": displayOrder, + "published": published, + "deleted": deleted, + "created_on_utc": createdOnUtc.toIso8601String(), + "updated_on_utc": updatedOnUtc.toIso8601String(), + "product_type": productType, + "parent_grouped_product_id": parentGroupedProductId, + "role_ids": List.from(roleIds.map((x) => x)), + "discount_ids": List.from(discountIds.map((x) => x)), + "store_ids": List.from(storeIds.map((x) => x)), + "manufacturer_ids": List.from(manufacturerIds.map((x) => x)), + "reviews": List.from(reviews.map((x) => x)), + "images": List.from(images.map((x) => x.toJson())), + "attributes": List.from(attributes.map((x) => x)), + "specifications": List.from(specifications.map((x) => x.toJson())), + "associated_product_ids": List.from(associatedProductIds.map((x) => x)), + "tags": List.from(tags.map((x) => x)), + "vendor_id": vendorId, + "se_name": seName, + }; +} + +class Image { + Image({ + this.id, + this.position, + this.src, + this.thumb, + this.attachment, + }); + + int id; + int position; + String src; + String thumb; + String attachment; + + factory Image.fromJson(Map json) => Image( + id: json["id"], + position: json["position"], + src: json["src"], + thumb: json["thumb"], + attachment: json["attachment"], + ); + + Map toJson() => { + "id": id, + "position": position, + "src": src, + "thumb": thumb, + "attachment": attachment, + }; +} + +class LocalizedName { + LocalizedName({ + this.languageId, + this.localizedName, + }); + + int languageId; + String localizedName; + + factory LocalizedName.fromJson(Map json) => LocalizedName( + languageId: json["language_id"], + localizedName: json["localized_name"], + ); + + Map toJson() => { + "language_id": languageId, + "localized_name": localizedName, + }; +} + +class Specification { + Specification({ + this.id, + this.displayOrder, + this.defaultValue, + this.defaultValuen, + this.name, + this.nameN, + }); + + int id; + int displayOrder; + String defaultValue; + String defaultValuen; + String name; + String nameN; + + factory Specification.fromJson(Map json) => Specification( + id: json["id"], + displayOrder: json["display_order"], + defaultValue: json["default_value"], + defaultValuen: json["default_valuen"], + name: json["name"], + nameN: json["nameN"], + ); + + Map toJson() => { + "id": id, + "display_order": displayOrder, + "default_value": defaultValue, + "default_valuen": defaultValuen, + "name": name, + "nameN": nameN, + }; +} + +class EnumValues { + Map map; + Map reverseMap; + + EnumValues(this.map); + + Map get reverse { + if (reverseMap == null) { + reverseMap = map.map((k, v) => new MapEntry(v, k)); + } + return reverseMap; + } +} diff --git a/lib/models/pharmacy/brandModel.dart b/lib/models/pharmacy/brandModel.dart index b20afa33..2855d492 100644 --- a/lib/models/pharmacy/brandModel.dart +++ b/lib/models/pharmacy/brandModel.dart @@ -40,7 +40,7 @@ class Brand { dynamic metaDescription; dynamic metaTitle; int pageSize; - PageSizeOptions pageSizeOptions; + String pageSizeOptions; dynamic priceRanges; bool published; bool deleted; @@ -60,7 +60,7 @@ class Brand { metaDescription: json["meta_description"], metaTitle: json["meta_title"], pageSize: json["page_size"], - pageSizeOptions: pageSizeOptionsValues.map[json["page_size_options"]], + pageSizeOptions: json["page_size_options"], priceRanges: json["price_ranges"], published: json["published"], deleted: json["deleted"], @@ -81,7 +81,7 @@ class Brand { "meta_description": metaDescription, "meta_title": metaTitle, "page_size": pageSize, - "page_size_options": pageSizeOptionsValues.reverse[pageSizeOptions], + "page_size_options": pageSizeOptions, "price_ranges": priceRanges, "published": published, "deleted": deleted, @@ -135,23 +135,3 @@ class LocalizedName { "localized_name": localizedName, }; } - -enum PageSizeOptions { THE_2460100 } - -final pageSizeOptionsValues = EnumValues({ - "24, 60, 100": PageSizeOptions.THE_2460100 -}); - -class EnumValues { - Map map; - Map reverseMap; - - EnumValues(this.map); - - Map get reverse { - if (reverseMap == null) { - reverseMap = map.map((k, v) => new MapEntry(v, k)); - } - return reverseMap; - } -} diff --git a/lib/models/pharmacy/specification.dart b/lib/models/pharmacy/specification.dart new file mode 100644 index 00000000..6ef69191 --- /dev/null +++ b/lib/models/pharmacy/specification.dart @@ -0,0 +1,61 @@ +// To parse this JSON data, do +// +// final specificationModel = specificationModelFromJson(jsonString); + +import 'dart:convert'; + +SpecificationModel specificationModelFromJson(String str) => SpecificationModel.fromJson(json.decode(str)); + +String specificationModelToJson(SpecificationModel data) => json.encode(data.toJson()); + +class SpecificationModel { + SpecificationModel({ + this.specification, + }); + + List specification; + + factory SpecificationModel.fromJson(Map json) => SpecificationModel( + specification: List.from(json["specification"].map((x) => Specification.fromJson(x))), + ); + + Map toJson() => { + "specification": List.from(specification.map((x) => x.toJson())), + }; +} + +class Specification { + Specification({ + this.id, + this.displayOrder, + this.defaultValue, + this.defaultValuen, + this.name, + this.nameN, + }); + + int id; + int displayOrder; + String defaultValue; + String defaultValuen; + String name; + String nameN; + + factory Specification.fromJson(Map json) => Specification( + id: json["id"], + displayOrder: json["display_order"], + defaultValue: json["default_value"], + defaultValuen: json["default_valuen"], + name: json["name"], + nameN: json["nameN"], + ); + + Map toJson() => { + "id": id, + "display_order": displayOrder, + "default_value": defaultValue, + "default_valuen": defaultValuen, + "name": name, + "nameN": nameN, + }; +} diff --git a/lib/models/pharmacy/topBrandsModel.dart b/lib/models/pharmacy/topBrandsModel.dart index e27ee270..0cd833b7 100644 --- a/lib/models/pharmacy/topBrandsModel.dart +++ b/lib/models/pharmacy/topBrandsModel.dart @@ -34,7 +34,7 @@ class TopBrand { String name; String namen; List localizedNames; - dynamic description; + String description; int manufacturerTemplateId; String metaKeywords; dynamic metaDescription; @@ -54,7 +54,7 @@ class TopBrand { name: json["name"], namen: json["namen"], localizedNames: List.from(json["localized_names"].map((x) => LocalizedName.fromJson(x))), - description: json["description"], + description: json["description"] == null ? null : json["description"], manufacturerTemplateId: json["manufacturer_template_id"], metaKeywords: json["meta_keywords"], metaDescription: json["meta_description"], @@ -67,7 +67,7 @@ class TopBrand { displayOrder: json["display_order"], createdOnUtc: DateTime.parse(json["created_on_utc"]), updatedOnUtc: DateTime.parse(json["updated_on_utc"]), - image: Image.fromJson(json["image"]), + image: json["image"] == null ? null : Image.fromJson(json["image"]), ); Map toJson() => { @@ -75,7 +75,7 @@ class TopBrand { "name": name, "namen": namen, "localized_names": List.from(localizedNames.map((x) => x.toJson())), - "description": description, + "description": description == null ? null : description, "manufacturer_template_id": manufacturerTemplateId, "meta_keywords": metaKeywords, "meta_description": metaDescription, @@ -88,7 +88,7 @@ class TopBrand { "display_order": displayOrder, "created_on_utc": createdOnUtc.toIso8601String(), "updated_on_utc": updatedOnUtc.toIso8601String(), - "image": image.toJson(), + "image": image == null ? null : image.toJson(), }; } diff --git a/lib/pages/landing/landing_page_pharmcy.dart b/lib/pages/landing/landing_page_pharmcy.dart index 59492370..52bbb888 100644 --- a/lib/pages/landing/landing_page_pharmcy.dart +++ b/lib/pages/landing/landing_page_pharmcy.dart @@ -10,6 +10,7 @@ import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; import 'package:diplomaticquarterapp/widgets/drawer/app_drawer_widget.dart'; import 'package:diplomaticquarterapp/widgets/pharmacy/bottom_nav_pharmacy_bar.dart'; import 'package:flutter/material.dart'; +import 'package:diplomaticquarterapp/pages/pharmacies/wishlist.dart'; import '../offers_categorise_page.dart'; @@ -136,7 +137,8 @@ class _LandingPagePharmacyState extends State { children: [ PharmacyPage(), PharmacyCategorisePage(), - OffersCategorisePage(), +// OffersCategorisePage(), + WishlistPage(), PharmacyProfilePage(), // Container( // child: Text('text'), diff --git a/lib/pages/pharmacies/ProductCheckTypeWidget.dart b/lib/pages/pharmacies/ProductCheckTypeWidget.dart index f2d87529..878544e1 100644 --- a/lib/pages/pharmacies/ProductCheckTypeWidget.dart +++ b/lib/pages/pharmacies/ProductCheckTypeWidget.dart @@ -1,12 +1,21 @@ +import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; +import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; import 'package:diplomaticquarterapp/widgets/pharmacy/product_tile.dart'; import 'package:flutter/material.dart'; +AppSharedPreferences sharedPref = AppSharedPreferences(); +var languageID; class ProductCheckTypeWidget extends StatelessWidget { final List wishlist; final bool isTrue; ProductCheckTypeWidget(this.isTrue, this.wishlist); + + void initState() { + getLanguageID(); + } + @override Widget build(BuildContext context) { return isTrue @@ -18,15 +27,16 @@ class ProductCheckTypeWidget extends StatelessWidget { Container( child: isTrue ? productTile( - productName: wishlist[index].product.name, + productName: languageID == 'ar' ? wishlist[index].product.namen : wishlist[index].product.name, productPrice: wishlist[index].subtotal, productRate: double.parse(wishlist[index].subtotalVatRate), productImage: wishlist[index].product.images[0].src, showLine: isTrue, + productID: wishlist[index].product.id, ) : productTile( - productName: wishlist[index].product.name, + productName: languageID == 'ar' ? wishlist[index].product.namen : wishlist[index].product.name, productPrice: wishlist[index].subtotal, productRate: double.parse(wishlist[index].subtotalVatRate), @@ -53,3 +63,8 @@ class ProductCheckTypeWidget extends StatelessWidget { ); } } + +getLanguageID() async { + languageID = await sharedPref.getString(APP_LANGUAGE); +} + diff --git a/lib/pages/pharmacies/compare-list.dart b/lib/pages/pharmacies/compare-list.dart new file mode 100644 index 00000000..37e2fc8c --- /dev/null +++ b/lib/pages/pharmacies/compare-list.dart @@ -0,0 +1,36 @@ +import 'package:diplomaticquarterapp/uitl/app_toast.dart'; +import 'package:flutter/material.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacies/PharmacyProduct.dart'; + +class CompareList with ChangeNotifier { + List _product = []; + + List get productListItems => _product; + + void addItem(data) { + if (_product.length == 0) { + _product.add(data); + AppToast.showSuccessToast(message: 'You have added a product to the Compare list'); + } else { + for (int i = 0; i < _product.length; i++) { + if (_product.length <= 4 && _product[i].id != data.id) { + _product.add(data); + AppToast.showSuccessToast(message: 'You have added a product to the Compare list'); + break; + } else if(_product[i].id == data.id){ + AppToast.showErrorToast(message: 'the item is already in the list'); + } else if(_product.length == 4){ + AppToast.showErrorToast(message: 'your compare list is full'); + } + } + } + notifyListeners(); + } + + void deleteItem(data) { + for (int i = 0; i < _product.length; i++) { + if (_product[i].id == data) _product.remove(_product[i]); + } + notifyListeners(); + } +} diff --git a/lib/pages/pharmacies/compare.dart b/lib/pages/pharmacies/compare.dart index ffb3dd06..ec2882f1 100644 --- a/lib/pages/pharmacies/compare.dart +++ b/lib/pages/pharmacies/compare.dart @@ -2,6 +2,11 @@ import 'package:flutter/material.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:carousel_slider/carousel_slider.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; +import 'package:diplomaticquarterapp/pages/pharmacies/compare-list.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacies/PharmacyProduct.dart'; +import 'package:provider/provider.dart'; + +int counter = 0; void main() => runApp(ComparePage()); @@ -10,6 +15,7 @@ class ComparePage extends StatefulWidget { _ComparePageState createState() => _ComparePageState(); } +//CompareList compareItems = CompareList(); class _ComparePageState extends State { @override Widget build(BuildContext context) { @@ -24,574 +30,301 @@ class _ComparePageState extends State { } } -compareList() { - return CarouselSlider( - options: CarouselOptions( - height: 800.0, viewportFraction: 0.95, enableInfiniteScroll: false), - items: [1, 2].map((i) { - return Builder( - builder: (BuildContext context) { - return Padding( - padding: const EdgeInsets.only(top: 8), - child: Container( - width: MediaQuery.of(context).size.width, - margin: EdgeInsets.symmetric(horizontal: 10.0), - child: slideDetail(), - ), - ); - }, - ); - }).toList(), - ); -} - -slideDetail() { - return ListView( - children: [ - Row( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Container( - height: 800, - width: 150, - margin: EdgeInsets.symmetric(horizontal: 10.0), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(10), - border: Border( - top: BorderSide(width: 0.5, color: Colors.grey), - left: BorderSide(width: 0.5, color: Colors.grey), - right: BorderSide(width: 0.5, color: Colors.grey), - bottom: BorderSide(width: 0.5, color: Colors.grey), - ), - color: Colors.white), - child: Padding( - padding: const EdgeInsets.all(8.0), +class compareList extends StatelessWidget { + @override + Widget build(BuildContext context) { + final productItemData = Provider.of(context); + final productItem = productItemData.productListItems; + return productItem.length == 0 + ? Container( + child: Center( child: Column( + mainAxisAlignment: MainAxisAlignment.center, children: [ - Container( - child: Align( - alignment: Alignment.topRight, - child: Icon(FontAwesomeIcons.trashAlt, size: 15)), - ), - SizedBox(height: 20,), - Image( - image: AssetImage( - 'assets/images/al-habib_onlne_pharmacy_bg.png'), - fit: BoxFit.cover, - width: 100, - height: 60, - ), Padding( - padding: EdgeInsets.only(top: 8.0), - child: Container( - height: 1.0, - width: 300.0, - color:Colors.grey,), - ), - Container( - margin: EdgeInsets.all(5), - child: Align( - alignment: Alignment.topLeft, - child: RichText( - text: TextSpan( - text: 'SAR 999.99', - style: TextStyle( - fontWeight: FontWeight.bold, - color: Colors.black, - fontSize: 13), - ), - ), - ), - ), - Container( - margin: EdgeInsets.all(5), - child: Align( - alignment: Alignment.topLeft, - child: RichText( - text: TextSpan( - text: - 'ENAD test', - style: TextStyle( - color: Colors.black54, - fontSize: 15, - fontWeight: FontWeight.bold), - ), - ), + padding: const EdgeInsets.all(8.0), + child: Image.asset( + 'assets/images/new-design/empty_box.png', + width: 100, + height: 100, + fit: BoxFit.cover, ), ), Padding( - padding: EdgeInsets.only(top: 8.0), - child: Container( - height: 1.0, - width: 300.0, - color:Colors.grey,), - ), - Container( - margin: EdgeInsets.all(5), - child: Align( - alignment: Alignment.topLeft, - child: RichText( - text: TextSpan( - text: 'Primary Unit Of Measure', - style: TextStyle( - fontWeight: FontWeight.bold, - color: Colors.black, - fontSize: 13), - ), - ), + padding: const EdgeInsets.all(8.0), + child: Text( + 'There is no data', + style: TextStyle(fontSize: 30), ), - ), - Container( - margin: EdgeInsets.all(5), - child: Align( - alignment: Alignment.topLeft, - child: RichText( - text: TextSpan( - text: - 'Each', - style: TextStyle( - color: Colors.black54, - fontSize: 15, - fontWeight: FontWeight.bold), - ), - ), - ), - ), - Padding( - padding: EdgeInsets.only(top: 8.0), + ) + ], + ), + ), + ) + : CarouselSlider( + options: CarouselOptions( + height: 800.0, + viewportFraction: 0.87, + enableInfiniteScroll: false), + items: productItem.map((i) { + return Builder( + builder: (BuildContext context) { + return Padding( + padding: const EdgeInsets.only(top: 8), child: Container( - height: 1.0, - width: 300.0, - color:Colors.grey,), - ), - Container( - margin: EdgeInsets.all(5), - child: Align( - alignment: Alignment.topLeft, - child: RichText( - text: TextSpan( - text: 'Primary Unit Of Measure', - style: TextStyle( - fontWeight: FontWeight.bold, - color: Colors.black, - fontSize: 13), - ), - ), + width: MediaQuery.of(context).size.width, + margin: EdgeInsets.symmetric(horizontal: 10.0), + child: productItem.length != 0 + ? slideDetail(productItem) + : Container(), ), - ), - Container( - margin: EdgeInsets.all(5), - child: Align( - alignment: Alignment.topLeft, - child: RichText( - text: TextSpan( - text: - 'Each', - style: TextStyle( - color: Colors.black54, - fontSize: 15, - fontWeight: FontWeight.bold), + ); + }, + ); + }).toList(), + ); + } +} + +class slideDetail extends StatefulWidget { + final List data; + + slideDetail(this.data); + + @override + _slideDetailState createState() => _slideDetailState(); +} + +class _slideDetailState extends State { + @override + Widget build(BuildContext context) { + return ListView.builder( + scrollDirection: Axis.horizontal, + itemCount: widget.data.length, + itemBuilder: (BuildContext contx, int index) { + return Row( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Container( + height: 550, + width: 150, + margin: EdgeInsets.symmetric(horizontal: 10.0), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10), + border: Border( + top: BorderSide(width: 0.5, color: Colors.grey), + left: BorderSide(width: 0.5, color: Colors.grey), + right: BorderSide(width: 0.5, color: Colors.grey), + bottom: BorderSide(width: 0.5, color: Colors.grey), + ), + color: Colors.white), + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + children: [ + Container( + child: Align( + alignment: Alignment.topRight, + child: IconButton( + icon: Icon(FontAwesomeIcons.trashAlt, size: 15), + onPressed: () { + setState(() { + Provider.of(context, listen: false) + .deleteItem(widget.data[index].id); + }); + }, ), ), ), - ), - Padding( - padding: EdgeInsets.only(top: 8.0), - child: Container( - height: 1.0, - width: 300.0, - color:Colors.grey,), - ), - Container( - margin: EdgeInsets.all(5), - child: Align( - alignment: Alignment.topLeft, - child: RichText( - text: TextSpan( - text: 'Primary Unit Of Measure', - style: TextStyle( - fontWeight: FontWeight.bold, - color: Colors.black, - fontSize: 13), - ), - ), + SizedBox( + height: 20, ), - ), - Container( - margin: EdgeInsets.all(5), - child: Align( - alignment: Alignment.topLeft, - child: RichText( - text: TextSpan( - text: - 'Each', - style: TextStyle( - color: Colors.black54, - fontSize: 15, - fontWeight: FontWeight.bold), - ), - ), + Image.network( + widget.data[index].images[0].src.trim(), + fit: BoxFit.cover, + width: 100, + height: 60, ), - ), - Padding( - padding: EdgeInsets.only(top: 8.0), - child: Container( - height: 1.0, - width: 300.0, - color:Colors.grey,), - ), - Container( - margin: EdgeInsets.all(5), - child: Align( - alignment: Alignment.topLeft, - child: RichText( - text: TextSpan( - text: 'Primary Unit Of Measure', - style: TextStyle( - fontWeight: FontWeight.bold, - color: Colors.black, - fontSize: 13), - ), + Padding( + padding: EdgeInsets.only(top: 8.0), + child: Container( + height: 1.0, + width: 300.0, + color: Colors.grey, ), ), - ), - Container( - margin: EdgeInsets.all(5), - child: Align( - alignment: Alignment.topLeft, - child: RichText( - text: TextSpan( - text: - 'Each', - style: TextStyle( - color: Colors.black54, - fontSize: 15, - fontWeight: FontWeight.bold), + Container( + margin: EdgeInsets.all(5), + child: Align( + alignment: Alignment.topLeft, + child: RichText( + text: TextSpan( + text: widget.data[index].name, + style: TextStyle( + fontWeight: FontWeight.bold, + color: Colors.black, + fontSize: 13), + ), ), ), ), - ), - Padding( - padding: EdgeInsets.only(top: 8.0), - child: Container( - height: 1.0, - width: 300.0, - color:Colors.grey,), - ), - Container( - margin: EdgeInsets.all(5), - child: Align( - alignment: Alignment.topLeft, - child: RichText( - text: TextSpan( - text: 'Primary Unit Of Measure', - style: TextStyle( - fontWeight: FontWeight.bold, - color: Colors.black, - fontSize: 13), + Container( + margin: EdgeInsets.all(5), + child: Align( + alignment: Alignment.topLeft, + child: RichText( + text: TextSpan( + text: widget.data[index].price.toString(), + style: TextStyle( + color: Colors.black54, + fontSize: 15, + fontWeight: FontWeight.bold), + ), ), ), ), - ), - Container( - margin: EdgeInsets.all(5), - child: Align( - alignment: Alignment.topLeft, - child: RichText( - text: TextSpan( - text: - 'Each', - style: TextStyle( - color: Colors.black54, - fontSize: 15, - fontWeight: FontWeight.bold), - ), - ), - ), - ), - Padding( - padding: EdgeInsets.only(top: 8.0), - child: Container( - height: 1.0, - width: 300.0, - color:Colors.grey,), - ), - ], - ), - ), - ), - Container( - height: 800, - width: 150, - margin: EdgeInsets.symmetric(horizontal: 10.0), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(10), - border: Border( - top: BorderSide(width: 0.5, color: Colors.grey), - left: BorderSide(width: 0.5, color: Colors.grey), - right: BorderSide(width: 0.5, color: Colors.grey), - bottom: BorderSide(width: 0.5, color: Colors.grey), - ), - color: Colors.white), - child: Padding( - padding: const EdgeInsets.all(8.0), - child: Column( - children: [ - Container( - child: Align( - alignment: Alignment.topRight, - child: Icon(FontAwesomeIcons.trashAlt, size: 15)), - ), - SizedBox(height: 20,), - Image( - image: AssetImage( - 'assets/images/al-habib_onlne_pharmacy_bg.png'), - fit: BoxFit.cover, - width: 100, - height: 60, - ), - Padding( - padding: EdgeInsets.only(top: 8.0), - child: Container( - height: 1.0, - width: 300.0, - color:Colors.grey,), - ), - Container( - margin: EdgeInsets.all(5), - child: Align( - alignment: Alignment.topLeft, - child: RichText( - text: TextSpan( - text: 'SAR 999.99', - style: TextStyle( - fontWeight: FontWeight.bold, - color: Colors.black, - fontSize: 13), - ), + Padding( + padding: EdgeInsets.only(top: 8.0), + child: Container( + height: 1.0, + width: 300.0, + color: Colors.grey, ), ), - ), - Container( - margin: EdgeInsets.all(5), - child: Align( - alignment: Alignment.topLeft, - child: RichText( - text: TextSpan( - text: - 'ENAD test', - style: TextStyle( - color: Colors.black54, - fontSize: 15, - fontWeight: FontWeight.bold), + Container( + margin: EdgeInsets.all(5), + child: Align( + alignment: Alignment.topLeft, + child: RichText( + text: TextSpan( + text: widget.data[index].specifications[0].name, + style: TextStyle( + fontWeight: FontWeight.bold, + color: Colors.black, + fontSize: 13), + ), ), ), ), - ), - Padding( - padding: EdgeInsets.only(top: 8.0), - child: Container( - height: 1.0, - width: 300.0, - color:Colors.grey,), - ), - Container( - margin: EdgeInsets.all(5), - child: Align( - alignment: Alignment.topLeft, - child: RichText( - text: TextSpan( - text: 'Primary Unit Of Measure', - style: TextStyle( - fontWeight: FontWeight.bold, - color: Colors.black, - fontSize: 13), - ), - ), - ), - ), - Container( - margin: EdgeInsets.all(5), - child: Align( - alignment: Alignment.topLeft, - child: RichText( - text: TextSpan( - text: - 'Each', - style: TextStyle( - color: Colors.black54, - fontSize: 15, - fontWeight: FontWeight.bold), - ), - ), - ), - ), - Padding( - padding: EdgeInsets.only(top: 8.0), - child: Container( - height: 1.0, - width: 300.0, - color:Colors.grey,), - ), - Container( - margin: EdgeInsets.all(5), - child: Align( - alignment: Alignment.topLeft, - child: RichText( - text: TextSpan( - text: 'Primary Unit Of Measure', - style: TextStyle( - fontWeight: FontWeight.bold, - color: Colors.black, - fontSize: 13), + Container( + margin: EdgeInsets.all(5), + child: Align( + alignment: Alignment.topLeft, + child: RichText( + text: TextSpan( + text: widget.data[index].specifications[1].name, + style: TextStyle( + color: Colors.black54, + fontSize: 15, + fontWeight: FontWeight.bold), + ), ), ), ), - ), - Container( - margin: EdgeInsets.all(5), - child: Align( - alignment: Alignment.topLeft, - child: RichText( - text: TextSpan( - text: - 'Each', - style: TextStyle( - color: Colors.black54, - fontSize: 15, - fontWeight: FontWeight.bold), - ), + Padding( + padding: EdgeInsets.only(top: 8.0), + child: Container( + height: 1.0, + width: 300.0, + color: Colors.grey, ), ), - ), - Padding( - padding: EdgeInsets.only(top: 8.0), - child: Container( - height: 1.0, - width: 300.0, - color:Colors.grey,), - ), - Container( - margin: EdgeInsets.all(5), - child: Align( - alignment: Alignment.topLeft, - child: RichText( - text: TextSpan( - text: 'Primary Unit Of Measure', - style: TextStyle( - fontWeight: FontWeight.bold, - color: Colors.black, - fontSize: 13), + Container( + margin: EdgeInsets.all(5), + child: Align( + alignment: Alignment.topLeft, + child: RichText( + text: TextSpan( + text: widget.data[index].specifications[2].name, + style: TextStyle( + fontWeight: FontWeight.bold, + color: Colors.black, + fontSize: 13), + ), ), ), ), - ), - Container( - margin: EdgeInsets.all(5), - child: Align( - alignment: Alignment.topLeft, - child: RichText( - text: TextSpan( - text: - 'Each', - style: TextStyle( - color: Colors.black54, - fontSize: 15, - fontWeight: FontWeight.bold), + Container( + margin: EdgeInsets.all(5), + child: Align( + alignment: Alignment.topLeft, + child: RichText( + text: TextSpan( + text: widget.data[index].specifications[3].name, + style: TextStyle( + color: Colors.black54, + fontSize: 15, + fontWeight: FontWeight.bold), + ), ), ), ), - ), - Padding( - padding: EdgeInsets.only(top: 8.0), - child: Container( - height: 1.0, - width: 300.0, - color:Colors.grey,), - ), - Container( - margin: EdgeInsets.all(5), - child: Align( - alignment: Alignment.topLeft, - child: RichText( - text: TextSpan( - text: 'Primary Unit Of Measure', - style: TextStyle( - fontWeight: FontWeight.bold, - color: Colors.black, - fontSize: 13), - ), + Padding( + padding: EdgeInsets.only(top: 8.0), + child: Container( + height: 1.0, + width: 300.0, + color: Colors.grey, ), ), - ), - Container( - margin: EdgeInsets.all(5), - child: Align( - alignment: Alignment.topLeft, - child: RichText( - text: TextSpan( - text: - 'Each', - style: TextStyle( - color: Colors.black54, - fontSize: 15, - fontWeight: FontWeight.bold), + Container( + margin: EdgeInsets.all(5), + child: Align( + alignment: Alignment.topLeft, + child: RichText( + text: TextSpan( + text: widget.data[index].specifications[4].name, + style: TextStyle( + fontWeight: FontWeight.bold, + color: Colors.black, + fontSize: 13), + ), ), ), ), - ), - Padding( - padding: EdgeInsets.only(top: 8.0), - child: Container( - height: 1.0, - width: 300.0, - color:Colors.grey,), - ), - Container( - margin: EdgeInsets.all(5), - child: Align( - alignment: Alignment.topLeft, - child: RichText( - text: TextSpan( - text: 'Primary Unit Of Measure', - style: TextStyle( - fontWeight: FontWeight.bold, - color: Colors.black, - fontSize: 13), + Container( + margin: EdgeInsets.all(5), + child: Align( + alignment: Alignment.topLeft, + child: RichText( + text: TextSpan( + text: widget.data[index].specifications[5].name, + style: TextStyle( + color: Colors.black54, + fontSize: 15, + fontWeight: FontWeight.bold), + ), ), ), ), - ), - Container( - margin: EdgeInsets.all(5), - child: Align( - alignment: Alignment.topLeft, - child: RichText( - text: TextSpan( - text: - 'Each', - style: TextStyle( - color: Colors.black54, - fontSize: 15, - fontWeight: FontWeight.bold), - ), + Padding( + padding: EdgeInsets.only(top: 8.0), + child: Container( + height: 1.0, + width: 300.0, + color: Colors.grey, ), ), - ), - Padding( - padding: EdgeInsets.only(top: 8.0), - child: Container( - height: 1.0, - width: 300.0, - color:Colors.grey,), - ), - ], + ], + ), ), ), - ), - ], - ), - ], - ); + ], + ); + }, + ); + } +} + +String returnString(data) { + for (int i = 0; i < data.length; i++) { + print(data[i]); +// if(data[i] == null){ +// if(counter == i){ +// +// } +// } + } + return "ENAD HILAL"; } diff --git a/lib/pages/pharmacies/my_reviews.dart b/lib/pages/pharmacies/my_reviews.dart index 725743c3..990d15a6 100644 --- a/lib/pages/pharmacies/my_reviews.dart +++ b/lib/pages/pharmacies/my_reviews.dart @@ -3,6 +3,7 @@ import 'package:flutter/material.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:rating_bar/rating_bar.dart'; import 'package:diplomaticquarterapp/pages/base/base_view.dart'; +import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; void main() => runApp(MyReviewsPage()); @@ -11,7 +12,13 @@ class MyReviewsPage extends StatefulWidget { _MyReviewsPageState createState() => _MyReviewsPageState(); } +var languageID; + class _MyReviewsPageState extends State { + void initState() { + getLanguageID(); + } + @override Widget build(BuildContext context) { return BaseView( @@ -20,25 +27,53 @@ class _MyReviewsPageState extends State { appBarTitle: 'Wishlist page', isShowAppBar: true, isPharmacy: true, - body: Container( - child: ListView.builder( - itemCount: model.reviewListList.length, - itemBuilder: (BuildContext context, int index) { - return Column( - children: [ - Container( - child: reviewDetails( - model.reviewListList[index], - double.parse(model.reviewListList[index].product - .approvedTotalReviews.toString()), - double.parse(model.reviewListList[index].rating.toString()), + body: model.reviewListList.length == 0 + ? Container( + child: Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Padding( + padding: const EdgeInsets.all(8.0), + child: Image.asset( + 'assets/images/new-design/empty_box.png', + width: 100, + height: 100, + fit: BoxFit.cover, + ), ), - ), - Divider(height: 1, color: Colors.grey) - ], - ); - }), - ), + Padding( + padding: const EdgeInsets.all(8.0), + child: Text( + 'There is no data', + style: TextStyle(fontSize: 30), + ), + ) + ], + ), + ), + ) + : Container( + child: ListView.builder( + itemCount: model.reviewListList.length, + itemBuilder: (BuildContext context, int index) { + return Column( + children: [ + Container( + child: reviewDetails( + model.reviewListList[index], + double.parse(model.reviewListList[index].product + .approvedTotalReviews + .toString()), + double.parse(model.reviewListList[index].rating + .toString()), + ), + ), + Divider(height: 1, color: Colors.grey) + ], + ); + }), + ), ), ); } @@ -47,7 +82,7 @@ class _MyReviewsPageState extends State { reviewDetails(data, rate, myRate) { return Container( child: Padding( - padding: const EdgeInsets.only(bottom: 10.0), + padding: EdgeInsets.only(bottom: 10.0), child: Container( height: 200, width: double.infinity, @@ -59,7 +94,9 @@ reviewDetails(data, rate, myRate) { Row( children: [ Container( - margin: EdgeInsets.only(top: 10, left: 10), + margin: languageID == 'ar' + ? EdgeInsets.only(top: 10, right: 10) + : EdgeInsets.only(top: 10, left: 10), child: Image.network( data.product.images[0].src.trim(), fit: BoxFit.cover, @@ -74,13 +111,17 @@ reviewDetails(data, rate, myRate) { Container( margin: EdgeInsets.all(5), child: Align( - alignment: Alignment.topLeft, + alignment: languageID == 'ar' + ? Alignment.topRight + : Alignment.topLeft, child: RichText( text: TextSpan( - text: data.product.name, + text: languageID == 'ar' + ? data.product.namen + : data.product.name, style: TextStyle( color: Colors.black54, - fontSize: 13, + fontSize: languageID == 'ar' ? 7 : 13, fontWeight: FontWeight.bold), ), ), @@ -91,7 +132,9 @@ reviewDetails(data, rate, myRate) { Container( margin: EdgeInsets.all(5), child: Align( - alignment: Alignment.topLeft, + alignment: languageID == 'ar' + ? Alignment.topRight + : Alignment.topLeft, child: RichText( text: TextSpan( text: data.product.price.toString() + @@ -110,7 +153,9 @@ reviewDetails(data, rate, myRate) { Container( margin: EdgeInsets.all(5), child: Align( - alignment: Alignment.topLeft, + alignment: languageID == 'ar' + ? Alignment.topRight + : Alignment.topLeft, child: RatingBar.readOnly( initialRating: rate, size: 15.0, @@ -139,7 +184,9 @@ reviewDetails(data, rate, myRate) { mainAxisAlignment: MainAxisAlignment.start, children: [ Container( - padding: EdgeInsets.only(left: 10), + padding: languageID == 'ar' + ? EdgeInsets.only(right: 10) + : EdgeInsets.only(left: 10), child: Text(data.createdOnUtc.toString())), ], ), @@ -150,7 +197,9 @@ reviewDetails(data, rate, myRate) { mainAxisAlignment: MainAxisAlignment.end, children: [ Container( - padding: EdgeInsets.only(left: 60), + padding: languageID == 'ar' + ? EdgeInsets.only(right: 60) + : EdgeInsets.only(left: 60), child: RatingBar.readOnly( initialRating: myRate, size: 15.0, @@ -173,7 +222,9 @@ reviewDetails(data, rate, myRate) { ), Expanded( child: Container( - padding: EdgeInsets.only(left: 10), + padding: languageID == 'ar' + ? EdgeInsets.only(right: 10) + : EdgeInsets.only(left: 10), child: Text(fixingString(data.reviewText.toString())), ), ), @@ -184,7 +235,7 @@ reviewDetails(data, rate, myRate) { ); } -fixingString(txt){ +fixingString(txt) { String stringTxt; String newTxt; stringTxt = txt.toString(); @@ -192,3 +243,7 @@ fixingString(txt){ return newTxt; } + +getLanguageID() async { + languageID = await sharedPref.getString(APP_LANGUAGE); +} diff --git a/lib/pages/pharmacies/product-brands.dart b/lib/pages/pharmacies/product-brands.dart index 86013a9c..bde53566 100644 --- a/lib/pages/pharmacies/product-brands.dart +++ b/lib/pages/pharmacies/product-brands.dart @@ -1,7 +1,14 @@ +import 'package:diplomaticquarterapp/config/config.dart'; +import 'package:diplomaticquarterapp/pages/login/register-info.dart'; +import 'package:diplomaticquarterapp/pages/pharmacies/search_brands_page.dart'; +import 'package:diplomaticquarterapp/pages/search_products_page.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; import 'package:flutter/material.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:diplomaticquarterapp/pages/base/base_view.dart'; import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/brand_view_model.dart'; +import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; void main() => runApp(ProductBrandsPage()); @@ -10,26 +17,43 @@ class ProductBrandsPage extends StatefulWidget { _ProductBrandsPageState createState() => _ProductBrandsPageState(); } +var languageID; class _ProductBrandsPageState extends State { + + void initState() { + getLanguageID(); + } + @override Widget build(BuildContext context) { return BaseView( - onModelReady: (model) => model.getTopBrandsData(), + onModelReady: (model) => model.getBrandsData(), builder: (_, model, wi) => AppScaffold( appBarTitle: 'Brands page', isShowAppBar: true, isPharmacy: true, + isShowDecPage: false, body: Container( child: Column( children: [ Container( color: Colors.white, - alignment: Alignment.topLeft, - padding: EdgeInsets.only(left: 10.0, top: 10.0), + alignment: languageID == 'ar'? + Alignment.topRight : + Alignment.topLeft, + padding: languageID == 'ar' ? + EdgeInsets.only( + right: 10.0, + top: 10.0 + ): + EdgeInsets.only( + left: 10.0, + top: 10.0 + ), child: Text( - 'Top Brands', + TranslationBase.of(context).topBrands, style: TextStyle( - fontWeight: FontWeight.bold + fontWeight: FontWeight.bold, ), ), ), @@ -43,13 +67,35 @@ class _ProductBrandsPageState extends State { height: 10, ), Container( - height: 100, - width: double.infinity, - color: Colors.white, - child: IconButton( - icon: Icon(Icons.search), - onPressed: () { - showSearch(context: context, delegate: SearchBar()); + height: MediaQuery.of(context).size.height * 0.056, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(5.0), + color: Colors.white, + ), + child: InkWell( + child: Padding( + padding: EdgeInsets.all(8.0), + child: Row( + //crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Icon(Icons.search, size: 25.0), + SizedBox( + width: 15.0, + ), + Texts( + TranslationBase.of(context).searchProductHere, + fontSize: 13, + ) + ], + ), + ), + onTap: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => SearchBrandsPage()), + ); }, ), ), @@ -57,25 +103,30 @@ class _ProductBrandsPageState extends State { height: 10, ), Container( - height: 280, + height: 230, width: double.infinity, color: Colors.white, child: ListView.builder( itemCount: model.brandsListList.length, - itemBuilder: (BuildContext ctxt, int index) { - return Container( - margin: EdgeInsets.only(top: 50, left: 10), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Text(model.brandsListList[index].name), - SizedBox( - height: 3, - ), - Divider(height: 1, color: Colors.grey) - ], + itemBuilder: (BuildContext context, int index) { + return InkWell( + child: Container( + margin: EdgeInsets.only(top: 50, left: 10), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + languageID == 'ar' ? Text(model.brandsListList[index].namen):Text(model.brandsListList[index].name), + SizedBox( + height: 3, + ), + Divider(height: 1, color: Colors.grey) + ], + ), ), + onTap: (){ + print("ENAD"); + }, ); }), ), @@ -87,96 +138,6 @@ class _ProductBrandsPageState extends State { } } -//topBrand() { -// return BaseView( -// onModelReady: (model) => model.getBrandsData(), -// builder: (_, model, wi) => Column( -// crossAxisAlignment: CrossAxisAlignment.start, -// mainAxisAlignment: MainAxisAlignment.start, -// children: [ -// Container( -// padding: EdgeInsets.all(10), -// child: Text( -// 'Top Brands', -// ), -// ), -// Row( -// children: [ -// Container( -// margin: EdgeInsets.fromLTRB(10.0, 10.0, 0.0, 0.0), -// child: Container( -// margin: EdgeInsets.only(bottom: 10.0), -// child: Container( -// margin: EdgeInsets.only(bottom: 10.0), -// child: Container( -// child: Container( -// padding: EdgeInsets.symmetric( -// horizontal: 10.0, vertical: 10.0), -// decoration: BoxDecoration( -// borderRadius: BorderRadius.circular(10), -// border: Border( -// top: BorderSide(width: 1.0, color: Colors.grey), -// left: BorderSide(width: 1.0, color: Colors.grey), -// right: BorderSide(width: 1.0, color: Colors.grey), -// bottom: BorderSide(width: 1.0, color: Colors.grey), -// ), -// color: Colors.white, -// ), -// child: Image( -// image: AssetImage( -// 'assets/images/al-habib_onlne_pharmacy_bg.png'), -// fit: BoxFit.cover, -// width: 60, -// height: 40, -// ), -// ), -// ), -// ), -// ), -// ), -// ], -// ), -// Row( -// children: [ -// Container( -// margin: EdgeInsets.fromLTRB(10.0, 10.0, 0.0, 0.0), -// child: Container( -// margin: EdgeInsets.only(bottom: 10.0), -// child: Container( -// margin: EdgeInsets.only(bottom: 10.0), -// child: Container( -// padding: EdgeInsets.only(left: 5), -// child: Container( -// padding: EdgeInsets.symmetric( -// horizontal: 10.0, vertical: 10.0), -// decoration: BoxDecoration( -// borderRadius: BorderRadius.circular(10), -// border: Border( -// top: BorderSide(width: 1.0, color: Colors.grey), -// left: BorderSide(width: 1.0, color: Colors.grey), -// right: BorderSide(width: 1.0, color: Colors.grey), -// bottom: BorderSide(width: 1.0, color: Colors.grey), -// ), -// color: Colors.white, -// ), -// child: Image( -// image: AssetImage( -// 'assets/images/al-habib_onlne_pharmacy_bg.png'), -// fit: BoxFit.cover, -// width: 60, -// height: 40, -// ), -// ), -// ), -// ), -// ), -// ), -// ], -// ), -// ], -// ), -// ); -//} topBrand() { return BaseView( @@ -187,35 +148,40 @@ topBrand() { model.topBrandsListList.length, (index) => Column( children: [ - Container( - margin: EdgeInsets.fromLTRB(5.0, 10.0, 5.0, 0.0), + InkWell( child: Container( + margin: EdgeInsets.fromLTRB(5.0, 10.0, 5.0, 0.0), child: Container( child: Container( -// padding: EdgeInsets.only(left: 5), child: Container( - padding: EdgeInsets.symmetric( - horizontal: 10.0, vertical: 10.0), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(10), - border: Border( - top: BorderSide(width: 1.0, color: Colors.grey), - left: BorderSide(width: 1.0, color: Colors.grey), - right: BorderSide(width: 1.0, color: Colors.grey), - bottom: BorderSide(width: 1.0, color: Colors.grey), +// padding: EdgeInsets.only(left: 5), + child: Container( + padding: EdgeInsets.symmetric( + horizontal: 10.0, vertical: 10.0), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10), + border: Border( + top: BorderSide(width: 1.0, color: Colors.grey), + left: BorderSide(width: 1.0, color: Colors.grey), + right: BorderSide(width: 1.0, color: Colors.grey), + bottom: BorderSide(width: 1.0, color: Colors.grey), + ), + color: Colors.white, ), - color: Colors.white, - ), - child: Image.network( - model.topBrandsListList[index].image.src.trim(), - fit: BoxFit.cover, - width: 60, - height: 40, + child: model.topBrandsListList[index].image != null ?Image.network( + model.topBrandsListList[index].image.src, + fit: BoxFit.cover, + width: 60, + height: 40, + ): Text(model.topBrandsListList[index].name) ), ), ), ), ), + onTap: (){ + print("ENAD"); + }, ), ], ), @@ -282,3 +248,7 @@ class SearchBar extends SearchDelegate { ); } } + +getLanguageID() async { + languageID = await sharedPref.getString(APP_LANGUAGE); +} diff --git a/lib/pages/pharmacies/product_detail.dart b/lib/pages/pharmacies/product_detail.dart index aa91f072..2040db11 100644 --- a/lib/pages/pharmacies/product_detail.dart +++ b/lib/pages/pharmacies/product_detail.dart @@ -1,15 +1,31 @@ +import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacies/PharmacyProduct.dart'; import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/product_detail_view_model.dart'; import 'package:diplomaticquarterapp/pages/base/base_view.dart'; -import 'package:flutter/material.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; +import 'package:flutter/material.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_scafold_detail_page.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; -import 'package:rating_bar/rating_bar.dart'; import 'package:provider/provider.dart'; +import 'package:rating_bar/rating_bar.dart'; +import 'package:diplomaticquarterapp/uitl/app_toast.dart'; +import 'screens/cart-order-page.dart'; +import 'package:diplomaticquarterapp/pages/pharmacies/compare-list.dart'; int price = 0; -void main() => runApp(ProductDetailPage()); +var languageID; +bool isOverQuantity = false; +bool isInWishlit = false; +var itemID; +var product; +var customerId; +CompareList compareItems = new CompareList(); +PharmacyProduct specificationData; class ProductDetailPage extends StatefulWidget { + final PharmacyProduct product; + ProductDetailPage(this.product); @override __ProductDetailPageState createState() => __ProductDetailPageState(); } @@ -19,377 +35,948 @@ class __ProductDetailPageState extends State { bool isDetails = true; bool isReviews = false; bool isAvailabilty = false; + dynamic wishlistItems; + + void initState() { + price = 0; + specificationData = widget.product; + setState(() { + customerId = userInfo(widget.product.id, widget.product); + }); + super.initState(); + } Widget build(BuildContext context) { - return AppScaffold( - appBarTitle: 'product detail page', - isShowAppBar: true, - isPharmacy: true, - body: SingleChildScrollView( - child: Column( - children: [ - Container( - width: double.infinity, - color: Colors.white, + return customerId != null + ? DetailPageScafold( + appBarTitle: 'product detail page', + isShowAppBar: true, + isPharmacy: true, + isShowDecPage: false, + body: SingleChildScrollView( child: Column( children: [ - Image( - image: AssetImage('assets/images/timeline_bg.png'), - ), Container( width: double.infinity, - height: 50, - color: Colors.yellowAccent, - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, + color: Colors.white, + child: Column( + children: [ + Image.network( + widget.product.images[0].src.trim(), + ), + widget.product.discountDescription != null + ? Container( + width: double.infinity, + height: 50, + color: Colors.yellowAccent, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Expanded( + flex: 1, + child: Container( + alignment: Alignment.centerRight, + child: languageID == 'ar' + ? Text( + widget.product + .discountDescriptionn, + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 17), + ) + : Text( + widget.product + .discountDescription, + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 17), + ), + ), + ), + SizedBox( + width: 10, + ), + Expanded( + flex: 0, + child: Container( + child: Image( + image: AssetImage( + 'assets/images/offer.png'), + ), + ), + ), + ], + ), + ) + : Container(), + ], + ), + ), + SizedBox( + height: 4, + ), + Container( + width: 500, + height: 150, + color: Colors.white, + child: productNameAndPrice(context, widget.product), + ), + SizedBox( + height: 6, + ), + Container( + width: 500, + height: 120, + color: Colors.white, + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, children: [ - Expanded( - flex: 1, + Padding( + padding: const EdgeInsets.all(8.0), child: Container( - alignment: Alignment.centerRight, child: Text( - "Discount on Second item", - style: TextStyle( - fontWeight: FontWeight.bold, fontSize: 17), + TranslationBase.of(context).specification, + style: TextStyle(fontWeight: FontWeight.bold), ), ), ), - SizedBox( - width: 10, - ), - Expanded( - flex: 0, + Divider(color: Colors.grey), + Padding( + padding: const EdgeInsets.all(8.0), child: Container( - child: Image( - image: AssetImage('assets/images/offer.png'), + child: Text( + "there is no data", ), ), ), ], ), ), - ], - ), - ), - SizedBox( - height: 4, - ), - Container( - width: 500, - height: 150, - color: Colors.white, - child: productNameAndPrice(), - ), - SizedBox( - height: 6, - ), - Container( - width: 500, - height: 120, - color: Colors.white, - child: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Padding( - padding: const EdgeInsets.all(8.0), - child: Container( - child: Text( - "Specificaion", - style: TextStyle(fontWeight: FontWeight.bold), - ), + SizedBox( + height: 6, + ), + Container( + width: 500, + margin: EdgeInsets.only(bottom: 100), +// height: 350, + color: Colors.white, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Column( + children: [ + FlatButton( + onPressed: () { + setState(() { + isDetails = true; + isReviews = false; + isAvailabilty = false; + }); + }, + child: Text( + TranslationBase.of(context).details, + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold), + ), + color: Colors.white, + ), + isDetails + ? Container( + width: 100, + height: 5, + color: Colors.green, + ) + : Container() + ], + ), + SizedBox( + width: 20, + ), + Column( + children: [ + FlatButton( + onPressed: () { + setState(() { + isDetails = false; + isReviews = true; + isAvailabilty = false; + }); + }, + child: Text( + TranslationBase.of(context).reviews, + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold), + ), + color: Colors.white, + ), + isReviews + ? Container( + width: 100, + height: 5, + color: Colors.green, + ) + : Container(), + ], + ), + SizedBox( + width: 20, + ), + Column( + children: [ + FlatButton( + onPressed: () { + setState(() { + isDetails = false; + isReviews = false; + isAvailabilty = true; + }); + }, + child: Text( + TranslationBase.of(context).availability, + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold), + ), + color: Colors.white, + ), + isAvailabilty + ? Container( + width: 100, + height: 5, + color: Colors.green, + ) + : Container(), + ], + ), + ], + ), + SizedBox( + height: 10, + ), + isDetails + ? Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + child: Text( + TranslationBase.of(context).description, + style: TextStyle( + fontSize: 17, + color: Colors.grey, + fontWeight: FontWeight.w600), + ), + ), + SizedBox( + height: 10, + ), + Container( + child: Text( + languageID == 'ar' + ? widget.product.fullDescriptionn + : widget.product.fullDescription, + style: TextStyle( + fontSize: 16, + fontFamily: 'WorkSans-Regular'), + ), + ), + ], + ), + ) + : isReviews + ? BaseView( + onModelReady: (model) => + model.getProductReviewsData( + widget.product.id), + builder: (_, model, wi) => model + .productDetailService + .length != + 0 && + model.productDetailService[0] + .reviews.length != + 0 + ? ListView.builder( + physics: ScrollPhysics(), + itemCount: model + .productDetailService[0] + .reviews + .length, + scrollDirection: Axis.vertical, + shrinkWrap: true, + itemBuilder: (BuildContext context, + int index) { + return Padding( + padding: EdgeInsets.all(8.0), + child: Column( + mainAxisAlignment: + MainAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + Container( + child: Row( + children: [ + Container( + child: Text( + model + .productDetailService[ + 0] + .reviews[ + index] + .customerId + .toString(), + style: TextStyle( + fontSize: 17, + color: Colors + .grey, + fontWeight: + FontWeight + .w600), + ), + ), + Container( + margin: + EdgeInsets.only( + left: 210), + child: RatingBar + .readOnly( + initialRating: model + .productDetailService[ + 0] + .reviews[ + index] + .rating + .toDouble(), + size: 15.0, + filledColor: + Colors.yellow[ + 700], + emptyColor: Colors + .grey[500], + isHalfAllowed: + true, + halfFilledIcon: + Icons + .star_half, + filledIcon: + Icons.star, + emptyIcon: + Icons.star, + ), + ), + ], + ), + ), + SizedBox( + height: 10, + ), + Container( + child: Text( + model + .productDetailService[ + 0] + .reviews[index] + .reviewText, + style: TextStyle( + fontSize: 20), + ), + ), + SizedBox( + height: 50, + ), + Divider( + height: 1, + color: Colors.grey), + ], + ), + ); + }, + ) + : Container( + padding: EdgeInsets.all(15), + alignment: Alignment.center, + child: Text('No Reviews Available'), + ), + ) + : isAvailabilty + ? BaseView( + onModelReady: (model) => + model.getProductLocationData(), + builder: (_, model, wi) => model + .productLocationService + .length == + 0 + ? Container( + padding: EdgeInsets.all(15), + alignment: Alignment.center, + child: Text( + 'No location Available'), + ) + : ListView.builder( + physics: ScrollPhysics(), + scrollDirection: Axis.vertical, + shrinkWrap: true, + itemCount: model + .productLocationService + .length, + itemBuilder: + (BuildContext context, + int index) { + return Padding( + padding: + EdgeInsets.all(8.0), + child: Column( +// crossAxisAlignment: CrossAxisAlignment.start, +// mainAxisAlignment: MainAxisAlignment.start, + children: [ + Row( +// crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: + MainAxisAlignment + .start, + children: [ + Expanded( + flex: 1, + child: Image.network(model + .productLocationService[ + index] + .projectImageUrl), + ), + SizedBox( + width: 10, + ), + Expanded( + flex: 4, + child: Text( + model + .productLocationService[ + index] + .locationDescription + + "\n" + + fixingString(model + .productLocationService[ + 0] + .cityName + .toString()), + style: TextStyle( + fontSize: + 12), + ), + ), + Expanded( + flex: 1, + child: IconButton( + icon: Icon(Icons + .location_on), + color: + Colors.red, + onPressed: + () {}, + ), + ), + Expanded( + flex: 1, + child: IconButton( + icon: Icon(Icons + .phone), + color: + Colors.red, + onPressed: + () {}, + ), + ), + ], + ), + Divider( + height: 1.2, + color: Colors.grey) + ], + ), + ); + }, + ), + ) + : Container(), + ], ), ), - Divider(color: Colors.grey) +// ListView(scrollDirection: Axis.vertical, shrinkWrap: true, children: [Text('ENAD')]), ], ), ), - SizedBox( - height: 6, - ), - Container( - width: 500, - margin: EdgeInsets.only(bottom: 100), -// height: 350, - color: Colors.white, + bottomSheet: footerWidget( + widget.product.stockAvailability != 'Out of stock', + widget.product.orderMaximumQuantity, + widget.product.orderMinimumQuantity, + widget.product.stockQuantity, + widget.product), + ) + : AppScaffold( + appBarTitle: 'product detail page', + isShowAppBar: true, + isPharmacy: true, + isShowDecPage: false, + body: SingleChildScrollView( child: Column( - crossAxisAlignment: CrossAxisAlignment.start, children: [ - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Column( - children: [ - FlatButton( - onPressed: () { - setState(() { - isDetails = true; - isReviews = false; - isAvailabilty = false; - }); - }, - child: Text( - 'DETAILS', - style: TextStyle( - fontSize: 16, fontWeight: FontWeight.bold), - ), - color: Colors.white, - ), - isDetails - ? Container( - width: 100, - height: 5, - color: Colors.green, - ) - : Container() - ], - ), - SizedBox( - width: 20, - ), - Column( - children: [ - FlatButton( - onPressed: () { - setState(() { - isDetails = false; - isReviews = true; - isAvailabilty = false; - }); - }, - child: Text( - 'REVIEWS', - style: TextStyle( - fontSize: 16, fontWeight: FontWeight.bold), - ), - color: Colors.white, - ), - isReviews - ? Container( - width: 100, - height: 5, - color: Colors.green, - ) - : Container(), - ], - ), - SizedBox( - width: 20, - ), - Column( - children: [ - FlatButton( - onPressed: () { - setState(() { - isDetails = false; - isReviews = false; - isAvailabilty = true; - }); - }, + Container( + width: double.infinity, + color: Colors.white, + child: Column( + children: [ + Image.network( + widget.product.images[0].src.trim(), + ), + widget.product.discountDescription != null + ? Container( + width: double.infinity, + height: 50, + color: Colors.yellowAccent, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Expanded( + flex: 1, + child: Container( + alignment: Alignment.centerRight, + child: languageID == 'ar' + ? Text( + widget.product + .discountDescriptionn, + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 17), + ) + : Text( + widget.product + .discountDescription, + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 17), + ), + ), + ), + SizedBox( + width: 10, + ), + Expanded( + flex: 0, + child: Container( + child: Image( + image: AssetImage( + 'assets/images/offer.png'), + ), + ), + ), + ], + ), + ) + : Container(), + ], + ), + ), + SizedBox( + height: 4, + ), + Container( + width: 500, + height: 150, + color: Colors.white, + child: productNameAndPrice(context, widget.product), + ), + SizedBox( + height: 6, + ), + Container( + width: 500, + height: 120, + color: Colors.white, + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.all(8.0), + child: Container( child: Text( - 'AVAILABILTY', - style: TextStyle( - fontSize: 16, fontWeight: FontWeight.bold), + TranslationBase.of(context).specification, + style: TextStyle(fontWeight: FontWeight.bold), ), - color: Colors.white, ), - isAvailabilty - ? Container( - width: 100, - height: 5, - color: Colors.green, - ) - : Container(), - ], - ), - ], + ), + Divider(color: Colors.grey) + ], + ), ), SizedBox( - height: 10, + height: 6, ), - isDetails - ? Padding( - padding: const EdgeInsets.all(8.0), - child: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Container( - child: Text( - 'Description', - style: TextStyle( - fontSize: 17, - color: Colors.grey, - fontWeight: FontWeight.w600), + Container( + width: 500, + margin: EdgeInsets.only(bottom: 100), +// height: 350, + color: Colors.white, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Column( + children: [ + FlatButton( + onPressed: () { + setState(() { + isDetails = true; + isReviews = false; + isAvailabilty = false; + }); + }, + child: Text( + TranslationBase.of(context).details, + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold), + ), + color: Colors.white, ), - ), - SizedBox( - height: 10, - ), - Container( - child: Text( - 'Body Mosturizing and nourishing lotion', - style: TextStyle(fontSize: 20), + isDetails + ? Container( + width: 100, + height: 5, + color: Colors.green, + ) + : Container() + ], + ), + SizedBox( + width: 20, + ), + Column( + children: [ + FlatButton( + onPressed: () { + setState(() { + isDetails = false; + isReviews = true; + isAvailabilty = false; + }); + }, + child: Text( + TranslationBase.of(context).reviews, + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold), + ), + color: Colors.white, ), - ), - ], - ), - ) - : isReviews - ? BaseView( - onModelReady: (model) => - model.getProductReviewsData(), - builder: (_, model, wi) => ListView.builder( - physics: const ScrollPhysics(), - itemCount: model.productDetailService[0].reviews.length, - scrollDirection: Axis.vertical, - shrinkWrap: true, - itemBuilder: (BuildContext context, int index){ - return Padding( - padding: EdgeInsets.all(8.0), - child: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Container( - child: Row( - children: [ - Container( - child: Text( - model.productDetailService[0] - .reviews[index].id - .toString(), - style: TextStyle( - fontSize: 17, - color: Colors.grey, - fontWeight: FontWeight.w600), - ), - ), - Container( - margin: EdgeInsets.only(left: 232), - child: RatingBar.readOnly( - initialRating: model - .productDetailService[0] - .reviews[index] - .rating - .toDouble(), - size: 15.0, - filledColor: Colors.yellow[700], - emptyColor: Colors.grey[500], - isHalfAllowed: true, - halfFilledIcon: Icons.star_half, - filledIcon: Icons.star, - emptyIcon: Icons.star, + isReviews + ? Container( + width: 100, + height: 5, + color: Colors.green, + ) + : Container(), + ], + ), + SizedBox( + width: 20, + ), + Column( + children: [ + FlatButton( + onPressed: () { + setState(() { + isDetails = false; + isReviews = false; + isAvailabilty = true; + }); + }, + child: Text( + TranslationBase.of(context).availability, + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold), + ), + color: Colors.white, + ), + isAvailabilty + ? Container( + width: 100, + height: 5, + color: Colors.green, + ) + : Container(), + ], + ), + ], + ), + SizedBox( + height: 10, + ), + isDetails + ? Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + child: Text( + TranslationBase.of(context).description, + style: TextStyle( + fontSize: 17, + color: Colors.grey, + fontWeight: FontWeight.w600), + ), + ), + SizedBox( + height: 10, + ), + Container( + child: Text( + languageID == 'ar' + ? widget.product.fullDescriptionn + : widget.product.fullDescription, + style: TextStyle( + fontSize: 16, + fontFamily: 'WorkSans-Regular'), + ), + ), + ], + ), + ) + : isReviews + ? BaseView( + onModelReady: (model) => + model.getProductReviewsData( + widget.product.id), + builder: (_, model, wi) => model + .productDetailService + .length != + 0 && + model.productDetailService[0] + .reviews.length != + 0 + ? ListView.builder( + physics: ScrollPhysics(), + itemCount: model + .productDetailService[0] + .reviews + .length, + scrollDirection: Axis.vertical, + shrinkWrap: true, + itemBuilder: (BuildContext context, + int index) { + return Padding( + padding: EdgeInsets.all(8.0), + child: Column( + mainAxisAlignment: + MainAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + Container( + child: Row( + children: [ + Container( + child: Text( + model + .productDetailService[ + 0] + .reviews[ + index] + .customerId + .toString(), + style: TextStyle( + fontSize: 17, + color: Colors + .grey, + fontWeight: + FontWeight + .w600), + ), + ), + Container( + margin: + EdgeInsets.only( + left: 210), + child: RatingBar + .readOnly( + initialRating: model + .productDetailService[ + 0] + .reviews[ + index] + .rating + .toDouble(), + size: 15.0, + filledColor: + Colors.yellow[ + 700], + emptyColor: Colors + .grey[500], + isHalfAllowed: + true, + halfFilledIcon: + Icons + .star_half, + filledIcon: + Icons.star, + emptyIcon: + Icons.star, + ), + ), + ], + ), + ), + SizedBox( + height: 10, + ), + Container( + child: Text( + model + .productDetailService[ + 0] + .reviews[index] + .reviewText, + style: TextStyle( + fontSize: 20), + ), + ), + SizedBox( + height: 50, + ), + Divider( + height: 1, + color: Colors.grey), + ], ), - ), - ], - ), - ), - SizedBox( - height: 10, - ), - Container( - child: Text( - model.productDetailService[0].reviews[index] - .reviewText, - style: TextStyle(fontSize: 20), + ); + }, + ) + : Container( + padding: EdgeInsets.all(15), + alignment: Alignment.center, + child: Text('No Reviews Available'), ), - ), - SizedBox( - height: 50, - ), - Divider(height: 1, color: Colors.grey), - ], - ), - ); - }, - ), - ) - : isAvailabilty - ? BaseView( - onModelReady: (model) => - model.getProductLocationData(), - builder: (_, model, wi) => ListView.builder( - physics: const ScrollPhysics(), - scrollDirection: Axis.vertical, - shrinkWrap: true, - itemCount: model.productLocationService.length, - itemBuilder: (BuildContext context, int index){ - return Padding( - padding: const EdgeInsets.all(8.0), - child: Column( + ) + : isAvailabilty + ? BaseView( + onModelReady: (model) => + model.getProductLocationData(), + builder: (_, model, wi) => + ListView.builder( + physics: ScrollPhysics(), + scrollDirection: Axis.vertical, + shrinkWrap: true, + itemCount: model + .productLocationService.length, + itemBuilder: (BuildContext context, + int index) { + return Padding( + padding: EdgeInsets.all(8.0), + child: Column( // crossAxisAlignment: CrossAxisAlignment.start, // mainAxisAlignment: MainAxisAlignment.start, - children: [ - Row( + children: [ + Row( // crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: - MainAxisAlignment.start, - children: [ - Expanded( - flex: 1, - child: Image.network(model - .productLocationService[index] - .projectImageUrl), - ), - SizedBox( - width: 10, - ), - Expanded( - flex: 4, - child: Text( - model.productLocationService[index] - .locationDescription + - "\n" + - fixingString(model + mainAxisAlignment: + MainAxisAlignment.start, + children: [ + Expanded( + flex: 1, + child: Image.network(model .productLocationService[ - 0] - .cityName - .toString()), - style: TextStyle(fontSize: 12), - ), - ), - Expanded( - flex: 1, - child: IconButton( - icon: Icon(Icons.location_on), - color: Colors.red, - onPressed: () {}, + index] + .projectImageUrl), + ), + SizedBox( + width: 10, + ), + Expanded( + flex: 4, + child: Text( + model + .productLocationService[ + index] + .locationDescription + + "\n" + + fixingString(model + .productLocationService[ + 0] + .cityName + .toString()), + style: TextStyle( + fontSize: 12), + ), + ), + Expanded( + flex: 1, + child: IconButton( + icon: Icon(Icons + .location_on), + color: Colors.red, + onPressed: () {}, + ), + ), + Expanded( + flex: 1, + child: IconButton( + icon: + Icon(Icons.phone), + color: Colors.red, + onPressed: () {}, + ), + ), + ], ), - ), - Expanded( - flex: 1, - child: IconButton( - icon: Icon(Icons.phone), - color: Colors.red, - onPressed: () {}, - ), - ), - ], - ), - Divider(height: 1.2, color: Colors.grey) - ], + Divider( + height: 1.2, + color: Colors.grey) + ], + ), + ); + }, ), - ); - }, - - ), - ) - : Container(), + ) + : Container(), + ], + ), + ), +// ListView(scrollDirection: Axis.vertical, shrinkWrap: true, children: [Text('ENAD')]), ], ), ), -// ListView(scrollDirection: Axis.vertical, shrinkWrap: true, children: [Text('ENAD')]), - ], - ), - ), - bottomSheet: footerWidget(), - ); + bottomSheet: footerWidget( + widget.product.stockAvailability != 'Out of stock', + widget.product.orderMaximumQuantity, + widget.product.orderMinimumQuantity, + widget.product.stockQuantity, + widget.product), + ); } } class footerWidget extends StatefulWidget { + final bool isAvailble; + final int maxQuantity; + final int minQuantity; + final int quantityLimit; + final PharmacyProduct item; + footerWidget(this.isAvailble, this.maxQuantity, this.minQuantity, + this.quantityLimit, this.item); @override _footerWidgetState createState() => _footerWidgetState(); } @@ -418,7 +1005,7 @@ class _footerWidgetState extends State { Padding( padding: const EdgeInsets.all(8.0), child: Text( - 'Quantity', + TranslationBase.of(context).quantity, style: TextStyle( fontSize: 15, fontWeight: FontWeight.bold), ), @@ -450,7 +1037,12 @@ class _footerWidgetState extends State { onTap: () { setState(() { price = 1; - return price; + if (price >= widget.quantityLimit) { + isOverQuantity = true; + } else { + isOverQuantity = false; + return price; + } }); }, ), @@ -472,7 +1064,12 @@ class _footerWidgetState extends State { onTap: () { setState(() { price = 2; - // return price; + if (price >= widget.quantityLimit) { + isOverQuantity = true; + } else { + isOverQuantity = false; + return price; + } }); }, ), @@ -494,7 +1091,12 @@ class _footerWidgetState extends State { onTap: () { setState(() { price = 3; - return price; + if (price >= widget.quantityLimit) { + isOverQuantity = true; + } else { + isOverQuantity = false; + return price; + } }); }, ), @@ -516,7 +1118,12 @@ class _footerWidgetState extends State { onTap: () { setState(() { price = 4; - return price; + if (price >= widget.quantityLimit) { + isOverQuantity = true; + } else { + isOverQuantity = false; + return price; + } }); }, ), @@ -538,7 +1145,12 @@ class _footerWidgetState extends State { onTap: () { setState(() { price = 5; - return price; + if (price >= widget.quantityLimit) { + isOverQuantity = true; + } else { + isOverQuantity = false; + return price; + } }); }, ), @@ -560,7 +1172,12 @@ class _footerWidgetState extends State { onTap: () { setState(() { price = 6; - return price; + if (price >= widget.quantityLimit) { + isOverQuantity = true; + } else { + isOverQuantity = false; + return price; + } }); }, ), @@ -582,7 +1199,12 @@ class _footerWidgetState extends State { onTap: () { setState(() { price = 7; - return price; + if (price >= widget.quantityLimit) { + isOverQuantity = true; + } else { + isOverQuantity = false; + return price; + } }); }, ), @@ -604,7 +1226,12 @@ class _footerWidgetState extends State { onTap: () { setState(() { price = 8; - return price; + if (price >= widget.quantityLimit) { + isOverQuantity = true; + } else { + isOverQuantity = false; + return price; + } }); }, ), @@ -626,7 +1253,12 @@ class _footerWidgetState extends State { onTap: () { setState(() { price = 9; - return price; + if (price >= widget.quantityLimit) { + isOverQuantity = true; + } else { + isOverQuantity = false; + return price; + } }); }, ), @@ -648,7 +1280,12 @@ class _footerWidgetState extends State { onTap: () { setState(() { price = 10; - return price; + if (price >= widget.quantityLimit) { + isOverQuantity = true; + } else { + isOverQuantity = false; + return price; + } }); }, ), @@ -661,11 +1298,18 @@ class _footerWidgetState extends State { decoration: InputDecoration(labelText: 'quantity #'), onChanged: (text) { + print(price); + print(widget.quantityLimit); if (int.tryParse(text) == null) { text = ''; } else { setState(() { price = int.parse(text); + if (price >= widget.quantityLimit) { + isOverQuantity = true; + } else { + isOverQuantity = false; + } }); } }, @@ -703,7 +1347,7 @@ class _footerWidgetState extends State { Expanded( flex: 5, child: Text( - "QTY", + TranslationBase.of(context).quantityShortcut, style: TextStyle(fontSize: 16), ), ), @@ -722,41 +1366,83 @@ class _footerWidgetState extends State { }, ), ), - InkWell( - onTap: () {}, - child: Container( - alignment: Alignment.center, - width: 190, - height: 46, - color: Colors.green, - child: Text( - 'Add to Cart', - style: TextStyle( - color: Colors.white, - fontWeight: FontWeight.bold, - fontSize: 15), - ), - ), - ), + !widget.isAvailble && price > 0 || price > widget.quantityLimit + ? Container( + width: 190, + height: 46, + color: Colors.grey, + child: Align( + alignment: Alignment.center, + child: Text( + TranslationBase.of(context).addToCart, + style: TextStyle( + color: Colors.white, + fontWeight: FontWeight.bold, + fontSize: 15), + ), + ), + ) + : InkWell( + onTap: () { + addToCartFunction(price, widget.item.id); + }, + child: Container( + alignment: Alignment.center, + width: 190, + height: 46, + color: Colors.green, + child: Text( + TranslationBase.of(context).addToCart, + style: TextStyle( + color: Colors.white, + fontWeight: FontWeight.bold, + fontSize: 15), + ), + ), + ), SizedBox( width: 5, ), - InkWell( - onTap: () {}, - child: Container( - alignment: Alignment.center, - width: 120, - height: 46, - color: Colors.blue, - child: Text( - 'Buy Now', - style: TextStyle( - color: Colors.white, - fontWeight: FontWeight.bold, - fontSize: 15), - ), - ), - ), + !widget.isAvailble && price > 0 || price > widget.quantityLimit + ? Container( + width: 120, + height: 46, + color: Colors.grey, + child: Align( + alignment: Alignment.center, + child: Text( + TranslationBase.of(context).buyNow, + style: TextStyle( + color: Colors.white, + fontWeight: FontWeight.bold, + fontSize: 15), + ), + ), + ) + : InkWell( + onTap: () { + print('buy now'); + addToCartFunction(price, widget.item.id); + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => CartOrderPage()), + ); + }, + child: Container( + alignment: Alignment.center, + width: 120, + height: 46, + color: Colors.blue, + child: Text( + TranslationBase.of(context).buyNow, + style: TextStyle( + color: Colors.white, + fontWeight: FontWeight.bold, + fontSize: 15), + ), + ), + ), ], ), ], @@ -765,92 +1451,281 @@ class _footerWidgetState extends State { } } -productNameAndPrice() { - return Column( - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Padding( - padding: const EdgeInsets.all(8.0), - child: Row( - children: [ - Text( - "22 SR", - style: TextStyle(fontWeight: FontWeight.bold, fontSize: 30), - ), - SizedBox( - width: 100, - ), - Text( - "Out Of Stock", - style: TextStyle(fontWeight: FontWeight.bold, color: Colors.red), - ), - SizedBox(width: 30), - Text( - "notify me ", - style: TextStyle( - color: Colors.blue, - decoration: TextDecoration.underline, +class productNameAndPrice extends StatefulWidget { + BuildContext context; + PharmacyProduct item; + productNameAndPrice(this.context, this.item); + @override + _productNameAndPriceState createState() => _productNameAndPriceState(); +} + +class _productNameAndPriceState extends State { + @override + Widget build(BuildContext context) { + return Column( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.all(8.0), + child: Row( + children: [ + Text( + widget.item.price.toString(), + style: TextStyle(fontWeight: FontWeight.bold, fontSize: 30), ), - ), - Icon( - FontAwesomeIcons.bell, - color: Colors.blue, - size: 15.0, - ), - ], - ), - ), - Padding( - padding: const EdgeInsets.all(8.0), - child: Container( - margin: EdgeInsets.only(left: 5), - child: Text( - "Johnson And Jonson Vita-Rich Smoothing Body Cream - With Papaya Extract 200 ML", - style: TextStyle(fontWeight: FontWeight.bold, fontSize: 15), + SizedBox( + width: 40, + ), + Text( + widget.item.stockAvailability, + style: widget.item.stockAvailability == 'Out of stock' + ? TextStyle(fontWeight: FontWeight.bold, color: Colors.red) + : TextStyle( + fontWeight: FontWeight.bold, color: Colors.green), + ), + SizedBox(width: 20), + widget.item.stockAvailability == 'Out of stock' + ? Text( + TranslationBase.of(context).notifyMe, + style: TextStyle( + color: Colors.blue, + decoration: TextDecoration.underline, + ), + ) + : Container(), + widget.item.stockAvailability == 'Out of stock' + ? Icon( + FontAwesomeIcons.bell, + color: Colors.blue, + size: 15.0, + ) + : Container(), + Container( + margin: languageID == 'ar' + ? EdgeInsets.only(right: 25) + : EdgeInsets.only(left: 25), + width: 40, + height: 40, + decoration: BoxDecoration( + color: Colors.grey, + borderRadius: BorderRadius.circular(30), + ), + child: !isInWishlit + ? IconButton( + icon: Icon(Icons.favorite_border), + color: Colors.white, + onPressed: () { + setState(() { + addToWishlistFunction(widget.item.id); + }); +// MyStatelessWidget(); + }, + ) + : IconButton( + icon: Icon(Icons.favorite), + color: Colors.red, + onPressed: () { + setState(() { + deleteFromWishlistFunction(widget.item.id); + }); +// MyStatelessWidget(); + }, + )), + ], ), ), - ), - Row( - children: [ - Expanded( - flex: 2, - child: Container( - margin: EdgeInsets.only(right: 150), - child: Align( - alignment: Alignment.bottomLeft, - child: RatingBar.readOnly( - initialRating: 3, - size: 15.0, - filledColor: Colors.yellow[700], - emptyColor: Colors.grey[500], - isHalfAllowed: true, - halfFilledIcon: Icons.star_half, - filledIcon: Icons.star, - emptyIcon: Icons.star, - ), + Padding( + padding: const EdgeInsets.all(8.0), + child: Container( + margin: EdgeInsets.only(left: 5), + child: Align( + alignment: + languageID == 'ar' ? Alignment.topRight : Alignment.topLeft, + child: Text( + languageID == 'ar' + ? widget.item.fullDescriptionn + : widget.item.fullDescription, + style: TextStyle(fontWeight: FontWeight.bold, fontSize: 15), ), ), ), - Expanded( - flex: 1, - child: Container( - child: Text( - 'Prescription attachment required', - style: TextStyle(color: Colors.red, fontSize: 10), + ), + Row( + children: [ + Expanded( + flex: 2, + child: Container( + margin: EdgeInsets.only(right: 150), + child: Align( + alignment: Alignment.bottomLeft, + child: RatingBar.readOnly( + initialRating: 3, + size: 15.0, + filledColor: Colors.yellow[700], + emptyColor: Colors.grey[500], + isHalfAllowed: true, + halfFilledIcon: Icons.star_half, + filledIcon: Icons.star, + emptyIcon: Icons.star, + ), + ), ), ), - ), - Icon( - FontAwesomeIcons.questionCircle, - color: Colors.red, - size: 15.0, - ), - ], - ), - ], - ); + Expanded( + flex: 1, + child: Container( + child: widget.item.rxMessage != null + ? Text( + languageID == 'ar' + ? widget.item.rxMessagen.toString() + : widget.item.rxMessage.toString(), + style: TextStyle(color: Colors.red, fontSize: 10), + ) + : Container()), + ), + widget.item.rxMessage != null + ? Icon( + FontAwesomeIcons.questionCircle, + color: Colors.red, + size: 15.0, + ) + : Container(), + ], + ), + ], + ); + } } +//productNameAndPrice(BuildContext context, item) { +// return Column( +// mainAxisAlignment: MainAxisAlignment.start, +// children: [ +// Padding( +// padding: const EdgeInsets.all(8.0), +// child: Row( +// children: [ +// Text( +// item.price.toString(), +// style: TextStyle(fontWeight: FontWeight.bold, fontSize: 30), +// ), +// SizedBox( +// width: 40, +// ), +// Text( +// item.stockAvailability, +// style: item.stockAvailability == 'Out of stock' +// ? TextStyle(fontWeight: FontWeight.bold, color: Colors.red) +// : TextStyle(fontWeight: FontWeight.bold, color: Colors.green), +// ), +// SizedBox(width: 20), +// item.stockAvailability == 'Out of stock' +// ? Text( +// TranslationBase.of(context).notifyMe, +// style: TextStyle( +// color: Colors.blue, +// decoration: TextDecoration.underline, +// ), +// ) +// : Container(), +// item.stockAvailability == 'Out of stock' +// ? Icon( +// FontAwesomeIcons.bell, +// color: Colors.blue, +// size: 15.0, +// ) +// : Container(), +// +// Container( +// margin: languageID=='ar' ? EdgeInsets.only(right: 25) : EdgeInsets.only(left: 25), +// width: 40, +// height: 40, +// decoration: BoxDecoration( +// color: Colors.grey, +// borderRadius: BorderRadius.circular(30), +// ), +// child: !isInWishlit ?IconButton( +// icon: Icon(Icons.favorite_border), +// color: Colors.white, +// onPressed: () { +// addToWishlistFunction(item.id); +//// MyStatelessWidget(); +// +// }, +// ):IconButton( +// icon: Icon(Icons.favorite), +// color: Colors.red, +// onPressed: () { +// deleteFromWishlistFunction(item.id); +//// MyStatelessWidget(); +// +// }, +// ) +// ), +// +// ], +// ), +// ), +// Padding( +// padding: const EdgeInsets.all(8.0), +// child: Container( +// margin: EdgeInsets.only(left: 5), +// child: Align( +// alignment: +// languageID == 'ar' ? Alignment.topRight : Alignment.topLeft, +// child: Text( +// languageID == 'ar' ? item.fullDescriptionn : item.fullDescription, +// style: TextStyle(fontWeight: FontWeight.bold, fontSize: 15), +// ), +// ), +// ), +// ), +// Row( +// children: [ +// Expanded( +// flex: 2, +// child: Container( +// margin: EdgeInsets.only(right: 150), +// child: Align( +// alignment: Alignment.bottomLeft, +// child: RatingBar.readOnly( +// initialRating: 3, +// size: 15.0, +// filledColor: Colors.yellow[700], +// emptyColor: Colors.grey[500], +// isHalfAllowed: true, +// halfFilledIcon: Icons.star_half, +// filledIcon: Icons.star, +// emptyIcon: Icons.star, +// ), +// ), +// ), +// ), +// Expanded( +// flex: 1, +// child: Container( +// child: item.rxMessage != null +// ? Text( +// languageID == 'ar' +// ? item.rxMessagen.toString() +// : item.rxMessage.toString(), +// style: TextStyle(color: Colors.red, fontSize: 10), +// ) +// : Container()), +// ), +// item.rxMessage != null +// ? Icon( +// FontAwesomeIcons.questionCircle, +// color: Colors.red, +// size: 15.0, +// ) +// : Container(), +// ], +// ), +// ], +// ); +//} + slideDetail() { return Row( mainAxisAlignment: MainAxisAlignment.start, @@ -886,3 +1761,102 @@ fixingString(txt) { return newTxt; } + +getLanguageID() async { + languageID = await sharedPref.getString(APP_LANGUAGE); +} + +getSpecificationData(itemID) async { + ProductDetailViewModel x = new ProductDetailViewModel(); + specificationData = await x.productSpecificationData(itemID); +} + +addToCartFunction(quantity, itemID) async { + ProductDetailViewModel x = new ProductDetailViewModel(); + await x.addToCartData(quantity, itemID); +} + +addToWishlistFunction(itemID) async { + ProductDetailViewModel x = new ProductDetailViewModel(); + isInWishlit = true; + await x.addToWishlistData(itemID); +} + +deleteFromWishlistFunction(itemID) async { + ProductDetailViewModel x = new ProductDetailViewModel(); + isInWishlit = false; + await x.addToWishlistData(itemID); +} + +checkWishlist() async { + ProductDetailViewModel x = new ProductDetailViewModel(); + await x.checkWishlistData(); + for (int i = 0; i < x.wishListItems.length; i++) { +// print(itemID); +// print(x.wishListItems[i].product.id); + if (itemID == x.wishListItems[i].product.id) { + isInWishlit = true; +// print('in wishlist'); + break; + } else { + isInWishlit = false; +// print('not in wishlist'); + } + } +} + +class sttingModalBottomSheet extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Container(); + } +} + +settingModalBottomSheet(context) { + showModalBottomSheet( + context: context, + builder: (BuildContext bc) { + return Container( + child: new Wrap( + children: [ + new ListTile( + leading: new Icon(Icons.shopping_cart), + title: new Text('Add to cart'), + onTap: () => { + if (price > 0) + {addToCartFunction(price, itemID)} + else + { + AppToast.showErrorToast( + message: "you should add quantity") + } + }), + new ListTile( + leading: new Icon(Icons.favorite_border), + title: new Text('Add to wishlist'), + onTap: () => {addToWishlistFunction(itemID)}, + ), + new ListTile( + leading: new Icon(Icons.compare), + title: new Text('Compare'), + onTap: () => { + Provider.of(context, listen: false) + .addItem(specificationData), + }, + ), + ], + ), + ); + }); +} + +userInfo(id, product) async { + customerId = await sharedPref.getString(PHARMACY_CUSTOMER_ID); + if (customerId != null) { + itemID = id; + product = product; + checkWishlist(); + } + return customerId; +// getSpecificationData(itemID); +} diff --git a/lib/pages/pharmacies/screens/pharmacy_module_page.dart b/lib/pages/pharmacies/screens/pharmacy_module_page.dart index 32a610f8..8a16ca25 100644 --- a/lib/pages/pharmacies/screens/pharmacy_module_page.dart +++ b/lib/pages/pharmacies/screens/pharmacy_module_page.dart @@ -14,6 +14,7 @@ import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; import 'package:flutter/material.dart'; +import 'package:diplomaticquarterapp/pages/pharmacies/product-brands.dart'; import 'lacum-activitaion-vida-page.dart'; @@ -53,7 +54,9 @@ class PharmacyPage extends StatelessWidget { hPadding: 4, borderColor: Colors.green, textColor: Colors.green, - handler: () {}, + handler: () =>{ + Navigator.push(context,FadePage(page: ProductBrandsPage())), + }, ), ], ), diff --git a/lib/pages/pharmacies/search_brands_page.dart b/lib/pages/pharmacies/search_brands_page.dart new file mode 100644 index 00000000..8f771490 --- /dev/null +++ b/lib/pages/pharmacies/search_brands_page.dart @@ -0,0 +1,145 @@ +import 'package:diplomaticquarterapp/config/size_config.dart'; +import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; +import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/brand_view_model.dart'; +import 'package:diplomaticquarterapp/core/viewModels/pharmacy_categorise_view_model.dart'; +import 'package:diplomaticquarterapp/pages/base/base_view.dart'; +import 'package:diplomaticquarterapp/uitl/utils.dart'; +import 'package:diplomaticquarterapp/widgets/buttons/button.dart'; +import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; +import 'package:diplomaticquarterapp/widgets/input/text_field.dart'; +import 'package:diplomaticquarterapp/widgets/others/StarRating.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_scaffold_pharmacy_widget.dart'; +import 'package:diplomaticquarterapp/widgets/others/network_base_view.dart'; +import 'package:flutter/material.dart'; + +class SearchBrandsPage extends StatefulWidget { + @override + _SearchBrandsPageState createState() => _SearchBrandsPageState(); +} + +class _SearchBrandsPageState extends State { + final textController = TextEditingController(); + final _formKey = GlobalKey(); + String msg = ''; + + @override + Widget build(BuildContext context) { + return BaseView( + onModelReady: (model) => model.searchProducts(), + builder: (BuildContext context, model, Widget child) => + PharmacyAppScaffold( + appBarTitle: 'Search', + isBottomBar: false, + isShowAppBar: true, + backgroundColor: Colors.white, + isShowDecPage: false, + //baseViewModel: model, + body: SingleChildScrollView( + child: Container( + height: SizeConfig.screenHeight, + child: Column( + children: [ + Padding( + padding: EdgeInsets.all(8.0), + child: Row( + children: [ + Container( + width: MediaQuery.of(context).size.width * 0.79, + child: Form( + key: _formKey, + child: TextFields( + autoFocus: true, + hintText: 'Search', + fontSize: 19.0, + prefixIcon: Icon(Icons.search), + inputAction: TextInputAction.search, + onSaved: (value) { + //searchMedicine(model, context); + }, + onSubmit: (value) { + searchMedicine(model, context); + msg = 'No Result Found'; + }, + controller: textController, + validator: (value) { + if (value.isEmpty) { + return 'please Enter Product Name'; + } + return null; + }, + ), + ), + ), + SizedBox( + width: 10.0, + ), + InkWell( + child: Texts( + 'Cancel', + fontSize: 17.0, + fontWeight: FontWeight.w500, + ), + onTap: () { + Navigator.pop(context); + }, + ), + + // child: Container( + // child: Button( + // backgroundColor: Colors.green, + // loading: model.state == ViewState.BusyLocal, + // label: 'Search', + // onTap: () { + // searchMedicine(model, context); + // }), + // width: MediaQuery.of(context).size.width * 0.09, + // ), + ], + ), + ), + model.searchList.length == 0 + ? Container( + child: Text( + 'no data' + model.searchList.length.toString()), + ) + : Expanded( + child: Container( + child: ListView.builder( + itemCount: model.searchList.length, + itemBuilder: (BuildContext ctx, index) { + return Padding( + padding:EdgeInsets.all(8.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.all(8.0), + child: Container( + child: Text( + model.searchList[index].name, + style: TextStyle(fontSize: 20), + ), + ), + ), + Divider(height: 1, color: Colors.grey) + ],), + ); + }, + ), + ), + ), + ], + ), + ), + ), + ), + ); + } + + searchMedicine(model, BuildContext context) { + Utils.hideKeyboard(context); + if (_formKey.currentState.validate()) + model.searchProducts(productName: textController.text); + } +} diff --git a/lib/pages/pharmacies/widgets/ProductTileItem.dart b/lib/pages/pharmacies/widgets/ProductTileItem.dart index 2dea5a93..ab1aeb1b 100644 --- a/lib/pages/pharmacies/widgets/ProductTileItem.dart +++ b/lib/pages/pharmacies/widgets/ProductTileItem.dart @@ -1,6 +1,7 @@ import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; import 'package:diplomaticquarterapp/core/model/pharmacies/PharmacyProduct.dart'; import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; +import 'package:diplomaticquarterapp/pages/pharmacies/product_detail.dart'; import 'package:diplomaticquarterapp/pages/pharmacies/screens/phramacy-product-detail-page.dart'; import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; @@ -17,7 +18,7 @@ class ProductTileItem extends StatelessWidget { void productOnClick(BuildContext ctx) { _saveLastVisitProducts(); - Navigator.push(ctx, FadePage(page: ProductDetailScreen(item))); + Navigator.push(ctx, FadePage(page: ProductDetailPage(item))); } void _saveLastVisitProducts() async { diff --git a/lib/pages/pharmacies/wishlist.dart b/lib/pages/pharmacies/wishlist.dart index 3a09031b..2d74212a 100644 --- a/lib/pages/pharmacies/wishlist.dart +++ b/lib/pages/pharmacies/wishlist.dart @@ -4,11 +4,9 @@ import 'package:diplomaticquarterapp/pages/pharmacies/ProductCheckTypeWidget.dar import 'package:flutter/material.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; - void main() => runApp(WishlistPage()); class WishlistPage extends StatefulWidget { - @override _WishlistPageState createState() => _WishlistPageState(); } @@ -23,50 +21,48 @@ class _WishlistPageState extends State { appBarTitle: 'Wishlist page', isShowAppBar: true, isPharmacy: true, - body: Container( -// child: ListView.builder( -// itemCount: 3, -// itemBuilder: (BuildContext context, int index) { -// return Column( -// children: [ -// Container( -// child: productTile(productName: 'Panadol Extra 500 MG', productPrice: '10.00', productRate: 3.00,), -// ), -// Divider(height: 1, color: Colors.grey) -// ], -// ); -// }), - child: Column( - children: [ -// Expanded( -// flex: 1, -// child: Container( -// color: Colors.white, -// width: double.infinity, -// height: 30, -// child: IconButton( -// alignment: Alignment.topRight, -// icon: Icon(Icons.art_track), -// color: Colors.blueAccent, -// onPressed: () { -// setState(() { -// isTrue = !isTrue; -// }); -// }, -// ), -// ), -// ), - Expanded( - flex: 20, - child: Container( - width: double.infinity, - height: MediaQuery.of(context).size.height * 0.85, //250, - child: ProductCheckTypeWidget(isTrue, model.wishListList), + body: model.wishListList.length == 0 + ? Container( + child: Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Padding( + padding: const EdgeInsets.all(8.0), + child: Image.asset( + 'assets/images/new-design/empty_box.png', + width: 100, + height: 100, + fit: BoxFit.cover, + ), + ), + Padding( + padding: const EdgeInsets.all(8.0), + child: Text( + 'There is no data', + style: TextStyle(fontSize: 30), + ), + ) + ], + ), + ), + ) + : Container( + child: Column( + children: [ + Expanded( + flex: 20, + child: Container( + width: double.infinity, + height: + MediaQuery.of(context).size.height * 0.85, //250, + child: + ProductCheckTypeWidget(isTrue, model.wishListList), + ), + ), + ], + ), ), - ), - ], - ), - ), ), ); } diff --git a/lib/pages/pharmacy/profile/profile.dart b/lib/pages/pharmacy/profile/profile.dart index 0336370c..0dc5bee6 100644 --- a/lib/pages/pharmacy/profile/profile.dart +++ b/lib/pages/pharmacy/profile/profile.dart @@ -15,7 +15,8 @@ import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:diplomaticquarterapp/config/config.dart'; import 'package:diplomaticquarterapp/core/model/pharmacies/order_model.dart'; import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; - +import 'package:diplomaticquarterapp/pages/pharmacies/my_reviews.dart'; +import 'package:diplomaticquarterapp/pages/pharmacies/compare.dart'; class PharmacyProfilePage extends StatefulWidget { @override @@ -24,44 +25,51 @@ class PharmacyProfilePage extends StatefulWidget { class _ProfilePageState extends State { AppSharedPreferences sharedPref = AppSharedPreferences(); - String customerId=""; - String page_id=""; + String customerId = ""; + String page_id = ""; @override Widget build(BuildContext context) { return BaseView( onModelReady: (model) => model.getOrder(customerId, page_id), - builder: (_,model, wi )=> AppScaffold( + builder: (_, model, wi) => AppScaffold( appBarTitle: TranslationBase.of(context).myAccount, isShowAppBar: true, - isPharmacy:true , + isPharmacy: true, body: Container( - child:SingleChildScrollView( + child: SingleChildScrollView( child: Column( - children:[ + children: [ Container( - child:Row( - children: [ + child: Row( + children: [ Container( - padding:EdgeInsets.only(top:20.0, left:10.0, right:10.0, bottom:10.0,), - child: LargeAvatar(name: "profile", url:'' ,), + padding: EdgeInsets.only( + top: 20.0, + left: 10.0, + right: 10.0, + bottom: 10.0, + ), + child: LargeAvatar( + name: "profile", + url: '', + ), ), Container( child: Column( children: [ Text( TranslationBase.of(context).welcome, - style: TextStyle(fontSize: 14.0, + style: TextStyle( + fontSize: 14.0, fontWeight: FontWeight.bold, - color:Colors.grey - ), + color: Colors.grey), ), - Text("Name", + Text( + "Name", // model.order[0].customer.firstName.toString(), style: TextStyle( - fontSize: 16.0, - fontWeight: FontWeight.bold - ), + fontSize: 16.0, fontWeight: FontWeight.bold), ), ], ), @@ -80,100 +88,118 @@ class _ProfilePageState extends State { height: 15, ), Container( - child:Row( - children: [ - Expanded( - child: InkWell( - onTap: () { - Navigator.push(context, - MaterialPageRoute(builder: (context) => OrderPage())); - }, - child: Column( - children: [ - SvgPicture.asset( - 'assets/images/pharmacy/orders_icon.svg', - width: 50, - height: 50,), - SizedBox( - height: 5, - ), - Text( - TranslationBase.of(context).orders, - style: TextStyle(fontSize: 13.0, - fontWeight: FontWeight.bold,), - ), - ], - ), - ), + child: Row( + children: [ + Expanded( + child: InkWell( + onTap: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => OrderPage())); + }, + child: Column( + children: [ + SvgPicture.asset( + 'assets/images/pharmacy/orders_icon.svg', + width: 50, + height: 50, + ), + SizedBox( + height: 5, + ), + Text( + TranslationBase.of(context).orders, + style: TextStyle( + fontSize: 13.0, + fontWeight: FontWeight.bold, + ), + ), + ], ), - Expanded( - child: InkWell( - child: Column( - children: [ - SvgPicture.asset( - 'assets/images/pharmacy/lakum_icon.svg', - width: 50, - height: 50,), - SizedBox( - height: 5, - ), - Text( - TranslationBase.of(context).lakum, - style: TextStyle(fontSize: 13.0, - fontWeight: FontWeight.bold - ), - ), - ], - ), - ), + ), + ), + Expanded( + child: InkWell( + child: Column( + children: [ + SvgPicture.asset( + 'assets/images/pharmacy/lakum_icon.svg', + width: 50, + height: 50, + ), + SizedBox( + height: 5, + ), + Text( + TranslationBase.of(context).lakum, + style: TextStyle( + fontSize: 13.0, fontWeight: FontWeight.bold), + ), + ], ), - Expanded( - child: InkWell( - onTap: () { - Navigator.push(context, - MaterialPageRoute(builder: (context) => WishlistPage())); - }, - child: Column( - children: [ - SvgPicture.asset( - 'assets/images/pharmacy/wishlist_icon.svg', - width: 50, - height: 50,), - SizedBox( - height: 5, - ), - Text( - TranslationBase.of(context).wishlist, - style: TextStyle(fontSize: 13.0, - fontWeight: FontWeight.bold,), - ), - ], - ), - ), + ), + ), + Expanded( + child: InkWell( + onTap: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => WishlistPage())); + }, + child: Column( + children: [ + SvgPicture.asset( + 'assets/images/pharmacy/wishlist_icon.svg', + width: 50, + height: 50, + ), + SizedBox( + height: 5, + ), + Text( + TranslationBase.of(context).wishlist, + style: TextStyle( + fontSize: 13.0, + fontWeight: FontWeight.bold, + ), + ), + ], ), - Expanded( - child: InkWell( - child: Column( - children: [ - SvgPicture.asset( - 'assets/images/pharmacy/review_icon.svg', - width: 50, - height: 50,), - SizedBox( - height: 5, - ), - Text( - TranslationBase.of(context).reviews, - style: TextStyle(fontSize: 13.0, - fontWeight: FontWeight.bold,), - ), - ], - ), - ), + ), + ), + Expanded( + child: InkWell( + onTap: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => MyReviewsPage())); + }, + child: Column( + children: [ + SvgPicture.asset( + 'assets/images/pharmacy/review_icon.svg', + width: 50, + height: 50, + ), + SizedBox( + height: 5, + ), + Text( + TranslationBase.of(context).reviews, + style: TextStyle( + fontSize: 13.0, + fontWeight: FontWeight.bold, + ), + ), + ], ), - ], - ) - ), + ), + ), + ], + )), SizedBox( height: 15, ), @@ -191,13 +217,11 @@ class _ProfilePageState extends State { padding: EdgeInsets.only(left: 10.0), child: Column( crossAxisAlignment: CrossAxisAlignment.start, - children: [ + children: [ Text( TranslationBase.of(context).myAccount, style: TextStyle( - fontSize: 16.0, - fontWeight: FontWeight.bold - ), + fontSize: 16.0, fontWeight: FontWeight.bold), ), SizedBox( height: 10, @@ -206,29 +230,35 @@ class _ProfilePageState extends State { color: Colors.grey, height: 20, ), - InkWell( - onTap: () { - Navigator.push(context, - MaterialPageRoute(builder: (context) => HomePrescriptionsPage())); - }, - child: Row( - children: [ - SvgPicture.asset( - 'assets/images/pharmacy/my_prescription_icon.svg', - width: 28, - height: 28,), - SizedBox( - width: 15, + InkWell( + onTap: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => + HomePrescriptionsPage())); + }, + child: Row( + children: [ + SvgPicture.asset( + 'assets/images/pharmacy/my_prescription_icon.svg', + width: 28, + height: 28, + ), + SizedBox( + width: 15, + ), + Text( + TranslationBase.of(context).myPrescription, + style: TextStyle( + fontSize: 13.0, ), - Text(TranslationBase.of(context).myPrescription, - style: TextStyle(fontSize: 13.0, - ), - ), - ], - ), - ), + ), + ], + ), + ), SizedBox( - height: 5, + height: 5, ), Divider( color: Colors.grey, @@ -236,20 +266,25 @@ class _ProfilePageState extends State { ), InkWell( onTap: () { - Navigator.push(context, - MaterialPageRoute(builder: (context) => MyFamily())); + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => ComparePage())); }, child: Row( - children: [ + children: [ SvgPicture.asset( 'assets/images/pharmacy/compare.png', width: 28, - height: 28,), + height: 28, + ), SizedBox( width: 15, ), - Text(TranslationBase.of(context).compare, - style: TextStyle(fontSize: 13.0, + Text( + TranslationBase.of(context).compare, + style: TextStyle( + fontSize: 13.0, ), ), ], @@ -264,20 +299,26 @@ class _ProfilePageState extends State { ), InkWell( onTap: () { - Navigator.push(context, - MaterialPageRoute(builder: (context) => HomePrescriptionsPage())); + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => + HomePrescriptionsPage())); }, child: Row( - children: [ + children: [ SvgPicture.asset( 'assets/images/pharmacy/medication_refill_icon.svg', width: 30, - height: 30,), + height: 30, + ), SizedBox( width: 20, ), - Text(TranslationBase.of(context).medicationsRefill, - style: TextStyle(fontSize: 13.0, + Text( + TranslationBase.of(context).medicationsRefill, + style: TextStyle( + fontSize: 13.0, ), ), ], @@ -292,20 +333,25 @@ class _ProfilePageState extends State { ), InkWell( onTap: () { - Navigator.push(context, - MaterialPageRoute(builder: (context) => MyFamily())); + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => MyFamily())); }, child: Row( - children: [ + children: [ SvgPicture.asset( 'assets/images/pharmacy/my_family_icon.svg', width: 20, - height: 20,), + height: 20, + ), SizedBox( width: 20, ), - Text(TranslationBase.of(context).family, - style: TextStyle(fontSize: 13.0, + Text( + TranslationBase.of(context).family, + style: TextStyle( + fontSize: 13.0, ), ), ], @@ -320,20 +366,26 @@ class _ProfilePageState extends State { ), InkWell( onTap: () { - Navigator.push(context, - MaterialPageRoute(builder: (context) => PharmacyAddressesPage())); + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => + PharmacyAddressesPage())); }, child: Row( - children: [ + children: [ SvgPicture.asset( 'assets/images/pharmacy/shipping_addresses_icon.svg', width: 30, - height: 30,), + height: 30, + ), SizedBox( width: 20, ), - Text(TranslationBase.of(context).shippingAddresses, - style: TextStyle(fontSize: 13.0, + Text( + TranslationBase.of(context).shippingAddresses, + style: TextStyle( + fontSize: 13.0, ), ), ], @@ -359,13 +411,11 @@ class _ProfilePageState extends State { padding: EdgeInsets.only(left: 10.0), child: Column( crossAxisAlignment: CrossAxisAlignment.start, - children: [ + children: [ Text( TranslationBase.of(context).reachUs, style: TextStyle( - fontSize: 16.0, - fontWeight: FontWeight.bold - ), + fontSize: 16.0, fontWeight: FontWeight.bold), ), SizedBox( height: 5, @@ -374,27 +424,30 @@ class _ProfilePageState extends State { color: Colors.grey, height: 20, ), - InkWell( - onTap: () { - Navigator.push(context, - MaterialPageRoute(builder: (context) => LiveChatPage())); - }, - child: Row( - children: [ - SvgPicture.asset( - 'assets/images/pharmacy/contact_us_icon.svg', - width: 20, - height: 20,), - SizedBox( - width: 20, - ), - Text( - TranslationBase.of(context).contactUs, - style: TextStyle(fontSize: 13.0), - ), - ], - ), - ), + InkWell( + onTap: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => LiveChatPage())); + }, + child: Row( + children: [ + SvgPicture.asset( + 'assets/images/pharmacy/contact_us_icon.svg', + width: 20, + height: 20, + ), + SizedBox( + width: 20, + ), + Text( + TranslationBase.of(context).contactUs, + style: TextStyle(fontSize: 13.0), + ), + ], + ), + ), SizedBox( height: 5, ), @@ -404,20 +457,23 @@ class _ProfilePageState extends State { ), InkWell( onTap: () { - Navigator.push(context, - MaterialPageRoute(builder: (context) => FindUsPage())); + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => FindUsPage())); }, child: Row( children: [ SvgPicture.asset( 'assets/images/pharmacy/our_locations_icon.svg', width: 30, - height: 30,), + height: 30, + ), SizedBox( width: 20, ), Text( - TranslationBase.of(context).ourLocations, + TranslationBase.of(context).ourLocations, style: TextStyle(fontSize: 13.0), ), ], @@ -432,8 +488,5 @@ class _ProfilePageState extends State { ), ), ); - }} - - - - + } +} diff --git a/lib/services/pharmacy_services/brands_service.dart b/lib/services/pharmacy_services/brands_service.dart index e4a40d6c..32024f2f 100644 --- a/lib/services/pharmacy_services/brands_service.dart +++ b/lib/services/pharmacy_services/brands_service.dart @@ -14,6 +14,13 @@ class BrandsService extends BaseService { List _topBrandsList = List(); List get topBrandsList => _topBrandsList; + List _searchList = List(); + List get searchList => _searchList; + + clearSearchList() { + _searchList.clear(); + } + Future getBrands() async { hasError = false; await baseAppClient.getPharmacy(GET_BRANDS, @@ -41,4 +48,26 @@ class BrandsService extends BaseService { super.error = error; }); } + + Future searchProducts({String productName}) async { + RegExp exp = new RegExp(productName.toUpperCase()); + hasError = false; + _searchList.clear(); + await baseAppClient.getPharmacy( + GET_BRANDS, + onSuccess: (dynamic response, int statusCode) { + response['manufacturer'].forEach((item) { + if(exp.hasMatch(item['name'])){ + _searchList.add(Brand.fromJson(item)); + }else{ + } + }); + }, + onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, + ); + } + } diff --git a/lib/services/pharmacy_services/product_detail_service.dart b/lib/services/pharmacy_services/product_detail_service.dart index f9bbb7e3..7a2947b0 100644 --- a/lib/services/pharmacy_services/product_detail_service.dart +++ b/lib/services/pharmacy_services/product_detail_service.dart @@ -1,11 +1,14 @@ import 'package:diplomaticquarterapp/config/config.dart'; import 'package:diplomaticquarterapp/core/service/base_service.dart'; +import 'package:diplomaticquarterapp/models/pharmacy/Wishlist.dart'; +import 'package:diplomaticquarterapp/models/pharmacy/addToCartModel.dart'; import 'package:diplomaticquarterapp/models/pharmacy/locationModel.dart'; import 'package:diplomaticquarterapp/models/pharmacy/productDetailModel.dart'; -import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; +import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; +import 'package:diplomaticquarterapp/uitl/app_toast.dart'; +import 'package:diplomaticquarterapp/models/pharmacy/specification.dart'; class ProductDetailService extends BaseService { - AppSharedPreferences sharedPref = AppSharedPreferences(); bool isLogin = false; List _productDetailList = List(); @@ -14,10 +17,20 @@ class ProductDetailService extends BaseService { List _productLocationList = List(); List get productLocationList => _productLocationList; + List _addToCartModel = List(); + List get addToCartModel => _addToCartModel; - Future getProductReviews() async { + List _wishListProducts = List(); + List get wishListProducts => _wishListProducts; + + List _productSpecification = List(); + List get productSpecification => _productSpecification; + + + + Future getProductReviews(productID) async { hasError = false; - await baseAppClient.getPharmacy(GET_PRODUCT_DETAIL+"1480?fields=reviews", + await baseAppClient.getPharmacy(GET_PRODUCT_DETAIL+productID+"?fields=reviews", onSuccess: (dynamic response, int statusCode) { _productDetailList.clear(); response['products'].forEach((item) { @@ -51,11 +64,115 @@ class ProductDetailService extends BaseService { _productLocationList.clear(); response['PharmList'].forEach((item) { _productLocationList.add(LocationModel.fromJson(item)); + print(_productLocationList); + print(response); + }); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: request); + } + + Future addToCart(quantity, itemID) async { + var customerId = await sharedPref.getString(PHARMACY_CUSTOMER_ID); + hasError = false; + Map request; + + request = { + "shopping_cart_item": + { + "quantity": quantity, + "shopping_cart_type": "1", + "product_id": itemID, + "customer_id": customerId, + "language_id": 1 + } + }; + await baseAppClient.post(GET_SHOPPING_CART, + onSuccess: (dynamic response, int statusCode) { + _addToCartModel.clear(); + response['shopping_carts'].forEach((item) { + _addToCartModel.add(Wishlist.fromJson(item)); + }); + AppToast.showSuccessToast(message: 'You have added a product to the cart'); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + AppToast.showErrorToast(message: 'something went wrong please try again'); + }, body: request); + } + + Future addToWishlist(itemID) async { + var customerId = await sharedPref.getString(PHARMACY_CUSTOMER_ID); + hasError = false; + Map request; + + request = { + "shopping_cart_item": + { + "quantity": 1, + "shopping_cart_type": "Wishlist", + "product_id": itemID, + "customer_id": customerId, + "language_id": 1 + } + }; + await baseAppClient.post(GET_SHOPPING_CART, + onSuccess: (dynamic response, int statusCode) { + _wishListProducts.clear(); + response['shopping_carts'].forEach((item) { + _wishListProducts.add(Wishlist.fromJson(item)); + AppToast.showSuccessToast(message: 'You have added a product to the Wishlist'); }); }, onFailure: (String error, int statusCode) { hasError = true; super.error = error; + AppToast.showErrorToast(message: 'something went wrong please try again'); }, body: request); } + Future getWishlistItems() async { + var customerId = await sharedPref.getString(PHARMACY_CUSTOMER_ID); + hasError = false; + await baseAppClient.getPharmacy(GET_WISHLIST+customerId+"?shopping_cart_type=2", + onSuccess: (dynamic response, int statusCode) { + _wishListProducts.clear(); + response['shopping_carts'].forEach((item) { + _wishListProducts.add(Wishlist.fromJson(item)); + }); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }); + } + Future delteItemFromWishlist(itemID) async { + var customerId = await sharedPref.getString(PHARMACY_CUSTOMER_ID); + hasError = false; + await baseAppClient.getPharmacy(DELETE_WISHLIST+customerId+"+&product_id="+itemID+"&cart_type=Wishlist", + onSuccess: (dynamic response, int statusCode) { + _wishListProducts.clear(); + response['shopping_carts'].forEach((item) { + _wishListProducts.add(Wishlist.fromJson(item)); + }); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }); + } + + Future productSpecificationData(itemID) async { + hasError = false; + + await baseAppClient.getPharmacy(GET_SPECIFICATION+itemID, + onSuccess: (dynamic response, int statusCode) { + _productSpecification.clear(); + response['specification'].forEach((item) { + _productSpecification.add(SpecificationModel.fromJson(item)); + }); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }); + } + } diff --git a/lib/services/pharmacy_services/review_service.dart b/lib/services/pharmacy_services/review_service.dart index 67434643..44839955 100644 --- a/lib/services/pharmacy_services/review_service.dart +++ b/lib/services/pharmacy_services/review_service.dart @@ -1,19 +1,29 @@ import 'package:diplomaticquarterapp/config/config.dart'; import 'package:diplomaticquarterapp/core/service/base_service.dart'; +import 'package:diplomaticquarterapp/models/Authentication/authenticated_user.dart'; import 'package:diplomaticquarterapp/models/pharmacy/reviewModel.dart'; +import 'package:diplomaticquarterapp/services/authentication/auth_provider.dart'; import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; +import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; class ReviewService extends BaseService { AppSharedPreferences sharedPref = AppSharedPreferences(); + + AuthenticatedUser authUser = new AuthenticatedUser(); + AuthProvider authProvider = new AuthProvider(); + bool isLogin = false; List _reviewList = List(); List get reviewList => _reviewList; Future getReview() async { + + var customerId = await sharedPref.getString(PHARMACY_CUSTOMER_ID); + hasError = false; - await baseAppClient.getPharmacy(GET_REVIEW+"1367368", + await baseAppClient.getPharmacy(GET_REVIEW+customerId, onSuccess: (dynamic response, int statusCode) { _reviewList.clear(); response['reviews'].forEach((item) { diff --git a/lib/services/pharmacy_services/wishList_service.dart b/lib/services/pharmacy_services/wishList_service.dart index d4a00230..5404a2bd 100644 --- a/lib/services/pharmacy_services/wishList_service.dart +++ b/lib/services/pharmacy_services/wishList_service.dart @@ -55,8 +55,9 @@ class WishListService extends BaseService { // } Future getWishlist() async { + var customerId = await sharedPref.getString(PHARMACY_CUSTOMER_ID); hasError = false; - await baseAppClient.getPharmacy(GET_WISHLIST+"1367368?shopping_cart_type=2", + await baseAppClient.getPharmacy(GET_WISHLIST+customerId+"?shopping_cart_type=2", onSuccess: (dynamic response, int statusCode) { _wishListProducts.clear(); response['shopping_carts'].forEach((item) { diff --git a/lib/uitl/translations_delegate_base.dart b/lib/uitl/translations_delegate_base.dart index 7be0a051..ae0a3d88 100644 --- a/lib/uitl/translations_delegate_base.dart +++ b/lib/uitl/translations_delegate_base.dart @@ -1063,6 +1063,18 @@ class TranslationBase { localizedValues['processDoneSuccessfully'][locale.languageCode]; String get selectHomeHealthCareServices => localizedValues['selectHomeHealthCareServices'][locale.languageCode]; + + String get topBrands => localizedValues['topBrands'][locale.languageCode]; + String get notifyMe => localizedValues['notifyMe'][locale.languageCode]; + String get specification => localizedValues['specification'][locale.languageCode]; + String get details => localizedValues['details'][locale.languageCode]; + String get availability => localizedValues['availability'][locale.languageCode]; + String get quantity => localizedValues['quantity'][locale.languageCode]; + String get quantitySize => localizedValues['quantitySize'][locale.languageCode]; + String get addToCart => localizedValues['addToCart'][locale.languageCode]; + String get buyNow => localizedValues['buyNow'][locale.languageCode]; + String get quantityShortcut => localizedValues['quantityShortcut'][locale.languageCode]; + } class TranslationBaseDelegate extends LocalizationsDelegate { diff --git a/lib/widgets/others/app_scafold_detail_page.dart b/lib/widgets/others/app_scafold_detail_page.dart new file mode 100644 index 00000000..ed8bc8a7 --- /dev/null +++ b/lib/widgets/others/app_scafold_detail_page.dart @@ -0,0 +1,241 @@ +import 'package:diplomaticquarterapp/config/config.dart'; +import 'package:diplomaticquarterapp/config/size_config.dart'; +import 'package:diplomaticquarterapp/config/size_config.dart'; +import 'package:diplomaticquarterapp/core/service/AuthenticatedUserObject.dart'; +import 'package:diplomaticquarterapp/core/viewModels/base_view_model.dart'; +import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; +import 'package:diplomaticquarterapp/pages/insurance/insurance_update_screen.dart'; +import 'package:diplomaticquarterapp/pages/landing/landing_page.dart'; +import 'package:diplomaticquarterapp/routes.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; +import 'package:diplomaticquarterapp/widgets/others/bottom_bar.dart'; +import 'package:diplomaticquarterapp/widgets/progress_indicator/app_loader_widget.dart'; +import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; +import 'package:diplomaticquarterapp/widgets/robo-search/robosearch.dart'; +import 'package:diplomaticquarterapp/widgets/robo-search/search.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:font_awesome_flutter/font_awesome_flutter.dart'; +import 'package:provider/provider.dart'; + +import '../../locator.dart'; +import 'floating_button_search.dart'; +import '../progress_indicator/app_loader_widget.dart'; +import 'arrow_back.dart'; +import 'network_base_view.dart'; +import 'not_auh_page.dart'; +import 'package:diplomaticquarterapp/pages/pharmacies/product_detail.dart'; +import 'package:diplomaticquarterapp/pages/pharmacies/screens/cart-order-page.dart'; + +class DetailPageScafold extends StatefulWidget { + final String appBarTitle; + final Widget body; + final Widget bottomSheet; + final bool isLoading; + final bool isShowAppBar; + final bool hasAppBarParam; + final BaseViewModel baseViewModel; + final bool isBottomBar; + final Widget floatingActionButton; + final bool isPharmacy; + final String title; + final String description; + final String image; + final bool isShowDecPage; + final List infoList; + final Color backgroundColor; + final double preferredSize; + final List appBarIcons; + final PreferredSizeWidget appBarWidget; + + + DetailPageScafold( + {@required this.body, + this.appBarTitle = '', + this.isLoading = false, + this.isShowAppBar = false, + this.hasAppBarParam, + this.bottomSheet, + this.baseViewModel, + this.floatingActionButton, + this.isPharmacy = false, + this.title, + this.description, + this.isShowDecPage = true, + this.isBottomBar, + this.backgroundColor, + this.preferredSize = 0.0, + this.appBarIcons, + this.appBarWidget, + this.image, + this.infoList}); + + @override + _DetailPageScafoldState createState() => _DetailPageScafoldState(); +} + +class _DetailPageScafoldState extends State { + AuthenticatedUserObject authenticatedUserObject = + locator(); + + @override + Widget build(BuildContext context) { + AppGlobal.context = context; + PreferredSizeWidget appBar; + + if (this.widget.appBarWidget == null) { + PreferredSizeWidget appBarWidget = AppBarWidget( + widget.appBarTitle, + widget.appBarIcons, + widget.isShowAppBar, + isPharmacy: widget.isPharmacy, + isShowDecPage: widget.isShowDecPage, + image: widget.image, + ); + appBar = widget.preferredSize == 0 + ? appBarWidget + : PreferredSize( + child: appBarWidget, + preferredSize: Size.fromHeight(widget.preferredSize)); + } else { + appBar = this.widget.appBarWidget; + } + + return Scaffold( + backgroundColor: + widget.backgroundColor ?? Theme.of(context).scaffoldBackgroundColor, + appBar: appBar, + body: (!Provider.of(context, listen: false).isLogin && + widget.isShowDecPage) + ? NotAutPage( + title: widget.appBarTitle, + description: widget.description, + infoList: widget.infoList, + ) + : widget.baseViewModel != null + ? NetworkBaseView( + child: buildBodyWidget(), + baseViewModel: widget.baseViewModel, + ) + : buildBodyWidget(), + bottomSheet: widget.bottomSheet, + //floatingActionButton: floatingActionButton ?? floatingActionButton, + // bottomNavigationBar: + // this.isBottomBar == true ? BottomBarSearch() : SizedBox() + // floatingActionButton: FloatingSearchButton(), + ); + } + + buildAppLoaderWidget(bool isLoading) { + return isLoading ? AppLoaderWidget() : Container(); + } + + buildBodyWidget() { + // return body; //Stack(children: [body, buildAppLoaderWidget(isLoading)]); + return Stack(children: [ + widget.body, /*FloatingSearchButton()*/ + ]); + } +} + +class AppBarWidget extends StatelessWidget with PreferredSizeWidget { + final AuthenticatedUserObject authenticatedUserObject = + locator(); + + final String appBarTitle; + final List appBarIcons; + final bool isShowAppBar; + final bool isPharmacy; + final bool isShowDecPage; + final String image; + + AppBarWidget(this.appBarTitle, this.appBarIcons, this.isShowAppBar, + {this.isPharmacy = true, this.isShowDecPage = true, this.image}); + + @override + Widget build(BuildContext context) { + return buildAppBar(context); + } + + Widget buildAppBar(BuildContext context) { + return isShowAppBar + ? AppBar( + elevation: 0, + backgroundColor:Colors.white, +// isPharmacy ? Colors.green : Theme.of(context).appBarTheme.color, + textTheme: TextTheme( + headline6: + TextStyle(color: Colors.white, fontWeight: FontWeight.bold), + ), + title: Texts( + authenticatedUserObject.isLogin || !isShowDecPage + ? appBarTitle.toUpperCase() + : TranslationBase.of(context).serviceInformationTitle, + color: Colors.white, + bold: true, + ), + leading: Builder( + builder: (BuildContext context) { + return GestureDetector( + + behavior: HitTestBehavior.opaque, + onTap:()=> Navigator.pop(context), + child: Icon(Icons.arrow_back_ios, color: Colors.grey), + ); + }, + ), + centerTitle: true, + actions: [ + isPharmacy + ? IconButton( + icon: Icon(Icons.shopping_cart), + color: Colors.grey, + onPressed: () { + Navigator.push( + context, + MaterialPageRoute(builder: (context) => CartOrderPage()), + ); +// Navigator.of(context) +// .popUntil(ModalRoute.withName('/')); + }) + : Container(), + image != null + ? InkWell( + onTap: () => Navigator.push( + context, + FadePage( + page: InsuranceUpdate(), + ), + ), + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Image.asset( + image, + height: SizeConfig.heightMultiplier * 5, + width: SizeConfig.heightMultiplier * 5, + color: Colors.grey, + ), + ), + ) + : IconButton( + icon: Icon(FontAwesomeIcons.ellipsisV), + color: Colors.grey, + onPressed: () { + settingModalBottomSheet(context); + }, + ), + if (appBarIcons != null) ...appBarIcons + ], + ) + : Container( + height: 0, + width: 0, + ); + } + + @override + Size get preferredSize => Size(double.maxFinite, 60); +} + + diff --git a/lib/widgets/pharmacy/product_tile.dart b/lib/widgets/pharmacy/product_tile.dart index 725966d5..42a25aff 100644 --- a/lib/widgets/pharmacy/product_tile.dart +++ b/lib/widgets/pharmacy/product_tile.dart @@ -1,3 +1,5 @@ +import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/product_detail_view_model.dart'; +import 'package:diplomaticquarterapp/pages/pharmacies/screens/cart-order-page.dart'; import 'package:diplomaticquarterapp/pages/pharmacy/order/ProductReview.dart'; import 'package:flutter/material.dart'; import 'package:flutter_html/style.dart'; @@ -16,6 +18,7 @@ class productTile extends StatelessWidget { final bool isOrderDetails; final String productImage; final bool showLine; + final dynamic productID; productTile( {this.productName, @@ -24,9 +27,11 @@ class productTile extends StatelessWidget { this.qyt, this.totalPrice, this.productReviews, - this.isOrderDetails = true, + this.isOrderDetails = false, this.productImage, - this.showLine = true}); + this.showLine = true, + this.productID, + }); @override Widget build(BuildContext context) { @@ -48,13 +53,6 @@ class productTile extends StatelessWidget { width: 80, height: 80, ), -// child: Image( -// image: -// AssetImage('assets/images/al-habib_onlne_pharmacy_bg.png'), -// fit: BoxFit.cover, -// width: 80, -// height: 80, -// ), ), Expanded( flex: 5, @@ -116,11 +114,32 @@ class productTile extends StatelessWidget { flex: 1, child: Column( children: [ - Icon(FontAwesomeIcons.trashAlt, size: 15), + IconButton( + icon: Icon( + FontAwesomeIcons.trashAlt, + size: 15 + ), + onPressed: (){ + deleteFromWishlistFunction(productID); + }, + ), SizedBox( height: 50, ), - Icon(FontAwesomeIcons.shoppingCart, size: 15), + IconButton( + icon: Icon( + FontAwesomeIcons.shoppingCart, + size: 15 + ), + onPressed: () async{ + await addToCartFunction(1, productID); + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => CartOrderPage()), + ); + }, + ), ], ), ) @@ -247,111 +266,22 @@ class productTile extends StatelessWidget { ], ), ) - : Container( - child: Padding( - padding: EdgeInsets.all(8.0), - child: Row( - children: [ - Padding( - padding: EdgeInsets.only(left: 15), - child: Container( - width: 160, - height: 200, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(10), - border: Border( - top: BorderSide( - width: 0.5, color: Colors.grey), - left: BorderSide( - width: 0.5, color: Colors.grey), - right: BorderSide( - width: 0.5, color: Colors.grey), - bottom: BorderSide( - width: 0.5, color: Colors.grey), - ), - color: Colors.white), - child: Column( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - SizedBox( - height: 2, - ), - Container( - child: Image.network( - productImage.trim(), - fit: BoxFit.cover, - width: 80, - height: 70, - ), - ), - SizedBox( - height: 10, - ), -// Container(width: 150,height: 20,color: Colors.green,), - Container( - alignment: Alignment.centerLeft, - child: Column( - children: [ - Container( - margin: EdgeInsets.all(5), - child: Align( - alignment: Alignment.topLeft, - child: RichText( - text: TextSpan( - text: productName, - style: TextStyle( - color: Colors.black54, - fontSize: 15, - fontWeight: FontWeight.bold), - ), - ), - ), - ), - Container( - margin: EdgeInsets.all(5), - child: Align( - alignment: Alignment.topLeft, - child: RichText( - text: TextSpan( - text: 'SAR $productPrice', - style: TextStyle( - fontWeight: FontWeight.bold, - color: Colors.black, - fontSize: 13), - ), - ), - ), - ), - Container( - alignment: Alignment.topLeft, - margin: EdgeInsets.all(5), - child: Align( - child: RatingBar.readOnly( - initialRating: productRate, - size: 15.0, - filledColor: Colors.yellow[700], - emptyColor: Colors.grey[500], - isHalfAllowed: true, - halfFilledIcon: Icons.star_half, - filledIcon: Icons.star, - emptyIcon: Icons.star, - ), - ), - ), - ], - ), - ), - ], - ), - ), - ), - ], - ), - ), - ), + : Container(), ], ), ); } } + + +deleteFromWishlistFunction(itemID) async { + ProductDetailViewModel x = new ProductDetailViewModel(); + await x.deletWishlistData(itemID); +} + + +addToCartFunction(quantity, itemID) async { + ProductDetailViewModel x = new ProductDetailViewModel(); + await x.addToCartData(quantity, itemID); + +} \ No newline at end of file From a2e5b489154d1fc1c0730e2ae1a0a8b4e46c725f Mon Sep 17 00:00:00 2001 From: Mohammad Aljammal Date: Thu, 7 Jan 2021 14:52:25 +0200 Subject: [PATCH 15/18] fix merge issues --- android/app/build.gradle | 2 +- android/gradle.properties | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 54ea9373..369cb30a 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -74,7 +74,7 @@ dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" implementation "com.google.firebase:firebase-messaging:20.3.0" implementation 'pub.devrel:easypermissions:0.4.0' - implementation 'com.google.firebase:firebase-inappmessaging-display:17.2.0' + // implementation 'com.google.firebase:firebase-inappmessaging-display:17.2.0' implementation 'com.google.guava:guava:27.0.1-android' // Dependency on local binaries implementation fileTree(dir: 'libs', include: ['*.jar']) diff --git a/android/gradle.properties b/android/gradle.properties index 9c0729c9..38c8d454 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -1,5 +1,4 @@ - +org.gradle.jvmargs=-Xmx1536M android.enableR8=true android.useAndroidX=true android.enableJetifier=true -org.gradle.jvmargs=-Xmx4608m From d77a607b7888fe56ce8b39fe1be26492bd944c97 Mon Sep 17 00:00:00 2001 From: mosazaid Date: Thu, 7 Jan 2021 17:06:49 +0200 Subject: [PATCH 16/18] commit --- .../pharmacy/pharmacyAddresses/PharmacyAddresses.dart | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/lib/pages/pharmacy/pharmacyAddresses/PharmacyAddresses.dart b/lib/pages/pharmacy/pharmacyAddresses/PharmacyAddresses.dart index 38afd842..e3651e21 100644 --- a/lib/pages/pharmacy/pharmacyAddresses/PharmacyAddresses.dart +++ b/lib/pages/pharmacy/pharmacyAddresses/PharmacyAddresses.dart @@ -11,12 +11,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/pages/pharmacy/pharmacyAddresses/AddAddress.dart'; -import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; -import 'package:diplomaticquarterapp/config/config.dart'; -import 'package:diplomaticquarterapp/services/pharmacy_services/pharmacyAddress_service.dart'; -import 'package:diplomaticquarterapp/core/model/pharmacies/PharmacyAddressesModel.dart'; -import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/PharmacyAddressesViewModel.dart'; -import 'package:google_maps_place_picker/google_maps_place_picker.dart'; + class PharmacyAddressesPage extends StatefulWidget { @override From c82f01cd1ab4d80ad16cb4a2f5d3630c19dfed9a Mon Sep 17 00:00:00 2001 From: Mohammad Aljammal Date: Thu, 7 Jan 2021 18:15:34 +0200 Subject: [PATCH 17/18] fix merge issues --- lib/config/config.dart | 2 +- lib/config/localized_values.dart | 4 ---- lib/pages/pharmacy/profile/profile.dart | 8 +++++--- lib/uitl/translations_delegate_base.dart | 1 - 4 files changed, 6 insertions(+), 9 deletions(-) diff --git a/lib/config/config.dart b/lib/config/config.dart index c3bf38fd..af925ed1 100644 --- a/lib/config/config.dart +++ b/lib/config/config.dart @@ -6,7 +6,7 @@ import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; const MAX_SMALL_SCREEN = 660; -const BASE_URL = 'https://hmgwebservices.com/'; +const BASE_URL = 'https://uat.hmgwebservices.com/'; //const BASE_PHARMACY_URL = 'http://swd-pharapp-01:7200/api/'; const BASE_PHARMACY_URL = 'https://uat.hmgwebservices.com/epharmacy/api/'; const PHARMACY_BASE_URL = 'https://uat.hmgwebservices.com/epharmacy/api/'; diff --git a/lib/config/localized_values.dart b/lib/config/localized_values.dart index 2f13293b..dea5dd5d 100644 --- a/lib/config/localized_values.dart +++ b/lib/config/localized_values.dart @@ -1194,10 +1194,6 @@ const Map localizedValues = { "ar":"التوفر" }, - "quantity":{ - "en":"Quantity", - "ar":"التوفر" - }, "quantitySize":{ "en":"Quantity", "ar":"كميه" diff --git a/lib/pages/pharmacy/profile/profile.dart b/lib/pages/pharmacy/profile/profile.dart index 3fa7440c..6e2f2a7c 100644 --- a/lib/pages/pharmacy/profile/profile.dart +++ b/lib/pages/pharmacy/profile/profile.dart @@ -14,6 +14,7 @@ import 'package:diplomaticquarterapp/pages/pharmacy/order/Order.dart'; import 'package:diplomaticquarterapp/pages/pharmacy/pharmacyAddresses/PharmacyAddresses.dart'; import 'package:diplomaticquarterapp/uitl/app_toast.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:diplomaticquarterapp/widgets/avatar/large_avatar.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; @@ -33,7 +34,8 @@ class PharmacyProfilePage extends StatefulWidget { } class _ProfilePageState extends State { - + AppSharedPreferences sharedPref = AppSharedPreferences(); + String page_id = ""; AuthenticatedUser user; bool isLogin = false; @@ -129,7 +131,7 @@ class _ProfilePageState extends State { ), ], ), - ], + ) ], ), @@ -615,7 +617,7 @@ class _ProfilePageState extends State { ), ), ), - ); + )); }} diff --git a/lib/uitl/translations_delegate_base.dart b/lib/uitl/translations_delegate_base.dart index 5e33f54f..65be2d3e 100644 --- a/lib/uitl/translations_delegate_base.dart +++ b/lib/uitl/translations_delegate_base.dart @@ -1083,7 +1083,6 @@ class TranslationBase { String get specification => localizedValues['specification'][locale.languageCode]; String get details => localizedValues['details'][locale.languageCode]; String get availability => localizedValues['availability'][locale.languageCode]; - String get quantity => localizedValues['quantity'][locale.languageCode]; String get quantitySize => localizedValues['quantitySize'][locale.languageCode]; String get addToCart => localizedValues['addToCart'][locale.languageCode]; String get buyNow => localizedValues['buyNow'][locale.languageCode]; From de1b7cc1d025988e9695f6a9d401857644b68351 Mon Sep 17 00:00:00 2001 From: Mohammad Aljammal Date: Sun, 10 Jan 2021 16:19:03 +0200 Subject: [PATCH 18/18] fix merge issues --- .../images/new-design/liveCare_white_logo.svg | 40 + .../new-design/livecare_arabic_logo.svg | 39 + .../images/new-design/livecare_white_logo.png | Bin 0 -> 9986 bytes assets/images/no_image.png | Bin 0 -> 18755 bytes assets/images/pharmacy/Group 1206.svg | 14 + assets/images/pharmacy/Group 1207.svg | 17 + .../images/pharmacy/aramex_shipping_logo.svg | 14 + assets/images/pharmacy/arrow_right.svg | 6 + assets/images/pharmacy/check_icon.svg | 6 + assets/images/pharmacy/contact_us_icon.svg | 10 + assets/images/pharmacy/credit_card_icon.svg | 6 + assets/images/pharmacy/delete_red_icon.svg | 8 + assets/images/pharmacy/edit_icon.svg | 3 + assets/images/pharmacy/empty_box.svg | 18 + assets/images/pharmacy/hmg_shipping_logo.svg | 17 + assets/images/pharmacy/lakum_icon.svg | 8 + .../pharmacy/medication_refill_icon.svg | 32 + assets/images/pharmacy/mobile_number_icon.svg | 3 + assets/images/pharmacy/my_family_icon.svg | 19 + .../images/pharmacy/my_prescription_icon.svg | 54 + assets/images/pharmacy/orders_icon.svg | 8 + assets/images/pharmacy/our_locations_icon.svg | 10 + assets/images/pharmacy/pill_reminder_icon.svg | 49 + assets/images/pharmacy/quote_end.svg | 8 + assets/images/pharmacy/quote_start.svg | 8 + assets/images/pharmacy/review_icon.svg | 6 + .../pharmacy/shipping_addresses_icon.svg | 6 + assets/images/pharmacy/shipping_mark_icon.svg | 16 + .../images/pharmacy/shipping_truck_icon.svg | 34 + assets/images/pharmacy/success_check_icon.svg | 6 + .../images/pharmacy/success_review_icon.svg | 24 + assets/images/pharmacy/user_icon.svg | 3 + assets/images/pharmacy/wishklist_icon.svg | 3 + assets/images/pharmacy/wishlist_icon.svg | 6 + .../pharmacy_module/ic_payment_option.png | Bin 0 -> 447 bytes .../pharmacy_module/ic_shipping_address.png | Bin 0 -> 383 bytes .../pharmacy_module/ic_shipping_mark.png | Bin 0 -> 782 bytes .../pharmacy_module/ic_shipping_truck.png | Bin 0 -> 503 bytes .../lakum/Account_activation_icon.png | Bin 0 -> 1123 bytes .../lakum/Lakum_transfer_icon.png | Bin 0 -> 1572 bytes .../pharmacy_module/lakum/expired_icon.png | Bin 0 -> 737 bytes .../pharmacy_module/lakum/inactive_cross.png | Bin 0 -> 387 bytes .../lakum/lakum_card_front_bg.png | Bin 0 -> 89083 bytes .../pharmacy_module/lakum/lakum_checkout.png | Bin 0 -> 534 bytes .../lakum/waiting_gained_icon.png | Bin 0 -> 373 bytes .../lakum/will_be_expired_icon.png | Bin 0 -> 648 bytes .../payment/aramex_shipping_logo.png | Bin 0 -> 1385 bytes .../payment/hmg_shipping_logo.png | Bin 0 -> 1821 bytes .../pharmacy_module/payment/installment.png | Bin 0 -> 41513 bytes .../images/pharmacy_module/payment/mada.png | Bin 0 -> 17068 bytes .../pharmacy_module/payment/mastercard.png | Bin 0 -> 59419 bytes .../images/pharmacy_module/payment/sadad.png | Bin 0 -> 23578 bytes .../images/pharmacy_module/payment/visa.png | Bin 0 -> 83030 bytes .../images/pharmacy_module/payment_image.png | Bin 0 -> 4982 bytes assets/images/progress-loading-red.gif | Bin 0 -> 142880 bytes lib/config/config.dart | 18 +- lib/config/localized_values.dart | 103 +- lib/config/shared_pref_kay.dart | 2 +- .../get_all_projects_response_model.dart | 76 + .../get_ereferral_response_model.dart | 128 ++ lib/core/model/pharmacies/Addresses.dart | 6 +- lib/core/model/pharmacies/BillingAddress.dart | 84 + lib/core/model/pharmacies/Customer.dart | 106 +- .../pharmacies/LacumAccountInformation.dart | 1926 +++++++++++++++++ .../model/pharmacies/ListUserAgreement.dart | 28 + .../pharmacies/PharmacyAddressesModel.dart | 170 ++ .../model/pharmacies/PharmacyProduct.dart | 487 ++++- .../pharmacies/PointsAmountPerMonth.dart | 42 + .../model/pharmacies/PointsAmountPerYear.dart | 38 + .../model/pharmacies/PointsAmountPerday.dart | 42 + lib/core/model/pharmacies/PointsDetails.dart | 57 + lib/core/model/pharmacies/ShippingOption.dart | 97 + lib/core/model/pharmacies/ShoppingCart.dart | 115 + .../pharmacies/ShoppingCartResponse.dart | 55 + lib/core/model/pharmacies/Specifications.dart | 36 + .../pharmacies/payment-checkout-data.dart | 21 + lib/core/model/pharmacy/brands_model.dart | 24 + .../pharmacy/categorise_parent_model.dart | 75 + .../model/pharmacy/final_products_model.dart | 184 ++ .../model/pharmacy/offer_products_model.dart | 579 +++++ lib/core/model/pharmacy/offers_model.dart | 175 ++ .../model/pharmacy/parent_products_model.dart | 566 +++++ .../model/pharmacy/pharmacy_categorise.dart | 103 + lib/core/model/pharmacy/scan_qr_model.dart | 584 +++++ .../model/pharmacy/sub_categories_model.dart | 75 + .../model/pharmacy/sub_products_model.dart | 562 +++++ lib/core/model/search_products_model.dart | 185 ++ .../customer_addresses_service.dart | 202 ++ lib/core/service/client/base_app_client.dart | 205 +- lib/core/service/offers_service.dart | 56 + .../lacum-registration-service.dart | 50 + .../service/parmacyModule/lacum-service.dart | 133 ++ .../parmacyModule/lacum-transfer-service.dart | 57 + .../parmacyModule/order-preview-service.dart | 257 ++- .../parmacyModule/parmacy_module_service.dart | 134 +- .../terms-condition-service.dart | 33 + .../service/pharmacy_categorise_service.dart | 225 ++ .../add_new_address_Request_Model.dart | 136 ++ .../AlHabibMedicalService/cmc_view_model.dart | 47 +- .../home_health_care_view_model.dart | 49 + .../offers_Categorise_view_model.dart | 48 + .../pharmacyModule/OrderPreviewViewModel.dart | 187 ++ .../lacum-registration-viewModel.dart | 55 + .../lacum-trasnfer-viewModel.dart | 42 + .../pharmacyModule/lacum-viewmodel.dart | 111 + .../pharmacy_module_view_model.dart | 35 + .../tems-condition-viewmodel.dart | 24 + .../pharmacy_categorise_view_model.dart | 158 ++ lib/locator.dart | 12 + lib/models/id-name-pair.dart | 12 + lib/pages/appUpdatePage/app_update_page.dart | 109 + lib/pages/final_products_page.dart | 480 ++++ lib/pages/landing/home_page.dart | 4 +- lib/pages/offers_categorise_page.dart | 620 ++++++ lib/pages/pharmacies/compare.dart | 2 - lib/pages/pharmacies/my_reviews.dart | 5 +- lib/pages/pharmacies/product-brands.dart | 4 +- .../screens/address-select-page.dart | 34 + .../screens/cart-order-preview.dart | 1 + .../screens/lacum-activitaion-vida-page.dart | 101 + .../screens/lacum-registration-page.dart | 236 ++ .../screens/lacum-setting-page.dart | 240 ++ .../screens/lacum-transfer-page.dart | 317 +++ .../pharmacies/screens/lakum-main-page.dart | 555 +++++ .../screens/lakum-points-month-page.dart | 271 +++ .../screens/lakum-points-year-page.dart | 201 ++ .../screens/lakum-terms-conditions-page.dart | 84 + .../screens/payment-method-select-page.dart | 202 ++ .../pharmacy-terms-conditions-page.dart | 51 + .../screens/pharmacy_module_page.dart | 26 +- .../pharmacies/widgets/ProductOrderItem.dart | 238 +- .../widgets/ProductOrderPreviewItem.dart | 111 + .../pharmacies/widgets/ProductTileItem.dart | 38 +- .../widgets/lacum-banner-widget.dart | 289 +++ .../widgets/lakum-banner-widget.dart | 289 +++ .../widgets/lakum-point-table-row-widget.dart | 116 + .../widgets/lakum_point_table_row_widget.dart | 116 + lib/pages/pharmacies/wishlist.dart | 8 +- lib/pages/pharmacy/order/OrderDetails.dart | 1 + lib/pages/pharmacy/profile/profile.dart | 3 +- lib/pages/pharmacy_categorise.dart | 239 ++ lib/pages/search_products_page.dart | 287 +++ lib/pages/sub_categorise_page.dart | 944 ++++++++ lib/uitl/date_uitl.dart | 5 + lib/uitl/translations_delegate_base.dart | 52 +- lib/widgets/Loader/gif_loader_container.dart | 2 +- lib/widgets/dialogs/radio-group-dialog.dart | 101 + .../others/app_scaffold_pharmacy_widget.dart | 114 + lib/widgets/others/app_scaffold_widget.dart | 58 +- .../others/points-expandable-notifier.dart | 77 + .../pharmacy/bottom_nav_pharmacy_bar.dart | 108 + .../bottom_nav_pharmacy_home_item.dart | 74 + .../pharmacy/bottom_nav_pharmacy_item.dart | 76 + lib/widgets/pharmacy/drug_item.dart | 19 +- pubspec.yaml | 3 + 155 files changed, 16097 insertions(+), 332 deletions(-) create mode 100644 assets/images/new-design/liveCare_white_logo.svg create mode 100644 assets/images/new-design/livecare_arabic_logo.svg create mode 100644 assets/images/new-design/livecare_white_logo.png create mode 100644 assets/images/no_image.png create mode 100644 assets/images/pharmacy/Group 1206.svg create mode 100644 assets/images/pharmacy/Group 1207.svg create mode 100644 assets/images/pharmacy/aramex_shipping_logo.svg create mode 100644 assets/images/pharmacy/arrow_right.svg create mode 100644 assets/images/pharmacy/check_icon.svg create mode 100644 assets/images/pharmacy/contact_us_icon.svg create mode 100644 assets/images/pharmacy/credit_card_icon.svg create mode 100644 assets/images/pharmacy/delete_red_icon.svg create mode 100644 assets/images/pharmacy/edit_icon.svg create mode 100644 assets/images/pharmacy/empty_box.svg create mode 100644 assets/images/pharmacy/hmg_shipping_logo.svg create mode 100644 assets/images/pharmacy/lakum_icon.svg create mode 100644 assets/images/pharmacy/medication_refill_icon.svg create mode 100644 assets/images/pharmacy/mobile_number_icon.svg create mode 100644 assets/images/pharmacy/my_family_icon.svg create mode 100644 assets/images/pharmacy/my_prescription_icon.svg create mode 100644 assets/images/pharmacy/orders_icon.svg create mode 100644 assets/images/pharmacy/our_locations_icon.svg create mode 100644 assets/images/pharmacy/pill_reminder_icon.svg create mode 100644 assets/images/pharmacy/quote_end.svg create mode 100644 assets/images/pharmacy/quote_start.svg create mode 100644 assets/images/pharmacy/review_icon.svg create mode 100644 assets/images/pharmacy/shipping_addresses_icon.svg create mode 100644 assets/images/pharmacy/shipping_mark_icon.svg create mode 100644 assets/images/pharmacy/shipping_truck_icon.svg create mode 100644 assets/images/pharmacy/success_check_icon.svg create mode 100644 assets/images/pharmacy/success_review_icon.svg create mode 100644 assets/images/pharmacy/user_icon.svg create mode 100644 assets/images/pharmacy/wishklist_icon.svg create mode 100644 assets/images/pharmacy/wishlist_icon.svg create mode 100644 assets/images/pharmacy_module/ic_payment_option.png create mode 100644 assets/images/pharmacy_module/ic_shipping_address.png create mode 100644 assets/images/pharmacy_module/ic_shipping_mark.png create mode 100644 assets/images/pharmacy_module/ic_shipping_truck.png create mode 100644 assets/images/pharmacy_module/lakum/Account_activation_icon.png create mode 100644 assets/images/pharmacy_module/lakum/Lakum_transfer_icon.png create mode 100644 assets/images/pharmacy_module/lakum/expired_icon.png create mode 100644 assets/images/pharmacy_module/lakum/inactive_cross.png create mode 100644 assets/images/pharmacy_module/lakum/lakum_card_front_bg.png create mode 100644 assets/images/pharmacy_module/lakum/lakum_checkout.png create mode 100644 assets/images/pharmacy_module/lakum/waiting_gained_icon.png create mode 100644 assets/images/pharmacy_module/lakum/will_be_expired_icon.png create mode 100644 assets/images/pharmacy_module/payment/aramex_shipping_logo.png create mode 100644 assets/images/pharmacy_module/payment/hmg_shipping_logo.png create mode 100644 assets/images/pharmacy_module/payment/installment.png create mode 100644 assets/images/pharmacy_module/payment/mada.png create mode 100644 assets/images/pharmacy_module/payment/mastercard.png create mode 100644 assets/images/pharmacy_module/payment/sadad.png create mode 100644 assets/images/pharmacy_module/payment/visa.png create mode 100644 assets/images/pharmacy_module/payment_image.png create mode 100644 assets/images/progress-loading-red.gif create mode 100644 lib/core/model/AlHabibMedicalService/EReferral/get_all_projects_response_model.dart create mode 100644 lib/core/model/AlHabibMedicalService/EReferral/get_ereferral_response_model.dart create mode 100644 lib/core/model/pharmacies/BillingAddress.dart create mode 100644 lib/core/model/pharmacies/LacumAccountInformation.dart create mode 100644 lib/core/model/pharmacies/ListUserAgreement.dart create mode 100644 lib/core/model/pharmacies/PharmacyAddressesModel.dart create mode 100644 lib/core/model/pharmacies/PointsAmountPerMonth.dart create mode 100644 lib/core/model/pharmacies/PointsAmountPerYear.dart create mode 100644 lib/core/model/pharmacies/PointsAmountPerday.dart create mode 100644 lib/core/model/pharmacies/PointsDetails.dart create mode 100644 lib/core/model/pharmacies/ShippingOption.dart create mode 100644 lib/core/model/pharmacies/ShoppingCart.dart create mode 100644 lib/core/model/pharmacies/ShoppingCartResponse.dart create mode 100644 lib/core/model/pharmacies/Specifications.dart create mode 100644 lib/core/model/pharmacies/payment-checkout-data.dart create mode 100644 lib/core/model/pharmacy/brands_model.dart create mode 100644 lib/core/model/pharmacy/categorise_parent_model.dart create mode 100644 lib/core/model/pharmacy/final_products_model.dart create mode 100644 lib/core/model/pharmacy/offer_products_model.dart create mode 100644 lib/core/model/pharmacy/offers_model.dart create mode 100644 lib/core/model/pharmacy/parent_products_model.dart create mode 100644 lib/core/model/pharmacy/pharmacy_categorise.dart create mode 100644 lib/core/model/pharmacy/scan_qr_model.dart create mode 100644 lib/core/model/pharmacy/sub_categories_model.dart create mode 100644 lib/core/model/pharmacy/sub_products_model.dart create mode 100644 lib/core/model/search_products_model.dart create mode 100644 lib/core/service/AlHabibMedicalService/customer_addresses_service.dart create mode 100644 lib/core/service/offers_service.dart create mode 100644 lib/core/service/parmacyModule/lacum-registration-service.dart create mode 100644 lib/core/service/parmacyModule/lacum-service.dart create mode 100644 lib/core/service/parmacyModule/lacum-transfer-service.dart create mode 100644 lib/core/service/parmacyModule/terms-condition-service.dart create mode 100644 lib/core/service/pharmacy_categorise_service.dart create mode 100644 lib/core/viewModels/AlHabibMedicalService/add_new_address_Request_Model.dart create mode 100644 lib/core/viewModels/offers_Categorise_view_model.dart create mode 100644 lib/core/viewModels/pharmacyModule/lacum-registration-viewModel.dart create mode 100644 lib/core/viewModels/pharmacyModule/lacum-trasnfer-viewModel.dart create mode 100644 lib/core/viewModels/pharmacyModule/lacum-viewmodel.dart create mode 100644 lib/core/viewModels/pharmacyModule/tems-condition-viewmodel.dart create mode 100644 lib/core/viewModels/pharmacy_categorise_view_model.dart create mode 100644 lib/models/id-name-pair.dart create mode 100644 lib/pages/appUpdatePage/app_update_page.dart create mode 100644 lib/pages/final_products_page.dart create mode 100644 lib/pages/offers_categorise_page.dart create mode 100644 lib/pages/pharmacies/screens/address-select-page.dart create mode 100644 lib/pages/pharmacies/screens/lacum-activitaion-vida-page.dart create mode 100644 lib/pages/pharmacies/screens/lacum-registration-page.dart create mode 100644 lib/pages/pharmacies/screens/lacum-setting-page.dart create mode 100644 lib/pages/pharmacies/screens/lacum-transfer-page.dart create mode 100644 lib/pages/pharmacies/screens/lakum-main-page.dart create mode 100644 lib/pages/pharmacies/screens/lakum-points-month-page.dart create mode 100644 lib/pages/pharmacies/screens/lakum-points-year-page.dart create mode 100644 lib/pages/pharmacies/screens/lakum-terms-conditions-page.dart create mode 100644 lib/pages/pharmacies/screens/payment-method-select-page.dart create mode 100644 lib/pages/pharmacies/screens/pharmacy-terms-conditions-page.dart create mode 100644 lib/pages/pharmacies/widgets/ProductOrderPreviewItem.dart create mode 100644 lib/pages/pharmacies/widgets/lacum-banner-widget.dart create mode 100644 lib/pages/pharmacies/widgets/lakum-banner-widget.dart create mode 100644 lib/pages/pharmacies/widgets/lakum-point-table-row-widget.dart create mode 100644 lib/pages/pharmacies/widgets/lakum_point_table_row_widget.dart create mode 100644 lib/pages/pharmacy_categorise.dart create mode 100644 lib/pages/search_products_page.dart create mode 100644 lib/pages/sub_categorise_page.dart create mode 100644 lib/widgets/dialogs/radio-group-dialog.dart create mode 100644 lib/widgets/others/app_scaffold_pharmacy_widget.dart create mode 100644 lib/widgets/others/points-expandable-notifier.dart create mode 100644 lib/widgets/pharmacy/bottom_nav_pharmacy_bar.dart create mode 100644 lib/widgets/pharmacy/bottom_nav_pharmacy_home_item.dart create mode 100644 lib/widgets/pharmacy/bottom_nav_pharmacy_item.dart diff --git a/assets/images/new-design/liveCare_white_logo.svg b/assets/images/new-design/liveCare_white_logo.svg new file mode 100644 index 00000000..494b3671 --- /dev/null +++ b/assets/images/new-design/liveCare_white_logo.svg @@ -0,0 +1,40 @@ + + + + + + Online Consultation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/images/new-design/livecare_arabic_logo.svg b/assets/images/new-design/livecare_arabic_logo.svg new file mode 100644 index 00000000..c524a803 --- /dev/null +++ b/assets/images/new-design/livecare_arabic_logo.svg @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + استشارة مباشرة + + diff --git a/assets/images/new-design/livecare_white_logo.png b/assets/images/new-design/livecare_white_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..dc223965d895a23bafa20008261bfbaccaddc329 GIT binary patch literal 9986 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 E6oU9fw7_*MNN7{I&bPYj>`x>Uy{1Sl)| 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 literal 0 HcmV?d00001 diff --git a/assets/images/pharmacy/Group 1206.svg b/assets/images/pharmacy/Group 1206.svg new file mode 100644 index 00000000..ef8f7473 --- /dev/null +++ b/assets/images/pharmacy/Group 1206.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/assets/images/pharmacy/Group 1207.svg b/assets/images/pharmacy/Group 1207.svg new file mode 100644 index 00000000..fd2ffd41 --- /dev/null +++ b/assets/images/pharmacy/Group 1207.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/assets/images/pharmacy/aramex_shipping_logo.svg b/assets/images/pharmacy/aramex_shipping_logo.svg new file mode 100644 index 00000000..30cc03b8 --- /dev/null +++ b/assets/images/pharmacy/aramex_shipping_logo.svg @@ -0,0 +1,14 @@ + + + + + + + + diff --git a/assets/images/pharmacy/arrow_right.svg b/assets/images/pharmacy/arrow_right.svg new file mode 100644 index 00000000..b4243287 --- /dev/null +++ b/assets/images/pharmacy/arrow_right.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/assets/images/pharmacy/check_icon.svg b/assets/images/pharmacy/check_icon.svg new file mode 100644 index 00000000..cfa4f441 --- /dev/null +++ b/assets/images/pharmacy/check_icon.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/assets/images/pharmacy/contact_us_icon.svg b/assets/images/pharmacy/contact_us_icon.svg new file mode 100644 index 00000000..fa591d47 --- /dev/null +++ b/assets/images/pharmacy/contact_us_icon.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/assets/images/pharmacy/credit_card_icon.svg b/assets/images/pharmacy/credit_card_icon.svg new file mode 100644 index 00000000..9ba6c2bf --- /dev/null +++ b/assets/images/pharmacy/credit_card_icon.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/assets/images/pharmacy/delete_red_icon.svg b/assets/images/pharmacy/delete_red_icon.svg new file mode 100644 index 00000000..8897a683 --- /dev/null +++ b/assets/images/pharmacy/delete_red_icon.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/assets/images/pharmacy/edit_icon.svg b/assets/images/pharmacy/edit_icon.svg new file mode 100644 index 00000000..df7cca2f --- /dev/null +++ b/assets/images/pharmacy/edit_icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/pharmacy/empty_box.svg b/assets/images/pharmacy/empty_box.svg new file mode 100644 index 00000000..05816608 --- /dev/null +++ b/assets/images/pharmacy/empty_box.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/assets/images/pharmacy/hmg_shipping_logo.svg b/assets/images/pharmacy/hmg_shipping_logo.svg new file mode 100644 index 00000000..8e9db3d6 --- /dev/null +++ b/assets/images/pharmacy/hmg_shipping_logo.svg @@ -0,0 +1,17 @@ + + + diff --git a/assets/images/pharmacy/lakum_icon.svg b/assets/images/pharmacy/lakum_icon.svg new file mode 100644 index 00000000..e2b223de --- /dev/null +++ b/assets/images/pharmacy/lakum_icon.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/assets/images/pharmacy/medication_refill_icon.svg b/assets/images/pharmacy/medication_refill_icon.svg new file mode 100644 index 00000000..d5951130 --- /dev/null +++ b/assets/images/pharmacy/medication_refill_icon.svg @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/images/pharmacy/mobile_number_icon.svg b/assets/images/pharmacy/mobile_number_icon.svg new file mode 100644 index 00000000..d98aaf29 --- /dev/null +++ b/assets/images/pharmacy/mobile_number_icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/pharmacy/my_family_icon.svg b/assets/images/pharmacy/my_family_icon.svg new file mode 100644 index 00000000..838b357e --- /dev/null +++ b/assets/images/pharmacy/my_family_icon.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/assets/images/pharmacy/my_prescription_icon.svg b/assets/images/pharmacy/my_prescription_icon.svg new file mode 100644 index 00000000..bda0e22e --- /dev/null +++ b/assets/images/pharmacy/my_prescription_icon.svg @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/images/pharmacy/orders_icon.svg b/assets/images/pharmacy/orders_icon.svg new file mode 100644 index 00000000..f09ae19d --- /dev/null +++ b/assets/images/pharmacy/orders_icon.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/assets/images/pharmacy/our_locations_icon.svg b/assets/images/pharmacy/our_locations_icon.svg new file mode 100644 index 00000000..2be16631 --- /dev/null +++ b/assets/images/pharmacy/our_locations_icon.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/assets/images/pharmacy/pill_reminder_icon.svg b/assets/images/pharmacy/pill_reminder_icon.svg new file mode 100644 index 00000000..f4fb4ddc --- /dev/null +++ b/assets/images/pharmacy/pill_reminder_icon.svg @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/images/pharmacy/quote_end.svg b/assets/images/pharmacy/quote_end.svg new file mode 100644 index 00000000..083ff39a --- /dev/null +++ b/assets/images/pharmacy/quote_end.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/assets/images/pharmacy/quote_start.svg b/assets/images/pharmacy/quote_start.svg new file mode 100644 index 00000000..74216f14 --- /dev/null +++ b/assets/images/pharmacy/quote_start.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/assets/images/pharmacy/review_icon.svg b/assets/images/pharmacy/review_icon.svg new file mode 100644 index 00000000..bb826f21 --- /dev/null +++ b/assets/images/pharmacy/review_icon.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/assets/images/pharmacy/shipping_addresses_icon.svg b/assets/images/pharmacy/shipping_addresses_icon.svg new file mode 100644 index 00000000..ebb8692f --- /dev/null +++ b/assets/images/pharmacy/shipping_addresses_icon.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/assets/images/pharmacy/shipping_mark_icon.svg b/assets/images/pharmacy/shipping_mark_icon.svg new file mode 100644 index 00000000..5cf9606b --- /dev/null +++ b/assets/images/pharmacy/shipping_mark_icon.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/assets/images/pharmacy/shipping_truck_icon.svg b/assets/images/pharmacy/shipping_truck_icon.svg new file mode 100644 index 00000000..8ffda974 --- /dev/null +++ b/assets/images/pharmacy/shipping_truck_icon.svg @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/images/pharmacy/success_check_icon.svg b/assets/images/pharmacy/success_check_icon.svg new file mode 100644 index 00000000..ed1379b8 --- /dev/null +++ b/assets/images/pharmacy/success_check_icon.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/assets/images/pharmacy/success_review_icon.svg b/assets/images/pharmacy/success_review_icon.svg new file mode 100644 index 00000000..f6951456 --- /dev/null +++ b/assets/images/pharmacy/success_review_icon.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/images/pharmacy/user_icon.svg b/assets/images/pharmacy/user_icon.svg new file mode 100644 index 00000000..8e978105 --- /dev/null +++ b/assets/images/pharmacy/user_icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/pharmacy/wishklist_icon.svg b/assets/images/pharmacy/wishklist_icon.svg new file mode 100644 index 00000000..cd0ce16d --- /dev/null +++ b/assets/images/pharmacy/wishklist_icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/pharmacy/wishlist_icon.svg b/assets/images/pharmacy/wishlist_icon.svg new file mode 100644 index 00000000..910a3ab8 --- /dev/null +++ b/assets/images/pharmacy/wishlist_icon.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/assets/images/pharmacy_module/ic_payment_option.png b/assets/images/pharmacy_module/ic_payment_option.png new file mode 100644 index 0000000000000000000000000000000000000000..5f3fca8fbdc06239e8d934dd377526a1a3696c69 GIT binary patch literal 447 zcmV;w0YLtVP)m z*bDjvv`uAcqoh$#!8A5$%v%vt2muXwMbt!%(c;WrmLQkh-8?WXXJ_|6bI#0}O#A9W z9|kdieq6*i+{ZJ>S^zq5K7K9$gE)f**6{)JVHa>W{HtYf4{nw+>BC9vVzC673;S{? zkp?y}iK#qZUdHRlViwbQ6tETiX?ZwF2NAFz3h)Hp;>HmGtu!a?wh8XQPn@j)JHRUT z1AMD+T*W5-*09ggaSp}$bcSWT$AgI4u5vs?H?Cj@*K?f16P&65Ei{W^e8ndWWRd!D z=m$FS0vko~?%-7o=%}=7QUR|O;9jYKRaNe$1&mX#8_M<_CnEEe0$lfE+?M+JR|FWz zTYuk{en)_J*gj71KAsngM#*srYuE~VS|>^#k#a0yOqv_;u>z;53^Vb3>}cchf6#kU pyAGEfy?BE?)!J+qFQr-0)IWY5fn|^+0>=OV002ovPDHLkV1l0Fzw!V8 literal 0 HcmV?d00001 diff --git a/assets/images/pharmacy_module/ic_shipping_address.png b/assets/images/pharmacy_module/ic_shipping_address.png new file mode 100644 index 0000000000000000000000000000000000000000..9566fb30a09d27cad92a94448a0b91c4c902dba6 GIT binary patch literal 383 zcmV-_0f7FAP)*_E}|3y1x?W( z5Q9n!>d?^-sB1K12L~yXR7#gdzrf^@K)f6J9sn~=we<9~oXP_LFPupZO=?rkB|w+>)KPlz4AIran8 zbgdgTYExtv+&bc=L?~ zcxUJp0DKae0x+qg3IGJI+!+BQe)=u|0LW=O2N&9M001y+Xw9l;1pokmsz{^?002PX d(xm_Z{sYbET)o?e#uWen002ovPDHLkV1mBxiTwZo literal 0 HcmV?d00001 diff --git a/assets/images/pharmacy_module/ic_shipping_mark.png b/assets/images/pharmacy_module/ic_shipping_mark.png new file mode 100644 index 0000000000000000000000000000000000000000..cc4b272d5a875da77ddc5ad003e40fd05a6b5ebb GIT binary patch literal 782 zcmV+p1M&QcP)eo}K~y-6jg(7B)KL`1zjObu(Xr67qB43(ML0@}#1JJZMI?JcMG~~A zHdeb_7}BE0E-IHrP!VE6nfCNi5Jj106zcSX(zJ|$NzKPN|C#^2r-jZCqhe=u&UerE zJKyROW~h?7{2~ya04TG6;77b6j3L7`E=Afgw{oIMeaZkE*N=lMtcxnuUICu$P9ch*Ewipv1x(1sWM?Ij7>#BjflVoUPtLSY%uKC4q3uc!zA)KJl9EpW$Oka5#aA`b=Br8m z>F>ju`MIiS`FTMEWeDoFOdJVmvR4b~hYHraE5w_g;5mY-G(%>Bl>87tK#|z;eTB>Y zvbS+5h%dU#xc9!_-o&su$8wwIb`r41f@m)z%%j z#Gn!|?lDoPV0=@8M~4D31I$UxNK*=FVTDvvqmCj^!iMI~!0s`}xlOIz<23-1S%~9V z%dHQuzSj)|gAqI4T4`6YvFfIPh(~o1t;~{l}gcv5Tm(3A( zu!0yz3Dg5tEdad+tIrDBkmT^6aU01bD8-R#F)?L1K(Ga&O6N;k$QF}kf zOWV!?I14})11ktf1d!N26mk)f5+FwqhBb}4h^X1p<(0g(bNvAD7s#tA1!~LnG5`Po M07*qoM6N<$g1IDZ9{>OV literal 0 HcmV?d00001 diff --git a/assets/images/pharmacy_module/ic_shipping_truck.png b/assets/images/pharmacy_module/ic_shipping_truck.png new file mode 100644 index 0000000000000000000000000000000000000000..274ae1da9977edf7a306c9d2ff9ef27afd639361 GIT binary patch literal 503 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 literal 0 HcmV?d00001 diff --git a/assets/images/pharmacy_module/lakum/expired_icon.png b/assets/images/pharmacy_module/lakum/expired_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..9a9809847738aabdf56096c04e49cf5222b6efa2 GIT binary patch literal 737 zcmV<70v`Q|P)X1^@s6CN-WK00006VoOIv0RI60 z0RN!9r;`8x0+vZcK~zYIrPkkz&si7;@E4{r(~Q(+8H}uQwNh4*3#6KsM9Jv~Cpzdc(+cgN68r;}u9@s-b(FN3$rx%z2Mk z=}xiow>epNW^`5*#mvtjhATPedvGWH9~CLjWLq+4|Km^<(lW$thOWBk>qYZ;aU3S# zL$JJJxVHGZlOb+0QIG)oog*r?Zon{H{;bDmYs^Jn| z<8QI3H==k)C}sJ-TE*ccan7$RZY~+VGjv}U7Ac*=3v9%kD#S!Z_KRjS8u>&~J0}ux z;c4kqevdPJpKN;YMFqVhVxK1z3ENXtD{CO8+{$m`x6vF-Nl_iHkvLDjuR!*VSkU%L z4$g?mYaIi5o8sH5OBCYVO2!LBxp$3$xCl!{CJvNQJ}B2mKLa!H51xwqy(${SIsTyd z+AD+E_yg~;ycWY2gLh}A+Fl@QMKA8drdmidG>O+>)?>Hht0Wu#=4!wO(U%8AikFOq zG>_E=-(UT>kDt@{mN=i;<^CUbsi6stcgp%d z)K03Y9aU95uA*{WP3<_40Y)bv3{*k5EQkSA4Aicrb=KPYtc}gp*w||c3D*)6Z{_9P zE-buVQgXYr^iFB%{g#&Jixxd!vgFm8HLupLeYI}g`-2BRo;vmI-o5Yl@Be!J`tP@I z|Ns9N2s?BH=rZw=AirP+77HtD8(X`{Q>QOkx@`H1m5-l1{qgf(z;xjUKqZVx-tI1j zH*d=p0XY?(E{-7_*G-Q{iZwDYI9wE$bej0Y^I4_OxBZs#e&63Sl^l<>^R;4NVgA2} zL1ITpX(Eg5UzsgCVog&P&Hfc)vuf(Glvms8_Ij6ktrI){KC;wp+0nK)W)qrkb@O1TaS?83{1OR#z BrN#gN literal 0 HcmV?d00001 diff --git a/assets/images/pharmacy_module/lakum/lakum_card_front_bg.png b/assets/images/pharmacy_module/lakum/lakum_card_front_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..73323a0ebe7b67d06cd87139d848593505e7356f GIT binary patch literal 89083 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

Wzy7IB)>vlWq%Mm{P5ll(n{4qyl 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 Y3%I(5+Q=CKP))P5hE zXvIMhbb|J5|bFmIWm7iv6^v>D>NmAV#kS4i5wS1 zd3v#k6;Z}B%$EaF*b_~z4M)DFdMui17Q3b39M(gddFAhM1Y4LX26Je{T^T5@d$fei zg}0gxZiBz%9|-$z#oz}ze}Q6k3UBpapH&7O7)x+|G`MEqMfLxj$24wh==A0j%hG5* TPksPQ00000NkvXXu0mjfv*MR` literal 0 HcmV?d00001 diff --git a/assets/images/pharmacy_module/lakum/will_be_expired_icon.png b/assets/images/pharmacy_module/lakum/will_be_expired_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..7f31f622b941fb02f271be7be13ef908fd98c231 GIT binary patch literal 648 zcmV;30(bq1P)pt^Zp8|M$PwyCh%z z(1a-%gdX^SN4SbJ_>}Tljjgzkg?Lqi0fyi(J|jUp?!@wqSWoaCd(b!fjl|d3mf(01 z*m8V~!M4XBFgpfmjP-HY8^7=#x}dcJmf!~_Yv!JR06DAh1 zz^B3#rS0pwU@ETTT@7HC=3rokeHxBs*q4nZZxPaIU5mgXsxJuLk5$zgcjGO( z{U_)^VVkY27GS!tP+AHCe?eREFr#gKOlD|afZM|HQ)}WYRYI?nttX!2L@nng;VUt5mb_Y)FLTt4%n85*)&5;W3rqGA0%coR?7vvxMivWDG_h iyulM(#3|w6D6F3q0jDe6hkfz@00005H^tx#l+>;DFq>Hmk%=g-g2<68ld zC;$Kf2nt9f0huh=u>&F!Apn3t5F(KvG8w{?ojajjyC4@Ah(du}T_Fz-A(1GgP=v0o zLN_@$?jWc?rF}g+4yQJ$qmx5e5L5LV?}gVNXxk%M14QhJAcseC6v4@7)Xg z`@;bNa9|)D6a)tc!!()*07QX-qTpZ=?sU2+Bt#S%Dmrig0RV(bMQAjHPDesRk+3iX z55vQeg9nj_2qZERiHbs^qme_0!~h_sQpMrn;>bvGbhJ1oMttmF24nH`=|$Yno?T2!lclE0&YhE`r^_x~l7pZe zCzC0^az&n%r2s(%lc~teROI9+a&r|01&V9e6xXjSK~R~WuPi7~vRF#|TU4YhE>?k{ z3TH`)sS zJkUOTsI9BhK6<1hk#sm48gwl!y0$hwiKK6C*0;9m+uQYQw!Wi7-_@n>?KQC3hR#ky zU!P%Mz`)@wk;zLqhlY$JBgWBDieu8pAM)OlDCkEh?2o zt+r@17OmEz(^>R-i@{)7TC!@jR=wV8Fj#Rn8m%Ui)oivdFI!R6ieXlZ#cH+M%x2s2 zvJFLT7-q9rYX%l3HH z>0z|M81Kp75>F-x8wnk*yQv))e#i^7^PU!Or+(y*m{eE^QAi zXpB%)=)N<*E0n~_*DyWXWX8Jwk6mehl;pjd_CWS*kBjH@#Wgpy#~QKvILVAt*>Fy5 zeIMi0&GN#Qnj6Z(W><_X-P~R{`qeYqw^=pUb($96;(Kb6X3h8hoTL%w4d=m=x!KHo z!Q+j5+QwMkg$j9I#^vDr3-eWfE;y~`m?jha_%qI*hqlEk-cNJK-@L8+@#0~g`yo)q zE%iO;=V8=!SDB|C@`F7g?TOc7O8outDrGIB+Qvv|GC0?ZOSl70h5KJ*W^_+1SW6w5 zZzi4L%#~d36_0oECzi@912oXOlJ%{e0$6jge*JM4Wof3vjumzLm~l%}OnrLws&X-D zXtXHcDZ8iVd5?&@Jt?Aq^(2JnR-??;Fp3)8-rsQUf!0#uuBOLBk;O#m{z@f1a#! zAO7|1XP;BsM~-c9{UAIOlo6G}+Wa}hlVK}0tUEgJ_!++oiR-pEf8w-nJTS1OX_r@P zo(38i2%!3J;Ca39j&qsbQStozy;F0QPQ9seZN;rjE5tYd-o)l}nCJ|v)@f!wCriLH z*Y>*bo@Wat+I8Zm0WY!z7^`XDC9f!ZZi3%ny5K{plM}^n>vVEA^{NAx;s~&+2^~Kr eHMWr%3<3eH?A_M6pnZ(Dix5VSq_Kk%ul@@o#Uo7s literal 0 HcmV?d00001 diff --git a/assets/images/pharmacy_module/payment/hmg_shipping_logo.png b/assets/images/pharmacy_module/payment/hmg_shipping_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..725b2e5ee5d2da3829d1631aeaad88502d720708 GIT binary patch literal 1821 zcmX}rcT`h%8wc=2aG@MHzLnAnE~pe#1W_@l2$mJ8lucP83Pq)sQG83VD4;TefDlF) zVGr35Mi^nLgpn`<0TPlx*pP%s2HEemJ?H(N&wakn`Q3l+x##>6?Cq?TmA+R3fk4Vo z8w*FEeSqitLkhrLJs7MG0_~I9|Lknp)6+9BFfcwoKKf6_#>RjK=Ku5WIe|a`7BZPk zp-}L6{DT1hz>uJz=V8wyU@xLy{T&k(9rrdSF7_=v{w+KqHW42GE-@iF37(Ran3A0M zKIL8N`{cCLWJFp@I^ul>A~hpDH8UeED-)5GnU2g#&qikEWM}2(AoFsOsN8H+UQRwL zw;&%?RG42}R8Ue}SXxq4R$5$MR#H)3T2WE@p`xtvLwQwYMOEd8>Z%Vl)s?k1RkbzM zb+tA1^|cN4b&U;m=*D_9x}gc(*xc0E(u{6tX=-h0#&7|Y9ymF4BH zR#sM5SJqZn*Vfk70qg4<8|#}J8=IS(TY#;t?d@$Qlc{l@sd<5UTAz9P67#GfaKK~% zSS+o}tRIY6=dQ5MLs*w?ve<04fhpVYHrvRYef19ex)mE@#Wt~K->_lt?ChA`+p%^6 zdWXZ|KwUU@T{*UHoS%Q?ICyg$?*nI?FaKos%a`5V-N5I-*yVD$uxKtU252si$BT;R zy?F;TkI&;LW$;sxd>{gWAU#)*QzSr@0;^!}YlQX9LNrF$)Fy1{5CRd2M4i2&?tW4K z0I-V0V(~CRJU#`qgh-N1&q^c`DSb)GSe7zYq^s*vsZ_SjlCjt_E>Ff6$OL;bnM^Je z%Ee;2Tn>)?=0CuFI2Pt;=XB_BY8oOPm0wV}x(0k9pD#P@PN4vA!4GY%Eo76RekTw} zp#f@P?rekWnt?f|yQt$hMYoUIwNSTdzy#85S606AwKic=xLFnW1(%$NTQ$fhlQ2!ex1h>jlMZMZw<5@+E$dNX80&)< zKGE$bVb?i#efpN%Ny5k{w!319a04Ux61wXY{qiZw8_~``W<2$@y&3ac9jN-;CJ&O} z&~5aG+u1aAx5E8mVxWd$RIi3D%P&wC`s}qytv>P9OKoU`a#WBu)MVBg1>;!K;m{OT z=j`G38-4H}^+wHMuFc2MMs0-q_& z@xf@KWi@l{*@28&e5ZTcnIEdS{lfC#kLi|>M&$}+izBh;)dHVYn6;T#7Z~)YL_=&V zPMljKzzr&=(C1oC?f6I(_8cP)(-X~TPeP^`8(U?9zAoa-ZcSNb+{u7?l-=*w`13cO z;7AEL-^TF9#W1cf%|GPfpB`Rvk`VUD&!;l*#ABxpe5WUtcQHBI3R7#x(M?inB{`(u zw|y0PG1Ih$3;G=czQ7S*?$w!GrOBz6$PV|N9Vrgs0i<%5zrxg$gc;r=8mq^zx!&&8 z+Ugw9Ge%;9u%vlTILQi^!;}7|HxrDY(aw&bCC%C`!)VFoPItzDjw>msBLFq@Sbxsj z#cR%6IveSa*)IIs{GP*vi4)AS%Q18d9fzN`O&n1}W;uUD^{-Qxa2H;SD!5beVp_9r z!!Lg+&^7h~%X>N$)=zmzK6-+sa-j+YD;M}seBwT<@TD)k3}`w!r%IF{q0Zw}w~}Og a=0QTA`%htE1O#xAK~PIOi@G}xV*Up+BSb#{ literal 0 HcmV?d00001 diff --git a/assets/images/pharmacy_module/payment/installment.png b/assets/images/pharmacy_module/payment/installment.png new file mode 100644 index 0000000000000000000000000000000000000000..034497efabd3db47c841d9464472527fb0095539 GIT binary patch literal 41513 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%0A7J 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 z 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 literal 0 HcmV?d00001 diff --git a/assets/images/pharmacy_module/payment/sadad.png b/assets/images/pharmacy_module/payment/sadad.png new file mode 100644 index 0000000000000000000000000000000000000000..35e0426c4a68703441198afd5e961e7e8ddfa3fb GIT binary patch literal 23578 zcmcG0hd_mKYN!NVt^lvewXb7K_DfmlfP79rTQVjL;9dA*No`r zsJWOyTv8gDmLSk6&=tdrH^RnO3qr#jcXCMjLcIoj?*?H?FeUd4);y0Ci5JOyr#QH{ zsN)|RoVuU&_1Uh+Xv3<{$6w(!4Vyk8*5{vHGtiRfU?{k5z^nGhM@1}lUNf86@I44F3QA1NXKpmEbT)%DkeL z^OWv@*-z#h%`KEIfscScdl7TBp%bpDJ9B{(`5kF20yKnSOd)if22-SjD9>4^(BZEW-$CWZGR$L}7 zmTPo5;<;DA(v>{!Wo4yiaJC7c(H7ISEBF0)u_8-S|1Fg7hf!;Nmky?%uMwu+xfIU_(4!!vSAuzbQ z%+eZZq3o`6z5+JB$wS3&kfhsdK!|#-w6HaSTC_ZQei_LO=!A#jPMa6m>4;FgdXdv0 z$uiCAIzSS8rg`Zrszle$$K3G7Qud|KG$@gi=R74Rq^@eF)3Bw=kB^J ztLdsntT(p&r^}8-hCYPfEC@f!+{jch%)ulPPXo}MM9!a=j5>7-%a->{_2Rd337&sa z-qfU9iPGfQ$55LE<9G~`ph#~9K)C{bE3NIA$qhzuR3zUv2>&J%_-rsk5->Ta&P$b* z);DoszUmmd6HEAOpoZRjpfXjzm5Z3qBt@7QaOD5ASbDk4>MSx2Wp7w^bo!}trn z12nBySxbNwtbc{Z^vJxFE05CiC&?%RDXUW63J(GcpL+z*7;>Ek@EQf#<}xZ-*O55O z!8Oqf+Jk%e38cE()BpE*w<7`WdXv$=i7(IMy?U51vHpS8KS5>#=4S(DM$Mt>lRBMg zojY{e(2PV8q7dLp@e|2k7OzB~uCj zNCon^pRo1N8>78nal?5vJ&+1hk82(K)1bmZ%zqX=YX;U^ZL1e>K$;-G0tf^jiKB2A z92d0K-vXBWHLy$zt(>==2aOq^-;#XHNIca<)ZS0SPelV%)$q&!0Av0_D3gYW2EFMe z`CQ7>B79$|Z$g_DBIkd&)+)5~8F8IKqDxMp4Y2+fo979loTJ}GFl=F3+%zj7z?U;& zRT`Y|!)wpgxM`+@ZvH!V=B4!;ni0dr%f(XTO}MGN?JJ)%VPCF7L#QpNywuuG%lSb=H>_la_n!m#-WDfVLCP8goM7vu6f=&XT5=Wb zLN>?h1j+&Xo)=)kou~9U5FtSR&?$y|WZe^zbLO`$OHPU|ZHxCjEH zYnu8rm6v|Zxxux?(FV^GSvW{6mUV-kDCaa-nc`BKG3z{+=ygEKRtovIXP+oQ#ap$ z^;kqWHc38xd%u2~ad>~B91bdtmvoTWTyM)T{5n4KPkVqGZm2z^G5=H438O!FFeSV! z0u~XFz(u0$km~2Y0B7r6Ke4Hfxl;s3SGvwPeoa?tB6EmlQ9Ok1l}W`XdQ&^gZPEWM zrh5XFaecD$bfQs;|%j<_on00W;40o6|d=BTkHPKFx?h!jQ9Z*__)? zLq!vg4aNXqE`;QF`p+LPSJewp?tv)x6lhF}hNM9<~x-iPDBl15E$dUzD&vXbaWv3wU zjE>^iluO8;hU)lm5igw7zbHlHC$?}XD&4G3MFK1HGLUYbO5?phVqDR{T>FvO1e|pe z7~zvM>(awGLEJ%7rxq#_xd_A|d*Y|lMDxB_jDTi^^@8qeO6foPU4{JQY>|Szt2%=->+Rc^KXvrrllmME$fxS;fN7iym~OA&$}3yZ)IiF&_4u!rtg z`3pXSq|IcZO~5%EX#dRMw3E^i)zs@sJotVyNQB;pj-4Hw3a?iuK$&X&H=sC)fb(fq zMK?(ze%gMwJMbC1Bn!FCqZ}Og$*I4HauT})NKxO6!l3)e4|&mqaW3k{Y!c}vK{Ld6 z{6Begu`l0v%VsLB$);Eg>9Vbuo3~CFTmjr9t+YU7VIyPf2tgADm5c^7`WL2Cg%{jJ zl^3maLbaJ2=??m0_^jCTsUfGdNPq+x!<^gy89UTxb7@Bcw%?PT)OntY{Z1?)A*p2p zoS$Yih#sV`=oTVX48Q&d{i$~r;Nke~WTnC=F0``=BRLvd^(0Gbx`j84$azEDcS* zskF{S?B|# zzTc6hu(|x#x!Zz-R{$6!lOshNhU|)m_Ucg%$nJB$0UI;O1}nu2WaNYL6ZS$)jH<*X z+V(o0ur!M20s4e|qno5{d@BLK7UxOM37;g~l~Th+VrF~bvkmMpuue8(Y!2tj8`=d| z%Rh1}t@m-@n!@=Sug;wIA)J(G9(I*XUSCnFw_W&EUUPx6(& z3%jJZQMWHB%x>6MSkJ4Y&Pb00@|0H62jbAU>P*rnAQPkhODBKW_-8obT=93~5%4E) z!6A%JiHc2XJiB+xauJYw!U+%xD4zo_g01BWDFtA$?jef^DZ?l=jJ}6%t@m8gGNVd@=odh-`yKeU*=K{qi~k1gBk=xRY48U|5u_UzN?74-jD>5?jpc&G2j zqH@MSV}quO_GYn&>EuP}E2vCnHdezVc) z#m^&5I6?X$7nOm@xVdU(s03qV{Vjja8b1#YA)~yAH>2cFo+#CCk zT*W(J@zmOpd5nxE$vs^{-$pnE?-<=&TCVe9lTf^UdYUWi_JD z)zE=S1|90gw=Vz*42q|mtmF~H7RG%@$#};+$)uB7TIdbIRtdtodpj@O?|@IB=#j&v zLok4|B#x7G*gcIFr>)X}dny?-K&1@UZx6tk`pXgTK7Y}nx`I-K9{U2iEp|DPU`UAo*8g>c+)fe?;WXh?3cuMd zl{&S0r)PEzgJR=kS%)eW5ovXz2^N}@T%e077{`yz-R|rN~MHp*;w zwD1`^xkd;uoN#8WTd1VUTnkdfL5%7Bn2A&<>AWzy8=`||gbRbPi z+U$Z84)bhWZ+tI!jOs-NA69tj`K4DYzKvX91448HVtf?X_wQ0@k3TLkNvUx%{wJHB zh!iQ3(T`E34&WYH1S(fM$!<^L!5p1(qa!l7(ac&0UO>A}>$74J)v!Uz#2w)}k~%}+ z_ZNM)g8$pnKbW7wH!%-S8VX`Z*!YMwz>RFWEgH~%K?|H>z`?j7@!K9 z>5r|E%-F^?xHov6s>uZlYv)5niBN@|o%rc+~TxG#~)^%fDhGm3Yvms10OKfjDqf zlTEH7?LdMpT~hU2S&1}<`~g5F`IjYZoJorXonHE041bAe7)==8Qnh723dfIpBAxq_ z=|CvVc3Jj6zS7Pj&!SEbUJJd61hU_6!x?$ioyE&{s3J`uxt+y$efsHdM1Zf8c#{-N-$QiIOnQ_Lc-+zN zgW4J2WwB-VT)VJv!wyN^qv-YEi$C%EY}DppkH@uaKHUK=MbBe|+chXnbe=T*-HwiI z^fK;)2Zq!B*VWA0pKjanZEN6v)>nixe`C^Nom`u%v&{4dGA(5rpdzE7@Ui_*tVhfl z+6A|C;SZ5ZA_p$5wBB7$zuZDTMlCw|`3T7uD*};>)|~c8Ttya+-NCg`tKW)swMh*= zV)bL>L#2o;FX_o*#56OG3gI@W%7hV#7S<8@TdrY! z!7do5%qDoo6IHcpZ0(=VxyS-ZnJDUF^d2flXJPSptD5LinK%5bQBHWn-&hT+`>CmzF1Ml zijWyF!tuBw*nWF0^7nEQkhSeHzvU>_nbk&pFgaH2Q}Epq*t=(qy}TZZ%=o0_RYlsk z2?eeP!9aO#mihpBf-2$TXQ1B=hj2YWB`vmDxHqBYJU2}>d%*UJO3T(Z=G8^_wJYwd zxwbp@gl~XVGX46WiAEYm*@0^?ZOz=>gt{EukeuE+cd9(^Q6nwxu~U>q63hcke2i;{ zj_x5K5!wLKm!r!4T~;p!fQUt~--EDHrtMqD4Q?8I|ATVNY#!o3UT+UfuX@2vUc>|t ziqGo~df?u84-$KD7qai1%0{3f$RCHk*%=0&(&FTsi;5+OqG44On%LPOkkr2U$C<$tJUQ7Re6Z8ztEh&OXI@?wA#q z3};Zce5SdWe=zq1W`5KvEo0J@*W2BM8^0(my+4OYyAMzk<*o5eWV#l3TJ zXsb_%Lna^`c?-E6kor^u?19n7Gany(U`JzR?BpTC<$jToNE=+>wO$9?)fe|GcY6-q z^r|TP@tT?Hf-dON5?z*{FFPgxJVCcKxXC;v18^UV8I3tk#OjL-ZYlsH)LWpZYY=q@ zyPo|COzMQ)5zS3J)VsqA@p<-bzk9+umLq z2Gq+A8g>1cTfjR#LI?S<1`!{v!v*1w+LEs=(eR#s6>(x}x;XJ4*;h{pSM|va#4-@v zQj4;yX!xK{?H6{;snWY9-HST{WQh(H!~loXV6hb5fc`W7O%ur<>RfA=tTT1Gb@cJ%s2rY|%HF5^uJV`5_TrCTYR$#u;J1zZ8L8I=8A4>kAn9 zzZUH#8)y!-y+s)z(js^w@5!9pwIY#CnC{mf=7!CR)pUCHK(VsyuKsZ;gRf}6_@p| zgljjfvx=DSrHl!yp!?WemzCzl;<$kn=dUJ2_zrv1+c%~bswHM}<7V8Kq~wm|w1ed8 zn9;GMPyO;rjRSK2mj>!Q47RJkL~n%{R^YXXzc``MYrtb45bhsfJKt<1|HXJs#PMhg?q_C0RABO=N? zg)4xGH6;yP#EoKRarI0U`a#CaitVR02Y+T2exIj@V|0AYoxa9*%-Gl*2=2z0ae31hc6uMvX;(4!tu38{e7FNoNZ)%L z?VSK5QE>J_#>terkRNa*v0!({q(rf15>+*;zmqApOD#~c%1D!-$^XG$#X7xDFU`fDPrXhEyYDm-#k!Cjor$h^@7wEqB--vS1*Aiet50@{qQhgDW9;TP zDnl%xgDqayrX$LCziqZqkG+sOL!)<$Y0h2iyueLK;97m|%4u`+s} z9$QB(qWyr5!9ch<3&l;WhXSuFi5@H24RI|wUL_{CE&$m_!%s|jzn^ICyR-O&L&-jq zJrHCxxHf?-L|6z&YTQJMvws-lF5*^@YgUKfy%@^YX+4oqM_2K1bLz(W-F}b0x- zN-0hm8IoxrIc{1i>}Vn7&1ctsrc}`3p21$;lMCMnhCOcKPDaqQaMyC7t-3im1F=7{ zN(~o(JSaZu&MqUW_R~~?(RsQz>DyroLeD>w>hOV6h}!UIlgg)nq*0>cMQ_$z?^ZWoi5e zfU)4fH3q4X1pcjqqSB*l)0FmL8+Xee?uQ=N-w2!YD7#fwB@RK{Wr(A&TN=MTMwy~A z$hIzJ;N!@xAGV^jL zTwmWszI~q$6ceZG|At1lxxmhyHS9r~JmT7$>Te&L=^WWBhBuV}vIOcRbxZ|QiX>?? zfw-X!HEll6|AwBeee{c4LP!S4i*CY6x!`IkX2Gaba@Y&$0rr!Y4c5h9U?Dn& zwzsq@p4?xb*EAx#;B;wh8WXqLjS75i29?4IBXswq;=GsU-Jjuvd zN!|eZ5rhS(TyyI^Ha(*~?IYe{UAowzfpAr~i* zds)Z4wnfl4)Dyym8Ft_nu`j#SXy|CxH_KOC6XSGI++lu6DEbro5s>Pm(M!?vy7BZp zfgM+Ksn*ThKa+gE*vVoX+S@weUbTH6#$6;+Tq)k5GBE9+dQoMeqW$J$wSms3B_bBL zh3bFRfCJ0Pf|rP1Vk=>{K6a6M_Kp;WdG5)1x2@8}OuTQD7HHdjg$#9bQpzX|xU1@L zaBvh1Wc9L%DqW^1cK3AEoO`u3tTjAM##OQ>#RN{{x9M%;pVV)V=ib47P+A0T)#L;z zsD16+icCr$^69Gl4m57crVhM;s)XUyi4t1eCjs}2jBP97{#Ko*W!LRZ^2PA_qb#;d zX(fSyh2k6Ho7+JfOy)`JT};}eY;cG2!>CE|8X8^t-aY$-$)W#d0jhrZ|5)a(RaRw? z%>?p^4=|vih3iIU>2O#w2Ee|4Ru*g?KLNjZftj{)LG(f2i+9&z0+bwmeQ!>0O`hru zrS7#jVj0YQn~y%IX1#D3s30^za!TrX!&JCw>@r#}y%5u&R?K#|>9#qwNSViD>%p5N z+t@Brw;t?FTLac}Ynpdbc?u@fZ9%Up@#R_VwXQ;u0@_A##amUkMn@pI+lPk$1bWe9 zn$*U!3VL8)dKwNU@%%NOl|O=g&w6~?kK}b`0xG9LH5TNrOC@om<9>iex$ zixWb_LVAg6yLEyv&XO5(xiGz}%MY~eEADn>bT9e)F%a>2Iqs!R1Q*(7ROzXn?Z{AQ zq+~8SN@&5v<*viGHQXiKC+raz?533~wC&uN=6RDg!TWMveURn|D&&+%s_wEDy_c4a zK1)Lg{qB!dk7VByS%J3a5BXaLM{kg8K7!fZMfFBmJZOOuG#^>VgOe|~a=8t%hTyNc zu*Co&1-dcLd_(W;P9x`I9$)fS!<0)5-BJ)f(_yr8I;Bim!o=@Q}kfvMjEIhf|Is6zhNOx3(e~bqAa&i%h zue02suwp~E`z-}$sOhKIX3s6Vvg?>U)EncW67qU8D4wA|cg=Kzs z^7jb=*c98gYR(>7S6;#9@0b8ZKh31=^63Pe5$tMfl=yaXbIgMhil@zVd0y??7h9R8 z2Z6b&I;;p|Rhw{0KZEI(M9Tg%Vlw$LTuh&P>tlFr`c&K6{kEsK5=L_!J8JoSe22xx zrWdi(Ow}uQGaiD(9op)qOE@-glHuD}hS3Y8OT%J~7m~l=m(XhyJ+RjKY2KrQeDsV1 zW{Kp={E&@asq3k`St>bySSj0Xchs*tyr^YY-ha}!JE|k5m%!B2-?3$8u@xBnuBgan zjvQ9;V#~s@1Ghe5{l4k8bksY)0vF1!2+7lcmn^Xb+FEo5&}MXriK@dh%^5wRR-fH0 zm+@3~>?0AqP8R)b#du5SHc^=K66;}dRK_cHcomn)_4=9qBBUbFRSH2aE_>_i>n9jR zl`Z)JRd7erI7%Ee3KUy@zLWse;2viW>t8R!ye3QwaX}51+k|Egs({4edO+F0pV1#l zEhKosJfes(RzosIY{4RmXV7`nz9rc?c~6qvFlvCv*lvfJ+)CEsi5E~0a=q)PFP3x( z4J7|kd4RK@g`&$^I#WJnSD!Ifcp=<#8;6dwM};<2&>yk%+AAB2W7xdZj=Kd`Shky6 zQh9MX^~ug`?}3`j1gL-TULWf$SKope0~E2eyYlTe%ew*8$;MgLu86N^)p+3XHFP!9 zQGN^~4itCIanq!a@Cnd?EYZwtH0!Ji5X$e5M56eSEq6egE9=mFnj;afe93qL{Z-t( z>xl2~8*k@4xO5qrL3NP1dsoT$={ZSw{CDsHT_laR+~(TgMksa6mG_sf@Y|l+3xvR( z?nS@o-jap(Hd*PgI&z*ZkS>zKD#a!imsuO6$~u!)z9~a{tpMcjMgra1X|@A!&ixfd zL(Qd*r|y$|-^M?~=tdq$5^q32#JqABXNKC{wsP))hsx<>d(pPjGG#81!#D}J#*T20u{X6hH zaH}18a9A10J0=LxUjL&OAc7A<=iTxsEhbjyc z40dY_wX^@YPR$>Q)-XaoG-KqpB>S?oE#Z_RIz%C3EXo-BiW08HUz*4W&0XH{2GNz z2K^8WZSTxM=c$k3ObgvEW$hP|pjY^6_@j8pyta$65WuhcKe(}~b^ajP9X?|O!w^dNO!(WzfxSk6g z%l^RG#lki*j>A3n8tiG$4$c~<2y;rByasToVW1uiwfc$Tl{jSaQrCxVI#{gv|8t#|q~`7~y7SaKFF2K)?uep9~7nBYvfko`ci!?Uq_JqUHkMC4fb z_2YO}xU<4Ebj8b>LwvG3R zo8E2N7)7oi8y=i$-V`Pc!xnq3AJW%yNM(vN6x!b3^%{E?Ud@7`Mu&yUcRO50qE{UA zSIb{;NFjZSc$}FXf4*;=&up#wEH%uUhbPH%j;4Qen)j&qT+@E>j4naVqan)YQ!An;kK^FxHi8n2UN-aGmGE*PZ|&P={ZGb=%mP=Eq_(bJ{1l z$KU#oLp>WlFrxXUm?x=qrU8Wc9L#tUtu(m3BF@UfXQvZ&x%5Om2WT$ZCGQNA>o(8u zw^+_L4A36hp&lpZMGWD?CqS!-KY0|+7$uQMiy^i_O|+)`KbeBg19#COBG8~~F6$th z5kL_9`(#gFcZpdJ<0m2HuRe+m0TM26Zfsg=-ntB{sdqc@McVR&!C3a$aV zu>t=B3I*x+(X{T2?*N^PF0QK=-#~_M2JiNI)G#hII`*VX1sFgWdF~j4F-#ilf)L;pXXjrg z-41~}$@>B)b>*$x2OrU!k{DJ_x5ZWv@eZiIQ_t3b3M+?{kkPFKj)s|VysVq^wB^Xt zro7{ISrqR)_wKBA9raaHDtv6G~-AW#>#uXwgr}jkimZYRoQ=blwSJ=)KK+RCwl{qs#P0%9&?7w{cn)yYTztpIA#7 zhB`@-eE~#r610bE1^MjkMZeN?kNHk-2EZ02;0y3j3j?Lk0S#f;0_CFuoQo()40gSpf8%kG!j2LlZuK2B|GAT9 z)#p9`hu^QKGPafZ!K2o;o%J7wx?U_Sq9y@h=Nl35fUV>;71o*id54phO236LmqV_h z2z*j#Mx2@JZxD$hh}**<3>TxTsjKM4c9{c!3O{%o*#eqg?@k8__?9|P=oZ{N_qI_n zLzt7@k~Vn!&iRR9XnF?<+s4vw=1QrmKPsl^;%ace^C*pUrmTA`evT*eMPxN11sD+P z&g&3miyD*-;KBpln0m&IKyDN*%+(0kOf_l4K5x5I8i%?eW2bKS>&_CQIJLF!I64xAN#*Ien#NfEi@5jN-zjljxi$ABBf<}}{Y>apcN zBQ+JL3rcjXw;3m8n(>W+bjn@;UO4{~&kr}3@iz+XH~Pc(oE662I3u~Hb}Fv)Vnq(v zz<;u^vfTybC1tqwGq1+XDftk~SF6NL^O*g@LD8~7xN-819+e}Iv*kc-Cy>J|`RI8D zW5)fR)pszSL+f^jg1C;c(@~FJ8QdPkpFXp0J!-%e-aY18B|8Py^)8*~XJIe3%;uNQgx!{YN0+g9M;)G^ME@8TM9;U^thx|Uj&0mfrZUOq zz&l{?krdr4&Z0h49S?BL3hN{EX1G7BjrU>)ETD+pn%z%wq+kh@Zf2uE7<+Dn1_#wN z>j5KK)b9*mkTuDj(a)0Z9qe=iKl-B)w6$~C2-Zxt)#n^_v)mZQUG00j{sFKaPtU}T zyGoBp%Kqj)Tj<$Jp5*5yemo-{2!H*RLkSNx-foKn9fCE^u~;e$Wics6UH{`bFvp}| z3d9=DNQH2=+Jw(~nx{Sq8Z&4X^J=Ua>x|53 z38B^o<|u9X16DBIwl6Nb%u_qPkssv$I)}`lmgRQhm{_K)wII#RT-Iq}dVAr9W$%Ni zGeG*kEq;_)zqzUJqtsb{hmRYtnUOomaB!NNreM6?fWZ<=>Gtj`{S`N6-EWU*%HZB% z`)(!{uzAQpJpHZwc`{9{oPHB9SQ`4L4yNRr&#e};#4v%gP>^hF`;lD$d)pBL37CFr zUTRCJ*uTjC(4mWxPJExG1u=+@VB7@4Irsp=O*7Ex7)nhR@S_@eaqgb#t}J9jJ3VJc zvTubVP;8y2g%U=V1KEZ_*)w1^_Hf!VvGh@40C3o?Pu1vi9kaY_P~smnbwZ^>Ec&jhUI%eky(F7c4UUoHJ={ej3Vat$qJ}tbr;!m5KUsY80%>U1rhXfQg`vE1#R;%+t<_ z5>mXS)7Vj5j`{O2Mg&*?*j4^ak>q}|v9_PJ41-cSwpm{3*KwR@XfDJS?iRXM^b)5#7CVpl8<{FH@Bl58Jb!)(v zT{<>gy_gcU73_tH)QF*nGTq~5s|2GP%I(D;^#h=Kxyo;MU|$CAMC+6&h;kl!05!KW{cC9A73-578@AElZZa;lkX5H zUAO7j(z8H$32J3jTl8|uNQutZ)n;f%>9g$Ks!r4}TpqHGHMzZwSqj%ZH0hItHxHc! z+((Cy_~g`>hH>Ja2Ej|olUtf*jf8Sgx${JWf0Y)N@>yO_UZKmp@5(&gs{gH+6&>O2 zP3Ox&=`#^7_$mKSHo#ozpx6413YjG-7$P*z>%E3WK_nI-`pFITo);&iX_@8?yua~9 z&D|GQuhEZ_{8i(Wq};j6TxL0*^`5==+L0Y$1eih)a(54^XC5a#=6LUbdHYA%Eqt>8 zI-<=T_k`f>b{#ct8%?YR`HAbo@zOFuWNg zXFeOzK@yKHut@(fR|kEPpJH^RJX^V}KHx5T$zfuA;?vs9eQ(@vHS;zhjf6&~sLINw z=#nZkgVZrf+d0VBU)}^*OaJNQ$NfL)gUC(0Zop7G)qI#Kk~vfPO9PSu464P!G8avd z?5>@OogGfprtX^JrdhRYy@_I9`{;on^~GULkePPvI}F<=?(U2$BWoZSG_pNqbJ+SQ zhg$+Gjtq^=iu=j$j8`|Ak6Wk*(gxerlQr3*IJ_?K2FUT<9#1tY-2HRDxqTq#RU_UP z)XaR+seWe|Dv+wlr@?tvSL0#Wo2QzP%imE(jT>!RQZ16lK0x(ypL>YZ`@c7MgSwM4Qg+JmK00Q2UvGUG}h-~ z=TsP=dzOsnjq_vl%>LFR)z)ne^UH09Ae z{}^NfK#WTo-{9ilMmtt#vQt{Aehr5Qhjx6O*={R9W0pd1+-TwtW2xl|``F@dT4p6% zpQoR<q_U|=y^B%?r!@^ccr}t-+Sxcb zGTnR|IbmI(ZvQmF-mm#W<4C{dN=55X8XqOJ^0wXdg4g}EHK$7gHQ{5{Nj5C*LT2u& z_8SwJv5W=?@S+1PjN83s*uAcrGT)>RZkz_TYi61FM6+V?4XOKzeSCaEoi}xc2Xf!5 z*&@o0x*YHswI@9DjYs0Kyb~^cRqI3k1H){DD;3bGZA78(b=)OD%U6?#+E^W;lzbt( z-k|SOQvkuvmi#gZI&T|Pm$$^QLr0Lw@auT%NGk4?LLJBH4gq6-6qSKpU%1Vt)1euU z2iyoNetLZKCB4_#V{zE0A*#hWb(yS0_oI(@>aRb|4_#Xh<~$5@R}EM5Gj)iJG?|XP zo2=H~k~etO|r+)8Uw>o`qM8%c^edT$$!Mb{eC3(@wkaG7s+? zQ)JlOn-Cz?5P&Ur^a}ysPwV-07FUhb2DomZJn_t*quk-N#W}1|!Wz(@^O+B>CaovH zuw!)yw)6X&`Jc5%MySsK-*MqLM+jy02qM^`+GJn8pjb-!wuGLO$r2{ z$f7epNomu|<{ohC8I9v$-wy^Li1E3DZ7g8eH>~2T0jsfa9ejOBP7HNz&uER-*iXGW zNP+jf)V^HqGbgjC#j)EnB(UooNQU>0tGp)j)%;IhIuTpl0=YLn;1;3BKbxd-m$!x6 zc)@*^>AgFi#F5zw0tt~uiT9UJ$hj<6( zzuG3*J$a+g=9a{u1x?7rVV+da-RzKadCR^1-~~Wk`U*TVdLGuOm_N~a8BSpG&9 z@?c=E!iC*~S5rnPIzMAGM)?+r2kECj074Kb2ARg3qzIQaZc@!*qyCqH;d+5KZ5E*l zs>0SGT3?!xw3)ULAR#wCwE{g}sY9HF$W-LQhw)NYNJ?jz648k8i!1g#556Tu(Q|6^ z*L6tIfniFS$uG?7rAiq8*E5F|fqb?>;S#xDIC-Chi<*`SdT&~!G1r}S@=ll-k2CU% zJf!@fI+@~2u%uKTO>yDa#M=w>H1n3+n?9k-Z;F?T__61vW27wv`a6q%JboAH{#x&N zHNHA@2-LjDcATGIEj8I+QSFt2-cxYdm^e7L10;8!R$hccIqyuE#VYtt?ngDf=tf-A z%$V!C6_8>Pe@u-Q*l_Yo-61QkOb~A#0o7x6HC!3CjQJYv#>StuB3zZ{uA%-3ZofVT zAjHv9MMg7b{;aOA*?v^P%#j(n-ki8uzU6*qruuE;+_sAN#)-U#4@evEVxh&`6)$FT>qBtr&b#46{(Wj$Mdw~XJ)r^kIT z!eN}XEWI&lip`7g%-@)YWxyLvr3W^LKdr-G9*N?LDD|?2lXA}O#eYaZEpU#bO4-DH zu*<;h*d?!sY{vgG1I&K?`nhocfj&Z?G)~C6d0`so)DH%>vFDP{ZuuY?kDV7?_lEYe zGPyA~at$_{zJ4n0%=mQ4DbL6V!5q#<{(x?)gs~kN$M`N)B4E?!&Hv!VW9M5IGkj|{ zp0$Y_-xoU*Ih29D1a0U~zO9qa?l%(y@l87-!LNNR{No;4!@M*aO=(Z|2lIVJSfI%3 zw9|jw{}|~H=r6Qs>r|JK{lg!*aBq3BMmXN$522r&DQaPje22vl!U}O!CI^a9_*SxoJZ=hQAl);VJpoF8=+0bU?R^wXgTAq~sMN|vb`brsi2~NnO zF#lt!}HYiQ0TXJJxjPI^2_FNY8fk^U-C)X>HW`+a4!0quaq1mS_D}m9; z+>6r2q~_uLb;%ciE98A)d44SLHqr)st{m2(szCjYkt}2@AZQmgT1RYtI8~Co*R~+Y zU!B2$m))f(T~0~f7tOoW+oWWWcvaTctd>^siz1}!S-g>73tc`w&+LfZ?;0v$vUKcw z!rYiHtwa$2n`HUI-zkpUT0f^0br)CCdlxZ{i-(7>vSF*b~||d+I=Vj(At2CZ2Q?m)4JWejX+>c91;z+yz>8n?=jHH9O;IhoKo6dXO_K?68~j+X&IM?40L- z7^I%88S>jdu>5}B*j!>kbIg4wT)MyHL!LNk&4}j44_4O)%#?4Nr+*u?@R7y*9Ap?~ z&rL8^ii>vyWTOXHs^3kjIC|ajv#TCJ;3J=S>hOX+->%`kLJqSVZ!}oHz zw`p!@dra)mS6^Lj5j z(@t=`lHfJ}+$Q-!qdO4W*4Hf1`|FF&T~7B)VFO(iRs-8BzEYcB7qp)G?_qAB7Nc}>U5y^gx-C;@ZRI+E&Z)^{DN{b& zO+T)Bb-@sLTQJ?|_e!)&hg*}ypI5&`?am@g006lZrCpanmXzaTa&p4_f zA{Sg9XZ6G$^!2bWIUC1x1if?W7=XWxKR8$W2{S4 zuSa9pcQtU|2EVp80m#WNs>OVOdnOB-_;90Eqq4nFV3mJ6UxUB*h5qN`qMeP}7tkl( zU%d>rA$(2R(i_^+7?Fc&>az1PS-$Ujuli*%KWu13?%ELOit-jLoIR+IX(oTCg}#FC z;hC8_Ldz_M3P(e%ovEd{th7G_X*tbpbSRH$d8_){5d6~4ey>~y8x z(G_vF>Y<+(&KN>FN9LMs5U%Y^I2^ac4E)BtQm5Y!9iOe%gKXs&B~GL52P)m|-hLLU zIPZ#>Zmw=U_{P3<`_;Qhg-dzkR$+~k8^tk}t&u{}MTJWf_M+Rcl`ct&aCE_5_wNMQ zturgsL2%B@X1mPj!#s;=r67NCC2dhfhLtT6%ga+0br)7;Fh3r(M@#ZB5fh^v*=8$Q zeeOkzuO}LjE?KOdU(KYn>+wOkczQIsSrgAStDF=vo^M*Yj13WnIt4Fh`L$IdP_0(Wf-5LBqCk1jv19D z+f25Zv3@_M`~Cg_-`8t?oAWv6Ip=xK`+3f@O`n;I3PV$5_!36aJJ+)xfX>>zhIdUK zv0L{~-B7BnXf>)T_R!cpH1qw$3y%it#gK0B#WesvCUn;g*9&d*N*4`V8a-S}KUD2n z!L{$aJ{)7TBcYT#Hl>98f1SMOOuhx!R^~T(?z=m+ijFpev0P4MJDKg*fUxu8GmTBKnWTv6elZ@NJ37rO}CU zT!6G<4}^)@>VCJ-ee*`ZoBb0CKvUho)a&s0a*CEswGU~+@QCvpXWG@b-&ghLI^ONx z+S0@y-(?|gB^tFEIyO7Pxf$rWrLVhI8v{{i&3}xpkKXDzdGFq&c~I5N!_?Xu)D-v@tNfAhEHqg@OF7&I@+m% zF_nZ@>R3Z>I0F~p8gCl}JJau}6?a}~XfR^u6}+?55qHYEBGP}@PS)_}^bN&&bZ7JR z@FUJ<*dSS-pU3;#{q{>X&?dk6VI^s3gBJ^7y{nhUKfaxg^3>+ag83lD3gP|K3*-9E z6?=P-c#}%qE0Ns^`-9;@Re_#x%BXo1d3s5Idwa~V!-7-M^l<-)k_GuHg!+%B6xWA~ zK{?I@=dYaAuI}h{$+2M*QGDb(_XSU>;S1DD*Sj{C^1_2-ngc_x+B$&==IvN1S=DLz zpG+o@i;Q{4jypF-?U5whzmb7AY(Os!)76=|H4p3X!ZCYhN24sqwr0G;4L+5Sv43(i zQ{?8s>Qluh^Ezfv(sp74#*t^Nu49-+KZ`9(v3 z5ds1c#&vZHZ;!V~VqP4KlTEp~Q(*`Ob(1QSXk>M_Kc?OoYUmy{xH}TM@9XFUU%s3T z-Xnoz^i}}<{S`$%B_dAJ|FxSHA<-mc0FrfIl(JK(3oe>sYkbJ3;gZ5Hw!DVSNf!~; z6Q}eCM%YF%oTPgF`bm~WmuA-S$IL}vvi0A#CRrmDAJ{ga*DFZ~^WX9z_L#l4XNgQ8 zTky6eF-|@u)<&(OOUx-OYF{SN?^Wl7iE&BJGENh%a3#D1{d>{fwvwP@T2m3w^-MKa zQv*QHnHA%&$0kEfN$<{LCi7q|DGg(MJ}vC~U@r|-=4Lc$8`g-t>J8RP^5WmPqkB3V z?%mM~d@GavM;G+nzvsrF1hoGrIqx2>GAj^J&^|*}ot%;KM2A@`>gP3~{OcFh8S-Gx z;qN1}u)ELoFg-r**Sh#xUDd(}LV)>Ki%C3pLyg`#ZkpUrK9FNEpLoM{W7k)!BIy|5 z8eB4J%(XYaD%en;YbW{6S)=*1h8 z_H5>V^Aib|)-zYMcG2D}2 z?~8lb9H-7jb?q~(t6lvza4_>cUF)te{m)m3RSAH-ZCW57M9yG|M?Er?o(+>l+Jc3w|`cCX4Z1(WZ=68~UH6@{;D)LGT zhy}QtY859J(KL{-xSaG3M7KEjs90$84M6l&Z+At;>Kc__y>YHzaUW0Eb|2A*fco6I z>QB{VC^AyDV}0O3+Ch5`8{jGquS{q&dcjrRZ)hgM=rAF5MJk0Xx#S2beZ>CnejIW6 zM(IY(&h4rgPHD({m3n}P0=SQ9jO%wOWyGQ;&=3A`avx4dxP9a! z<^S)gx4!oRds@(wS^`mSVZE1y-ne5l5QcL`1sa&`xM;S#m#-^5c;l03)_f&$*WVwM z48!0PGW$-eg!7SxN&5R%V6O#2{w1k~k^6B5wK@3?!_X%W0Y2dd34shrI`C+y`>V4NnuKu2@pTK2Gwx%~X$SWJMO)Q!MJ{?+`e zio<9(mjouJpP#M^t;oOv6Z5x~}Z<;axrxqBdap{nGnjk~wC2QEY&y#sZ5a>YDpFlOP0!$;Sz}VDR z?p8CP4umnrQnR0_?hLhSxu%S#j=XSP>$BWTBvcDjq%Jc)3uI%mt(S#Cf1DCPbAY%n zq*se@B;s^ z4tnodER(qhprDtV+o2_pIOv?&*5^e7ARb8dw&-d2mUgfMQuh3-03mz2otE98Eb*(#oYukouiM?Qa^VUHH2wnO4zqZWN}Q(Fpuy19m;Sou5b zT6tu^keNPhAof)z7TgsJT-JYS^~@%fvI$6=)3yu?91`MEv66S zu!q)Sx|ZXmEBIdFxPf0lEO4T~rGZ7`Kgs9fUR?dzA#+EJj;BfHr+g^vn)OdwOb=1P zp1(v{HibyR)?v=xny%=s12a^G;7E|MP#1K;@aCAjUK(NcO&w{SSagna>gh{X%=wi- z`<%oCEO9BxZNjyz@}RjkvGk!8Lx*uS7XN8rv*fuV7r+~tyaT6M!H)Ul=X zGFQ%QPHkXKb{0AbZ;^hv8Z&Paygx`X*zA}T)gY-dJrG(xJa5e7MbbEhU+>nSLpOTt zCts{Um&{G(0CLX!ZkAD{HD^JwvC2x_el1m9eMiEsd0{Up)@9ZJrGO{!?Tirpb$|RD z-Q*l*6lRwVbiffKkj6W%+?UIR5_)&^ZvELAZLBc=F8T`RCF2Gg7^hzy8)P`l(sOoAkMZlKi^Z1hxkMIGRL< z97S?VWinbM2+Ar{S20h!eKx)B z^waT({B>}Ga5x6W7WClApUcR}#%u)VuxOThVW&_|PQ`sc7tPZOpEHE&b=tvZh))K- zriQtjWjq%&=Ez%G(VFf~M^&0kevxO`=8tp`t{(@d2BFLPCBuMUPkK-%bSQ*z4OiFT z3!$Dn8l)DaNJepUm_p!K4C&8WnG7COn^GX|P<-KPS*R3CGziP;hQuTuEzRrrVfjKo zIRKjl$ADNr|HYh#UXQL#MJh17o*fDu5@qyi7Zt%-TruJ%v0T*ECS*MN5X+x&Tf4}> z?SMOq!AK!jmwy5 z48YRMwm$uYE+EUGZqiAudAtjO&V+Gbwl~vCDQ-xYGk0^Dvm#?o1W*4m!C|996XMExWNPF(x#^EY>X<4@Z^g{7Kr0} zfa8Spa9b-rAtiiEC`us@8K7=IGgES(Cc(i;tc7>qV!GweO}K$4{k;r?GLY(ndiSK4 z#?tuTlh#Ro-WH)Q$~;=gmmZO-MQNt1Sfemsd6v_Y zFN>cxntT`qZ4dJ7OSiitr6P9K6Q`T@{~oO?`S@}I^J~{}b)tIm*SM!*)OKMp9h(C} z(bgYahAjn$8urwG`I*Vn6c4?m7_-J`{2}l@kk;468J@NY%s@Lz-$XoVI~r*Awn%aL zJ#Es(n(e1nd#PRXu`Pn5CRVwleLa54Gfi3u>*3R!*qrI57`fgXCcIfizU$?S7d{%U zp`QZ89QKVB*2X(<3?Up-28Q(dXx6ImsrP}1GIjf?)(M_@kSgtP*bpo~8mxS;L<1~= zIqjnA%iNe|M*`n z9ks@)9Ye-3k!5o~PI(9gA;>_b7?1I0wQ`_pQPB=(Eh;gf-ylBjZ`slwds*Q?2`NXL ziSBjqR<1Z_SZCD{fc?$<7tJb$XRBc+?`*v3ENTOC-g#T(#6=PBS4O^5$lm`=s)(nZ^orT zyCNEv2p#d&oP}-4)z@K|1AjCRAOLJ~ZF~c(c`rwnv7lWfQFfb0(Xp%WEzv>Ur6^r8 zUwxv=nV|HrJRhHIkC3}5unZjFPxXZ)}0FD_Vj{eA(fgY#0H9mYrdj4 zZ&Cs8{k|SZqRoO>g9ExRv^}@%wB|9O;JrA*%Ht$AKC1_AgdBS%M#Vz&;N1v(*%G@C z+J%ZWTNZI&5dF>A1kfZ#-s7`|)xHci*J2@Ao!Uj*C+w?=_-?Iz`Z?k^3`35C{Q`X% z9oj|SWjA>wRo`MNgT~bJKBEZkz9XWBQdG9`WvQ(_tlqBmWzm8k3Xn1_`?V+P`*!%N zkUATqPmY^hk880opGN!#h3ynye+DlS9Y+DWm`178E_yf zHclgSXatZ0@Pkgv;jRnR!)r*$V8*kjxrz7Em>0~`OE zo^D@L(g11ECf-*rfuOwKhGWQg2RGfwZdbPjE0#_{2ep^R{FCJA1HuIpj!_g)X$vw6 z?E04|Xg%bhYUq$fzH#B_W8MYkx0FRh{W#Mz-_yci4 zA^brSEQ@H{>z2#>Ey8+|gT>v^<+HzH5Qlpz7J16z%^!?%5@_Q%Lhe6O{ZxkU+!oi{ zt@k&fgWve+o6h94bnckXjuPbj<2dhQgIIkbRvgDa+Uq9nnVd_L5}v?1_eIX~jS9M; zn8@EtEwsz6GF*ly#C4##=Q0!{07?%_x!4kAxYDTSKoXcQ7B7Y$jYCk>W z$?x_+ciRW9+&|3)G|MpKCl+%LrWy;Dg%gi4;Q^ZVQGhdOOo9)K?K;^Ywcc%m67*nQ z_iQsT3&cUQ9;qq?mhxtq1$m{Mzv1P$XfWb@o$*%`s44tAGs;+H7CVaXQ5}kG^tmay zrA6Q|oFEl3Is!g|K(jsuC47VCeEltxDzw4(7}<2OxO(`1|5AY0j(nj1Hw2Sd*Ocji@6ohBwJr)<(FA! z%>#^7U9rbz)zW(@V{5CT-+wqlLP?#(lFp3G$PtiyWRK+7&4)$JD#{QPJkBJ{ct~a% smMJ19dr*IHqU@{&mKc<^9gU`SHG#FW9nAhyB4z>Q#`zg9fayLP_}^luqSu`l~| zJ&U&cd>J^~Us?`eU<_pcJ>af|g3e!yFpg4k;xKy<=j7U^kIrw)%Dm+*Oxz{NEa*m?_F>RqElE~V0|O06D1(I{AORs6fv7z{5H2ZF z0)<*Q!{opm7;V%M2MlgupYkns2Mmlrwtp;TYK=!l>V}g|iabor+uGZRj%pvdUq9^1 zUbOhj%#p6g!s1E4ZE-eL07_#L*Hv-Q{=Bbr%;ci}aMdF-{{(SJ) zOz-FyK{KAL@q+0_sRqt;47T`Rht|TV;0#~>u&*JP_RIHmTWjyFt$SwY4s?|^RkF*P z*y|UKlG=6=>a-GJFnXwBz6f8weU*LR_uM-p<5sfMvngh`1kl%(8789WkE`hnOZg8~ zR8-KHNMT{*d>QHJxHN(3<@~Vr9!AZ3{Dd0rdhMNDce@i|d7IxH+xeHzoc!*&6pSW{ zQm1F%E1Pw4+EcuNuDm==l|H;I>`wE1wo|yAH`kRO)F_8ef;>~t&u*>WHntPGmyS$B zOziwJxuRS>_8!goo_n|%>DfuB$zJ}Kp5u9}4fwTY& zmS-Cx2RskGy~?kxE7d*CrVB%_%Mp^C+dG@~Zakwf0w8qePITH@^D;!-YbRUT$fi}W z8C*E|fqHbVOGqtyD{Pm){dn-I-YaL#n3A5vl=?==O|)J+p7s$jl!S1fWrsfKwYUPf zEVC7$|6cOY%Dghc>>SQmH>2FUwjX{2=$f^YIjGnloX>}O)oxhr8(S-V(r{Q`MHO69vo; zhFhiG{j0HD7O{ihb}NLdD*)>^XVr}wJlb8Pi)dk!CrIk2kK??VsZ}}i3(+R5htUP~ z9XG~Qt+xY8`gW%r(NhZirlfk`3Ydt}Xsrbbm}q=UOZzJeC5$d=-21AZb8)b-H#Rmh zb;avmFoQ>;XQmGCwL7)q8+0%bnxIK z*i=40;H6tzP$&f&5L7af_ZBLAnCIW%U6z81sTa8fM(!=9eb~RqEhIrOkZUi!r=o!l zQ%69^R$~GN!h}TqmLx}027$#RA{0V12$pzelmZVXFH0LOFTP>tnEbq+?)eJzgepEf zO3Q%H!5Bsgb$K(1JmN8x$BnyZp){cs^SyFLjl$<^qqfaMEIJB^&+y1+UA^r3A;z}F zx3^~9yvbD^yBbsqZ;QJ?-`+WAiu-QmNLK&^kF11kpn~x1_itK0+rrGNOHbl+b50X{ z9>I7U3-A%H|E>ago7vtWt1nJnNgdh0qRj=fhF$`V7qoZ=jDv!JK!mO+y#5AJ2nvX= zu-&#-yeH*T#4C{bE&k34mQqj-o!!I*A(BfF?sOpe#8bR{;Ts+*3dI1Cq>>g+S_#F8 z!Hf&zClXgR2{EF8#MQ|E4)(T!|8zN&w<1`Y%j{pYI}DV z*SO5~IR+G=7_PmO&CzNtDxKM8Tea%bhk*Fh>*=tbzh1T1gWgcbbTjM(2IP+HV) z?@qCiOn8!i^pmT0+XTESd!KrAKLm^KFFA0Bhj>2&-wm_%W;HlWM(G&z)>yl*?!NoU zO}ovOY6*Ot0Xfyr35u8!-Mw3xZJKMbh&}eTww{lOkKT#B%aHM|$A(}&KxCTv#-!+V}4Kz#k>J(Ae>X2#hoj|tZF%n6J}&iHRjJYT!4 zO--Mb)F8lZ2NLih{s_7UfSxl2);bJ-Fu1|D*PAXM-B*oEHLZJn9EpS+IA??q`y>a+ z+#^q#Ekhd=0xBnIY2U+7ikeL_a;{$SZ8)dA3f6({<1Y4}GWsO)JsCfHG;(rpc>$9P zvMAw{V#u=a!lcdZt(AD&NT)hr)!>T;?~o{;$-}E{IDA&fIj5nU%%Qxg2jh?*Xwb&; zH*Pi(S#M|mqHq!h;4K!_kWLMw2isP+uIR>}^L?IJ9Rms)Zm~=fcv~~|M9}s|%+$^> zZ1s`&O`n?YG$V<1SNnDG5CzhGM>H^v!;g?Oxj(;WKV=c`Kdk=Ii8`2Kk1WmFJzmf9 zpZtx1AN<{TRFiwdQY{rxFIm7Kd}FQ99FG%lomT zPq5oQG4dNJ1` zs3G)1BE@1$w3%LchOxQ3PO1@(b9?6Dz-pyObfv+~GSJa?U}61Hb;C!;8mDJ&u-v#X z8yN;u!Nw2^v8JGfgku|e3UkpTX*gv2*4wRlASCXkZHbyHeo>!2VJ4ws&oFw3QIezN zo`mSalU}2vtL=#2mvSe;)YD$yrGPTMwFq=xopVc7@Vl<*zxsZDvz$Z2J;-H zg`@4g(yN50RRYDHnuL}4Cc8c7EuN>UyNH{Ohp%cbAM_;s7g7;GeK6ad)gi$Hy<1FV z%mNPxBR>iSrWt@F+kB*pWGbkw+OBt zb%6Iwg7;M+t+5+OvxxiSr~{Bo=q&_e@SZ5rC(wdPAU_3)e7LyXa3|_5asx#v$Eu()E5O@>2oqF^Nyn0@ZnGL%ltz!8J+=ihj z1kr3j+NpJWoljNELE}>eADy|B)32$oV=D)vm-D0BL|>k=l1uXAiv3H$X*EUedONmy zyHoI9N4g?9=iK2xcByU;A0^9qA^7|tB;FN`$vRLzMN=Rw2)*i0Ra32j5SKVsV=H&B zRXJq(z7%HT#V)=xh^tEI&*C}#i{g* zj_smF(*k0EdX=;1S3=?w2WTNEFyl&ujYuzxbl1^G)(4KEAwtDIkXj~T6wwUE5fuT4 zODWZ<0)^!LN%aJ~`p|xIzU?OqYwslS%afOT-txPEDt$i1H#~qc&hPxch-RmnEM1Ir zZU^>aK*`M=Nsk_Y>0NtbLbhwQUk4eDS@Cg5MEpb$>W{&D`5)e*q!kY{O>Gp-`&7P| z7x-hj1FTp{^0salnvomm0MAz_?@y|a+Q@y}|kmq?&jkY(pC?ni#evlt4ww zz^SqfK_Ej_JKw)vEUsHEUnY0A6Q~Sk#4t~f_D7nT5N+7Cd;$z(I@QIVCa-a?wrkm` zyS8;c$P|*Pe&qaN8Bwy6F!vHNa+Ejl@@Ho>@9UvpI|k0}h1G?7LrA1>p*tR;AM%@>`j5Xh(F9P1^C-9-g%Z=3hL&q`!awJB!aJklwk|X^vBFx zIEE6;&G^^_%?qhzut05T{vOndtl?mKSW9k1{$D~mWhCUZq!1oyfY(cyry-4;twV6Z z(1f`t*sDhY`{d8Plu!Q#!R`4hZIPzKqLEhw&8*l|p~yL;${tpD$}|g_GRLImjuQd> zM`K3Qe5}0lC!2Dz_9CN;6>Aast+ytaXCLD44Dc7svaM~^F*+#%ON_N;A}8opI#14t z1G*yLnai_x=ewWZEi3JvG+k8g8u?nMegXM}O~h>X*(W>?)(uaXb=yWvr|>Tkvj@7b zshHrD)75bgGQAh7{9?^lj8N7`Df|l04Xb%Q3^&m z4f+2WW%g9zLE0g5ji?b)CeU6(rz)d8=?t77cRq~0>upNh+x_Df>mU4uiRMP(IJHCB z{*U+xxliMRC)0azy_sfbCKlqrpd8KYItt1{p5{ z^qR!Bf#zOZP{!UyCD5>2CJ9oe5*gNi3^~$FjKl7GALV-LibaCi?k2AtC%)?G-VUoG_ywrT>k^ET)AKio)yq`686R-9l7q5{6Z z{JzWAkj+-+H%>S-l;;50f1KMq;(7#V7q$yu7y>*ZwHuJKPS{O46u~Lr>sU9-Ql8UF3njR>=kY~7 zFC1vrIY13{!cZOvT?`mpIPwy7R@(u*A)yPsAJ_=Z_9k)*3-}V`<}x#TnwB%AOpsTqFJqO&%RvhJ0{N zvl>^ZIz{jHlNcx2z_M}gRy6n(*4)NTaM4y6Yb{*FX6vHHj1C%$C;z9hwKo5i9!k!% z1tjhzx}KhUwF$-N3(kjch~P6_j5k98`@M+j${&#wI$lXOJ(hx)TCQV^MC|UJ9sC(T zm;n1pK{8$92m~Cs7zLr&0Qi$th{?aZe|)9+v?ZgX)2P_Ol6Tz$*j#ilW;n+x=+18E zY(BN7s=4msR9eb%7va)o98%4LYQU>}n5G6tl$3ds7lP{z!uC>Ke6CfDzJ}ucbjTKX zh(*22wic|bsRH&5mF8Xo0>7IPLCIB!&nllt{zvArPf$TFgQ#aw*D?95B$$}CG{7q)tNNIGJyfq)YJ{P`?kNS znT>i4o95t`QS9&sOmG#;G}QTEH;H{%Z&}M-xH4fMV(+q`tFRhW= zq2gLT^Pe;iE2*~FGg~$OgNJ8k?`Yr5M5KRa%q{HgMN4GeJQPyd_7l|N|84rpgR|~8 zV}^Tafm%NCG|6K!)_-QYael!?>UZtoTe|!_odZ-5&_w~&>0-0`E&dOj!$&c5vobR| zdGMn7B;<0mmfWK!Zo^?GvGy`4YZg`wPKq>@y{8}t<962Vi0+FJE%VO!AwsxL>yQy% z@x=+aad7>`!sRg7yIwAwABxB5R!)TR#Xm7opTlK?`0Nf>YdfP|(pAKLZ47>!h;05+ zax3PiL%KWBnB{x7W-4E)S14GlZ+VbZG$ji3RHTx{mJuD^foB6VSrUI*@?F*SYyN>) zVD3w3iM@#*)G~h7YD*tzT*F`FZjm}%+0qSi-aEp>|0bXbusyc*`oWU^A|uY^;6JVv zLT2~v2J`l=I=7m%kAle4WeeGu_G3Fnuuqu@MNDW)71L;rXgfd<9#k@I!BPRIdx|a^ z)-@>gXK=>#)G)Gf5jjE}d`72HfiO=v8mB`sfR3w zN2Z*4vaG%&m%PRjqow7PM?0MVG1w`WUqr`>r4D~O@q!+N<#Umpg-!l?*@hdG(Vz`d zJAy`{bB5o#BeOY5ID*!7Y*tAPcl{0D9aqpFnhy*zY|Ls~dO+lW(PN)cj~lqZGdMAl z>4_QS+6)cV)f!;C^d~7I&>bp4Wz6m|q1n_$y2U*A)1uy@!^XyThUK5FFyRJ(6h4W0 zUdF%wBTSrv8;fU2BN@-j5D=Y{HWQPRt^IUCcRWde?*B=z*)S*68L_H?l@wJQW%SP| zJ%&)i6zEjhdU$xK+Pv=2g*@bJ+wLD@b+Ht^B;8ApnO)ETfNbst{}i_gEF5+{oS(MW zxN82vgE9zz2Q%}#^LN-fsZeKLNfUn807+>OH@iu%A!h_$s`liM-Gnj5^aQeD47ajbH;r^#@d1kTV&!Ml$RWIl%j=UWV@_ zjX|Pv*?LkpTtP1!8KMUKcoHYO9{Fxd2T1MTXt9)gJWq}+o%r4M5wx{p0jMV`bEc2P z$i#L%j_V#U^;axpI#+MeFzSigBKV~mlIv=~DX5=P@6g~mSbpU*yCR>;JJ^4v);6xE zL1hc*eCZELA_Cs-eG=zz>C`cqp^*>&s0^h-ud@ze0x>ZR#_dv!+S;Yg%St<9DaHM! zbF4Rz%f#7-l!ttZnn}+-5=rs}FBI`7CugVO(AhmM)oO5Fe~~&L4%(F?eAI}1ZR$AB z@QFt_#T<1M(;XD^h5Kpwpkku0VEX{h z7Ju{P7I9PT^4Z4_6{U7roLJeWbv4wq&D(o=C)Ha2Nvz|Iz-LtB=QN#eFeUS?Kmxj`q+g>cne-O=Y!~00xh*-d#qdU52lADR@pfo9C*~Eub7wER zx&Nqwc36>96ffvlHR>K(aM73SgH2a6ST}A^(oB{(WYED?;ghQ2`{yQM3ddPH7jgQP z+qg}f+?K$EP6@{KgmezcgD~ezVay!<;DznV=IITU26O)4F>5gMs`-$v=1tS*yUwtH zN9|_UU!6I;C7$l6WIE}Tb^dLSR9jI*4^3n0#auQ4>y;qTCC)~doTo+Z><00A?G$cv zO-;>N%>ZZjg|PnTx9*{KLBiXUQ`mqf*fbeCcc|$iHuRWQrs0aazsG^N$5nS>>9<_# zy{fd3JVF=?KLmdYTi8^(MccmXp6-jal7^ANs~F04>(j|kgXjSqE{i7CA?RmA?p^HH zgP+HyC&7%pgTqqenR9eI${|hRLd7Lv$l_cw#Wu5ct_BK9r7{~e8hs@!3pt+qVYSm2 z_iZ8OPaC!iv+{Xx1(2C-$^$K-IUw4h*#&L%zWvTrm@NpQ-weI&`Y=LlAQ}=1TIc~} zYP@X|rha4x3w?u^{Z@+b^82>kf3Yu44w%)#*ozo>_TTb~NbO;Oo69*&LMr3wO*} z0myMxOs`2tdE$r_^#{z=iN(kwJ`!Cn{GO}_tp#2+5cG}CX>y@w%NC8TOGNYi)^1*WtbJc1SI;wr5!2gSzc`kjoQ7S$e6N3AgZ8$mPMb?G=J{WVv7~ahbGZdnb}qvc}<& z&u78g-IaGZtIYQ{Cw!!X87+w-BxGXoh@L~P-|id+q)V}WWJOrRGo#m_Gg$Zae#AYi zC~#2(upEM&q0nzJmfINQ-^_%TY_{(i9e@$tV8!=M?%S0uPG-|;?VDSMJAd8A+dl$H zQ>kk3u!`CGp>&<`ooE(&73U!n)g+P<8=Ts%&Q_KwG|x!C6&Oo>U*IMGffjU`w*jfd zHEq-ViSZU;^Q4@K>{5y(?h9yUav5qF&q7whbfB-);&g|xvL(2+BCZO0YDG~LxD6RV z_^jmUQycq9OAuDPlyO@E0U!DXi@2W$vo9tLu~>u5<&`*ob||DYpe8Edj6O2G_?|^X zOf|x;h`1ywUxBAC`nRIndf~}z-A+6<@s78gZC=Jna|RpP$bW$AhJ}i9%MtDw@hJ@G zmU^4zD^U@$b%EZ*z{jb2W{X>KGoza5G3cw#?MFyqqz*~ee?kxjZ)*aPATY@IUe0NW z0c?CEZ9m)}r%fwbq&u?oPNeA;qHx#jvs2CK*b=whf9>B~6L7+g)6n*G-_7uqXS5`yoS>tdFq4fBH zmaEBF&k3|b|F#*bGNscl9km3PJ(^z%^7A)+pSE@pKqgh;T@bQyf%iV>?KYUrBw54` zFGG%6q!~+g>V{BT6r5!llMtQ07Qo3bgE+EEzt6l^YP*Ca2sU8gwST#LU9BPP+&m0L z1NWY1Jin(uac;keWS*FuMCvZFxQ$*nKz29+QncLS_cokCPK|dD$FZXH-KdDdsD3Ld zvP-yss6IUuBMgG04gIbTUn=LUiq!0F?{x2*X%RKub%@b8Sm4z-U3+qeh=ZjgdLye% ztg+}jIxeJ4+!l4plw{sXqr@r@!uuGKI{MlK7r+&*`Ne_k-G(%ur7;g#5mzS1#|nO2 z?`>cc7X#EW-5rkoY`hwvjmoqGZD=x%np7WGSciEDjQq48Co;36p5I;-taNlYLVuh% zdl)%m(J5r>6)mQ2Iaf(kwq}jzMfLz+vlS4`&Pw9Z)%{S@CtWqgO>Q4c9g)uOnmOM`*13)3jdn9l*!(VaDJMij z+c0?~Di5kFlvfE9L=AKZU=?c0N}z^c-nN7Fa_He?sq;H}RW97~>^*;O=(|6lvhTZX z6?_~W9xlASb-?=zE#g!cZd%WuI6Cu(#S9qYEjSImGQKK3WqbzRRB;NQ5!I!U?f;b2 zYbc4hU(S%Df>eU4Sg_lJ+W%QPXuT5RiIea&lF?DSu`@JmbLV{5m2ny$)4KWM!wK)u zSy(!A{87SZ2o7oZ{!~I%f-kf}6@__9c2(l?edy#vRR6eq)7pj=8}BKi*rIoV(F>k! zEFCG|F|(lo-+1-9wOJte_dow-K`BIz;J9Jtvui?t(=e0Csx?OH^4a?q&E-`=j8D}E zA4siFky{ z-^qP$Qj%{M3D%0(3jTWHFIJM$L2?i$Q|mB#{dJVj6OEi&o=S&OBtjM~y^V_b?SvvO z{XOv)T3^QXdoWVwRE?cgif$h4IQY9ahjXzB2$e(rd+j{?^<5f8w!ZleXK|Qn-*z82 zDI-10jDb|cjj#&+qA&HFyrUWZ=&W<|d0wl<_TFn*4`fWIY4=yNdt@M?YFM7|INPSUpt%JV$j|zle>x_ zJb}k6i{5B48l4W77(%*dOeONs3v@qNQFzgHWPV*pyZy(L4|vhRhOZI;kX9p!`|m`@mUGbECCDM9M158-99$P;GfAgB6~)Ypr); zI>9g+J~1?Yi`JWLes6b~oy2;6maMr%rlhDndRY8!l1v@7dN3w1I#ih)()O z+O?b|MOI#{w~6126&{&6qsgGg%6B&c$RA?U=9NuydRUlfREm78%cNV^vnYwuC&wok z-g=IDs($I-S?msLf6qa6!-_kdy<%fN2o4-DOiE0|8_90IWEUJWXIG19l&gOC;TI7Rr*Ykw&lQeK(gPOv^ ze{*g$!?kV*xP^t~fQ!|U>QAzWasiXZ@`W;m_FRp)TcH=7;cVc-*RY??b^Q#<@iz$f z14%iy&i+Hefm8wry=rXvA|;QiObDYYx!#9duJL`A zOxbPX?vuID@S&&qrXtl*Cm{MSRkf?#x}r*#hP(~DNR>r+_0OOCkt^M~{>E5WJ`4zL zMxIDg;Cj;ayKyR-CEUI&clI zfX%SLd#Xe`rV%R<&3JK5LoKU{p{um|C`u4)iVU7Gk1$r9zvxYh=wrXWpX+*3*M{`d z`_J@)KHj3guC5vH@K7pfQ_h(Kac9K>6yrsc`SNpP&WP>BRO@*IChf!rIUd{<^?;FtlP7d4xQ)=Z@q}u*f%-6| z5mC`o1&GXowfnY9(zOifz%mpkF)*=_o6yUPhuoHktay$(&bHucy_KLaztL(`M|_|5 zr3}|$Bl)>B)aSto(AK~ECoV(phiOB*af3-2xA{QbGrp#S=<{M1Q~h&^cEl(bbLE4$ zu9Zvc*={+x&d1=q)yEFXCtgapQAv-ffjdDKuY}DrDaNpTYJfKXwl_fF}FIWZ|IgmkcQV5ztPcF zRy-;S%igW8xyOB$&8tx#FJMUdMXM-Z1=BmA187>tEmKU4R$`nP*?(<@l>+(WUYZr zfiy-|o!9Z$uEgk0Hvi~_a5<17Wb@tMeSJ95++p&%9Bw1a+zBxKZr9l3^4d}PD4D}- zZ;;MQ959}z9W30{g}=>C@@wRDso)EIi0N!$Xyy%>Ip%TsGx29n<$AvR{YaL8w^kUF z2bzPBW6Q4y0j}?&K+SMzs7BeNpj1|$M|)~pHUr{10R5M370IC85Rh~*`;Xu?p| zx)N+6>%Exq#vF%FZ%NV1)}!yThQhu^|8?4AL}b)?;gtX8L6wDGFaDLv_0%K(n8JGo z%!!V8u87HAU~-N_>v~=~ukf(!JPm;zm+Udc3P*4UiI|0)A|8ZJ)%$T&o@A9s64F>5 zIEPRvthm3!>{^Vi5f?fExHntf1NRq{WB-SRDC5;0mymhy#uu!P4p9FooHaYC0{QALbeT zPY$4)yhG6=I)DHN=Z}`wu%rXJ`*85mX`1226Fg*WxfZF3p8%6a3M3?T@(+SG(fb8= zIZ%GJe@ z-WeUjv|75UPry5s-DUPQ*Dz~|9Z#WGBvB#uRwK;e(qZO$1rzc2xMuuYu6*!}`E}3Y z=H{QDx1exwOB*i`t$=rIm3|s0=mRUq-o^m7_>+x#2XdfdxV%vSu@pL#hSM=5)+?m2W> zNmFgwI2klaMso9o(d2WvgY{qJDEG|Pe_hC7` zRP^5Uep}8NfVp-Tvf&Eu;| z-u~#i_UQIrf8wFD+jj5vzK$xtnw0Z#25A%g-5cC^ZU#oTU7NO;0%czAu4Zb8%Y#M& zNuy)(ltbFUr1-wgBjM`$AES+g$XRc&?Kj3oJHj=5k@!{>7yPW25Dmr_z;y!X{JMfj zB-U1KtFLl=$dbm7#(I#8lu@c`G^B6a1Phz3G|~q?Og+}OBx1-<&ytvSuSdp)ve?TG zLbcvfYy7;%NrPj&R(k{rH0eJ_Erm?qMsh_reJ?bf1`xGh*S9e^V2S9JO_l9nn>I>L zoV<|KcuR4elWUvB3_yt1->36lZPkkpS8eFyCssbK5kFB(9Y}&Oau%xmvniNDn)8N) z^Sg$6Qq>Nlfy~ZC$HtwaF8cq0XTQ1@zA#I^Yl!cBmavuNxIEt#C1W>{ zA%bpc{Trc2LVv0!rl-rFpPw6l{%l9TUMnCUAbORqgV_?fXV3ZLc7rft8WY<>qiTw# zj$pR1o9n;;r51}7?YQtyKB`TI;}lqaz|&!*dSipRW@z)RXqkT&ztlO+wN=IcP#!K# zgVu_x%3qqD&KUeUx6 zV6xJGF=ixsP1n%_KQP~2&;5U~+Ik!nz)4X~o}1pSYzT`(jScVx1vE0zBq6yT$S4?E zHu~^8ajv4VM(2FKhq#sTQc#(dJN8yYT<;vJ8xpvS?j8)vPjLxe8`|9wmfV4qu&{zf z_{MMaaFJzv$*czlY+O^18;N_e+%fhYn4loJON@&gp(#n7siYQge7Q$S=2PvDOUJRq z%=tIS&zG%$l7dBA5w}Ve&P=j>p}|rKt!vywZ{~K}8t$9cd*dPd2W=!bn{%3Wj)jzv zFj4x|?M62Tt8ZpjW~3q3MXx}E)4<=F?-DRbZwp7ME^${M!Hk6KP*<&G-zqEz`*S?8 z1;g{Sf2cQxF>tEt+4hIy>SW+;-iS{GheJ2Qcm}l0qUF)o$UvcVTpzD21IOU0hf>R( zn>)_#Z4SD#(oA-nQufTyO_8Ff2+3%X0oEhJMxAd)u=_nftGhnMA=lQk9bHF$<~FQf z)Na`zy$u6CtjZ4KLk zp$f7M3kUKcmMI`}aAaOL#?@~&e#_m&F0X=l^=vvG5d{zKeY-=;PspSpb~H{V4$2`J zsrksP-`|gsCavyjKAdAKh68Qt0yRpm_%E+C$`QQT8MznyJ#n!M%G5h+G+zdGvSTCd z92|y+KdcfxS5I_)u2aA%5T@=S>!R_EtvvkxAzcaRGRT4>0?v(qYi|^qKb>Gh< z$Y#4!h_SNxHc1^LH7P7UQth^Ji6vqGVemH#fAo3+)ke?t&%_?};3#HgWT;@UV*DJx zX_P(Kgav&;p<^%~-&BCtFfHv}F_!Fsd{hn!ey`M!N3h4>jlR^Kg*;2^R@ZK=9S^w{ z8WHwbRw$yg)_VT{m1ASp9eaD1SNrV1mk%yEEToor-wEKG9vYo35(#V3u-E?mV=z% zYy>}?vri8P)P8>Z<;J^mpd{n|joIu%$rUR#@?X;RC5pHC`5Ce(>0#c90Tc6V8UOCZ zRMqZ)Bt_r(e&=;hH^oO$%y!o`V6NI4zlfoz@v*&(U(l|^{D*}aeP6)N^qN`t(11sE z1;TwCE-_U+XZZ1EV7{)!ud!p$?2!suoQzV;`$pcSZ<<(ac$+rPLc zNax=`;%cKHGLV%b2h)j4$K9WR*3uzOVGb7zY{RUngWBLPF1;0Y78BbHnW||Z`HXCK zk?2~)1Jk1fE}|ZBy$HqvLz#X8DX;Q4ML_EGKMCPovWZr+y>RV+Xh@OsmWWU9*TkKp znN12`tOO}5%b5mGnDv3)s-c`3K2)1PDuf&!-6y1&I|&8R*$F;SWd{idCOv3b!hwjvcqE#tPeMoCV+BUR~N6G^$^*w;A*B36@L+Hx#rA$mjY>S z^i|R2lRvuS)auW{k*GcAKYtw}Zqh)m+ zbg9(8&D(fvYW{6mu?AwItZ<=(2!oyyOs@-4$Cflq%fEU*z1iEkBT9V1l|%3tS?RQa z|Aeu%>KAEt`iyMNKGOnFz&p{a{If%vyNms7oeUv87opn`-%PC3)V>N1F~f5Qk?Jzu z1Z52|yk@oqf-3c$p;ST-p|`!yTMh1<<{p_p*XO^La3Fugl^!D!)I#J#POCQH4)1mC!Vy0TnG)LYJS;V2X;El^Z(6b)vG_xVR|OwK+Q#>i1h^`Cj4hjVH6Y(!mudI(*C>x+ z@fcikbnI*QDGWKysiGOG0@&ORF3g-gIxl-0$%b08b~k|Uy$X5$s8~EV9}x3xYAz=# zqu?#rhoOEQn%l!&dyTyAfAOX6GFxrfZ5af^!*g@06$ctufZBoL7rnuX5;_ED7!ri> z%4pk){XLB`rNbxdl*2^NEnM?Q@w9_p-H+WqnZ+q&L^{&8l$0|jR>i$$-BnnXr-KS+ z5pu@ZL0<0fXXuWh5Bv~N|DB$iyc{2|Gnol?x4zK-v8Balhi9!d>vf6xqUA!hggYc2L>e zP9xKjk$P3he4rDmiqd?ylA3hVYhnjeE!nPeoi{wS3-u#TTCpl7=Sh(W5fsNNXRKn4 zGJT6w?KK#Ebl94?p^TZQ)pKxWJR3RAp&PT;MsxWCt$qoq@gviZzIKhQ25pJ)OL}-% z)W@9ACe9xdW~CAS+Ep{R2jhK@@;p%puF^G~2pm{#i#b?}d8pBp*2@pc0jwNF!<;Px z|J{t#MZN;;Uz^U(nbd?g6z-Q<$`q*vnDrX z_P2%SRNF0*t~-Zd$o{7pwro_F}?Uh#-*zOAqFf0PsrT5>x4EUoVZ)C(o|W zE<>wFq!$_do1+jOzaKRbvLHkbf9ZF5$b7*%zDb2DIJnaywz&V$ZzpkM75EFZ6@hm` zXRPe2fu;*PU|aN6BbLuS@f&W$3xof^AR30>2LC{Fb?w~)`bK;A68WS|SqyKYm#+c5fI;9> zEv3zCr;(?G7qhfnY&Apte)R7`Nj6qM3i(E=<#($Yk{|6hE%o?HUi81c9D(H)3FQqO zRDM^QUm(*gFF7930AyI!@AafczNaIFYBdj7X_@(YT+eNTiaEWFZDR}~!KaIA!q>-) zllLk2y`Ko0MBFOFb0K9iOqNaa8o75PWY)_f#7o_o@WWeSy?2iOy%mcLC}F|u$)fu1 zb+z;U``8{2=AirFuR)1Yp)+0{Ev_}O!og2M#^~-rgSv92smvl9;gzTmD@eWsA|}aO zoMi}PulY0geE+?v-;G2nT7Owl-74;CFuE&@+dr4v`Cyg*^*^WI|AQm|-@nB_pK!ItLUW^9btiUf(HDm`0oQ zCKRIz-IaQYKoF(Hsf@5qu(k=VUthV*K>OCke%N6i>-GUHp3G{5^P`jP;qA^@OT$Z$ znc-R4V)#nnj{Hc2K%8oD8PDI}yKq(%bdmNBr~)0=&>hyEENSk!v5t#G#azr=U@2nK zthxPLGHeW~uNYM74@R~SRTyt!ux$4CCm<|Z_Y~~4_4q9Be)H3Ld0x9{TBoVHcOiC< zm+6eBO3_g4g|C$^!K2cWa~NxB=5V51DmJ9`Jllh1^0qzr$==sRLUdTGTC}}CJCs*B zIe}%l$qRg>mbs+<+bW&QCX*HGEEr^|1dY1T9#^HEu&#!ROo-;5+FStV=--&^8y|cF z2N5%PAfUi^KY-f|2E&7<0{Ntddvsr~4*HsMhh!MHRX0~lOS4Oa48{D%&)Fk%z)b`fxns18?mkU;q7~rQ~epAJ5nOOE^gJpDZ+Pa`^F$XcLm>} zOx2C}vY4bX7KHdTk$s_&2aRTzy^@#UAR=7EIVjwgQ5T+`-LBJ6`jgK z)jp53S1_9-zdYFd%K-{}Dmze(NG?rP;mYPw4p4CbBpjzk zr{~3xspv`=?^q1xFU~f|4x>P!SL5SCLuuk&4gOIiexLd;h>nqi*tp06?dl8Pz4H8a zMdXPEe5@uqS|-j43`?=HZmIvfUpATlXl@Mkg(a3RzHhk;-dmu!D*8-y+)kb8FHkLy&&;b~@>Ri^%o%}NQX{nbsQIr7dGXW3 zN!*gO{pc=nF#M`7Tz=7TeSeAELHN(tIoSuF?)wLPPes+eXI_c(m(4%G5++f}83Xf0 z53@-bd`rNCd8Fn!PRD4R6(b(D@@xcx<+O4e77fuviW9+n}iGVL1qp@69!c3DS z83kxMn)J5s^?$VF`K)g^rl9PF13HwX~u!*HHCL@V?(I93$k6AX?+Pq1UCd(fyz$);nQd8G|VXr8w=sipSU4X$BBNPD@m9 zEmNcrE2NVguumC=><%1d&*T2a)UmWB6AX5u5=AmXH>59unH;lUT+x6YX`Sqbmd7td z8E&y=RW=S=78>oR3qu)?z-@+rQ9S43I8YKTx4nZRIZxN7M{gNoPW19XJ znc7vwICx>x3&<{3tmz&AhEsEyZvdFZ%&1#z{`tl(Ue6`j)-m#4T->}0fizGVpm*gS zd&n@mrHTKf_xaH*HPQJ;IKY@u=p>RvYoM7Pf|2sb*61xy&zVRuuhfQS399vhb|iVG zOELy_H&o&RYWsb3xjsEfc4&5Or2e`i#nekbi=DLArJj_CIN)wB0jWfNq%FG0*>M4^ z5X%ojM;);&Q}q=SMCVoh)O7WX>hqu)`o)g1j>s>v_umfpW|5`y>1z-&qq+TE!hdm% zYKtgZi+$TgI%UGfs`Qv@YK!9bFTR&7UDz7(PX;1NNaQKv1-%p}v0A8Pgji?fas zx|iy`c0^6P;q&=!)Fsy$A)&S`k$kZJ5i_4Ytv{lv+oB0@Fs_`HV=i-K@#fvAD&)CD z3*gzXW_M1MK{F~RFom8V><*y+`>SVC&U!N}CH8qt!h@>E57 z$&;)M?>yi44ng(U`low^pMoA&L?-KM$-s**)s(XQuA|b0s*ZDE#e%DC zgI)0}ctKTn8!-yrtnBM)!8GH?2y}u>TMPy4MoMEheUhs(}H%BU)&O(OEZlBQSI3@{43m=et;h^ z7cdTYG1t~j7P(Uo$OxGEi%9zhx}Yr7on1<_mBTpJ%gf-I<}7UjTCQ ze$fVAy9w6L;%AjW5yo<4kw9vdx!Uv^ZIR#9|3Z){&B4CUgnP{iOUJi(ZAN&Z^AB&3 zKtYgO{hD9XrO3T-fz|OC!DjtQ<`?>l-iO)=Ed!|JsHX$wR}iN0wZ{G6yaeA>@AWL(&8x zQkR9Z+~_I6`b=zIX+{anmp;<56Pf8p7r9?LYY5e9udl9pMG3yH0zXJhU$}oo-Qg$= zQRy0XC8zKbTo2>>-8`+BcB!8ERSU8<8J#OCPW@<8VMT)J+&`G^4l4(`F#=>r7(3NY zWOMn#d1RI-|BPOm;+~rxE8IRJJl=qsvkx_F+JlHYo_S=i_5w-!oE3h|A*XIeyQ5Df zlr@-iU&5fnWb@Y|_8|~30U8q)65|_lmM^$yOQ`4GFFS5vd%?Ys#>N$Y<2YXut-SVG zwS(rs_Q|h@fUl@Q%{XavyROLh2J`DOdz1 zrNAHvjL#5B*4JFo4f&OS|1w5WbgL4R3v}qNT}zshFWmKcI=&$HCQwz0QUR$>h*b-% zN6)ER1-s2A+r%;pN=O6=;Gt?Ar9o-A<@!U7n)(;oY+@rxH7PAW@s{^;(m#NSL2dCl z;>y=po1>*)-ySWDM@_R>z>jyaG=Ge^6SHS_FH6}XMtbDLAY-s0Ik8K&^OQ(|Zww2% zPua_u^abc4Xc){bVADAc?qAkNZ!7C`-W#^s!rMzwo#Oa{T~+ncK({r;U~Yk^d#KLe z3bZc?vF>_EL3&ty8K?*ku%)1&AdpK4>E5_@mC-J6)E6vxlFGykr34AxY@r5=&M+kh zgw#mms6|RhydvSs1MPKOT$iM6Zv~W-z1|x26Gw16*)MqL^c*JIi&LyNKuoFY85JqW z%lML05Vv|1y5i41ayLKss^@>xJm(z%eh$%!L$O|q(l8nMbb~%#(IPb=-73dupS~(V z1+nAhI{e{+w=AO43|!?8Qavg5?X0_64E5<(RDkky-^ zD4bf#IyBQ@r1NMo;(o6L;dZaZn88o_NO2D3hj18|BRqJ8KJj0oh)DxEfj?eTn7bL-Bl)M%2q4} z5O?;X(VSiCqm4wxZIIF-;V?#2DfIhz<$xmZb6`r)4lLI_=>RW$*0nr&vdd*x%&=#F zmskpv44|e#86?6K_;PuVE{z-D_N9kGqU*2wLxWCpPA<&RKdCvP2mHlH?;}n6oEemy z?&lmoW%0r;RjUI*1cX=}laYdFK`9Isf)cSXBxpJ0->EEBB}nVxa8j$hwAaK-`Ha~Y^M8eSL44O0REV> zQKpL_1D%jChwfg@B3JXC{BD+h{I7WZe|$Di-xWiA68gs+H6=fY&@J*{j?gZwzMzqe z;kXjsu8n=tje+*p8_pa(#t2Z52OeQv*v*gs9kEFoD$%D2n|`ukPG~CHRiCrq2FH8{wnyW=28py)4Z@c}Y$;2m@hN4AuP-g5PT^Aq zAxaxMHepx;AP>X7nUE_EO|icA4=N5X*lV1mxox89_!Ru7w||gF>=S9npwmA1TYJE+ zARo^`j8s`#*#J-b;8zs$J!hmf)Cds}O-wMMa~9G*t=MPrs~_j^lMitD=X)FJ0Ww5%BRD*F-bN^NS^}eo$>9*LvZvvj|?t>qG@y+98 zGBp+bq2V)MJZ`%rNF(4*xK(eD~e_>TOr>+-vu9RTtnG zr1K=9Pb-TcOqZ+QHeV(sk8JH>V|9~_fcIK}o(u4tQBW>cfEh7Qi)qk{pk~+92)6dZ z&>OmJ89sII!)S9A;grDZ%~QscIM>V35TPWq(5fxRxx^c=MIqKWL}EPz3TrE}#fN1o)@$~$mVP2})T;{-ySm+Vhg|{Aj(Bumiwf|NQewa`+o{R~Af)r&62Qp=a1hmbVZO8OZ9YaQw#BqR5&k~B$+%z3>%MFM4r8ocVxX7}c zv^bTW(XjhkiO!~d<6OR8JHT$%JVMEU*>1o~4`0c*9zMit`8E_jnv&1oe};E{@RNM% z-iJBe|0>5%S_r#T{sE*icoB9;KdA*1+KenZzE7R zpGruZC3?M{jUGj1;{$gd;pmA|#0L&gRRtsg$Ot7h#%QdW1Sv6c0i}1e@E_M%OiZUW z#T{Qb%J<#&q;+eezYS*)b^!P}M%3wyw&GQB^OZB~n+Z8yfk7jXv@!{D01}FhfJF$? zlp$?Y`%08Hgu?{_`!)QTeLPfjDcaw`>+kq$Za=!ncfI5=S57V=Sj4a9fG+5RAXhk2 zj?_xB7KDJ;a@CHNKz#hz4S@H`?@P-{4SYKu(5xR9PB}+RwO+ru*W0=-V7-RU2EbkS zeT_ox$3`u({vtC`#K1U9bXVzi2}-c(%qk=r`r6}&qcp;Mn!pQatRdBSeV zFMj{a8}4cc3@4^1&ijG8QNlAfNH{r{I)G*(w2f88yu7fp1M7z`B|Zsn{>x8t-(!!!M{IIe^~Px?3+drs;{CzM0m_6#CMNU+Lkx)=5CGPM$i=gWcn@)V55?d(df^n` zd)vzqtk?U!P{6Ri0pI=;Upz+Tcc^?2E4bdWz95Z8`qhe2hmqu>)1{V10+%`&YGLF6 zt0SgpW5}HGglO@S!xD|Cxyk0D94bpogNETt!>K;p{YXjFRaC$v6^F z8Hq(w$Vt+{DJG^ov~k@0)8Rq9xzF~8+#uRq28a~&QU78LR_w^T%mLSqIAZGVz|-GW}Wi=ot1c9M!k+S1ZA zr*Lwcs9l}w{txh1cRh%jx(bqrt|$nLAzrLVr3T|8sEF)5455_%4oEr==U2CNh>v{w z2*OnBjG(ro3Dgb%{{~`^4H~Nh-}0>M`I~niXAq0!s+{rhRf$(RX*b7fEh$C53h)>T zM$^{4xs&WU_(bly@1J=^H~VE9O*io;eNkXV{uvK#UK&J0S&r+yi`%72f-QLkiUC-rfIm-@exkB8y8d-Osp^<1hrxj_dMB)|N&_j9CwH9?%9(**D-qY`C&3=o+X z7AR$c;~xg>#A6R@EP35tC|KF~sT1sN*qPY@;NL)OG=%blFFnjJ{;z+=OdJ3p6fq@W zv&czA83=trCJHP$W`$Mts6B}FXkC6ii~SUP;3noKy4>>ikMjrLImyefx`Ju{1mpwI zDM>j&D_nG{D1@~F$_bF&_0{fG@AeAN-2}!*T=H6iaFyapl_0+KkI1JKm|%NvG{5zp zPw@G#WyoC+m?c6LpyO#*J%UD47$Hm0mmVNG;JWNcrpzcokmSlk3>T29MK}KnKk<{d zZ+IwO=uOA0spx&=(?@7~`_Keb%0t%ehV?*v3mhc%oe~0G?BVr~@$@TZ8efMC#j|(r zz3VHPR(ibck3Wb%eJdsfsdEG^h7wv^{VEsGcHOX*b@v~#JJ28VCc*2W$_51&pH{BF- z`zuZ%;x9ouq?PnQBxC|a7!!mF(O+=-;OA7T`#K!(Q6+o?=2h%OW2^fhdjNv#)>U6l zoH$`GmSV>Fh$PLelFfkmci#6IWg5NOdt@GDcQNl@@_^Jd`jJ4tq zObM>LqC?Y^ZtDUmpbQ4tx{8qmj+`E%W^N*@LX5<+b0seqYPBm)81@ z6XrJ){%zj-ZR&0k7?&coLB+>x4MkYFU&Q5|LEx`q(hiqooXoCXVse*ZojqW%)u^znj{KnUPfS?iz9%JYCf};nv!o zTDHU*yXxJrHl;1yYF}ILxRB0*O$U_$-ufpW;Y1O@l0_Izt~`(df`u)=rdxXt(qGKT zZAv~o!P9o1<=?&Z@)~@9{Yuox)p!5?{bK+A{o+z9J1M2a?Ch)?6G z^~kdPF;&p6+SBIU|M^wi_s-k-PcJ*jp2bH9^1HF=9M8FK|GM8PaUulUEt(9fMqhv6 z&inCdr&Pbl@tIg*z6Q#;nIKcEg>|YO4Z_Erl**D!gH$cv@u@FdGS}c80KNs|M{m1q zyn>4|#mH)09UWE0EioWbCL}NwfvNCHh4eMbNbK-oihhb#vqX!JaCO(PPa0a6U(ZAS z3wX5phNfd*Da~6pr5Ryp*)(APc9rN_Y!Egu)WVTR!FuQ z4}9(QN*wq5_FwxW`h`cDIX-M&F6#>06?7qu@7j;TtG~Z_l9Ga2F$8D6F}g8x9Wm9i z42K!l?rAqNQD-mU`?$0;XuQe3bS&lMT)yHEG~=UCi2D1Y+A{Z62;h5Y1bHF2?y3Xp zWar?*w)Ho9A3yl_pCGXc6_-d1S}Q6Qpv=|>5LsW-neC!$>Vm++eU! zO6=diUx+Orr#dk`;Q;wWM;Ig{K+ZQv)>6{rXI}YS9{P))=g3C?%ou|;KE=iNk#p%L3^ z-fRbepI6|vew#ad_?hgP-Rs=W7adQ-0Ujgfbftg$I-M^omg#- z4NPItvP8(Sh6u`(<9oK3FYvb4Je#zky3p_UxsX-A!Cmp>}#T;L- zoLXq6nmZlR(;}PhXFm=n_HwIs8Jna+u6&-Rk z1B5I&t!4=Pm`<9~FG8yQPe-d+rtKWN7XO~b?$tcPwY>h0y}a`uPs7AM+SB{s)I3>u z4u&2ZQBXu{xdJ}=na$CqaI%M^XaV*i{FQ>?TQD{Pg1_~yJ6IT2WLbtS-19DlqBGG& zkT%jxMjP^`0U^>u8Nb%nF$l6c1vC&&v!~KL>$%TeS6z^7Jb5*EmP1z}aYTVp>WOKsj*cM^ZU}E2|b)9@xXhRF-H0U{*^0?$h_v%NJ+~i5UTI z6_HtJ+pP~E1Sz|th-mQ#G3Yn4}#K>DC=;D=X606t0DEt>^!KP zywtARZF5iyP%Jp5lfe_*XVJ$_ECCD7%6?SswgIRB_m_Sw~*#c+bY1)_aa{UhA=)TFYL&#-bgO{Gc}(;RfRiZeEf(972VdB(#B)>uR>DQ9IytJNVnbqp^!ggUs7zkc9e zKJe%Fb2K{)S3I9&{&O&4h{Ux}K$s37KMvi4B-tTnU+*Ol9d(~=7qK+4EH_vsk1k_q z1b7MNY`-A^*&0$+uAOQctA>>~g%ZJrKyR~0r7JqKT~b}37lsHah*XZ13aw_j%pT|8 zefM){Qh&J^ZRTAU5pZ4-04OCznWDtZxRP`86%pOG+<;emVdy?hiH=5a_ah~Nutbv) zt=Pv%kF2n0YiMtSrmohDOtn2;{gN9usD4Xg>9G}f-sd|eCOTqvc6LlrITs)`8L@LKf4{NORB-wT?6d?r`jqyv2 zU!v0it-S{+wNH`l=4AUa-umz)Z+KtC9rne<`#fwMF-%T?orZP`f+_mPQd(12xT^Q4 z8m@9MyMbBvIjCE0(mD>f5e|@7$(Wv!mu}HZ@o?kovQcGuGsQ-&$N&7!Pjb3<3jD3R zB#Nq_G$HL2CZ^g%Kz}&r21pCRGp^mwbX2a};xDxH;G@N2R`QjHw@*t^<0GYqAVp-3 z&K1k`VDLgJpfn{q3QL}zrZN&4xP3^j*oQ{L##=cA^IW;NO{ddt1U1?e-<05cZPGWY ziZ26k*$BK-Q*FCWf!5kK4Ja!tKlj#;G9O3FYeO2mT6)&naQs@yH9*-vPYPIpsSvVU zHtF+Sr_!P*ya;JhDqSFbO(~tKm5>5WiNP{01sY8pbqRwhQeBXwC8-^f7K8ECj|zdC zWp-)&`~fLFv`vVkE~oqXxMQ_4wv!>x4gi0Q(R6?+EKhsN&G=~s!LC(5i~SIU$4U=O zyTX8HKsZvKz=brIZ3UMSk#3c`8% zgBkFyp(``=!o6#*c16}+C7_FC5I(AihbzirHGe!0Jmx?9-y3=0a+5cRnua$lYkfuo%B&kmn?+yUs{Ow8i$YgYbrDdG&XH z3#LJ(>13~W!8F&mYK(xmHU%TTc(2zR1MltldTlhI+UxaL$^~&bOOlqT$VbT9+1eO{ z2-noUWo;66p4YGOR}K3&&AnJO)ap$$zF3v2?FKvrK%pCy!*fZ(I@BiF)-O3=THFf=nfhSO^ zMV0vDg{w%%3qaQ(e8eHP#wQ>|n#wJ#6^o;ce9T}GK}tuZXe&7t-$;M@RzCl=jMx76 zf@AIfKrUj)6QWjq9bt%y=IgsW1U=T>0ATM_r?E0Pdl96a zHX3~W)K_|>VrEkQB4_EEqOLFQM z*;0RuEs|tFk_?tRUe?1PS9RhA*(HB(vch6&+>`Y+GMeO_AN(Y;K_Yp(81n1@@W&Xl zv$Kr{>(dS&;;Q|7$#jJg9>R1`$|Em^uHs#TJAtm3a4i)#qIawWR9Q3@`q%XWkN3E* z2TOh8C?u=|{l$!6@Adp~=XSpBt*4RG-vt~bjE0c^3$|N2z#R-74Q2EJAm*242X(Rh zZzEP$z*lTUE%_kK-Q94^LpI1Z<@;r|wi|7}zxii(Qmh>GC|3aREd$+NPfI!D%>`(w&it%$uDtB(b z`Suqu+m4x3A+1`8DNq70_SbdXmp84=vG$da1XYHV9!4hw-3dN*@530geH&Lh0Q|Au zEJ}&AVbLk+(GB|ewzn#+mCB57c4?LuZ_}cX#v4CIjfOCZ5lmr<*y)LT30{7J$j;M> z1A;7LK2lWiUcT*@pTt+=?}7Llun8i~oI;8y-0nQ72U|Szn&#x=Qb-Suq9ov<({o6jj}y%85@BG;`VVu}?#XpLTgk;%;V^vao?~?U zkxzNENNPh4$^fA#|T$! z2*@u{_)=2l(Dn>OAp;$Ax}PH&aMpG)k0UnHqrByYLugq5hQcaRUExQ|dfJ|s zAdR;U5IV5!7Kqac7gz&DJ=B$Hs7wbLq;x8apJrH{(6K3zpU`g4bE?|I-Mgpw*542K zYW`9u9k{Rn_BfEb;Y%-B2I56~xf;H1ZxRlKuWSJg6W6mIKElP+Hog#>uSW12|LsGZ z>F0>Rx~j$qd~ZQ6xDt}KAK-ZjsqT^G8F6PX-}0>MH~fDt77%QD{Uy*l`4C1;Y@0n{ zB$p^e%j__DXn0v9!S`!FE*h*okwGUax02T7hqQ z*Qcmvt^rjLiI}1)5GY#V9umEpptaWb!O_kx)R|{i{VUX9jr&`pesocT^&58u{Gb2k zCNzTUpL7)+Um&GqVycZ)?Xk-wwyNEmH{W|y8pEKpPC+i5#^!K*!P0MV>8(}Qwmc7f z2Y^2wz_S6^y!{7Wgs?*js|bX3!-@Iyc+e~t-TGiO?t7xb5;2q|iS$Thhf*m_RuJlx zJ$lGw27y?@$N@@y!6pcmc58~?n|SN$J`1J{x)oCMp2 z_#kIX>43P(Icp2(J^`}%<>58m2u7PMD)8&y3?YMgv$>DCJjq=#S05fwVNi@Ok zZBV%ES~o0hWQ>;<-28-z#=+zZJ@hI!IK~a2gmFA@*&+i17Lk6%pxpY@jmkg3onN@G zu9&TU6*ihd*okkBXtkS@{QvR(&$9dA)sUS;&>__YEiXW$(ba%fG^!ZKXi_w3t<&ua zXqI^V`EkSTTJ>Z^XVJ18SJy?^qEre+i82A!gjlAC2x*m?beQmh7u<@%@|^4TGe{Ol z(t->yY7RjJM%Md)0jUXq$Oy0=sl4=9wxvoc-_0qti({yA5yCDX{Mg+zb=&(FP)TYB zfNzBZx7%&xfnT+!&7MlTao$mOXO}Z+Rcf@a)-Aq}l)zMISyD<#B_@zjKvud6bz~IE zgjnM7M)cPlq*F5mG74jBv`b)&NX{b?dpu}+LV*TOkq@@1jZ$Hl?#Q}`3@QP&1-;e3S zX}s7c30ic0pRhW?Gp^mgAxOJe(t}yUV4z0uP%q=;TwYg_hTCFKD5{E(DWKq{*8YoL z_ue-WOITMHU97zb9TefYVw_#BvX3gB%VM<|`s5RY;YV6ba6i8?mViN;)kFlt+d$Uo*a<@;iL$Umk{ws3f%mz_&;! zrNlD5a-~8HFje`%ZB0*2hLeQ9%we1gUclJ?r46xGrG~M|z|5co~F` zDs7vM3;I~Y&zCT2FQ*m;ja`6U-7ZT@gB=k5O%{3HEDZ3^_n)MScLS00fLIT~9bID# zzAu8Fk@ZleuGP?1Tt@w;hvfilMeI*vd_^4OTszU{t*`r`71w9De9sJ#pEzSV9Wb8s z8Q~7G`2e`01SzpAb=9Mgk9_(_F9$G325G_0cn7fC~&I8}b`SNV9 zkD9uQRL2;qS=rq zYHzx3`wjrV$kCmeX{@%q@`X>~+KIk%oeLs#R`a>+$|1kyqfnWgq39B@@*vD9g`%uw zkV@&4It&J7b9`e6(v&Hi5}TYVijnFH!eEMa)h7sZ`nFH|Nzdb5CvM;k?~5qo=cD5p zTIB#lizLY)m?96nWv=%KaE~hA-kL#7K=~G%o@`tgn~4YBood#Y{?&Kh!Iw`b2S|`ri?1>K@=w0B@p1i2AU(KtjVS5y;He>&X{b^{Z|e`q736p_CahZQ zZ!K{3m6y@vGI%N61w}mLjJ?EaSxu+7usw`;;wYpyOu2tPT31K)`ICrrhk|HGHjvJFZQ zvcRC+`V~Mixyym9BIChRLk>Uribf#3(LmCLiY8w2SPn}~!ZuQlvw4e1t{sk-`s+H3*4Wj?L7RjRZcIgK48C-Bh1e8jhG;d*J3shI z*TGv8Tb&2K1HjKiH1TOm0)F(Cr=rY|w9N6>;5#8gl=0m##V7;JXTZcL<9;S&jxss2 z^f4cGNe?By!0@#Vj*ZT+YwBMLy9t`b@{UNTsMqZNJ3<}mygfw=B@AB%Tb;{ zFx4T?773$Cbe1hUV1kn$Tt*ek&X_6~gY_sM)I9L@N8D!Mfp4UI@K1L=%&F)QC_$GL zuSgsi-{O(#3ZoOI8P-*iqTw~kE~+KB)!H^0HlJEpsCmifM?qjSM9^|Hh)jnZ+|#NL z&~v*dFUositdl>L+rxBcZN%jGMUFO-V)l95_LINUxCTZsJ3EWk+V1eew`VjP@4#Y~ zbN^h2Y%!zVNsvX%#PsZnvcU3Zi@Ly4gDWt>+De42R{czd71}~k6{O`N*;1by4z^G- zXv80Tx(;-Nsi5VphI-OeYpVO3rwf+pWoJ(9OQcEpz@7JF<@#&ftg^>D0Q@3GCt7du ztr5KVyPl0Ua$Mol(qC~HuFZZO2e}kZ5Kp1ULsBDoB4vDXVr(sjhM-g2^DfaU4)Xlv0;YmJmBtVD>La#z+8A_}GK`ZGdqc+vZ zAyc%-Jb(FT>B%it{eYi%%X=Z{LXqJWiQ|8(tvloO_i@X?e%MFL>QQu7v^}aKr`B)UHu8RA{-!`wkr+pS} zN@upq*~}FNUjB3c>m2s)aHkr+4Pztkfj7MU|Ks5#fbKqmfyFK*^owxSqec~CCCf1g zzu*ZnYMsvb$`~e+R_r4J3)*tyfq>Wi@XKjb2tjbm4TlJWc8wiM#{tK6!Zu?_>7k`0 ztSPWw;kpw>*0dY5{&{Xj+2b7mevxBhdP1z@xMF$A6>TmHjw93pg%{DWZUGo+!Ow|} zp=Am{l1hmVhxpzZq;*n6)`rV+g|$s>OFRCzvN_h~w6r1CidZX_CR&^+G{O#HXbYwW{QJgr%AGUGqVX% zT9Nq^Fifxyf2c7tz0^)s8&yAg{Q{%*g3cg_kYX1DLIN{?$?v1l<|{;w5IIJ8Xc3M- zl+uK@PiXs4R;av9S#>~E7)~J775KKtkKXcBBJ#$=XLfe>qVB#;3MdA6$KQOBsJoXa zJcT!RKYHT8mfr{Ta7Z2|z#>n+>cFO{Dk&@nrbK-(mkxYK?vU0D5HiPC+rXG7Tw+qh z40MbRp1|jd8@PY2!}tHvyBa+UR^E^MW@lNNU$RM>?*Q>_5E~^_2Kd08_ftjJU~|U9 z_nl5{FK^x8rLPrO4_$w@Hgq=e^~dNuUita)Mk|w8G)qxN9%ZOf*ZSizLpehhfzCoE zt6fZHa|HSXFFkzOI;Y*yn!oMv6Vd4re7lI}C6rM)F4k${@jRL={Y|k`g}S1fEnw|g z`hLWGZ~&c55oaY+vsZFzVbHjzZsnos9RPm5fX1MCh;L6fM4A*MJ@V4M+@fx08ENax z^!(Y`dNQVMTU1qREMYjrU}QyJdZ=OvnJm(J;??}je|dzjidzZeCu4`lz-uvFG>9y~ zcIz8m4be8G<@Hu^!~J9kEfB}&)%RzPVUN|NJy2SCekTnQ6(=dIFPpOzxUE|%tdM0SCwN}+#}ld|BG z_dLRFulXO$J&OD1h!?J;w^I$@1~J<>cLMKy?-w|pPU7cFM3qZQvnXM(bm@ortX$p$ zrK!-q!XKZlIR&6h3`t3B=eXsDLn}^+_0RV3lP?=VRQLOhC4hCLtWk%3Qxq|L1=6`X zuZ)L|&+~~d9$WW34O`ogX9s|vF96<9=>z!Q7u{6f{9%3g`B*e&mBi8c0kD>Mm4>E} zPD|Vf&quNrCW*0ZU>Noh4zx_O4uQM?_JB!uY?ilxM&3H6U|C|2i6HH9ck{2h4biz=86np80 zm!5(+nw1%qPK3x;fn!?;X!!(T&cQt`e&yf4>{0LJtM;_HcA}2~%F69W#rXG|vD(VW z)$>wEUOFQpRTn6udhk`@V^qkyKYUl?OvhFp#M}Yk=P5R-Z2ic0+`{ESKvDCUupSyU zo@|Em*Qi#;Mca+yWK8J^GiEGe2Ybs@s5<158d?$CyPla zTTJ5-hI43Q5*c9ha1-nwPWo`IL6-CRD2T#{v{*neWH`*2jQmGkwGv6Y9nsc?e8r5{ zs7N;&blhxFs^$Kz#8t&ZFXwY#{Cs0)cPkHK?f~%f6cZDj#v0yiHy}?>!-$hB*3wYU zZxvjikj5Kx$5%=nE>;m@qQxWeG-Y-#B1`bftGOe+kyrmu1KooR6Ad;e^y=%1Lv-#z zH0`G4sur5g@^B_Vda?$La!n;^-z9l3HsYWE^soIHk1S0wOx*_Lhfw0c`XJvVI@H#6 zD@K(`31BNCBT!P&FDz+V;Ke@O35&HUT36!=&fzOm!$!QZ9{Pn0t#xB3;*q(OBTHQj z5StuKLAEV+fk_m4tUj`K z)0t0R51@JZ3C!R)!+e1+pH6t#9^&%veiI+M>k*`UbZi}UB6fAV^m;wJqaD5l?g6cB zw;|~_M(`is^rsx}EBfV-s-Ai9ln2^UYyui_vE~GI5{NF5mw*gHOty$fkMrw4|9y2e zSU$?CH@x!3Cy_@Uxn}{1G9g-)}!V7unp`i91-`>*|r7H1sF=h#r)eKd>{z6r^w zxq>?3P^aQ;uX%Q3gMhVgqOGkpo*3cZ6iIW9ls5ts0u_|QdoghEy^GyP#)5FT;7I|DYS747g_gOe)(+V-@74VgM!K~ z+W_d2G90uh)FHH-;qo8=Jx5U$$l!^*@#J^&iQ$#Zw`&6zn~>W+t;m2HqI?V41gYKw zksHVqHesQE>{0c0FJ^=raQS}!FYct5FVHXSSZ!p`FX%5i;N6+M^jWlPp~%(u#40V= zly(r|OG#lQRa#Pz)A4iCVZyVX``q>5i{_T>MXE+Me*ccUz5-E*l`$swXj?#S{q=9k zNwO^Cw!=?stgK#)R%w$WlQDwlT(_UAW+F;eQW}HtOMLC)8=viB%-)&klAJmQHYe&T zbiRO+8X`D4mys>?>CAS?3qg_$cp$l!qi1$=^()`Zo8R@Za|hy4xC6vDWAdxD-KgvO zy5IZ&59DpK#f+d@q#(j?xnwo8>3BwKvxEcTa@E(?Sd^FWqGw%8%DL53ZoYDc-Q5sW zjzv-F%9;7qSV5I~6Oqp(W`zW#K!ZPms4NF${pa)@}P@h5Q#m1|-m=Zx+YukyMH`2HL@duG&FOiBE zrbAjXCZA~0j@zWgfPCTX<^XY+G5ut%MsutJ(qcfiWC^7}sQ_Vz6kfzj4o@~Zg~7#_ z9(**wsS$kO&if&prsai*^tc@$?VNVm5fDFd;=~RR-z4EW&<&c{rs6Y4PCz)#?#Q`Gnn;m}DXi|Hv(iyf zE^%mCjwz}%Jd<`1vA0~{_8)jr<6hrX{g0(rQ(#vlDw|aMfAk*s#$Pr+5-Z=AN&f63 zccbL?fvr0L{QLqAv60pEw0Dxw_R&@%j3!P`qg22!^(j@GR*{^CtXUyMPAcbJYnchi z4`5MfG((XPRHxa)0+CM0gM$pcX}lugGJ707JHf}V`##?AzKE*zGHiDrS$2w~zlfcj zbR2N|S%ghs<{3~t4Y4#qYdVBu|Im0%7gHjr*XuQA^Z$H*k7D+Dq_U(kO9XL%F&(7o zV9`iv2-KxlgV3Z%`2X2^^Ds-U^33yhBF>5BE_t)EvUZiElB%=|OBkU6%qGAvrg3A8 zO=Dx5e%b~bx*LWzZqpVcciWGr2YYA(jb@CEZJsd(1I8Ez8-u|h0cH^{Kr3h|NwrsH zW#!Gh_r`Kg#F;-L?#(T3sU(#uqon-w+$SrytH_9RzVn^;yx;rcYBkcKMK~B~iKI^g zSUaH8?qV{_gBX_8-l-@ovzH{8s(@0)qV=6F+VZr2O(n#8!?pSQpNvmABz z&`4$qXmDmvJvgf$h;Pt4*+M06snO9N@fhzT7(4Jf@9sJa$c^r@5p)q zUKbRmV)1iHdDCm2Pj_JHcnMZ2gleF53c;B>`pTpnbxtofRz)~jp}Hc)7V^A7nni`? zsDBbLBu<+JyNzV-1SgXwU!1#~k9;ddh&Cd%G&&QAV`k)#>E{`wUGR<;sQBPGcILL~ zqVg;%p;S*o$?x3!*BprqY6;g>qp?HEj&;t8)$pSVv3hD|gC330MaM3IatJ2_d>wJa zGxsnN_^WvMrSZ<1{Rx!{CXb|;mqF0ul?N15yq@Szz^;}z@4|>QTg}3^7)sMq;mzr zKAI~93SQ7s>OmhhOW-4E@@0+r!-sol&T^!iR{rj}Xvni(fS=)Lwc4w8Xc-=_eg1B? zhx25fk3eH&jxyO9)j#gpHU^0!LsAkH5z^JTRwGbk*%mATmVhLP$xVcoS>cLhCfOhb zzPF7d;dQ+8mMwhezG;Ha9!Q&LFE6AA^(2YoLOv*rdF%jmikSKK*!yudV&UY%nC8ob zI}Z-P-@rcq9?)ZkGOD4vl5{>n;X&2Yh7Oad4(nV@CD zK=#lw!`cMb7_u-!wkDX%6yJF80>1I!1-$$>KE-Qp{ODL0zLgQQ0y>?I1tPw#nsU}+ z9MJHwTYkX3GhhM*Szc;i8^BbW(yV0+20c{h;31GG`eI_VanMo9uBm`ue&w?(N8$WJ zj~Bh<#g&EW|MDYya0Um<=1YTi6`mW86@^&K^>0YiHPRVTFpZlbF@?#Q-{A}2x~p<7 z&eZI*cf9~#gBWMDF_cD1`-SCssx6ufR~5}rdH(pF7{wAWy_FX(n?olpTb}VJA|#d? z=|z}Qn|!FjtYbyyw-G+xfZ z==+{z)z<5O`T6g1%$^6yNu*gUbJJ3%c~~S4m1Am=gjON~Hb>eVS#sa<^111BjtjRm z*|oV@`95ojevhLbedBxg;|p6g-lfQv5JzUEC$W2r7C)F~`49e#%{wkZ8G|Cj zNWBbfQ8nU23)LWW3%Z4n1?sD90lY}Pz}4ruW3|6`UvdeTU3RIcS_gJ*?y!AQASgkO zEGP8}%IfgFf;t?4je6u(Jk61GvqrWWeB|%H2~Pswg7pIY35s#N+h^?A2KEH0bnuiw zTgdbo)DOuc(iO5|f*6TG2p{RrBVA1@J^JYs%D5=wlbeV^VCaP*jfK5*>>T!@m+;ZU zS8~%QyVwnv7fqKcDQGAwHw(!$jd1f=eCUZr|Hf*+0yqEFS4eeUAmHxeaQ95Qs5~Q_ zTG;Up7lvVK8ELbY3CKwYWU5JK3|=&yV`C-V5`~jYY}>XyvF%K3+qP}n*2Km{C+5Vq zCbsW+Kir?ty?0kvJ+*4pDaj*P|Koaw`W@&B>ZiaG+xK6ME8$gvQ*4++uOAFs*|q_M z2AQ61YC>B4XfthEV(N%03w!PQ@2tgWlF-^{Q(1&!DADj~cur zNNH9r4?HxKnMf1zb>mj4OjgdZuGmsgWfsh=&cm&SSZ=a6519 zJ&*haJPg(oDmNq6b}I~51(~Ohn6#6?4N!iGQF$vaO%1!ZN3PXDkOlxF!jBwp%5pQZfo`@O}kdEbi!k=-ocdanc zb^?}iREdM`*nNko$9m#|Z6f_G#w8W|)4R)IhhD-iXn+cx$9o(lNCb zd;*-DEhAs`@1nL0I!ekKQs-9}+^<_uGx?OH)b#FWg28MA&%xqU(NLXLxkxHWtmD>< zya<-^Cg`6zEb-xY4;PGweBam#&2gNl0375t?Gcnu9>OSx#&Qq>UoL=C^r(BBNCsS6 zBF+N3_N2VdST_P_;#@B}(;A{vFca$EVSIf@K`(doNN!{DXAcUZx9mNGZ-;*v^muSG+w{Ty?pm5)ObH4w6*SgYymR{%_Ji}i-bf@Fraft499y^sFH{yLof0<&<7g_y$^ER(E!CCF z)vB$ajG1%S{Kkh{#8eF1s~dK7#N>_Go5iTYF?J8B-0)n=EMlDr5t<7a%gtAMn3R|@ zy3b-|tp8=HVFVM|Jh;TgE`YFDyiq`*1e14+&U>DOI1o+Q88x;gn&=Kg#Z^+aAJ`k} zfNy=f@cjVjIUY^OPq&^}=qzg0V;Y_nay>Dpi&^jkylrxAkS;rc4s)1*b3q0@^3Tur7Jc>{%onhZ3$SFOF85T3NVI z8Gu2m4Bu53i8h}8NQdCaFivm*9O~w7fBiavLXg|B$$9JN${XV{+zl1+=r{`EBi#Wx zBf8RzI>7Xv)3EqTVUQX{!jdFNS* z-ftZ^+-QQp#R15pZ^daAB{pcE)WGH#(_dT$GA-j?H|Rxtq; zZVMQ#h&A})5ek`JMme>0Mk{Iq0iKU8v^&OiIm-Vs?OpAhpSE3~$wXTeV!~B~It0!) zvGxov+NN6x9M^t;@;ekDbTI(dTU@xvOHC@o_8mqIP?$3_UE=>G1 zz8;u&l^M=*v2{`Kk)l2M#SwXkNPG7Z?CG>?r|}6oSKn8e+HF1(0bkF*d%Y8b4qhVJ zaq$hxHQpmK=&`hrL@*orh1+@F3jNE<*yx++Zt#J+_AR~FpS>@eV9x)Y5cR0lZQmKk zEC3APL}I7%5>lO9|FDCTOW)whwn=!(B(V7O%uuek<9*aVp#Z z%Mn7a82%Gjzj9RBk=%dX7u(-)0A_nJk|_6sEwVmF)A9#NoME`MOF$V3QsD9vjFxFN zRqmc&!3!=@sSfaOzyRTwEjJ8t?MbX7wqT)vZYd>-N4bxyIgcjvOR54vkwyg%RXQq( z2k(?j4gL$VUSO7@_B1zXpv`V$cs>5J12ye!|1#pnLoY%eBA*s3keMp`XE^LKVGzsU zpU7Ofvjxi}EV|SPndDL&>tXOu&W5!}Ggk|j7FW7sDH1ehF+EXbs^6Bkkck(u0 zAE@&rCZ}1cwZ!=f(1m09L<|7B3 zr7;$`9tl<5njO0}FmJKlbUtzE2?qH;8@PC5%=d4oO94ACE zHbAC<(;L>h0wZu{|A!5wC|XJkilSU;CNQ41{xYxKcF!O_A4!KZFq^DVuM18-eDg+$ zAmsE#bNECqVtF}!@$2g)!(KA=!_|tkTvj4n2;)wbLdB|-jh95z1$>x5|6u>o)7Z&L zDi0(Fmhl+mI^ezLS0_WgS)<3fe3BTMr{lM>GruO|iiuy(Z-2(v1Bn_I$fMUO0Ir>d zld04K*8tyaRz9Gz?r)i>0X2oWdA!<}+xN{jm-CW)g5?!s zii@xpD+gwcKx~ye0MQHUR!~{ND7>*~$^77?No}3L5luGQN`7$VFnS;7Ft6lWAeP}H zJdyW_V#=Pnb$~`EegU_C59_ynXGst;38pwQ{KmHE+-=iquQ^C+qe;P#rTpL6<)P}u z(Kw6F6?0&gV%4(2pj-wez|TLe+mHPZSm(_#Wry{&t^`SC38Cy|LcGbPR8bCMu5jJ7 zITEi;5&0VtUg+zi#|kTKuZjHYNEAUX2t1WK@)1O7iOk9(GkFQnd;7$eG+vpNy$uwfe|&~YWhr_8ihEma+V2$0tn_83f?E;~OEB6`-G1$SWHlbh(=;C2 zo;v{o+qZl&!w;AbZ>7%?FWx!~5#tg|$0c$9;UW}gqTvRi5_bHEl|q>SMIjA^nrgl; zrqk$53f5h``f%@7UrQhjO89)5ZL+|H9B1+7kA}3%GMe~~mY3WEE<231h&lX2~F4C`K zSbdYe>m&-38|7fN3RYvkv1bQyXo6s};*^fGYav76NyL>c%UKXo?qc~jXp^?N6+G7y zbp6&l^~pSMoAcvc?uZAQEe}lg(Nk#nj3f!sY`TK<8c~|sNK(Bku;Iv+JTk?WMpBJFbiC2|+q`yH14{KD`v(icNBLc-n_pbaRBnps{z;|c_ zx=P+{e~)5P*Sd{a7X}-f#U_dWxJ2H;Y*VCbA4~rB_}KmYXwYzI`1tISLdrkKX4W7) zr2zbKyHougrrwz}W6aWbh*~$JTqKEJ7C5Yo(4vr3KXgoNqN@4}y$iBvxo^ak0}a2{ z)e~^xuzQZMH9X=)m-7oy{!-n4Ib1=(Y)s zyzV_IlGGQJ@qd|`isi?$Yb&U%Jf6T~<@2O#T;Y55_rI`l$YF%xErZb{^CdOrvBq=k z1d3?m#oFwyg3cqttGu8!eX$yh0TH=MT=<^ReYaI`m=c8>Qk;fQ&+)^;(@`cYSPHb% zOj0+nP#CF&p^pLwf0j0|y2RSvhutb;ff;Ugi}8qaL9IUe9ZnlHeW{d`aa(B=dzlA3 zkrjs6yu_CQ;t7%%tM|6M&fL>_KL^R~Ez|?=ANudfHmiS~r4{&;RPxhFRoYflJ8%u6 z=fNxzO;s2-TD)`LX=xL<_Q^-FNEH4K%@h)#_hES!3w6b{*H+Rg*iE=v<*8FL z+dvGMR!7a?$(8>o6_`jL|7F%NJCpZQk!Podx`2@;=cfRrvs7&YDq#~k7d{}tK$h9m zN}9n`LbQXL9r*_upJ$8rl`CZhFu8lAK7`gtFA^V;Pl;a|Txw4y9~d z6aR>C^B!<3&KsAfiDSF~_Bg{AfFr^s*S2tIhFTBk_iC~txYjfNy&Q=a!s9{@PLB! zxr{Zb4mn&XCf?^bUqY_keJHuEtIFROX6ZbO2V>&`!a73h6qk~gWUs>4zE?j9Z}z`$ zK>hE4L{*OKC@B*8!qRik8^0x3-HQm`;p>{{1dpmMS%OD-a|A70dPO`NAES-ggw>BA z`kDlUEElGBRp$8+|Jw5tLG9I)Xft3JC9OW5NT-+3)bnEsK_dkK_$~co1a(~#!FA3I zs0%*KzB4QEvF8S}mMd3E>CQ~hP~8zZbF80A`VR`lpC5}3J!)JH7i>by7{=NlunJMzQnIKyaZGvohl4EaLO5Q8|^r4lzv~aMeQ)N1X`g_R})duO{XuUGSy7 z4sQD(CUL>3r`yhzEanbAY1oEr!Uv6x?PIH`WTMu(L2m$vS=PXn*a4asDN&GFO1b@B zuoS)O)vRubg!rS}uhTwH1*WQ*DW@Q6fh~xBpwY#h4H-*J28c1&Wgo{d~2K&OF_3ME&Qg)n_qgG8F?qQk( zwi6EMJn47E^_!v=ql)Zb3(wO559)?&!tF_THZOP%eG;!NZb&!r>C zPe<5)RH2epQoZ?AdtL+jXEukuJVh4S#Z%-az(qF|m5~T;_ByaES+k1Ff;kvb#|O;E zlD$Q83+sxQ*!EwjnS8ce$D##-o$dn|j5pfsiVKJ7`xU~DDgxdlR~dXXAzXcs^0Io+|ZJ3^Kd}tuoAj0LRWt zKOsWzP9vD9(62wbL+SLt_mYVi0qHd5Q)P2|T>x=)uq>3C>6HqpJno|C(fpP;9lTkOX3}^m_C3R6)1; z{=6-AD9f=K7#3!8bo>~R5He@fgi^J?i(pNXXr1Sj7!`NQs+KG3=H%);4hE?^f%#F;r}+-H>1NKtO6A5$c0dz)(+ID}uJf>%c{~bAgG?~F z)^Y&*wTBo1^$zL^T&ufJF0uK91-_t0IRU^sphi^DF8(SMQV9!Tf?!qB)auBuYg^}# zb>Dha5(AbR<$A$whR9}8+00{(|G*RkB#~dzPM;re>>c@=NhATlWt(9SWRGQZ^!)Mq zYiT>sddxJu9N?FTm4W4Fq6?#d>j0P8$>>G4Q-jZy)1%fw3^UdugW6(W_ z@&UM(l{|V;*cHlggzy6{Zd~JIcB-Q2y)(wLq*EFKiI2Ju@L>8Ow*G9T~d)j)gwvnc3 z_D{?Ph&go;sIAMCnw?J)wp4Kx@V<;siZ}T?zIsRAUO>c}yX+&cs2C$tf_pZ1+cjr} zJWWutRFwi1qFXwcO2m&H#4Z(u3R=8HtOPTh?y%k2f5%fm*9gqj{uHHRZ-BUc9n*;E zo|-eIz3co0w*ZL)PmxEikq{1}PDx9l!SAf>&f?N0A4m7tc7X|ae?@G2G`=fTM80IQ zJ$v+}2)Mju!~`A((fa}t&$hhGmN5{pIHRSlkB}6%lycJH9)&}D5|Bc;{)I{+P7S$% zRU9Qw!r2?k7r-fm-Qk&2J!+Ts<%A#vUrytQB3MT1w|% zj9oHoSZt=@MDZ6FU@eK;(kuAjU*Bi;NAhM%A5AC7jZ8>^81YjscU&dF+^=$tETc?* z^sl!dv-Ohry|CWH{K-mj$p9F`w~`?^zAKqv*X{zZqe0BNe_i;(Jn6qfA_PTXg7+mq zNEOc4Ww|=MR}^@3LoCfO+WKSZ!qd}Gj9gFG!)Y6j&%rLkmx4Jf@wWtiL1O>to_wCg z-Ju?mhH||kVOj8FF2v*lktZ{vaA;Eq88VDjou5)!;Eg&Xh!}#mFSnZ8;KffZm(RYA zgSr)1zLV1!Dd*$|UuW9j&xq z>}1O=lv^ZEpReRuRxaxmsQV0vLR+aJ3YctIrJFV)N7DuBCmUVa|2Tlk(=hg z5;(-1L?-1eIco}p^{Rw{K??2QxG0(M`=yU-?w7|RJllT#Xljmzg>>`3-*YHpmRWJ0 zdx}=S%jA9%rs4&JB*Nt56i(!)>^XHNP0mY8c0-FmDo-Ryk?L&l(7HP>LJ0tX5IaWI z0hb2%yg*ca(A;mM#p@aeMJugi_2%``A85?cb@^ODuQwkCC(8WOkCmnhSLJ4wFG zA9Rrq($4Lio)yyy(;4--u%QelWK}%a$BiIHvtvT;e>cAUeop zLYgjP&jIBh-}P*wO*9P}4AQa$9#P>`$l z4KVuUn^y|u)0;`VKi_w7zw03(Wmq?KZ0XVX!Wdr_6Gk`gxBdrQ3i}-I$SdTcVKd4X zKTg>O#eO$#%^erm@Vbfmexsd16C4(eJ%nj)iqbagO0*v;oZ#W$n+c$e7)HhoX@x10 zjwanaWWO)&Cue{g43;J;E=zF7$i|FCc#nx113Gl<*1`9clOl0M?r1_CZ;2LgJj z@Vhl2FyI+&CA|VLS>T@5G+t$FT&xPp^(Ur*5tn6atc-wt-szXrQ@s;<1&JWau# zW14%aB!0SKV3ZK~7>z?M$?O!*93Jo!DTphUp;1obuFyu5c8z6zVCI+uMRE>eg%l4Z z7Ktnd;j)J$1q=a9(Bf7{*ih;{umi6SIegzXB3@>uWdHOBYbxR1<*pgmSd*2Yd=L@6 zQT6!@M+^XdxLPMtO5$NjRuIcq$ul;NQZd^5g61W5dHQ z-^1@=Sv7TcWd1!xp2Wsv^@H74D|~u zbUESy)&AX9x6%R)%FWSA>wB^+;nI7Y&2o?7io{b(x0qE@gZgf9N~iYb4^e3>FmP+v zYVuOzMwH~h@(qy-&`v_bX-I*`G@qHZ#$MnNl~wY_b4uJqTU?Jy_Zu0?{$C5AAcT;M zt@lhFUHMy>3lUQtea~2mAhXb@8SE?x<_u(T8c~lRk&E$Uxq<2d5)YaW)a5xXK6CP* z(YaY+#OY(9{feSsGl(jhh($}`Z;TQpoxWvm)2VwZ8*50F;yFV`uyY&^f%=ihz$5Jjz9*7~nQo&?bl7VIOIJb#csZBs0v8YogAaTSkp$dzMtDsFU3;hM zhFCVwTs>Ji%;PWKI}h@qIz5U+IZs*EGIb!y~3d(RCRo%We8mZJ#YX zfxgyVsGmR-;A0v3RWkFePCV_%udGre`&dO@2T*BJGaKg!m#cJ^ryqSs=F`DNBFf<} zX&v0gPfb6DD!H5CL^;=^%e z!I}TcyZE)(Wk0em;CE05<_ixv@7h|lEkG~56KTnepqDV~auh{Jq;z2>rFte8AtzIX z&+3c;SdvnyCKL>ku7$S>j84z_8{J#iAuS89fp3NiK%%++UY1-bb09oiT@*KA{-gg|SF9#8ipn+^~xLAEawGS@Rk==k>(*Y{>!{v`{5X-$(-?ZH)_ z%nAP}ppwCpa&U|=J8b?1!%{cR2xO(!5A9Bg;nJ=c znQUN{#iJ^weoZI#R)Xd z3a`$sr1*W>I)N~{b-zEg2A%n|!MxYN7uJSvxyu(*r`-ATKSu@4ulbSG&xx7LH;R!3 zHLlO5rsOC%`G2+#Y!BH%qsnC?|I|RS=9u_w>$yhQVloh)S+T!mwf_|fx7x!U_w&bv z5X)0cE4Qk53u5fDMH1TcNhY*k_Lzu#l`a`%N6$4D6GZ2mvRn6-9=gNiBjpFFaX{=#;1bN>2qHr)Up*KtSWZi(9~*59q$3?elyuawZ&8 zf3^n-fsjH~NaJg^7#lX{2k7x}NNgZxRj?q0t19?Q<>Aqs35K}CtS3CKav&Q*OcD&I z4rcKVcy}YNEIum}u9s_;wW90kTpLBP6pCu}ALl9I<;1uLhlkr|xJ^1OhVJv{q6-`TXVrN!lKH!?34U?zlHNt}3xeSLim^P**prjs*+o z6l`TNdp1FXk;QD~5N@NC zaveCaU(->snTlpna}do3LLT~2Zrl;Yo?V;)-}&1M$V7~8XR=G$C_dRnAELhSkfmiY zgV&nooQ``Rz!)cATm<3E8!b3KA;0&}na_WsK*jh^h0@C3QH2H}hmD@TZB31;sSqct z8DsNaKT;mf*em8--aA}1Y?k8nRqCLBKbiQnf<=Q~eeW6Fz_n=Nv|FZvIp&#d?sZ`p z4v9FqnOz-pk8s3z4gjeWUq#;PFU-9dSM<(vErHKq%AL2}oLlognF_w9_!IuxTM}wh z+_44`Nyprl zU7p>e;R{rW+nXMR5;-c8E9igCuM``&*o5u}M#-a7IR$l6xd#8QCGL=rkz#UZ$2@iM z3|-}227<~~<)-)q$5JmsE&?wKq-l<%_4yERvTvBK zp>K8DOKFw5AP>P`k+`aw5AFdnWfDsQ!uLV(5fCL7uYjY{*$2=PQ@nj@<}hW9em)B-c@Z&fF3`h! zX|mI6Z#=RY_{L@7$nc0iB_>N%SmqU{Mx@NDlkTdwi~;XD4ekNuf-8W|y@b<%elTo^ zR0MXyluV0)>@Mjr8O1C~;|IY7!h`gZJ>u_(9Dy}6(Pq&3+li1TeG02 zBc>gIvPUwI^~oMHS3?3U2eo|bq-g0-Zp+Grh5`UWY*Us<{$or%huIU~!1mwIWQRfQ zzPnw&mJrIuc&zqhvs-@MT$hjstczh3LjdO8{T}CTzhytHbso@ zk07o_JJpo?!QkY59>VqRNHuTQl*~Vcl9F1y^$``KJ(kjF&rJw3sFH(^``sN(7(y}P zd(=>hz~Lxe8mC}Rz(J--V~o|+-o4MsYaN~-e>z%U<06lR>mXolhK|1A_08`v<);#> zVUy9>3_#3ji`t+@vA&TI9` zeFfZ@_f52Ds0_4>JkwXA18@?}QLOe;VmKu*KNQ$-A)3V2DdOC4hDLtc1;W(aVB#h4FsNJO?SQDZ$()BJ^*E0T&0J}7kz72lm4X3{ULQ3U6xtZt3f^0z> zIyer&EG+wk>5F}Q3PMUFjowm|8HDK8{_?Cp)Zm$n*s*KkW>^Yb8ugfOt`m7)AyH?h zXL@-U?<+DR-S8x-3l1t61(N$1$IQfan61s!ZMlX(bJGoviit%-p~w-Hwu+jTajn*H z7;9GC!;G1{jAJwX-cO7&WtMoTV#QIg64`2*>eMXo)uJ6AxzIr>n zc6wARsL5`oUZeuSr4)+_4C_chB(>}~a#56!RxnPKK*45FDfF7a+L;8&FvO{wwh1Ta z90abqh(2R*jas}K8>2cSItD7xeXmSMy9K>3u*o-n1Fv>j!=N^xqX+5cq~MkFj~IxR zuKf-HQ*VD3U=lYR_bzirfcLp6=GzzxIRj(GrVf)At>AJM2hhKGi%;cS-j$ z7&7){hY5nf7>B^?nw@-R9@*x^Q2V=%<`BG2UWj|LbO~JaM5yyT4Vlz5oVa)m9vZBG zb}6F^_gc-SPR88l2N2(^N=$N6X`5@BWKgWED1#(X6Tj8c$drlEA` zy8npkby!|-rfn4eC)X=5$p7jNVMj6AB#mVg$wG-l{voyiFyxU|$gbU3v&k|tCDE#; zATI{TU?s9bm+?9^MYM9}gY^)yA;Vt-_Q5s5hII=NQQ-b?ZhuuE-F`;AnE+E*+~d@+ zu>3mvT(*yiZu`CEAF9+@jX?q-)MYs49keEi_52{JO5voag8B-gG*z~PSwfQh!Ni3t zF;2(kFOvoV>PJ3X0pC9?Qb&K;jhS@pW%+Qk_yklfs3gdrc8KT#Dc@nQz=E44IBFg) z-%*iCfjOID+24D|=1%><2Ef98le6dN-Q>)Fowk=b*<_JzILDTls6{X>Jzh=uUXWPs zR(266jp^cCP|55Qr;|&MRBOV?gQQaE8U$?e=bdkmltnDmLvedtWA2H+NK^9*1Vz4K z(cym{sc;TqSY24kEo=Cln~=o*WrgeIQz6T-I=)$ECBLT7=jM{cX@@Gn9bw?>YrF6*i7H8PVz!7%1WqnstE`lc&qpp4 zcV{|~Mp`*!mgm40cV@ERzEfE-?%daOO>RHjLBrn}+cSvt@z)40>r5aG3 zk>c8_*=qi)d4UCKLMn-Dbnms#EfL0$nrMr3;`Qc+_3O(&oA0(%#>hF}HLT zak=TGEnz`j1FVB*$B+6rLb7Hl=Uk=}2y|D7s}scF1>J@g&k&A*x;G&u&fU;MT2TmZ z98wDy8>)cg6B3|{!qu~rX(am3mxA`ENT1u1eDo!VuD$+`wRX>!x$$`oK8hP_84EQ^ z(a9p6svrN6e&`Y>W@?;bkpy|+0r4F2>$k@O0vBy$L3^6&W;_V5^PmXCy)Z(l&QehI zgqD6)DsGNeYlJ}#Mr}p|bWEq$w?Y-IK7^60`?*JJj&A+$;})+F`t6LMoqC%;u5pK7-7KZ0d2=AM5M>gq<=QCOLP=;(pUPtnod*;uZhRVK-3_^SCfw|4TtU+|Me{|B0)`}JZkY?YUq6-Mxk9Xg97&kz+GHi z6cGfYfG`A@#%u^a{PO=y>t3ZmEQyWD@ENwsQ1ciMCj3G5p9JI1QV)WH3&m?qE;G%Q z+6K)LEgUYKy_$MhwhXuntWGU}ei8t&UaR>HFgRT&AUKiIt8TVmQ( zwa;y!&{TOhyDZLKOZeGkdVLW-6bAX!452716C~;2h^5a0g;mT;Ky@GF`lSr(mvj2_ z)t1jFXol0L=psSFxH*Y~R*mL)g;Vvuk925VVnV>#lZ*9C1J8pX)H zeji@x@PG_mAHgw|H2VS&%%!Fiq|{CDG`pP4 zP#wM@UI{9_KAN*t0>Cw`Og*%_^To4vJgQJgJe|~zk`6XAyRd)oX?$>6tV*$3)ig8ZOzTYoIp_Rtp`QB-f5jIj`T2X= z&NjCz(|*VB-itMhxO8BSn=0R-i+&zcK6^0^9&h??vccEg3`g5TJkCj>3@ZMSo4x&| zj>Nn5)cv@2)x6d(lO3PNwc}Tcv{q*o^Qhx%{bkzhg>Fk>Ky6VfD)34dV+r2D#3d63 zJa#u6{1;8y%p*F+##gazNs&pMo~ci`R_^=Ry~fWNE&0NPGicyfn6bHrI@YS4c*F)& z?TiwgR{Y*?#KZtdN+QmOrUhZUr2bD_Uk==1LucBf+y?}4yKDyi3E|eo6P;G3pa$?O zqSE}{jNv)t!b%SgG-F#{YQKE-03+f4dx!A-pQF|d5h3qLd`8w9_i!~^(XHdJS$Or7 zbwe;}X-QjT7~8U>?jneU0)LVk!}%UnKed37+qJ!)FNv0Z)_2Bbl}(S>E*Sct8YP-G z1HTtz`9U}+uv?2C){#TrK&H!Y2oj%iK|mrL-;L@OC_ATxWe|0M5bWuCMZMbah~?W1 z#lw6qR*I&Hf2&n{U~6BV-2ho|K$Qd6#4|cGdJOc7NVuyJ^y9}1wq5$HYJS+Q1i9AW zlK*e+jkJPqj-^OvtU3;J>P|}wT_SygnFHic2I+2=(&SvtzPE`nLe)&?S2aOecC+G$ zWxI|@ToSL2zz=vGN}bKez4qH8JcDSidv*6VXU^-6P`~Eew>VQU8%pY#Uw`kWy``nK zv`>YFcWC_w=PX<1{($9p=!%@mp^4Kt;`iIl^PV_fsOY;KNG6#m$SJPmy+r9CX#k)E z{qUOI+4|yP<*OD>%`+M0;tpjYl*h-PCr&cZKS={oLFHG-EIn3vkM65a)aj^4&eq&o zlos|nXFGZbx#o^z2yqksXeu3}MULxj-u3z&MRn_@`<++50cGS3T8-6W7`QC9tm9Mr z&#B{5tQMh>s~8eYZc(AgHE^_JYE&bW3C5~H>8hKLA%1D6vP@U}#-#4juXRZN`9qzD zrU76(HpQm5`khfSDIsr?=pIoFWcerM@v|IQ;5|pJT&bJaE{cj>u)y}f>#^RuvN7z$ zC^;KF?gXibx&8dDK4wobB=L(1xG&CvO85%MezC+_TVroDa86GFB6Ts&Zlf)VTOsn` zFcqkf?XZ7lfA+h3eo4#7M-nobjIa2}CN`0#RMQIOmP%<@u;4T^G9E4li=?@BFI7#w z%e)o`a&GP-u8Abb5a1K^UL!+URF}c5RIiu<8)i}d-KD_om<~ZI?kl)4MIaU7=B~?{ zu{ld3;U1POPfw~zLXyv!e6 z0e)7<%nSW*eElX8l$|8l@h^FqT)2qInv$ly4N`w+T*P9k$yVrAPJyntPB?(;dNUyd zAS9PMZBj*<(}U=8W>>Nef~!Y)YsMAL9JaQ<4<&AKVpD!wL7nm`a2uczg67 z!g@75x8Kdr$41F|M_DJ=n?5soq@-+3O-y6L@A`W#+IHux#Aw1Pq1 zAk(p|zm*|riZ1aiRUAx=NZq11fM@|}k}yZP_w{Agb4m~pk(To}*Z~5rFDmrkr3b+X zdqWA)Kk~dRGS1*J=wNmV&ala{-F&Z>$BF@7Pf~`OAaK1pQ?||vyHlt|e6#SJVsU}n z9Hx5yu#SuRZd&6ju<2<#)nWxIAKtsp)(@SxJ^atV%xIKjEg>{Aw(J+jCPg%<5G{|G%=D3x>j_LlQm+x2=bCE{oM(Cp{=e#9XC{rXU@{ZRn4HIL=x z5rO#_aLGR##a6)M8WXORfIzh6IF(2Moh{L#-ikL6_wKlWI(=NwUK?(GHe^#zeg1mH z;>MiOpqCokwY1u0E%)PKHRBH1>JV?(7?(X@S(1_Jj)6W(@*pbY_74{P8qrvxEr7=! zQ6?J7$QYtoAqQA*mahRGLb(k@c8Er_?p(s9ollzTo-IMoZiyxBSC7$LV=5(P8U(E_^nN z_~o;`FHCXMU#IT=sIP=S-}!Q>bh75DucdY4Yl|{zwcO+(Tj5&+{#eeYRsUpOqQ(S}+u`l;nUia{V)ZitM;QLSSFNh(A3#&@68rD5UBVqtZ)Vkv!UQs}E6PcsIBw!b>~YXrMjlQdhcb(tzT}0+bhX9))1zK*BhT0OcQvUWoG~mhb5k)6!R3iq8xs$cGc5TTB~sctOCU z%bB}#ba4>I;?Qslt+=Jc6?G*&9{Q*fb_RLt15GT+4WD-3Zb-q~X!vZ^Z@$}zZv-a) zHDEu=d5Gz25AeEPw1wPy3wuPLu~G>FjS|ctSscE|^#wVE141SPU++pnUbGaws%7ne z72#0*$#XF03zL%uk8|}g0~UJ4&7l+wz1;a$2hlU}LRMlTs5w){5RvR)Bb$?Yt1O*C zrQceSK9W6LWnyoC1^-uNd8mr3f8Xb2G-7*v=W89w*~^iLYl?9plE1jE*a5T67<;V8&U7ouDXg zw(lsi{d?Jf#5(gJMxD;b6K$ksq-EEVicFforXZ8?XE8LagA^aaK)XaI?u#;r>Y7ta z1GE|*4F#&GvG22f*#9{#0!j`^B!p>p+JDPhfRNh;JruZ`jf zMpdfXhz`7TIZ7tTRk6rb&&fQ340Q=M8c5&Be129P0cnHxJX_=?De@vbX~k>YAFeMc zX{NdjxffV7S9RKh?Sn$h=14Mu_oH6CZ-ihfg8)CXdfSyC5<8i`re|cpLTb3?tUgT3 zMK-4bieZTN2xchj$XuWW!%KP7*4ZJUcU45YV`7Hj^ZGh#xKkn_A4OHZr|xMe`~urZh~SeL2=zwZHymlee%%zP`Sa z{Ewz<46dx}nz21eCbn(cwr$(CZQHi3iEU$|iEVxNd8@wPx9V2ybM`*FS9h<~Nc>C3 zcctvQv%>hE)c)UX=1!p=DVfLKildAjl6Xc%Y?%>~B{*6E)|zl1h%}5z|PkrpLF<e)>HS2*4$Fb9ZdNg=j3F7Va77R<>xF%8WWl?tkK2oPXzTcl*DGAkvM7PvGxPsoB_fDPOz0xsD_eh=j58bJKYv zNe`tULr_!51jmige4-slq!^|O4kC!DkxT00y3Vz&AaU!uyu7daw;CV*1`QdDUz~19 z+hvU+5;x^lURwi+!l=GU;%Xk2}+GUYa1_G3|nau%tA~qt0w+YA_lw2xVCoS%9Lr!&Bau%Lis&?wI^So=z~#| zGKN;Aa-%d2Bo`Zt(#NX%o~%sVpha!F&siSa66^FfYko|NuQ0vHVANEV#un$saackeoYT8b5fJsiDjx>x<(O|NHF8@tTg0}ORksy^UX6yW@DDNNze7V9A} z@OweU_k6K_UAO;%TWgPVl-;TU-Ghl`K?tZ4Du$7bb1q(C(l)&rvC16n2wy7H^M{0# zn^@)evI(s&AB{$C8-wKgrf;Q^`OSqmW2^M>wfl2}5cdQo(<<2v2)Iw{#_jQtl^09B z*a@S?drr4;CGiT>85My6*^`6}9<*=iIJQ(@e*U1Lp@|uZEKf~J_uG@D0N%tZXC)@3 zx@SMRSV}-lPJM>#=Mc=y&Y zQ#CVp9XtJHRy^GGw90||-W5(nNG|*z-6ueAP7 zHkd$hCCC|$({-Lzqg2};p9NeB+++ccb19;VPm!EgBqb=SgG}pa_{LM6c3wk+!$&cm z2w!;!5V-2&U>^`FmmfUwc#eUFEW0(Zes~0kP4utOr4cy+QYba-IW|DjO&!yK>&mi+ zFolVlG%$B>kkM&Qi2IoMLoxFC*@I-RLChDS%S_w%SZ;q{edCSRe$6+qq#bUNMr~0% zK8?DmZUH0IKXM+CfJx;4+cT+HQ;4O@qFCZjUSq$16uLoJNw@%UtT-X5R+pK%5u~1K zpAg<|fMWN04d=5EV<J&9dbfz4`H*|ThUaEmyDe__mD>JOTfzOLi zJ6Bd4Fjfe@(WPTo=pV$>3^eM`_iVooHE&;Lws#>h+(WvUgHHKO@++J`E9fSQ7)r?{ z(=j*oBY-;CE}V2Gb9G4XP|{VR2r*J6i1qX~F!tT(mfK3~vdId7Mo5a)s>})`>2sqx z-NfK&mSM~iByEd=xEA^EYVj!$Z5u#Vt00G#e4b;vU==Lf}ro7msoFN`*?72WH83_l8CWl;7MXQ0N^mr;m|VYT$fvY?0w;KAkNxl*>+$l zZLrsPY;~t6Rt2GXpd_OfHhcs>yJJ&Z`uHzK50v5-k{8acqKiPH!|C)Ay85EE&HV>6S4opmB%~&%; zu(97Bq_<9Ot%#v%r05PNl(oQBQrOdivQWopuaFo(Erwg04}~^eU%RPWozCa}+%vfI z=PX8m&fDcCd&Z!4Qw5N-H#7t~S}9xelDAP!HVKvxNX98az?ZenB+`^_Gi(`i-6ONg zeEp&0$DFS3S}P~c$F7gs=3SxeOOZHZT#Kn3;YGH{a&z^mMQBsBG-AWp8HOo;RPLUQ zQ>dQ>3y24CE)3!5F>GX{z;rmC)$A#Xo@kC*iC|+mC{_wagUbcGx|LYN?Z$*Dj3@(Z z_dkKnsdFtR*ngh$G1O37gb{xKq7yqe>`r09Ba2T|<=v+UVMPbTyC(D487Zc6HV&Ti z?Jk1+oND_UC`dZHuBDGD@N-Dg#=E40)?EOBXxK)5S+zXS9^ABJ(=!lG$e zbGJ)+PR)Ja{S@@tLXa|_;v4w1KvSv;_{UaB6CPt-c)rM1Mj?0nAeU+idishdqrvxl z_kNbQ_cSTJYVijl@^tx6P0Hi>+;+Ft>vuY%Ujh?=BpS*{s#g$N+bBMQU5uwBZUls- zq9iFo;f(9aMZ&X3F{hNBqh*TY#3=xSCmx^Z z+#C+Xt0#FtAtGY3zfQSP2l=^*`_Q!HiNq<_Gq@s*sv${277A(vhr+jH$r?XnkFI53 zQb?5Nr&NIHDJ#h~{kM$*B|J4}F*?^lyEgg-3|%x-W6|Ny$S(ZO@#FR?j{0_m0QXcr#VH*7VE_v_mPZW?ED44xjBP zHqf2Fr$L~4-v#Ka5&AIdf7qT5M^LQUgJ=L9Q;~qe1*Agyuipf#r-MU22vFsCjArwB zISUr;weNm*NeH%83cU#K>(J0p*tGJu6JzwTU=YM(7l_Sx9_CE(tW z@Q=A$0WE53U2dpQ^?<7*SJdnEyh<1xk@a zOx%#MX&?icAsL-f%4Ns<8dxm=Wdv&c;CQY#Ey6~4DR~4=aFjz_aDZ6+H*{}A9is)M zq8NAWZtH+Rz+gcx%EPz_7zu{Yv7$veGA%43FNTI@IQ7YCqf#BWT$+G&QGnB+af1N@ z$-S1MhZezijrA$VYoq&}c)M>ZKoG&rVVITumD8otJsI#K-F*?JQkZP48aFHXPPVy1&<~fx2+~sIn|FDYRjme4HrSmh9f4_Vo zPUrvg?}ay0|Mk$H2-TTHfJhh>yw9aB!z`q|vg@*wBrmN*07>@Yt$uqdR^DS5Vqy=r z_TIUSkx~#dQ9&w_3y5+s5H@`)W*XVH9>%z_1`sFsS4rhvLR5_u+ zp7U>9{moVm;n~q+Oo2JJ2#5_GREhy5B6VwwRTF#;L%7=raRQK2a6%DPKVt!rmZ3z^ zZ;MTY{wHVpI#nEuF^E1cw`ub7HEC*2I)U<(RPODG@?XJTp5=d;rMwX(wQNno?J`z{ zr(!Nn4C-)~SDm6FK_*4P|0*lfF32)3+Ifj#-~3mrbzB7V&n0V1Pfry8`=n5EyVJ%? zj9{E7ZA3*Ft)clew9LZ{uuWLwf%dWHs= zIhvm$OdQ)fp^mA3$O=ICinzfIs-mqrc!OfpeV2*M9^m|<~Qtbd))4BSU-SoRTeM9F0mIUYP~ zbiVoa>j-5Tv472I)DYKGBMULT^wIpI1#AA6;_-lLNczi;H{k5@xRj_LHt=#;Ujr^v zh2@n*D=_}Irc;5Dvgk;l zVen<6{rT3h*rw};S;KbvPCUcv?90m406VygFHA;G8wEme4IwILAJnO=A?F%&W zF(c*{8R+n~NJPYYy8tehrY_K!D>PJZC@xJO^S(x(>gO|#nCJMM_g{&)!S;eVk#7jp zyy$nCsiZ$yelb@hH7?Y1$7}yMD%AI9K z(#W&M{VAm^Y$odGIBZ=$Nu?shUu9ZGc6RbOcdqh){knED0PlXqYky3h&p*cOeras( z26QaHR4%D6*`gsvDH|O_mQ=JYs4t09%2*_Vc0D)L0(P*Vt}P!Sp>6aTM03yJ$C#tP z*tN$l6Eh2+XGLI~j$1$QT(+RK5JA%C4wndE zib#0jG>;ZYYgU2c!`Oy%m|icnaib``MAI`br*!b}YMs72LJxH7e}EexBa+ZiEOX<- zL&U6*L_q~(SQ#}CEm5&T(Y5=5t8{T%)MTgI=>$FO0G@Hmo~hF^CW+r zK!qwu)zrAyqSoS1^Kr_ruN*B1hY5h^F!*Zug`pH$S4y%@#$$jZEMN(E&8F5ON_lwv zDKKp@uzHvJ{@~p^dUfhL@sKN`d|g5G$sHyKlfvRz8QKX2l9jCF>FL4w3ePC7SWFVd z>$+v!5#9Z;{^?881+f@8AXVhHDLs1FV+0eO?11U2953Hv)=-9)sDfakkyHv@lkWVE zvdy;1DJPq-4l$aa_xU$ZsJ-^s-t~(4JuL4_Ki7RCwfp+vKfHS!VzGr&3D3wRRt~;@ zc!pzNCV+aKB0CNOCwHjFNi^6vT`c>{YHwr7y9?+1LxTk+bm9@*`-PfZ&BhnE?ns{R zULHwLj5?CAeSP z{mEE8?M|QX){=d;9IN5PWKbejr2CVPfiKBR#mk`4GhV<8fV2MLB|*V&zg>xYUPasU z5EEH~4B($GT-Dk9yQYWoxI)|+^7p?{hc=@l)}5dXjZYv2Xs(!d7SNLv3G-C6nyP+9 za3OkP?b8(Px})XaZ+yF-Q8$>^UEH|t22~}63l60mk$SW$n|xAY#DuV(ZOG?I2oNq|alR?{|IB%bNHcTc zJtu#;t&z<;F53I^`~eiT|Hw0GW9n387=gqbrkd;iI{V)`^L*6$OHvBOS>jt5nhd$1 zF5O@OGy$&nJq@P3OIvhr48S83B;r50WAHntxhho#KIsWXQDY~n} zD9mBMI#8pev=4W^6^WZOpVoG9mDz133`UBx-EdZPWLOyx_uU7JScn-5i7`2#*9cKv z$sjPl*9~>%wNJJwAVnxDUG}0D*>K$fZCp^!^g42d)lOF!=#+wFycYL|PWl^N&;i|t zW1}o0m4MY_htS8r1x7;;jT#49eqxf*dViM`rh1;n>_+Vt3A$9t;Nn@?mJIFEaN|I! z5~}AMGIqrAW6CX~qRJPPkyS_)xXupb#XTk%<@hp#0*U{Th_OPD%aj`ryU+gdx%;v| z>a>4njv^u6{uW7Ec5pd>;y!gd$p4pAoH)9I|5AGT?(hks`IG{*XqVJAlT;iy&pJhdKtgHTXRr^BiR zmS~OQ%J^V)r8gH!sBxi)iWrD^LX~T9knz|bMO)9P6%*q{jTJ9-EuCM4T@UBycS!JM zfL;$d&ZU2m(EDGvW&nl)4|P?G6|zx;*g$hIyXDS`@71W2QBFZfHp1!2VBQEQ7a#*p z(QwF}9M6it1eCmI2uE|83n%Hq+qlfVa_|y3%31OU<4ngyYqKr@6M=%#Vd_6`k=Ddk z9|!Moww#EiWH740TD}DdeG~|8O|sG4kZR@n%k*elyO>dKYe2x)xx4bn7Y_)PxB<1x8c=|r@d^?7JCLOrDG&2pKmu-Km@H5s{!jV<3*dBM-s+# zdS#!y?7kbFYb-gg#_rM>`W_65tBG4FBBaVU9BZruafdpO9bq4`gqKo!o=NAiOUk56 zOwY|l4`&BBfc8B9VSkuU#H(5(%!?e5_(T%w*WsUo{28T3B2EdHhwc#79J>Naz_xcz z@QV{!G#lkcr0HVn%?L`9-JbZD5gu7iF??0gA$lTP7%L9|pfWH`yM*Fd8z_QN|M7(i zWniYPZYBaYBb>Tud_o}-BW3D)ECL+$Fw!wpENSbQW6+4PWh{}-DPSN63}RWO5v*_> zEP2d>%rJyP03}V`h8IXZv@XmUj?J;OT56uK?tDNzek2>{7CFYv+j~YKk>~B+mggx- z(|m>+yf8g6eYY$3pPD!!>SWCt7@+D1?+d7m&}$397u$Zw?X^%|yeRcxGBcoH$pCc6 z_EeGaXmj!1&)L%D2xin+=ME&v`FO-RoBKbA9VKRFIP@|fK z=@w`4XSo_P@}+$JO*XEV?F^*-pWpJg2I44lmm?4FC6-eBxc(GMlaySZ67+ZTBN!xp z#i74HporQnf8l9`4a4W4AWMmWg30T*&AwSJlq|05#p)+WNGi%CN7e@YI=T~M7gJy4r0y_zJ~eqEx13nnQ*X!mzdWsbi4qUsi*g5>!2h&Aivnu1q; z==c@?`FT!9e5l|1cF&=3H`Wx=n(H(}&`{R?dkkT7mcrV`C0A#T_u1!VOQ{`wY4*YV>-7)Ef7yw=4Z@bK&9U%ZcPpNeZCZ%9PNj=s- z6}xs_L5cu)x`&8E7jl&;j~-*rZi&a?35i2dWO-}#E%DmI1bP&)gEj7cxEl$n)Qy;J z`cy_GPq$HYiae^`^s}a>8`Exl>3seVbJQV&JfdERo>P@B6s)}8A|Z?{p@g^2DKiNe zK0Cr$D50VWDy7ABGQz;vd8pxKL2bG`Y6dsI<1py zW)DU!DS)NJSKRw)z!w(YlMKj5#JKq+^*7%~C7f3_sE~R#hV-J%W1PUTq6ik z1G5Q&EQOA7rpTt%1ITcu!hMm{i6Y>U^=>tOFZVk^ud~D+gE$Y^j?RIO-{A3>+?e>u5)(cgYXL-&HtY?r7xvA_<+7sK#9O2UwLV_*vjXZq9C zI$uLXji4bH!^Qe;&h%*aoH+e-05cXcBBh#sr)z$$g9 zlWE{8XXSCU4}INb?|&7uF7>}^ZNZ|o%t|T$K-}J!Oz#Isv2>VHCHTyO#UubCS>fa9 zhWr&VUj)4lp?>ZCB zBr$r~ETw*1t|n;o&tBy{5o1=Z%=UOh$~LcI@$f$^E@PVwnq8=zZ_FF0G)O_Yk^6BU zpr>qXuTvRz7bcQIAQpiX2y)1GyC2i?$jV6|B7q=mE~)$VEu)W5p^`hLDxnB`V+FVV z&X=dUhpg;d3dM;vl4K8;=j1Vj1#1cd(-nFQh*46mmS{^2yu+QM*{TuEF;!BZ;O(H~}w(63{qXj`vJ5F?1K3VEYGo_qpm+Hz~lD zSb1ORiQnIsUXkTnd^`<9zU+0Aoc_V^>*ZJdCbOhOx<_4YcD9mM-oxY6ol6{C_7NN2 z37udRYe9_26yt{SR;-nbRyu~ki%kSRxQ;|=zWi=$elM)SGGKBefr-o%SPGRu1IzOv zMIxpUI>x~@<&f}))hp|Isz$adLejPLRFM+%()zg<-5x*ND}0}tU5rM2S2E(^@9KT+ z6bv|+*aRaIxdzu`43teULQz(FW{~9laOD5c@>S)d8rD4kgFua$1zcICv)(q7O7)AX zY0wl8_esEMAWDa%9Wb0(XL2t5494}_s0e-UOKVcf#c1ZZu>1yQ*Jqa}k%doY>01oW zW(KcIdz`iBm(p(^_3KMzf&i86h9eRgyJqfvq*Om>Zp`b~tF=Hm#BiNk#2Ae4+4o}6 zo&2^+HeGXG(!i9g!lL*UHx|wliNV;RK`J6(F$YcX+{y`4%S$u%PElOC$?zH|Af_wE@uJVO6G|69GB~l z0z`b4L$Wgp_MdgtTpd#%g`t%dwK73qq$p7&%wDHy6)-s|xw6}is#muDrw96S1L94_ zW@X_J+h4<&R+cm8mo}zcAnowf#}QLSp5XcUrfg+h@GtId=6Y#SCgVp4CE2teUaca$LNI;2ln7If`03$SN;t)GrY5-Ss8j{sTj$0en zTnacVd4~IsM>x;D$~rz>Ou(zLu2Is!<66Y-9&6`BqIUFc!bEavO?Q5?(fN>}FUyME z8It=N6SlF5W2?@ts|kK&jT$+_-fy#|d&cSWv)&M#n3bYg*l0 zwU>gw@wpM_beL~&G76OFcw3GD=)4DKPOqCB;x;};hlkdp#as)xSE8baF9EA8WjvPQN9_L3XsvLIcXH-6rI7NS|A<~^i=)>s z7vE&;WV*mDMXy9wmf`XGp>iJp!ml@g_ONbkgNR(&#N%=qw?or*rW_N4*cM!|O-%}A znGKLa!-_&8=7GtC*PI@Y(dJwfNJ6^hm9h^ToAjf%ahhz;LC3j3Pce#8Yr!q{4S}Ij zfYf?n+{FK2B#9Nu1k{-n$;g<2Eu=7^EePXUe+_e6?XfOOz8;N%_5cJDp-{-b^9!5) za<_{XshV2SbpbBV{npr0?Oq)9>;NL?{VkN_LLJr5VW(kuftfmdUO%wiUT!DYQwntc&AthTBW$RlqKF=J74LO+a+*Bx zG|}K%tL7?3*=?E{Uo|-*)Ei>|#mIiufP2NeT3&eNsX&?80Z!r0JlmWwg(fDi?*>8+Fc)deq~n`P|3G$IDrwQ>>ASM%B({!WbAfSjA%EoDh2*GZfO)wt{i1)BLX?ZDb=SwD% zCX|jSBWtZVCC-ry(n-gF1aRpAF(62$s@-_aGRXkpZV=|@Bc8X^&+w)!Jw#KwEpqm= z7&2a8h**Fq*10OVQW@Rjud27zML+$cnK?59vj#&EMahm`F}0cxlQ+I`Uag|gJQUyi zhW+BYE2d;paLs_l%5+7{4V>qQ1$zQ4v|=WaN#LIuW9>w^*=*ppD^HSuIgJ8Fi1#_Z*E@5&L{C zVYwgXvQAV!KXG5b%e5+MVt&kVSY#-v@{88d{$~lJ>jIHVD>VlXJ~=s2n^Kmmkr{a1 zu=9|sS*CJ_n@)chN7(-Z926q-OpW2WD0Chx@w@Cchkrx>t8o)2rB5sZLolRfS&oGk zE(>=TTF>L_GVGHy@Ok$kg)uRd*MBijE!2Sj6L&?ulvFB-6PFxy=|63Y!w2uLKIL{)9~QUjKeCEEFmN^WO} z?iZ05hVQ+QoEbL+54YHXeUl^U^E~C9SUXC3fQp%cLM!ZIx2@=x=CriJjE&(i5vnY( zptW^%dfNBcR zy6;JFVbxp6qOJJ^ZTSl%N{Hf?*DMP!{l*4hKaS<#vHjkx;gJRD|2V}bjcG#^To^bK zO{n|Gw$7ZAl==Hv1BmD{s)L+q&k}&s^-J4eixx14KPd}nrS`JZC%dBSXW zq=AJ5O+LqNp|jSf-{56KfC!4>OS!Js2SMU z*~63Y0F3qJ&`?nBIA$H>UUsV7CHLl`KwGkmU>bM2m|zQxjcg!krI$!aHTd2+{L!Xk z*X;T zVctu?3l*{zg>+V$03qh}F&_6FjC5j`)B+tSj;=2StlSvsX)GY@Y`lCU=Jvsc#D#-C z6}N>2uk*KU!y2vxHthwHJRrg{lCl53zo*EJy|Il~Sx^ zA`&P2Q+Hpo%)|*{?_pvzj3uc@yR|j+UV`T;_FVDdkztiw=aQf} zpv4MI2+L&TQcBwklLPp6k1^bb!nU$Slz#?MX9dj9`Bf~?rY*UpK4C4+A!}dz%vRM~b0L^K>FYIW-aiX;?)V6nsAHKY zNQzB}{jJeoMu`27XW_4X?LG0;`akMC4fc05`9+|IwG<-O-jdZ7kIBqi|cj9|@hQYJ(#I<0Uo zS0E`{XQ_S3Ii4Td^=>G53uhjFo)lq;ZE!nbl z1#cigyw2Glo_pos6g(?DZb2}6bKSyfXqvZ=p>Iu7E9Kmad3oAO-`DtjN~0q*lV0AT zP4a~haz}a`WXUY3(&d!J+ugnf1m~$`cAFz;WM7It4;X+B22_~dINQKz@k?~c$J!DS zvKhVodr1F2Cf^6~ru(Xzrrg}_oUx%8qoP8i_G%#1c^jKU9bmCBG#ngVEcS)DrInc= zzuBC-`CKvouUTV+8TnrdptC!};LU?HyL>GMtaEnAn+3836rZ!;_Uzcs22!A#bL!_k zOkLR>#eqy_-|Xq(KSr*>y%c^_;Tfk=aTHHXOWbVS2=}$|7v+$o&N!vPYB@u*Q-<7b zo$7Vh`v0y-GC(scxqB(KTK0&Lql;5Ap0P%t5L7Avzv@t5hFt?k^)_;5I{!qXBsqguRdvC6vr(s~DY8fuZ4}cmX zN&(3@|LrCKqKp-tm^653Xj*Kooox8$()!Wvf1ccP*M75~O}_bBt4m@jwq=j<52JgL zJc`HwQ`2_7_HJ!wP0@-%rL1B!><<(oF>gvEhUVYs01B5cTIF}`o^x>a3zTW5hdfN-?1>N0fAh2&Y)eG!xZd5=F>Iz6O(}fMAR` zl}V*0Iz;`JPd3gM%;I$!!UNZz6Li0)VSRG$RLuC>FcgJk4$)V<(tCmQxXi{4D_xHj zbC0iS!tcxUT@^H=n)u;(*k|mtrJ!JGbfbh&vf*Gx`ooqYNyF(|=L#&eoLY~*|H|9> zB5V3$-MoP)5S9Wa8tITyQfMYKA?c0HKT3ZfizS4m6nEgGNj%>7@A zyZ}3~7L}m8GFNX*8({w;TV@ptJbOV7hA*Hl21`2bL0(HdC;zN z)Mi)oGCUjti$gs z#q%5;2$q;SbVzrNm3Ch@5n8tvA2VWn=f$Op76jc;-*YM7&Cduvpu?-@`*`l}e@x!ml}+BmDfVY~*WL9%XUP(0AEjf%#wo&A zLd`f-wN`ekTod^ZPATezb=QohZ=OBR_F=012Rs5hy?6zuh=t-COm9=P0#b2UD9x<}vJoYb1LHv)Om|W^2JA)^lzc~riCKbm9p%? zFVpe*?Y8`Qzvt{ri?`2PSo;%I`i_H|%)6yvXXjbFLS)6Om-0=h9NChcl%KP7{{LD* zYNod(kY?wvKrF+bT}CD&@f1-RcdQz>Wi{lawVav%>4Ahr$wCBLyP#5}aIU#K=dnAE zW`-6Ce8oh~HniM^<^K{F3)w z_&yNw{m)TSn8P|sb1s0Ezy8;7{L@`uNY2ZfKnr$Bz>J!}7IE*%#T)m?B3+qwf-^VC zCA{uaH^+`_5XL}>@j$?+CCy}z+Qj!9s>OdQ2V>xy2w6DrqZofV1h6~ay52U;eY)k1qzzJhX2vfmVReE7ViCV${u-7LvL3Aa%G0J=U%+-{K z)CkKekq4ThO1b^G#efTDZ6;X5OQW{71FF;ofc(r9$pgs(^L;j)Uq9XX=Dx%~pnla< zkFkbg$1LWj6y-R96eGJ{rwfRT%S_!q)ce_83A(puGqu{DCne+6P)FZRcpm*D5}ReB z1$pn1E-<W~Kg^y{JpVfW23U7#|DUVzN!{kC&JXlHw zH&|c-2is6euUIIW=PS)20t}@NC3#s8Lni$|syb*xYmy}_G$+;9b<8fm@iR<(@jqG8 zVP83b?#}w}a2&VN_awgU99CP_%TBcSy}5qh0Nmf7SBCl1dxGWk1-;l!Apu}6;ntfC z_Kc)&M6;TcG58Y{hSMbX zn||JI&fMYsREJAW%jP#wN+mNIn`xl&1I4Cl7TeP#h;`a|%u-qXx8>I17II3v=L=ca z$h4hc#nD+LlX7g|hI#HA-B;`a0B$dUcRF%xSYrw5d*$LM>L!hkiE^E9g^W8fLG+N< z?_FwfK8(62{Ovh>S5y1YzfdFbKTe6u;31CxmE-2a3ege;#El>}Ih?sk^>BX^&s}PV@DXxjx;0D)HEh4(pV1os}wf;KGJ0e90A8ZcP7ox&6I) zzE=o<;|j(VE#N6}iA^4E>=olzj<9(o1($Evd@f&jL!qK#5ER;lq%{`|PtbA`;q*+L zm%A~$vHdB##GHA)Kid?mGQhJDT@5`UV$GZ7WFS1d5_v#R11JJ^Fid^dy9e6P& zvBBj`X_(dvl|<3U#yreS!ssvCbq82blyhfPCI>9dj=u1dArjg}FtMjklvApv6ts|& zY>UT)yddOQL)Cn-f(4Bg=U;!oEQN4PACo~!v7k`-oudKco4<>(*@|I*SLV0?7%D@6 z7j!{VB?tJ#XeRI%1Sa^AXwYohIB+Fs!oIYm4PH-oE?#Q%?6*chV01uVnr*pET=#L!@adyuusg zkknzOL@vBmR1=KW#T2Uof$1H~Je_cIPa+fT7wgZw1^0h*n1I?eO@7hyjXogI-=7b& zJ6`6IUiTcT<+WcPVQ-t2)tN^N#MU6Fwj23oln0WeFp14Z}>rIc|VQzy}8c@pIRJ} zNHvNUrYr*&-DIv`24Pot+Z{;h@V>WWBTimCt~e`Bu6?0{PH`+`4dp4gl{y*-m|K z-|&Q)K*z?jh6%t(8IU;n94f0NOXIdP`2~&;CxR>Ots~#k{1zb$q58wlCj=cs*{G4m z9ft3-b)ofR*Dr-wHr(cC=5gNWEIVXW!({`fo{_B|WaKNKUw?Z-*@UL&@WI$Z8CmK+ zQ+A?R6<Q5OI9hVKZ^xtBqh<$0j6slBWs#fkF~f`y)sZ#ZdIAWK>XN z9%@P@u~A*^Ufv7()xMH5H(5^QOmf_J;DMFp98Sz$`a1+b;$tKK0Vij zN0F!5!{1-BdW^vHrtXmf8Z^8a^$aVl$}ks@TI&p<$-1frg^}Ww zB4&Wr%TutBFpW?Ej@F&1|5?sXSTveGx$`JS-L<4ke0+U8?GvKQU9Ddr{;LdsgH^d;wRo`l>^{qp^oe9DnHEevU6l)a&ag?QyH!PxniuFCsZB?>EKZGj_F zT<>>it8t2=N1%Agc95xwm>%boGcSf2<`Jc3C^$$x36g>287Z%nssgc>{6|U^!EH4Z zH*wR@)+090Nupwa!H9yzn8qsI8zT&l36c>Lk{M_zh}fz@7^ff($1ERAu6f2#Ab80} z`;;CG*eJtq*Fcn9IOr1b8m^cpD)adKLvMVKkLetGdPBS|y7w<{|4*nnr{ASvvv~b} zoS40fMp?{`EpU=Scf2MC#wD%=%~BLIfdWBfmTnqkhj*R0)|!Fqo19*CwD&NaM=FcH zt|UHeyl!6YvIWqS%XdSjPO2yQxgecb45nfDVs_soc1z`l1C^N)ycR6_FMmm6^Mi=;7SoU!a+Yu>iK!Q zL-^ddpAB9S^_ho*BL%q)RO6@o^DQ!Q*t*OGv3cZ?iu^xYJ?M!9>8o z`NdF#FXqC77%G~T6p)|@7x}0euj9?91jjR|Nn>t1nWaFoSg$2btHI7NfyUd>>M+msDx6@6;+8$M1p|6p5xMnI9APg)JJq{92Sb*-FR-W zHs@HPaoF#7i%W;Gbl?6v%Fo^gP8(MwKL_!1v;1~Af@AZ8=UvYd)2m2Q$i-Kb&APPM zT5iDnYu+Luj#-bJy)7z+8_Ce8hqWU zX_)P*qUCnDbYn(gQP>b?mq_wNf2-#xki*1P&z5y2cV(B2XmyDK9pZ{H8M zzMSJVkB73hP#>gGlLYpetSl2G8>Zv0v%-OR#>66ww9g|z*E(PGmiMq>mvMm&`?``e zA)4+JHu(fPaqES8=?1>yp9KnASpuBv0-6=KUti|^_wW%zR4BT%tF)@N7Zxk2^vVbh z7?wL~m@Eig^)Mka3W|crXf8(hgy2FjQppUf)fFAlL}5jTZXz-e}eCyEv{!d#<) z?{yeUPcU6ZI)SddPYtrxm_-f(UMjB!s09(h;O{%4e+NVlxep9^Rt7O7l5k=w0}{;` zv_#+Wnw+$b$iCuzo3KK38!(Lzif!W(d>f##PxJO`>${WF`(EE#M1Sbfzh;|So}|96 z&GU|0`UB#;JvJtM9pOQRXrdM$sj4EgfE*Ru;;;ytN1^FV95=33&tucqq@;8~!a6|q z?osrs1Kr!5+Eo+-?X|feOO&{Q$Kcl}oalw5@oC-bL03htN`Vg?67RbNLh8}qvdQKD zuf1!2ZuATHwYRoy+qP|MYuoMCwry+M)ZDsT+wIo2b@RP5_rJKABtK;`lQ-`<&vQO{ zTI#P?LZAbLMb=6H-F|MCuyZhmKF9X>J+I7E6A(Htm1Cpjg6A4{!SsGZ=-3Tyxrhj) z7$Ql@?X~2#(lQ{3xx{fR6@_#l^Mw8xHz!OWrZa_a03^H{9BWmT~Cwty$Tp{kNVpN3R@_t z$QmefS=tR+i3ijrGDE4cHz0BnV7gIJU`EkR`efWRL{#M}N*F$;j!ojA z`pA**fhnPwBxIp(Xz46?DYnS4(eg=gV7%4BkODWOh>_rPe&V0|hw0{ZpQ5r&5>TY2 z%8-L@)aoKG0YlIHH>%suH@}wB3c}`rOCllVFMxs!UhNK#=#_n)5Y#cakY9@O$pgKc zp6|s%oTO~Q9a`2%4V|F0p=rs74sRH_tss#MCP*JDlzgV@hkSem7;6qPUSa@jnCF^( zX#eg=cGX#nqHdHph(~qaoBr_qwmA6jl*kwE?DE~P_-spav>q+}<3}f2ZjxCyhFA!N zf302Ku=}OO17R$N`8TaUwPfPN$Jc^}6tNC?B7?3~)MO(~Iy?T*(aZXHjqCW3K-8k0 zWV#C#E6pP?Tl1IRZer>}j+C8l-K?{{+X8~JP5vYS)2k!^V3ramyA z!LTl+Zb3qjrQQOK7nKBKgH)Vr8d^8A&8y-XiR}`c#Nu;eb7Y(mH*pCBQ)CKAMs$7x z#b&adhI7hFv4kXXB|Wh0Vf4z)m8jdOiS>`4?#B0GW2M;zo378_UDtJezXPPzOg~vf za!pGqf%De#enC)h^b%^McAc3_(!wc1Ry_qr#TL$b@k)u~SQFkQZ(w?FwDo1`Aw64e zB8(4v*8_jpvaPGB#n66@0C8~zYO@QGG>@d>@dmDf6`I=}y&Q_Tiflc!vCGO&g?RRT zSdK|@Z8L&OsLlae9^_==U!_U(cD`GzI7=A3quoy(@o&xNT@+bgBv$7cp0fqOF7GbCol(rt-*eamy4ERhYR*JqB28%vKipFsY%3@mWtBry6 zl})J!Np;ZN(Q~p)ZNP_($z8Rg<+r6I+u~hNgijIsHP98K`=pg^E9BxPL~0in3^45B z5C-h?Wm{b?^IV9|IqIe5Inup7yZEtY>mG>IRE=Y z*c7XykPlXf#$>i&CCR-74aXC~G2061jR^+-my1Z(nCGvqQ9;A{n>VVxIyh-Taly)H z#{9eOnYQ5T$Ac^EuH(j$$23Dw0G4!8*d*jFe+0|lSBwv4QlewxP9Rz;n|eZQ5#GCP zEesffY3Oh(i`?qaa$PYt6RzkIzIaD)i%JfcmN@9w>U|@3?EPN0#r5I=+4bFApO~kk z-?`PLl3E4snzs9d&9h@;WGrZiB?(XLB zuHL9mZ`YUzMlW}$BC{#w-89T^>W3k=eDnpLr-_bp`cAv_zTGO4?c3y>_*`93y~jbT z;6keMu#ctRwKV?dt|7o>cFL?(gCf=V z!%@=0i~N=!nWA4_cKEuuXgW`U?5%2V)oZ`aaqnO1)&J5=sfZlhfPpWl`~d5FZ1`HS zKW^0F*;peM({o>5s=iS~*^&79LBGz+GT+mimmk3-_LJ(Aup{jDbYB=u2hpS;?gApz ze+=q@7an2M_UbjYY^~6{?l@-rCqhae-NnJ@po7iS?7s*UiF8BDF2&R5o9I1xc;z>& zjYC59iDsR{Zro^k3A@)mhxz025{d9(Y1T_neb=iQdk2fGZHxNq%{F1F)Oyn5;FWbs+WOlUzDBObuEy@(@^DMbKbp8 z$%%RW7JFZooUhI0{X9Slo`c~znz%Is+CGN@1*?`dfjwlj8$S$x$oBcH)Po<)L z)v=FF)yEGEp3(6_gOhDl4o*o#Q2V*oC&TK7~nBOuw(l8aRsN?s>i zoZ`!#gH}-?e1%~^s7js$z9&vSAC6Y-e>edsDJ)I^@nZdhOT+;Gk6o16P2>Kfc3xpw zT+*b}V?04^Uz$aHpKqM4zoGhacZ@$hD~4^cd{rK@0@G-;a_6Kw20qQr`_!k$H^{>Z}I^mQQEu2yW(fO2)QD;vtpt25V} zvDcIhWl=DQIX%uycTnl+Z58_HNe~*8D$o{7AYU(_GUl3NjY~01g)PTDf6THbI~_ue zsZUKNFT-NPMzCBKfaS}M^iB-z7`5k%pBH*3y0+vtETQ(LW_4Tobm0LdY0UytwYQ4_S{d;Y0~rdX@fn3kG`V`?6Y+@w~!ie@tSL^HFV zdrWjHSiu5N)4XP1jIuY;Qq4ABXjWE_N`7pvuLt`f@gBbucWv@f47wv~UXM!{zfLj> zqr*)cv#$e<5!5iyNXss1lS-3);7Fo>Y6Bd-=tw5_+*=z0{&>tZyIf#v%Vi+8&$XEQ zwu-xhfmge(YijSa;iJ?5SpsAdQBP7n?%ubjJ$#NcP?u~|j8po*KcNeLZf%3=h;lK~ zuvTP?W1WR|%-$*W?#HPGxwB57W17gjZZ0p6F3fPQ$v}qkQ83n-905-5h*j6}b z?)aX3-QqNiD!CCJTA)te(yCE3!y9sNpaZsQif zIOmHkv`@k0R^Sp;A%74r&o_`R5b7#AvpYljFfNuS;YHQeJyIf(Ya@wlp5!e4DVu&f9Q^_z;EyP8^P)d4qSG z=n4FkWf^t4Bo}%}FbZtMHXK4v=L(qN>e@Gt#ICz6Haafe5gk$!*a;%qv)wstT2#z1 z;&mRUKJXL@tnb;D;{9){089xh%eE-^%R&L0R@Rwh3_{G~;iZ_u*1f0x14+o;<;2>& zy&lIv3p9*Xeq^?zBOk6(n@-7_FeyTbC*DL6d~+)}apNSBv3!%?_6sYmN&MFwJ4>=6 z)^Z-bv_fU7S*tet1Gu&&s5{r?)*jkW$AS0~(#55YaARWN)nxLe7U*cPJWsDCP++F=@ki=LE zVadPRK6Q2Ue$=9&Feud2gX6hB7b%HpY9u-|{ZZaSL!YCJUPq~MT6objvb$LE9sY)R zTEBkI_@zB|D`C6wbo)UhhpPNbL1Zs#d#2&vA8VX_q}~1qHu!thL2=|%1)EywHr&vl zkX&N`R^AGmf0vEY0Hy`o!dy@4Rp;)|y75ZLf0u*7Wt zJoMW|Q%WMxm85{|xy#*HejtC_Qn z)l6Jd-1f;lNQvn-CYPWS@NgX{H~hU3o6t<(L-MAk2Ub3KcPq6VjQHu0aO(sCp?$>c zEqRegRTAhQ*iKDX)s-k}$yUd)tS~gBjXJ-_>k4m>yvWer;6Jb_U*rNS-jfHq`^Q9f zF-KwZEryDdo56uBnyhqM#c+VT3Fh$SzX&u!!HIEDFbVdd6)j1zsJ0J(G@*I-T+3ze zDu0lDEH7_@xp87>q+jzG2UA(4-iL?eZz&n_s629Ga{R()Ro^w2t$_9nBxU1slXGC( z-}W9q(aG^;UM2FTk@-&BZ^S3NY>B-`LYv<$%C-5xi?V2!te1P?WakdU9$m;c>XbQu zE)lClRI!5saY|eDtoje~&-XKYgQayx-=%0EP1+}buG=hj7c20*@Aot+iPHo+brvz{ z$yKtoiWY3=?up_)ZLlCnF*^UH+B8O-X{)S%#wjs}h-dupZ=-)$Uu~ZMQrf_pz&CIY z?zuOSbcAwPBOQu-^LTa_UWOfy=zm4XDX(}(WuL8yiQW+SE1jYg#O_S{=rR+9 zryb-@{PVfZKu0JaQr~fM3WZ=yMCXGZs#2a9sfQ#e1;I3k6CH)o>sbm2Fs6hE0{gO9 zzVj>samd~SP{$LwehGz^EcrRCqSt-2t&Kk4PMx>O-g$ryv9k$YK|vWo2OhF&)}Dky zpj+MoYuzr+{(?&MHRq|h+vQI;#69{}{OQ#Qh_(Seqf)YG9(#9F&j3Rv$Hpm%g@mwJ z3pSXA41=lJOvP+OgG7*zXOJ80N0oq#1VQz*?>mHa?cTE(rPhrEwayN1GMA7%iMX`K z4sMDsUtKmFs+X`hi`4Ms=UNvgwPb6u@gA{o~St&wcy2W+wkw!;^6) zHZSfT&*N%#Q^N=v5#&X%k&{Q%4B~lndtbYI+M0isOCt$An4aIy4Q&QBgInanqb8*% zS8We%%oHtl8dUT~JtzYKXHtXL2F1+9g`Vk(f8_ghrkBX_Um=&|ULL%@&UA%fg<`(Q z6p^*gW3xdMi0}ICGrrK8d@EydQRAvLTr^_!O=YS4a+^4Lo`EeSx(Pzx`#2No5LZeD z4l;+0#E(Q)#8m~QeNoFoBDQE}PAG6qJ5`fsJ9j4TMX43r;*Wue42x$&mj#jaxb^vLSRfunm*)bn=~ zb~{(lwravj{c05paC&akrKQK`<>Wp^{``*Ja{7>K^O{YL`vDCo6y?+^)e9iS9l+`5 zpX(GUtt$THP9J~0HpZk0KzDqWp;2zm9eH$yEx4rBIPVdqOBs?z=5`NSdf!sTPE>=q zegTX0q5xMIDV3>v<}4DKLo3zG@N)pxbKi@{I<3KS@GrTo4p)(I9gsfOvDXhXs+>Xl zvOYvY-pyF=b$V^<=-~1p&W8AoS0T)z+z_mul<#scy zvv}S*Ez|IF#OD>vjbzgOtmMM@@45G3X_>!}03Me>KIi=pAVt>qdBYIMHi!rJOE-Yx zg9a6Fq_GSODnBz1+FC&gW4xBq{JLaJrI=DZD)v4qW<;lXF+1|TAqw~q3C)@cAw+=6 zXz}kNvTFqJvd!V{P8#{vR^M5|$Pvk{j8A~}(&|HebZ$IZ{2gcsfgqDD6`aYrDrm@6 z_LkW{vsqP*!OsO%KPgF-+Jz+d*^E`tW5F(?`8oY=LsyKyiUA@rFX^hkj%pW$j8$m8 z#)*L`C6|>S*F0O?Dd1w@vgntW;D7V(eG=T&MgU7U(`2lTC$$M8^o~cgzxJVBrf-JZ z8SMBmaw~W6xFg>{ki+Y}LIVlgXjs;bMh34?Ek`YC+A5FZw#wZnnpNvMDcbPJOV}e4 z!i0s0*|KnRL{`wM0(-b!Q3z3P&MwR3ZHEtX18!T}*SLCC)cfe}=}d1()mpSLQ1{@+ z&>4jpDS2o-BX$ENEOV}b+h?c&wIS6gi4FtCWGqlubN3qh3d7?Q>uY#tYA1I%Ig8|2 z*}I4d{&k_%D>8#+Y^-m2Fl;`^@W6P=xAeIUs1s?W7uM|7J7=M%cMRD5V(9F99Q@7p z_F@l5?cQ=bls#-kq~xt_KuR~NQ;0;m+qHTY*+^`2Le=^@5(WiF!=-Xa$r|~4*Ejpy zJ}xW{lvHmIgDY?UIq+#~(|hzEVE4U4^W2`Pn{2N9;92NV<6qbxD^qAkAY4TpnNwZf zHTq67$7;JAOkLK|TMc$F?}__JvwLVZ2G#w&*QGbJzc>N+4+^$d|L;1`UZLy2vkBVs z3<($d*UN5rYQVm{O{I?azkbZ#8Jj|&b6)WWGEY>eHrMO>yZLSX;lkhaNa=m^gAinx zPL_RgDXj@;x|)iYaZiC+Tu_Aw8ongIrj?7R3MFH87}U@#h3!_K?(>-eVqm}y&JITD zU?JR(wV*CXo<*N;&ua8rr%V8*|H}v3&vqKd@z~)NK~YGneXi*{5eUEMY>w7wr=gZ@ zF99SD*le}kE=D_ZW`*%o>l^zx3GBFtJ^N?f^oYRWQNag7AlZJS0lw2{5IS??TkvM9 z7_%WAjle*Wj?Qo|=~2I}@_2Y9L-l*eYeGyHN$wz;doOy5h8+;S`;*sHJGA?Dn{ns4 z{M||}YC{IL(;ualC4|U#^qhF=Y53*R9rNWcR=(X2*&iOnME})XS0s$xe7^V&)d4of zov+33biIC0@N%$8V}W5MKjZw@d{Z(4XCMdk-&g9A6|Ru7`E#v#VBGZj`Nc;2p|eP9 zIdqguT6M{p8V`2el|V{>lFJB`?pDL`m}Soep6gvKUOkSjZz&~Ip!YOu^KcR z6uV!!)$!~GU7tbbVq5!Yr*;|Xu^-#UH&>yn!s!^tZMg|ep~K{QI2pO2k?(^hd=5a< z<()mTcsek9P4D{de~fUFY2PjM-4z%d_R|KbNxh005vxU^yw-Po_11H2p-sp(t0r<{ z7?2$nJz`JIo{H7LQ0!hbTJ@AC|2mjdI6vm>x_ItAsrPpd5XA&yIv-1;ed}*uinA!d zLyutdC17&rTg-7-&vlod$(2eP7@~`ToQ{W$(6RMic7k=sVvIf6t}~`ylqAh+irO|<>5~(EmJziZyIf7UO1F2TzXKcitk(@gF-v+C zV(!#}O8oFljy*FAS#wiUHRCnNG~_=&)Qe!7#Uf2%$@sNIG`ytI*cb~etm~Cn=nZZg z{e-j2{Z1-++a5dfd8K9 ziHiV$z*YhOVnClesrOe>up&Zv|xq|wj0(r|EC2I z=aiXf?Ud=fDjw_Mk+PL_l|z?=K|u>cNeY^O;EthK0e8E@Zd*tD7!CYV40!c-EF)e` zcl76JL365>x(q8P|Ni%f$bv!zyN_6?PgKW)lj2+{;~~FH!k~gUq#>~vDp>*F=OZ>g z7N@Cz>TdLK9{5tl_Yp1-7(7~4zh z(FdUQb2l0^M{BXe@YKM~>0PB{P*A$=;*rijrn(7~%?j>GM#iG65Vu#^dhh3jR|FjQ zYzB0OQq34I0w+2obDz1ou?ztPG_t9%KaaG@8iZ2EdaTgu znzNSdVF%63?8T2~P2hMa;ogA9oMRy6=!$k(0V|2HfG7ES#>2zS#*Xj{)X??XzEYG6 z#Zf?`)uTatKmeyC3OLM*(BG!jUBYTXOz1zD4^)L=Qx(>4<=hB%4PDJ%GV7*;`w~&6@J50Si+$zlMQoG5nv^|s{ z@Xt+tyl85zNNYa-nZ1VTc8Sy1ldtw3w~z7L-P&2>eUh^Fm@U$?>#E*B>bp8bXmLVu z+)J&9Wyvhg6(8_?f5Bi`);@Y0eYs5dk~ps)TVniQxlR^?W69y$6<1H{yF)^w1Qf1Y znQqY_Wbx}*mB@wjZ?!0!;`C8eLhS@XoM58;@l1S}3HRt$weF|sCty-6%e#LUen_A9 z-OysPk%C;^opsm1rwtDiyRK}gc?znR1k!PQ&XHbU71m|!hxvx$FXr$*A0LdtUT~hf z`SLE45SckE(#=$D|fcopTk zk98$QkInHvyKGa1ND9mS#g*6B=KyGX4Wb41E|T9n8GxisJRH#CKG*}!IW3i%9~YF& z+#NNN=~KV)iNj`HV_e}jTjl8>VcW~!`ZQ&~PWA(Vnh}M!1PY)|0)c&4iSx7f7tBk2 zUWAReV2sP?@+IMTWAcSO+o0c&!nXI@X~`yU+X%4j<9q#OPN_9O+QHzL{W@hW~puP0KrVT!h{=@Q%C?O&he$wj; z#nAWMI^cq!VMFuXw`-6MdO1IrP!1`@+bT!tgsS(rpS#e#_k4zq$`v&|FDMBGn{5NK z-a{lGSRs(=1iWW&c5CwV6Jbcw1v&xXcr=YlfQ`@yc0+La7J5zz*e>S`{gFZjARLL* zciXFZl5TPOW94Vs`)aQo~96>j@w_4a)#4*Bk1Vp>UbZd3lfByr+K*+p1UB1t&b2H z*v96e)|XKmf~#V-FAx_NbPtNfH9;oEk_+YMoRPXAliBy@s5re|;u>))k>vgR@fVY;IZ3U|I z_DBDxxT`;Q?D$Ch!l=IZ#mx1)Eoy27j?S+G7!XJQt-K9J7p~-o-J{BpTEr_Z#r#^? z*%`22O0X_lRF(?j_8-~9D|Ha{G^^cSn~V2)7*6%zc4lN~ZnTVba;W*$p<}gbUO)=h zLh+*I%X2UIS_FkuJdy^z#C&M;<36$^#OhOL``*B_>2|zeui|T<%`nx06&rzB%h|yu z=0Jz$bv8n9VBEQY`9w4z9{5?+9AURqeIK@-qk3A{8SQ?LN1xyuKLLx^T3K6` zYAfFNpEEys-VLT1Hb<@8U{EYzP*J;rsE=^o%X^GxT$_=xR2*%YFbAbYBr>+bbs|`C zQ<}nA!yPo5oCWT%y&8g82WF<7eEI+V+`gY)E^sQb=|hab6W8OOfqGdinNjv|6gk8j z8c~*(h$p3zl#`+2kVfcL#2#7kWI-&Pr{TgzA&J(bD}*C~oqr*3B0dSi)hm8DXXJV9 zjGdWE&rI%^O^)+7RU&!Sh?rfvOE{ln}Aa0FTrZO_B23p40#I0bfM(tN)Kq1Ap_7AI6p}6Ka4#zvf zNp_{VwI?$Q?k~p@X^lCfr@phdL}aVZf+Evh)L)qDdk7c_d7CXB$1AeVHv^3@eKQo* zL=-ew>EEgGi5QXj+!+Ss-bsbGC>kQ!wd+}lNyTb!vA@~q#|X(>TE>IXBlk(tubZ<7rAaT;Hb;+FIU?5` zgnt(cIJo{qg1-OOK)8W5djVRR5|O_5B2?reZWc);C|vPDe{EI>rTw%t*IBZ33PGlg zn^Os4FGf{r?=GB9dnhPEcDvI^-7#bKA?dqKQo5f7f4;JEI{I(npvgu7ifK{*>;;UC z$cCpg_NIfU+J^EqakrdUQ#iHq5pXL?e96Qsmk|dX&r* zi9u!M)zcPC85Wg5uQ#9t!VLWEbHiT*)5Y`IriCq*F~<-_31+4U3yr7274{I&t$cS2 z2l2bE%`vX&22uO_3yCrzIMIaVh=XaJ64nzsnz7$wIG+5cqTp~!4UO|P46fFqL~)bk zFLoHzbW?32#2YD^J<$y2prMCGvnVY$ZZu65mn91Wy%0E*addJpx;pSdHC7iWnR@;Z zNyBMnO+SUOfiW<>(<579aY*dG>VGFC)H0ro--O|2AU*%gB;yl4u#o;%P=dhB> ztvR5*tR(3^JN?S4oD*xP**o2*SW7Ztmd&^x-Gw>?X~{n-9_^CnuNhU|%;q0a2rNz{ z1&bJExKx`v%nILXvEXR@2e0rwT4Y`R$y^zRL-##03f^3KI<;H}EDaACEto_TL26<6 zIUd`Ae=PsZ-m=qs;BLB8>pkO5icWCjPPSvWv57wy{=*dpJ_55eSMXT$NOxz1P@U~W8jCP-v|(Z; zOk~O;P*M5Pz#Qi^h=oa&t*rHlQuIbY%i12F4Go1{rh$H@%*=RP7Z2@O0G%HPjVv^J zs=o~#Lw+}C?{}BcuU0CU)+*lIGF!>Y%4B<1!#_Dao1D~C8;1*{SnpSKkVXon6CTvR z5KUUdlY%h}QkyE9*Gqbqp4G@ssM8!$+$zs7;UiDXXD!?a&h;oeyf)R%BVPMo7y!*7T9B8NmbQlrB~ zy)*60K2c=LGB#7E-V*c_%GTG=*}}2Ur)q~=g;!1|;?E-F>|7RWqww5of%H(V6jgE$ zyW5t-h>BvOHw%vyd$$6uDALj;kqen)Fr+1kyY(}R9g8h_+0PA;C`0JO{J}VCu@Ttw zvH~UKb3Em5SVN#$LL&yx;%H??4W;Aw+BozA#qdK@>9N%v}JJUv= zM+x_n*S@yky-XHg`F!kD^#JssSRHgFzE0Zz;O~J>1R<40~8AHo4@wjA{1+_Ba?x)ktf{ zMLM02@T@cJeEycOrh{L$WzJjlK$Y2=eYGT!ct6r#?<)8hJxswUW}d+B4WkjqufBpq zJUqGB7Lh0f8UZ&!O00-+ikIrb*#OsEEtE#m-kWn>8<*1}g-wL|&A(hR+te;efKxMu ztz)pwbWg_f;I-}e;^KA56>ar<{tV(S5*b`j6ciNeHIf+7O3eG$#YUGi9H8>Lz~p-? zGR(8wJ{^~xl9AXd)QkDX;+ScUsBn7(DHwHNt^b%pLpg|T?-14nr! z1q~WAymr>VtWaT5Yt+)bV`cs3mPHY4HgFVA7ZO6mg{*2D74*BXomZOXy~yulrSEX0 z&#MAg%S0ANq>@Y21DYWLV)0{~U~LeDU?O3bk=5MS+o3g%dCmzM(mUy3>be?MOliMT z73`fk?tkjW=26uiEaeQ9)Qk?t{TQ{C0q)@cIznGO72MYXjun*{T#Jh%UKGyp1)u%? zfhaCYl0%^dJK97T8Ammq9Ch2cqdpVO+X;1@MPcet4ZxkY&rsT7j=QzXZn_=|66%G* zjg@4w2w>|Vde=}F!A>mT$BPEsQEm5&A$3<2bvZ@FOJ`eZ37iR>Vgnwz@V`fXU$q=( zG|J2?+x72e{YZ2rZVt~rr~y;r!xiZ&nwJ;E;>wr)=$iBlCOZJs8U z-XU1{L-*?891_f8KjfS3?~x$!dpTn%8nbB z?bHf?**-67h#zXyZ^QU>(9u^`*Z-uRb#gjnOvX{j(hT;F5uuN4M*GDZz`5t4S7Bk~ zC={b$M(S9}#VC5t;%U|4(;!|Ija|a9iVzan(b{mE&gBQxFueG-?>n{ONMV6*xm3?w zV&9BZaShGeehLVE%N3YX;33n=WXEUnp%!_buPI*bceg*XSXXOlFc1?1a)a= zw{_Ko10xLBntZ(>`odZqBvEBD6)B4yrICfiz?dBegI5u4b)}sf8x)Il+30n(9u<6o z6Xr$*E4r;Czh54>zTF`Dgg1QbZ39g2L4$nsGg?(>Y68%YoMWqe9ZzqnesayaASQsh zDLR_3cRix1DG?bdaOcz+{=y|NSBr4R4jmYVh{K1mD#L_DxYmM}=GEdi z->?J()3QfBa5;w-z`xZ0tjJQnRbSk6j^zq$sD^VGhdZOir}S?#3@+L9Y-(TAj_rtW;Ug1o=~I36W@CnyP{v(Hhq<>e~&-&+8t z1_d9x0jI~0w-3h?&A(530LOYlMnW@iNOWCpc333BdRULChA?I_CNuZI#Uw{}(=k^< zq}w*R_Br>H(7E__o-@Rgvhu1ZOWY|&Rz?&kFdoUi>1+{!?TBU8Zb280Wrr10D&!{; zldgvp4FhU1yDxLDL^4sk$_mFkFhm;uwW9-%+yI3i7WYR|*c1{5PP>{caLmB8n#Ns$%gHkwSSyF2VH?wJ-5sdtivg$?SSp`X)ZpQj( zARcEu>jrf(tyV@PG!4{XjB%YU!_{CP(mT%YbQ7`r_BL2k*_|P9YM;({KsM(>PqPKS zj9(pcPT-RCa6R^P#`na0sF?dtPn*Zf9#>x!7ypauKWXFGPIIaHc&}$4*A)n_6%RM> zjz_HC>tB7tqnhzxG{N*q;^u>Yvc+nl1o*Se6k?MWh6@+}HnkA0KleA=^PLJ6O_DcW zwR<#D;_}V(EY;3UZUv&I<5?*YYlEJTE#lh# z{PjLXTGX;ej?tBN_EmyJW8=?@fkYsk=(QVS;?-iR^+|eR59zl{Q1{!YeJ|T>c6zTD z{Q!9cRhPR97}a2|73id-1Na{e?L)*)x!=0$h-$?>*yl6|Z`o~Icl^uYsS-hH6hI!= ztn^d`9geA`Pz{wJW!~a8KIdnD8^j><`t5mFcQ-vJXE>)1;^Ec#kQjvk(8%HN--|tD zfOwzH$SXPUb}wQ6Qj-78Em|KTavo7Kj94NKq(`_K9fmqgQV%u>{DAs&7LY6)&MMeT ziz|Vy=FDKx-d| z&fW<}w3iYvitHEe!0iRICKGamt+Ch$uLLEb=%bA5FI1NNOlbBF42VGhfCm}I)Bb#= zB7sShd%|#lv6SkE6Br%{z+i2_w3LycoV~frx#Jdz|28a z(5gxm#Etf&?efq@sS=86b#7C$BjfFRt#j0s9+_&@rOOOc6ijm=Gfo($V(Zvu(v7Hy z1RYzEVKm08R>*C)I;_+}?HIu8%#y4morB9Fqa-KuAabF&nclhlXc@-K+h6v|t8eap zFVecL=h~TJfbX&Qq+$g0#*?)dNO^YofYhYCKA zW0qifR+JPG>B1o75Xc5;7+BaQ(wwy$=th&tcnZBQSk4RNMr_I7rb&e;@Wk09qQRNK zL7A8B{{j~GHL+sOGWM^yFI!Ro@9%3ZdEzQv{?%6<71KS>Go4*cWEGf|DG!82)XHaw zM6To=rK*fnOdet~chjp{QUnxa&p|RqN(a4zNSVIFDFh2iO{!;0hc%Sms+I*+S1S)S z1^!Z1muIiHiC}*bMo|ynPN$g8GXni8^@H`*)K;QeH++4PF%uS{M&n95RO$;)c4mHw znH`52%@7AXX=>mvX~IR<*{#f+{o?Z+&CezXC&6&))^6`|HBPsYuP+GfDmDsSoc|LT zNG(%cxAbtaSD$OF;QiBUe!*nt`TJt4b1{0y4rT9y$H+ugV{(Q1|^yl5h9o3GHuS{_YpUZ1s z_PuMW{gib`%5#EvvzXETHV4C%x||h@x{5_gI6Y0G&5oK4PcFCj0=#uNGlBIfioWXT z^GY+;Gy=~=W;&+vDcWY)Rw^=q6jigBo}HfL&(!bIgm$a(%Le_LwFRa$| z=dX9_>VL`hWjwe=o_(M@Gl|u5p(k>uehH<~AW=SwRFx;Qrq!mM`g1GxVfCEbt{5bz zcrGR%@J-UbX5G;*E2d6JO45mxZMv=zda7~N*PTi2ymtn?OcBM> z7w0nW5fW$oT zd*sPoADE$rkzuzXv!#_V^*qPde}6S}u2AQz7r=ME)v6_zm(SuDi@!8OA3#ws)^L>Ux^MUCb0I&AqdaHcTqn6@I1?Uo_Np$u35_e0~P{ zzP(%pK8}A%z5R&@RB7}v{9dP~)LS~7j20MY5o!7rc{(=nfN7JxS6i`iRW!EJj5W@Z zuWy_7_!UQk@m#QKPbaq}QsAA;r;0x5HQ8*fM|W=Dn(|pu^_0MSU7$=OBUg4cW;$7X zD14ecpEg71)H(56JN|rfgn@@sBbk!cLV*U+eP33mPP4QIOY>o?#%NY4;6uZpLw})k zOQifeG-Bz>dtHrJX`zXM`tzRjsWUh|L-9%U!Q)@$=H&#u-{o-C#Mbtnz6eU- zOQ8tp5r&z~2V2*>9z)$*eltJLhl3$yZ|syLrf}cai;m&Ml4AH?BBLzRLRurjiv_yIjtd~vKx;5aj?Y--5W(3XO?Kq#%?$U~mK0jJ|z9$?CL#j)UYgRJ(B_Il~`Lf`w7!Wx5i^V z?Psm3Efg$(+@P9=);(W3x%Vjz@9m3gdueGB>!HrJM%PeBV{LW&itBgI^258y@ngW9 z%gT!iJoP7=F~+FmrPIh@!K{w?QLt zrfPF$lAIY4;DpXx(Gf8=5D;)%8F3NyUJZ-4J!&mdsXui?syt`nnj15u{%TP?=ZOL&f+*52yhkDc4^n>ux`nzl>EiN;;BP)0}vk!xCC`n&)>t7|@3 zmOt3SphxZhs@tI%mS0e&sXd8bFo#faeqIG0CnXqfUtj(9ulx!rz0 zZyc&_FaStXeJ_4}pP2AaQJfNTIqxfa-ZebGDhx&upgJi-@*E6C?MF^<$-D#~oVCc0 z&9hJaG5q#QO4U-5_P5z2Gk%xcmgvjSOQua*QcJ2-3FXOKdH*=T#ByJ++5H_)0OlmZ zgegPzS^E3*&lcj&h3uQ@z`8`(9$>jfL%@Okz#cGWypILiOc3 zo-8xBuKEl=A;>{?`$2Fy$T&)l?!o75uh|L&Vetu*=NfE$^D7>0(#R3|H+L-|Kr&_X z%e_ZE(j=n((F;0J51*V?4|j%~>Sg9PM277>^_ITv4i!$+V}eNcgMwtH_D^D0dA4Vy nnfvUhl|h00{{sXhh~|^X=711Vx_8+2zw03*p(tK2Y8>)EIz*6c literal 0 HcmV?d00001 diff --git a/assets/images/pharmacy_module/payment_image.png b/assets/images/pharmacy_module/payment_image.png new file mode 100644 index 0000000000000000000000000000000000000000..ebf7a9297a1ed077d17cc8327e4f452017d7d71d GIT binary patch literal 4982 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Â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

`p-I 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 tHo$fM8&U9!WgP9a(Rq^8U(0{?Np7dZe json) { + desciption = json['Desciption']; + desciptionN = json['DesciptionN']; + iD = json['ID']; + legalName = json['LegalName']; + legalNameN = json['LegalNameN']; + name = json['Name']; + nameN = json['NameN']; + phoneNumber = json['PhoneNumber']; + setupID = json['SetupID']; + distanceInKilometers = json['DistanceInKilometers']; + isActive = json['IsActive']; + latitude = json['Latitude']; + longitude = json['Longitude']; + mainProjectID = json['MainProjectID']; + projectOutSA = json['ProjectOutSA']; + usingInDoctorApp = json['UsingInDoctorApp']; + } + + Map toJson() { + final Map data = new Map(); + data['Desciption'] = this.desciption; + data['DesciptionN'] = this.desciptionN; + data['ID'] = this.iD; + data['LegalName'] = this.legalName; + data['LegalNameN'] = this.legalNameN; + data['Name'] = this.name; + data['NameN'] = this.nameN; + data['PhoneNumber'] = this.phoneNumber; + data['SetupID'] = this.setupID; + data['DistanceInKilometers'] = this.distanceInKilometers; + data['IsActive'] = this.isActive; + data['Latitude'] = this.latitude; + data['Longitude'] = this.longitude; + data['MainProjectID'] = this.mainProjectID; + data['ProjectOutSA'] = this.projectOutSA; + data['UsingInDoctorApp'] = this.usingInDoctorApp; + return data; + } +} diff --git a/lib/core/model/AlHabibMedicalService/EReferral/get_ereferral_response_model.dart b/lib/core/model/AlHabibMedicalService/EReferral/get_ereferral_response_model.dart new file mode 100644 index 00000000..e873261d --- /dev/null +++ b/lib/core/model/AlHabibMedicalService/EReferral/get_ereferral_response_model.dart @@ -0,0 +1,128 @@ +class GetEReferralResponseModel { + dynamic acceptedBrachCode; + dynamic acceptedBranchName; + dynamic acceptedBranchNameAr; + Channel channel; + dynamic identityCardAttachment; + String identityNumber; + dynamic insuranceCardAttachment; + bool isInsuredPatient; + String otherRelationship; + String patientContactNo; + int patientId; + String patientName; + int preferredBranchCode; + String preferredBranchName; + String referralDate; + int referralNumber; + Channel relationshipType; + String requesterContactNo; + String requesterName; + String status; + String statusAr; + + GetEReferralResponseModel( + {this.acceptedBrachCode, + this.acceptedBranchName, + this.acceptedBranchNameAr, + this.channel, + this.identityCardAttachment, + this.identityNumber, + this.insuranceCardAttachment, + this.isInsuredPatient, + this.otherRelationship, + this.patientContactNo, + this.patientId, + this.patientName, + this.preferredBranchCode, + this.preferredBranchName, + this.referralDate, + this.referralNumber, + this.relationshipType, + this.requesterContactNo, + this.requesterName, + this.status, + this.statusAr}); + + GetEReferralResponseModel.fromJson(Map json) { + acceptedBrachCode = json['AcceptedBrachCode']; + acceptedBranchName = json['AcceptedBranchName']; + acceptedBranchNameAr = json['AcceptedBranchNameAr']; + channel = + json['Channel'] != null ? new Channel.fromJson(json['Channel']) : null; + identityCardAttachment = json['IdentityCardAttachment']; + identityNumber = json['IdentityNumber']; + insuranceCardAttachment = json['InsuranceCardAttachment']; + isInsuredPatient = json['IsInsuredPatient']; + otherRelationship = json['OtherRelationship']; + patientContactNo = json['PatientContactNo']; + patientId = json['PatientId']; + patientName = json['PatientName']; + preferredBranchCode = json['PreferredBranchCode']; + preferredBranchName = json['PreferredBranchName']; + referralDate = json['ReferralDate']; + referralNumber = json['ReferralNumber']; + relationshipType = json['RelationshipType'] != null + ? new Channel.fromJson(json['RelationshipType']) + : null; + requesterContactNo = json['RequesterContactNo']; + requesterName = json['RequesterName']; + status = json['Status']; + statusAr = json['StatusAr']; + } + + Map toJson() { + final Map data = new Map(); + data['AcceptedBrachCode'] = this.acceptedBrachCode; + data['AcceptedBranchName'] = this.acceptedBranchName; + data['AcceptedBranchNameAr'] = this.acceptedBranchNameAr; + if (this.channel != null) { + data['Channel'] = this.channel.toJson(); + } + data['IdentityCardAttachment'] = this.identityCardAttachment; + data['IdentityNumber'] = this.identityNumber; + data['InsuranceCardAttachment'] = this.insuranceCardAttachment; + data['IsInsuredPatient'] = this.isInsuredPatient; + data['OtherRelationship'] = this.otherRelationship; + data['PatientContactNo'] = this.patientContactNo; + data['PatientId'] = this.patientId; + data['PatientName'] = this.patientName; + data['PreferredBranchCode'] = this.preferredBranchCode; + data['PreferredBranchName'] = this.preferredBranchName; + data['ReferralDate'] = this.referralDate; + data['ReferralNumber'] = this.referralNumber; + if (this.relationshipType != null) { + data['RelationshipType'] = this.relationshipType.toJson(); + } + data['RequesterContactNo'] = this.requesterContactNo; + data['RequesterName'] = this.requesterName; + data['Status'] = this.status; + data['StatusAr'] = this.statusAr; + return data; + } +} + +class Channel { + int iD; + String text; + String textAr; + String textEn; + + Channel({this.iD, this.text, this.textAr, this.textEn}); + + Channel.fromJson(Map json) { + iD = json['ID']; + text = json['Text']; + textAr = json['Text_Ar']; + textEn = json['Text_En']; + } + + Map toJson() { + final Map data = new Map(); + data['ID'] = this.iD; + data['Text'] = this.text; + data['Text_Ar'] = this.textAr; + data['Text_En'] = this.textEn; + return data; + } +} diff --git a/lib/core/model/pharmacies/Addresses.dart b/lib/core/model/pharmacies/Addresses.dart index 74d5a591..b00b1a17 100644 --- a/lib/core/model/pharmacies/Addresses.dart +++ b/lib/core/model/pharmacies/Addresses.dart @@ -17,6 +17,7 @@ class Addresses { String createdOnUtc; String province; String latLong; + bool isChecked; Addresses( {this.id, @@ -36,7 +37,8 @@ class Addresses { this.customerAttributes, this.createdOnUtc, this.province, - this.latLong}); + this.latLong, + this.isChecked = false}); Addresses.fromJson(Map json) { id = json['id']; @@ -57,6 +59,7 @@ class Addresses { createdOnUtc = json['created_on_utc']; province = json['province']; latLong = json['lat_long']; + isChecked = json['isChecked']; } Map toJson() { @@ -79,6 +82,7 @@ class Addresses { data['created_on_utc'] = this.createdOnUtc; data['province'] = this.province; data['lat_long'] = this.latLong; + data['isChecked'] = this.isChecked; return data; } diff --git a/lib/core/model/pharmacies/BillingAddress.dart b/lib/core/model/pharmacies/BillingAddress.dart new file mode 100644 index 00000000..765ac54d --- /dev/null +++ b/lib/core/model/pharmacies/BillingAddress.dart @@ -0,0 +1,84 @@ +class BillingAddress { + String id; + String firstName; + String lastName; + String email; + String company; + int countryId; + String country; + String stateProvinceId; + String city; + String address1; + String address2; + String zipPostalCode; + String phoneNumber; + String faxNumber; + String customerAttributes; + String createdOnUtc; + String province; + String latLong; + + BillingAddress( + {this.id, + this.firstName, + this.lastName, + this.email, + this.company, + this.countryId, + this.country, + this.stateProvinceId, + this.city, + this.address1, + this.address2, + this.zipPostalCode, + this.phoneNumber, + this.faxNumber, + this.customerAttributes, + this.createdOnUtc, + this.province, + this.latLong}); + + BillingAddress.fromJson(Map json) { + id = json['id']; + firstName = json['first_name']; + lastName = json['last_name']; + email = json['email']; + company = json['company']; + countryId = json['country_id']; + country = json['country']; + stateProvinceId = json['state_province_id']; + city = json['city']; + address1 = json['address1']; + address2 = json['address2']; + zipPostalCode = json['zip_postal_code']; + phoneNumber = json['phone_number']; + faxNumber = json['fax_number']; + customerAttributes = json['customer_attributes']; + createdOnUtc = json['created_on_utc']; + province = json['province']; + latLong = json['lat_long']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['first_name'] = this.firstName; + data['last_name'] = this.lastName; + data['email'] = this.email; + data['company'] = this.company; + data['country_id'] = this.countryId; + data['country'] = this.country; + data['state_province_id'] = this.stateProvinceId; + data['city'] = this.city; + data['address1'] = this.address1; + data['address2'] = this.address2; + data['zip_postal_code'] = this.zipPostalCode; + data['phone_number'] = this.phoneNumber; + data['fax_number'] = this.faxNumber; + data['customer_attributes'] = this.customerAttributes; + data['created_on_utc'] = this.createdOnUtc; + data['province'] = this.province; + data['lat_long'] = this.latLong; + return data; + } +} diff --git a/lib/core/model/pharmacies/Customer.dart b/lib/core/model/pharmacies/Customer.dart index a5311489..e3defbbe 100644 --- a/lib/core/model/pharmacies/Customer.dart +++ b/lib/core/model/pharmacies/Customer.dart @@ -1,4 +1,10 @@ +import 'package:diplomaticquarterapp/core/model/pharmacies/Addresses.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacies/BillingAddress.dart'; + class Customer { + BillingAddress billingAddress; + BillingAddress shippingAddress; + List addresses; String fileNumber; String iqamaNumber; int isOutSa; @@ -8,8 +14,6 @@ class Customer { String phone; String countryCode; String yahalaAccountno; - String billingAddress; - String shippingAddress; String id; String username; String email; @@ -17,50 +21,63 @@ class Customer { String lastName; String languageId; String adminComment; - String isTaxExempt; - String hasShoppingCartItems; - String active; - String deleted; - String isSystemAccount; + bool isTaxExempt; + bool hasShoppingCartItems; + bool active; + bool deleted; + bool isSystemAccount; String systemName; String lastIpAddress; String createdOnUtc; String lastLoginDateUtc; String lastActivityDateUtc; - String registeredInStoreId; + int registeredInStoreId; Customer( - {this.fileNumber, - this.iqamaNumber, - this.isOutSa, - this.patientType, - this.gender, - this.birthDate, - this.phone, - this.countryCode, - this.yahalaAccountno, - this.billingAddress, - this.shippingAddress, - this.id, - this.username, - this.email, - this.firstName, - this.lastName, - this.languageId, - this.adminComment, - this.isTaxExempt, - this.hasShoppingCartItems, - this.active, - this.deleted, - this.isSystemAccount, - this.systemName, - this.lastIpAddress, - this.createdOnUtc, - this.lastLoginDateUtc, - this.lastActivityDateUtc, - this.registeredInStoreId}); + {this.billingAddress, + this.shippingAddress, + this.addresses, + this.fileNumber, + this.iqamaNumber, + this.isOutSa, + this.patientType, + this.gender, + this.birthDate, + this.phone, + this.countryCode, + this.yahalaAccountno, + this.id, + this.username, + this.email, + this.firstName, + this.lastName, + this.languageId, + this.adminComment, + this.isTaxExempt, + this.hasShoppingCartItems, + this.active, + this.deleted, + this.isSystemAccount, + this.systemName, + this.lastIpAddress, + this.createdOnUtc, + this.lastLoginDateUtc, + this.lastActivityDateUtc, + this.registeredInStoreId}); Customer.fromJson(Map json) { + billingAddress = json['billing_address'] != null + ? new BillingAddress.fromJson(json['billing_address']) + : null; + shippingAddress = json['shipping_address'] != null + ? new BillingAddress.fromJson(json['shipping_address']) + : null; + if (json['addresses'] != null) { + addresses = new List(); + json['addresses'].forEach((v) { + addresses.add(new Addresses.fromJson(v)); + }); + } fileNumber = json['file_number']; iqamaNumber = json['iqama_number']; isOutSa = json['is_out_sa']; @@ -70,8 +87,6 @@ class Customer { phone = json['phone']; countryCode = json['country_code']; yahalaAccountno = json['yahala_accountno']; - billingAddress = json['billing_address']; - shippingAddress = json['shipping_address']; id = json['id']; username = json['username']; email = json['email']; @@ -94,6 +109,15 @@ class Customer { Map toJson() { final Map data = new Map(); + if (this.billingAddress != null) { + data['billing_address'] = this.billingAddress.toJson(); + } + if (this.shippingAddress != null) { + data['shipping_address'] = this.shippingAddress.toJson(); + } + if (this.addresses != null) { + data['addresses'] = this.addresses.map((v) => v.toJson()).toList(); + } data['file_number'] = this.fileNumber; data['iqama_number'] = this.iqamaNumber; data['is_out_sa'] = this.isOutSa; @@ -103,8 +127,6 @@ class Customer { data['phone'] = this.phone; data['country_code'] = this.countryCode; data['yahala_accountno'] = this.yahalaAccountno; - data['billing_address'] = this.billingAddress; - data['shipping_address'] = this.shippingAddress; data['id'] = this.id; data['username'] = this.username; data['email'] = this.email; @@ -125,4 +147,4 @@ class Customer { data['registered_in_store_id'] = this.registeredInStoreId; return data; } -} \ No newline at end of file +} diff --git a/lib/core/model/pharmacies/LacumAccountInformation.dart b/lib/core/model/pharmacies/LacumAccountInformation.dart new file mode 100644 index 00000000..4f1d0455 --- /dev/null +++ b/lib/core/model/pharmacies/LacumAccountInformation.dart @@ -0,0 +1,1926 @@ +import 'LakumInquiryInformationObjVersion.dart'; + +class LacumAccountInformation { + + String date; + int languageID; + int serviceName; + String time; + String androidLink; + String authenticationTokenID; + String data; + bool dataw; + int dietType; + String errorCode; + String errorEndUserMessage; + String errorEndUserMessageN; + String errorMessage; + int errorType; + int foodCategory; + String iOSLink; + bool isAuthenticated; + int mealOrderStatus; + int mealType; + int messageStatus; + int numberOfResultRecords; + String patientBlodType; + String successMsg; + String successMsgN; + int accountStatus; + String activeArchiveObject; + int activeMedicationCount; + String allMedicationTakenDuringAdmissionList; + int appointmentNo; + String arePatientsOnlineList; + String balanceAmount; + String bloodGroupList; + int cVIUnreadCount; + String checkUserHasAccount; + int complaintNo; + String dischargeList; + int episodeID; + String finalRadiologyList; + String fullName; + String geoFPointsList; + String geoGetPateintInfo; + String getAllDoctorsByProjectAndClinicList; + String getAppointmentNumbersForDoctorList; + String getCheckUpItemsList; + String getCosmeticConferenceForTodayList; + String getDoctorERClinicResult; + String getInvoiceApprovalList; + String getNearestProjectList; + String getPatientAdmissionOrAppoinmentNoList; + String getPatientBloodType; + String getPatientInsuranceCardStatusStatisticsList; + String getSurveyList; + String getTotalRegisteredPatientList; + String getUserDetailsList; + String getCustomerPointInfo; + String hISApprovalList; + String hISInpAdmissionList; + String hISProgNoteAssesmentModelList; + String hMGGetAllOffersList; + bool hasApproval; + bool hasConsultation; + bool hasDental; + bool hasLab; + bool hasPharmacy; + bool hasRad; + String hmgSMSGetByProjectIDAndPatientIDList; + int hoursLeft; + String iNPMGetAllAdmissionList; + String iNPMGetPatientInfoForSickLeaveReportList; + String iNPMHISPatientMedicalStatusUnreadCount; + String iNPMLABGetPatientLabOrdersResultsList; + String iNPMLABGetPatientLabResultsList; + String iNPMLABGetPatientRADReportList; + String iNPMLABGetPatientRadResultsList; + String iNPMRadGetPatientRadOrdersCVIList; + String iNPMRadGetPatientRadOrdersList; + String iNPMRadGetRadMedicalRecordsList; + String iNPGetPrescriptionDischargesList; + String iNPGetPrescriptionReportList; + String identificationNo; + bool isHomeMedicineDeliverySupported; + int isInsertedOrUpdated; + bool isMainAcoountEqualPatienID; + bool isPatientAlreadyAgreed; + bool isPatientCallBackBlackList; + bool isPatientHaveFingerPrint; + bool isPatientOnline; + bool isPatientTokenRemoved; + bool isPaused; + bool isProjectWorkingHours; + String isStoreRateAllowed; + String isStoreRateInserted; + String isStoreRateUpdated; + int labRadUpdatedToRead; + int labReportUnreadNo; + String lakumInquiryInformationObj; + LakumInquiryInformationObjVersion lakumInquiryInformationObjVersion; + String lakumResponseList; + String laserGetBodyPartsByCategoryList; + String laserGetCategoriesList; + String list; + int listCount; + int listCountDeliverd; + int listCountUnDeliverd; + String listDeviceInfo; + String listFamilyAppointments; + String listLabResultsByAppNo; + String listLakumInquiryInformationObj; + String listOpinionGetAllPeriod; + String listOpinionGetAllServices; + String listOpinionGetIsAgreeValue; + String listOpinionGetOpinionLogin; + String listOpinionGetRequestedSerives; + String listOpinionGetShareServicesDetails; + String listOpinionUserTerms; + String listPLO; + String listPLR; + String listPLSR; + String listPRM; + String listPatientFamilyFiles; + String listPatientFileInfo; + String listRAD; + String listRADAPI; + String listActiveGetPrescriptionReportByPatientID; + String listAppointmentsForDentalClinic; + String listBabyInfoResult; + String listCheckInsuranceCoverage; + String listCompanyClass; + String listConsentMedicalReport; + String listDentalAppointments; + String listDeviceTokenIDByAppointmentNo; + String listDischargeDiagnosis; + String listDischargeMedicine; + String listDischargeSummary; + String listDoctorResponse; + String listDoneVaccines; + String listEReferralResult; + String listEReferrals; + String listGetAllPatientsLiveCareAdmin; + String listGetDataForExcel; + String listGetMainCountID; + String listGetPrescriptionReportByPatientID; + String listGetSickLeave; + String listHISInvoice; + String listHISInvoiceProcedures; + String listInpatientInvoices; + String listInsuranceCheckList; + String listInsuranceCompanies; + String listInsuranceCompaniesGroup; + String listInsuranceUpdateDetails; + String listInvoiceApprovalProcedureInfo; + String listIsLastSatisfactionSurveyReviewedModel; + String listLabOrderDetailsModel; + String listMedicalReport; + String listMedicalReportApprovals; + String listMedicalReportStatus; + String listMonthBloodPressureResult; + String listMonthBloodPressureResultAverage; + String listMonthDiabtecPatientResult; + String listMonthDiabtectResultAverage; + String listMonthWeightMeasurementResult; + String listMonthWeightMeasurementResultAverage; + String listOnlinePrescriptionResult; + String listOutPatientInvoices; + String listPHRInvoice; + String listPHRInvoiceItems; + String listPHRPaymentMethods; + String listPateintDetails; + String listPateintInformation; + String listPatientAdmissionInfo; + String listPatientAdvanceBalanceAmount; + String listPatientCallBackLogs; + String listPatientCallBackToUpdateFromICServer; + String listPatientCount; + String listPatientDashboard; + String listPatientERGetAdminClinicsModel; + String listPatientERGetAdminProjectsModel; + String listPatientERGetAllClinicsModel; + String listPatientHISInvoices; + String listPatientICProjects; + String listPatientICProjectsByID; + String listPatientICProjectsTimings; + String listPatientIDByUID; + String listPatientIDForSurveyResult; + String listPatientInfo; + String listPatientInfoForDDScreen; + String listPatientInfoForSickleaveReport; + String listPatientInsuranceCard; + String listPatientInsuranceCardHistory; + String listPatientInsuranceDetails; + String listPatientPHRInvoices; + String listPatientServicePoint; + String listPatientStatusCount; + String listPatientChatRequestMapModel; + String listPatientChatRequestModel; + String listPatientChatRequestVCModel; + String listPaymentMethods; + String listPointServices; + String listPregnancyStagesInfo; + String listProjectAvgERWaitingTime; + String listProjectAvgERWaitingTimeHourly; + String listRadMedicalRecords; + String listRadMedicalRecordsAPI; + String listRadMedicalRecordsCVI; + String listRadMedicalRecordsCVIAPI; + String listRadMedicalRecordsResults; + String listSickLeave; + String listTransaction; + String listVideoConferenceSessions; + String listWeekBloodPressureResult; + String listWeekBloodPressureResultAverage; + String listWeekDiabtecPatientResult; + String listWeekDiabtectResultAverage; + String listWeekWeightMeasurementResult; + String listWeekWeightMeasurementResultAverage; + String listYearBloodPressureResult; + String listYearBloodPressureResultAverage; + String listYearDiabtecPatientResult; + String listYearDiabtecResultAverage; + String listYearWeightMeasurementResult; + String listYearWeightMeasurementResultAverage; + String listEInvoiceForDental; + String listEInvoiceForOnlineCheckIn; + String medGetActivitiesTransactionsStsList; + String medGetAvgMonthTransactionsStsList; + String medGetAvgWeekTransactionsStsList; + String medGetCategoriesList; + String medGetMonthActivitiesTransactionsStsList; + String medGetMonthStepsTransactionsStsList; + String medGetMonthTransactionsStsList; + String medGetPatientLastRecordList; + String medGetSubCategoriesList; + String medGetTransactionsAndActTransactionsResult; + String medGetTransactionsList; + String medGetWeekActivitiesTransactionsStsList; + String medGetWeekStepsTransactionsStsList; + String medGetWeekTransactionsStsList; + String medGetYearActivitiesTransactionsStsList; + String medGetYearSleepTransactionsStsList; + String medGetYearStepsTransactionsStsList; + String medGetYearTransactionsStsList; + String medInsertTransactionsOutputsList; + String medicalRecordImages; + int medicalReportToRead; + int medicalReportUnreadNo; + bool missingIDCardAttachment; + bool missingInsuranceCardAttachment; + bool missingMedicalReportAttachment; + bool missingOtherRelationship; + bool missingPatientContactNo; + bool missingPatientId; + bool missingPatientIdentityNumber; + bool missingPatientName; + bool missingReferralContactNo; + bool missingReferralRelationship; + bool missingReferralRequesterName; + String mobileNumber; + int nationalityNumber; + String onlineCheckInAppointments; + String opinionUserAgreementContent; + bool orderInsert; + String pateintInfoForUpdateList; + String pateintUpatedList; + String patientBirthdayCertificate; + String patientERCMCRequestSummaryByProject; + String patientERCMCRequestWithTotal; + String patientERCMCGetAllServicesList; + String patientERCMCGetTransactionsForOrderList; + String patientERCoordinates; + String patientERCountOrderList; + String patientERCountsForApprovalOffice; + String patientERDeleteOldCurrentDoctorsOutputsList; + String patientERDeliveryGetAllDeliverdOrderList; + String patientERDeliveryGetAllOrderList; + bool patientERDeliveryIsOrderInserted; + bool patientERDeliveryIsOrderUpdated; + bool patientERDeliveryIsPausedChanged; + String patientERDeliveryNextOrder; + int patientERDeliveryOrderInsert; + int patientERDeliveryUpdateOrderStatus; + bool patientERDriverUpdate; + String patientERExacartCheckIsDispenseAccpetableList; + String patientERExacartGetDispenseQuantitiesByOrderIDList; + String patientERExacartGetOrderDetailsByePharmacyOrderNoList; + String patientERExacartGetOrderDetailsList; + String patientERExacartGetTotalDispenseQuantitiesByPresNoList; + bool patientERExacartIsDispenseAdded; + String patientERExacartIsDispenseAddedList; + bool patientERExacartIsOrderCompleted; + String patientERGetAdminByProjectAndRoleList; + String patientERGetAdminProjectsList; + String patientERGetAllDriversList; + String patientERGetAllNeedAproveStatusList; + String patientERGetAllPresOrdersStatusList; + String patientERGetAllProjectsList; + String patientERGetArchiveInformationList; + String patientERGetAskDoctorTotalByDateFilterList; + String patientERGetBookScheduleConfigsList; + String patientERGetClinicAndTimeAndEpisodeForAppointmentList; + String patientERGetClinicAndTimeForDischargeList; + String patientERGetDashboardDataforApporvalSectionForAdminList; + String patientERGetDashboardDataforApporvalSectionList; + String patientERGetDashboardDataforHHCSectionForAdminList; + String patientERGetDashboardDataforHHCSectionList; + String patientERGetDashboardDataforPrescriptionSectionForAdminList; + String patientERGetDashboardDataforPrescriptionSectionList; + String patientERGetDoctorDashboardDataModelList; + String patientERGetDriverLocationList; + String patientERGetInsuranceCardRequestByDateFilterList; + String patientERGetLiveCareSummaryBookedAppoinmentStatusList; + String patientERGetLiveCareSummaryCovidList; + String patientERGetLiveCareSummaryForCMCList; + String patientERGetLiveCareSummaryForHHCList; + String patientERGetLiveCareSummaryForHomeDeliveryList; + String patientERGetLiveCareSummaryForInsuranceCardRequestList; + String patientERGetLiveCareSummaryForNewFilesList; + String patientERGetLiveCareSummaryForOnlinePaymetRequestList; + String patientERGetLiveCareSummaryForOnlinePharmacyOrdersList; + String patientERGetLiveCareSummaryForTrasnportationList; + String patientERGetLiveCareSummaryLiveCareCountsList; + String patientERGetMedicalRequestTotalByDateFilterList; + String patientERGetNearestPendingOrdersList; + String patientERGetNeedAproveHistoryForOrderList; + String patientERGetNeedAprovePendingOrdersList; + String patientERGetNeedAproveStatusStatisticsList; + String patientERGetPatientAllPresOrdersList; + String patientERGetPendingPatientsCountList; + String patientERGetPresOrdersHistoryForAdminList; + String patientERGetPresOrdersHistoryForOrderList; + String patientERGetPresOrdersStatusStatisticsList; + String patientERHHCRequest; + String patientERHHCRequestSummaryByProject; + String patientERHHCRequestWithTotal; + String patientERHHCGetAllServicesList; + String patientERHHCGetTransactionsForOrderList; + String patientERHomeDeliveryCounts; + bool patientERInsertDriver; + String patientERInsertNewCurrentDoctorsOutputsList; + String patientERInsuranceStatusCountList; + bool patientERIsNearestProjectUpdated; + bool patientERIsNeedAproveReturnedToQueue; + bool patientERIsNeedAproveUpdated; + bool patientERIsOrderClientRequestUpdated; + bool patientERIsOrderReturnedToQueue; + bool patientERIsPresOrderInserted; + bool patientERIsPresOrderUpdated; + bool patientERIsProjectUpdated; + String patientERNotCompletedDetails; + String patientERPatientsCountByCallStatus; + String patientERPeakHourCounts; + String patientERPresOrderInfo; + String patientERPrescriptionCounts; + String patientERProjectsContribution; + String patientERRRTGetAllQuestionsList; + String patientERRRTGetAllTransportationMethodList; + String patientERRRTGetPickUpRequestByPresOrderIDList; + String patientERRealRRTGetAllServicesList; + String patientERRealRRTGetOrderDetailsList; + String patientERRealRRTGetTransactionsForOrderList; + bool patientERRealRRTIsTransInserted; + String patientERRequestList; + String patientERTransportationRequestWithTotal; + String patientERealRRTGetServicePriceList; + String patientInfoByAdmissionNoList; + String patientMonitorGetPatientHeartRate; + int patientNotServedCounts; + String patientPrescriptionList; + String patientAllergies; + String patientCheckAppointmentValidationList; + String patientLoginTokenList; + String patientQRLoginInfoList; + String patientSELECTDeviceIMEIbyIMEIList; + String pharmList; + String prefLang; + int radReportUnreadNo; + String radGetPatientRadOrdersForDentalList; + int referralNumber; + String reminderConfigurations; + String requestNo; + int rowCount; + String servicePrivilegeList; + String shareFamilyFileObj; + String status; + int successCode; + String surveyRate; + String symptomCheckerConditionList; + String symptomCheckerGetAllDefaultQuestionsList; + String symptomCheckerGetBodyPartSymptomsList; + String symptomCheckerGetBodyPartsByCodeList; + String symptomCheckerGetBodyPartsList; + String symptomCheckerJsonResponseInString; + int timerTime; + int totalAdvanceBalanceAmount; + int totalPatientsCount; + int totalPendingApprovalCount; + int totalUnUsedCount; + int transactionNo; + int unReadCounts; + bool updateStatus; + String userAgreementContent; + int yahalaAccountNo; + bool check24HourComplaint; + String currency; + String message; + int patientID; + int returnValue; + String returnValueStr; + int statusCode; + + LacumAccountInformation( + {this.date, + this.languageID, + this.serviceName, + this.time, + this.androidLink, + this.authenticationTokenID, + this.data, + this.dataw, + this.dietType, + this.errorCode, + this.errorEndUserMessage, + this.errorEndUserMessageN, + this.errorMessage, + this.errorType, + this.foodCategory, + this.iOSLink, + this.isAuthenticated, + this.mealOrderStatus, + this.mealType, + this.messageStatus, + this.numberOfResultRecords, + this.patientBlodType, + this.successMsg, + this.successMsgN, + this.accountStatus, + this.activeArchiveObject, + this.activeMedicationCount, + this.allMedicationTakenDuringAdmissionList, + this.appointmentNo, + this.arePatientsOnlineList, + this.balanceAmount, + this.bloodGroupList, + this.cVIUnreadCount, + this.checkUserHasAccount, + this.complaintNo, + this.dischargeList, + this.episodeID, + this.finalRadiologyList, + this.fullName, + this.geoFPointsList, + this.geoGetPateintInfo, + this.getAllDoctorsByProjectAndClinicList, + this.getAppointmentNumbersForDoctorList, + this.getCheckUpItemsList, + this.getCosmeticConferenceForTodayList, + this.getDoctorERClinicResult, + this.getInvoiceApprovalList, + this.getNearestProjectList, + this.getPatientAdmissionOrAppoinmentNoList, + this.getPatientBloodType, + this.getPatientInsuranceCardStatusStatisticsList, + this.getSurveyList, + this.getTotalRegisteredPatientList, + this.getUserDetailsList, + this.getCustomerPointInfo, + this.hISApprovalList, + this.hISInpAdmissionList, + this.hISProgNoteAssesmentModelList, + this.hMGGetAllOffersList, + this.hasApproval, + this.hasConsultation, + this.hasDental, + this.hasLab, + this.hasPharmacy, + this.hasRad, + this.hmgSMSGetByProjectIDAndPatientIDList, + this.hoursLeft, + this.iNPMGetAllAdmissionList, + this.iNPMGetPatientInfoForSickLeaveReportList, + this.iNPMHISPatientMedicalStatusUnreadCount, + this.iNPMLABGetPatientLabOrdersResultsList, + this.iNPMLABGetPatientLabResultsList, + this.iNPMLABGetPatientRADReportList, + this.iNPMLABGetPatientRadResultsList, + this.iNPMRadGetPatientRadOrdersCVIList, + this.iNPMRadGetPatientRadOrdersList, + this.iNPMRadGetRadMedicalRecordsList, + this.iNPGetPrescriptionDischargesList, + this.iNPGetPrescriptionReportList, + this.identificationNo, + this.isHomeMedicineDeliverySupported, + this.isInsertedOrUpdated, + this.isMainAcoountEqualPatienID, + this.isPatientAlreadyAgreed, + this.isPatientCallBackBlackList, + this.isPatientHaveFingerPrint, + this.isPatientOnline, + this.isPatientTokenRemoved, + this.isPaused, + this.isProjectWorkingHours, + this.isStoreRateAllowed, + this.isStoreRateInserted, + this.isStoreRateUpdated, + this.labRadUpdatedToRead, + this.labReportUnreadNo, + this.lakumInquiryInformationObj, + this.lakumInquiryInformationObjVersion, + this.lakumResponseList, + this.laserGetBodyPartsByCategoryList, + this.laserGetCategoriesList, + this.list, + this.listCount, + this.listCountDeliverd, + this.listCountUnDeliverd, + this.listDeviceInfo, + this.listFamilyAppointments, + this.listLabResultsByAppNo, + this.listLakumInquiryInformationObj, + this.listOpinionGetAllPeriod, + this.listOpinionGetAllServices, + this.listOpinionGetIsAgreeValue, + this.listOpinionGetOpinionLogin, + this.listOpinionGetRequestedSerives, + this.listOpinionGetShareServicesDetails, + this.listOpinionUserTerms, + this.listPLO, + this.listPLR, + this.listPLSR, + this.listPRM, + this.listPatientFamilyFiles, + this.listPatientFileInfo, + this.listRAD, + this.listRADAPI, + this.listActiveGetPrescriptionReportByPatientID, + this.listAppointmentsForDentalClinic, + this.listBabyInfoResult, + this.listCheckInsuranceCoverage, + this.listCompanyClass, + this.listConsentMedicalReport, + this.listDentalAppointments, + this.listDeviceTokenIDByAppointmentNo, + this.listDischargeDiagnosis, + this.listDischargeMedicine, + this.listDischargeSummary, + this.listDoctorResponse, + this.listDoneVaccines, + this.listEReferralResult, + this.listEReferrals, + this.listGetAllPatientsLiveCareAdmin, + this.listGetDataForExcel, + this.listGetMainCountID, + this.listGetPrescriptionReportByPatientID, + this.listGetSickLeave, + this.listHISInvoice, + this.listHISInvoiceProcedures, + this.listInpatientInvoices, + this.listInsuranceCheckList, + this.listInsuranceCompanies, + this.listInsuranceCompaniesGroup, + this.listInsuranceUpdateDetails, + this.listInvoiceApprovalProcedureInfo, + this.listIsLastSatisfactionSurveyReviewedModel, + this.listLabOrderDetailsModel, + this.listMedicalReport, + this.listMedicalReportApprovals, + this.listMedicalReportStatus, + this.listMonthBloodPressureResult, + this.listMonthBloodPressureResultAverage, + this.listMonthDiabtecPatientResult, + this.listMonthDiabtectResultAverage, + this.listMonthWeightMeasurementResult, + this.listMonthWeightMeasurementResultAverage, + this.listOnlinePrescriptionResult, + this.listOutPatientInvoices, + this.listPHRInvoice, + this.listPHRInvoiceItems, + this.listPHRPaymentMethods, + this.listPateintDetails, + this.listPateintInformation, + this.listPatientAdmissionInfo, + this.listPatientAdvanceBalanceAmount, + this.listPatientCallBackLogs, + this.listPatientCallBackToUpdateFromICServer, + this.listPatientCount, + this.listPatientDashboard, + this.listPatientERGetAdminClinicsModel, + this.listPatientERGetAdminProjectsModel, + this.listPatientERGetAllClinicsModel, + this.listPatientHISInvoices, + this.listPatientICProjects, + this.listPatientICProjectsByID, + this.listPatientICProjectsTimings, + this.listPatientIDByUID, + this.listPatientIDForSurveyResult, + this.listPatientInfo, + this.listPatientInfoForDDScreen, + this.listPatientInfoForSickleaveReport, + this.listPatientInsuranceCard, + this.listPatientInsuranceCardHistory, + this.listPatientInsuranceDetails, + this.listPatientPHRInvoices, + this.listPatientServicePoint, + this.listPatientStatusCount, + this.listPatientChatRequestMapModel, + this.listPatientChatRequestModel, + this.listPatientChatRequestVCModel, + this.listPaymentMethods, + this.listPointServices, + this.listPregnancyStagesInfo, + this.listProjectAvgERWaitingTime, + this.listProjectAvgERWaitingTimeHourly, + this.listRadMedicalRecords, + this.listRadMedicalRecordsAPI, + this.listRadMedicalRecordsCVI, + this.listRadMedicalRecordsCVIAPI, + this.listRadMedicalRecordsResults, + this.listSickLeave, + this.listTransaction, + this.listVideoConferenceSessions, + this.listWeekBloodPressureResult, + this.listWeekBloodPressureResultAverage, + this.listWeekDiabtecPatientResult, + this.listWeekDiabtectResultAverage, + this.listWeekWeightMeasurementResult, + this.listWeekWeightMeasurementResultAverage, + this.listYearBloodPressureResult, + this.listYearBloodPressureResultAverage, + this.listYearDiabtecPatientResult, + this.listYearDiabtecResultAverage, + this.listYearWeightMeasurementResult, + this.listYearWeightMeasurementResultAverage, + this.listEInvoiceForDental, + this.listEInvoiceForOnlineCheckIn, + this.medGetActivitiesTransactionsStsList, + this.medGetAvgMonthTransactionsStsList, + this.medGetAvgWeekTransactionsStsList, + this.medGetCategoriesList, + this.medGetMonthActivitiesTransactionsStsList, + this.medGetMonthStepsTransactionsStsList, + this.medGetMonthTransactionsStsList, + this.medGetPatientLastRecordList, + this.medGetSubCategoriesList, + this.medGetTransactionsAndActTransactionsResult, + this.medGetTransactionsList, + this.medGetWeekActivitiesTransactionsStsList, + this.medGetWeekStepsTransactionsStsList, + this.medGetWeekTransactionsStsList, + this.medGetYearActivitiesTransactionsStsList, + this.medGetYearSleepTransactionsStsList, + this.medGetYearStepsTransactionsStsList, + this.medGetYearTransactionsStsList, + this.medInsertTransactionsOutputsList, + this.medicalRecordImages, + this.medicalReportToRead, + this.medicalReportUnreadNo, + this.missingIDCardAttachment, + this.missingInsuranceCardAttachment, + this.missingMedicalReportAttachment, + this.missingOtherRelationship, + this.missingPatientContactNo, + this.missingPatientId, + this.missingPatientIdentityNumber, + this.missingPatientName, + this.missingReferralContactNo, + this.missingReferralRelationship, + this.missingReferralRequesterName, + this.mobileNumber, + this.nationalityNumber, + this.onlineCheckInAppointments, + this.opinionUserAgreementContent, + this.orderInsert, + this.pateintInfoForUpdateList, + this.pateintUpatedList, + this.patientBirthdayCertificate, + this.patientERCMCRequestSummaryByProject, + this.patientERCMCRequestWithTotal, + this.patientERCMCGetAllServicesList, + this.patientERCMCGetTransactionsForOrderList, + this.patientERCoordinates, + this.patientERCountOrderList, + this.patientERCountsForApprovalOffice, + this.patientERDeleteOldCurrentDoctorsOutputsList, + this.patientERDeliveryGetAllDeliverdOrderList, + this.patientERDeliveryGetAllOrderList, + this.patientERDeliveryIsOrderInserted, + this.patientERDeliveryIsOrderUpdated, + this.patientERDeliveryIsPausedChanged, + this.patientERDeliveryNextOrder, + this.patientERDeliveryOrderInsert, + this.patientERDeliveryUpdateOrderStatus, + this.patientERDriverUpdate, + this.patientERExacartCheckIsDispenseAccpetableList, + this.patientERExacartGetDispenseQuantitiesByOrderIDList, + this.patientERExacartGetOrderDetailsByePharmacyOrderNoList, + this.patientERExacartGetOrderDetailsList, + this.patientERExacartGetTotalDispenseQuantitiesByPresNoList, + this.patientERExacartIsDispenseAdded, + this.patientERExacartIsDispenseAddedList, + this.patientERExacartIsOrderCompleted, + this.patientERGetAdminByProjectAndRoleList, + this.patientERGetAdminProjectsList, + this.patientERGetAllDriversList, + this.patientERGetAllNeedAproveStatusList, + this.patientERGetAllPresOrdersStatusList, + this.patientERGetAllProjectsList, + this.patientERGetArchiveInformationList, + this.patientERGetAskDoctorTotalByDateFilterList, + this.patientERGetBookScheduleConfigsList, + this.patientERGetClinicAndTimeAndEpisodeForAppointmentList, + this.patientERGetClinicAndTimeForDischargeList, + this.patientERGetDashboardDataforApporvalSectionForAdminList, + this.patientERGetDashboardDataforApporvalSectionList, + this.patientERGetDashboardDataforHHCSectionForAdminList, + this.patientERGetDashboardDataforHHCSectionList, + this.patientERGetDashboardDataforPrescriptionSectionForAdminList, + this.patientERGetDashboardDataforPrescriptionSectionList, + this.patientERGetDoctorDashboardDataModelList, + this.patientERGetDriverLocationList, + this.patientERGetInsuranceCardRequestByDateFilterList, + this.patientERGetLiveCareSummaryBookedAppoinmentStatusList, + this.patientERGetLiveCareSummaryCovidList, + this.patientERGetLiveCareSummaryForCMCList, + this.patientERGetLiveCareSummaryForHHCList, + this.patientERGetLiveCareSummaryForHomeDeliveryList, + this.patientERGetLiveCareSummaryForInsuranceCardRequestList, + this.patientERGetLiveCareSummaryForNewFilesList, + this.patientERGetLiveCareSummaryForOnlinePaymetRequestList, + this.patientERGetLiveCareSummaryForOnlinePharmacyOrdersList, + this.patientERGetLiveCareSummaryForTrasnportationList, + this.patientERGetLiveCareSummaryLiveCareCountsList, + this.patientERGetMedicalRequestTotalByDateFilterList, + this.patientERGetNearestPendingOrdersList, + this.patientERGetNeedAproveHistoryForOrderList, + this.patientERGetNeedAprovePendingOrdersList, + this.patientERGetNeedAproveStatusStatisticsList, + this.patientERGetPatientAllPresOrdersList, + this.patientERGetPendingPatientsCountList, + this.patientERGetPresOrdersHistoryForAdminList, + this.patientERGetPresOrdersHistoryForOrderList, + this.patientERGetPresOrdersStatusStatisticsList, + this.patientERHHCRequest, + this.patientERHHCRequestSummaryByProject, + this.patientERHHCRequestWithTotal, + this.patientERHHCGetAllServicesList, + this.patientERHHCGetTransactionsForOrderList, + this.patientERHomeDeliveryCounts, + this.patientERInsertDriver, + this.patientERInsertNewCurrentDoctorsOutputsList, + this.patientERInsuranceStatusCountList, + this.patientERIsNearestProjectUpdated, + this.patientERIsNeedAproveReturnedToQueue, + this.patientERIsNeedAproveUpdated, + this.patientERIsOrderClientRequestUpdated, + this.patientERIsOrderReturnedToQueue, + this.patientERIsPresOrderInserted, + this.patientERIsPresOrderUpdated, + this.patientERIsProjectUpdated, + this.patientERNotCompletedDetails, + this.patientERPatientsCountByCallStatus, + this.patientERPeakHourCounts, + this.patientERPresOrderInfo, + this.patientERPrescriptionCounts, + this.patientERProjectsContribution, + this.patientERRRTGetAllQuestionsList, + this.patientERRRTGetAllTransportationMethodList, + this.patientERRRTGetPickUpRequestByPresOrderIDList, + this.patientERRealRRTGetAllServicesList, + this.patientERRealRRTGetOrderDetailsList, + this.patientERRealRRTGetTransactionsForOrderList, + this.patientERRealRRTIsTransInserted, + this.patientERRequestList, + this.patientERTransportationRequestWithTotal, + this.patientERealRRTGetServicePriceList, + this.patientInfoByAdmissionNoList, + this.patientMonitorGetPatientHeartRate, + this.patientNotServedCounts, + this.patientPrescriptionList, + this.patientAllergies, + this.patientCheckAppointmentValidationList, + this.patientLoginTokenList, + this.patientQRLoginInfoList, + this.patientSELECTDeviceIMEIbyIMEIList, + this.pharmList, + this.prefLang, + this.radReportUnreadNo, + this.radGetPatientRadOrdersForDentalList, + this.referralNumber, + this.reminderConfigurations, + this.requestNo, + this.rowCount, + this.servicePrivilegeList, + this.shareFamilyFileObj, + this.status, + this.successCode, + this.surveyRate, + this.symptomCheckerConditionList, + this.symptomCheckerGetAllDefaultQuestionsList, + this.symptomCheckerGetBodyPartSymptomsList, + this.symptomCheckerGetBodyPartsByCodeList, + this.symptomCheckerGetBodyPartsList, + this.symptomCheckerJsonResponseInString, + this.timerTime, + this.totalAdvanceBalanceAmount, + this.totalPatientsCount, + this.totalPendingApprovalCount, + this.totalUnUsedCount, + this.transactionNo, + this.unReadCounts, + this.updateStatus, + this.userAgreementContent, + this.yahalaAccountNo, + this.check24HourComplaint, + this.currency, + this.message, + this.patientID, + this.returnValue, + this.returnValueStr, + this.statusCode}); + + LacumAccountInformation.fromJson(Map json) { + date = json['Date']; + languageID = json['LanguageID']; + serviceName = json['ServiceName']; + time = json['Time']; + androidLink = json['AndroidLink']; + authenticationTokenID = json['AuthenticationTokenID']; + data = json['Data']; + dataw = json['Dataw']; + dietType = json['DietType']; + errorCode = json['ErrorCode']; + errorEndUserMessage = json['ErrorEndUserMessage']; + errorEndUserMessageN = json['ErrorEndUserMessageN']; + errorMessage = json['ErrorMessage']; + errorType = json['ErrorType']; + foodCategory = json['FoodCategory']; + iOSLink = json['IOSLink']; + isAuthenticated = json['IsAuthenticated']; + mealOrderStatus = json['MealOrderStatus']; + mealType = json['MealType']; + messageStatus = json['MessageStatus']; + numberOfResultRecords = json['NumberOfResultRecords']; + patientBlodType = json['PatientBlodType']; + successMsg = json['SuccessMsg']; + successMsgN = json['SuccessMsgN']; + accountStatus = json['AccountStatus']; + activeArchiveObject = json['ActiveArchiveObject']; + activeMedicationCount = json['ActiveMedicationCount']; + allMedicationTakenDuringAdmissionList = + json['AllMedicationTakenDuringAdmission_List']; + appointmentNo = json['AppointmentNo']; + arePatientsOnlineList = json['ArePatientsOnlineList']; + balanceAmount = json['BalanceAmount']; + bloodGroupList = json['BloodGroupList']; + cVIUnreadCount = json['CVI_UnreadCount']; + checkUserHasAccount = json['CheckUserHasAccount']; + complaintNo = json['ComplaintNo']; + dischargeList = json['DischargeList']; + episodeID = json['EpisodeID']; + finalRadiologyList = json['FinalRadiologyList']; + fullName = json['FullName']; + geoFPointsList = json['GeoF_PointsList']; + geoGetPateintInfo = json['GeoGetPateintInfo']; + getAllDoctorsByProjectAndClinicList = + json['GetAllDoctorsByProjectAndClinicList']; + getAppointmentNumbersForDoctorList = + json['GetAppointmentNumbersForDoctorList']; + getCheckUpItemsList = json['GetCheckUpItemsList']; + getCosmeticConferenceForTodayList = + json['GetCosmeticConferenceForTodayList']; + getDoctorERClinicResult = json['GetDoctorERClinicResult']; + getInvoiceApprovalList = json['GetInvoiceApprovalList']; + getNearestProjectList = json['GetNearestProjectList']; + getPatientAdmissionOrAppoinmentNoList = + json['GetPatientAdmissionOrAppoinmentNo_List']; + getPatientBloodType = json['GetPatientBloodType']; + getPatientInsuranceCardStatusStatisticsList = + json['GetPatientInsuranceCardStatusStatisticsList']; + getSurveyList = json['GetSurveyList']; + getTotalRegisteredPatientList = json['GetTotalRegisteredPatientList']; + getUserDetailsList = json['GetUserDetailsList']; + getCustomerPointInfo = json['Get_CustomerPointInfo']; + hISApprovalList = json['HIS_Approval_List']; + hISInpAdmissionList = json['HIS_InpAdmission_List']; + hISProgNoteAssesmentModelList = json['HIS_ProgNoteAssesmentModel_List']; + hMGGetAllOffersList = json['HMG_GetAllOffersList']; + hasApproval = json['Has_Approval']; + hasConsultation = json['Has_Consultation']; + hasDental = json['Has_Dental']; + hasLab = json['Has_Lab']; + hasPharmacy = json['Has_Pharmacy']; + hasRad = json['Has_Rad']; + hmgSMSGetByProjectIDAndPatientIDList = + json['Hmg_SMS_Get_By_ProjectID_And_PatientIDList']; + hoursLeft = json['HoursLeft']; + iNPMGetAllAdmissionList = json['INPM_GetAllAdmission_List']; + iNPMGetPatientInfoForSickLeaveReportList = + json['INPM_GetPatientInfoForSickLeaveReport_List']; + iNPMHISPatientMedicalStatusUnreadCount = + json['INPM_HIS_PatientMedicalStatus_UnreadCount']; + iNPMLABGetPatientLabOrdersResultsList = + json['INPM_LAB_GetPatientLabOrdersResults_List']; + iNPMLABGetPatientLabResultsList = + json['INPM_LAB_GetPatientLabResults_List']; + iNPMLABGetPatientRADReportList = json['INPM_LAB_GetPatientRADReport_List']; + iNPMLABGetPatientRadResultsList = + json['INPM_LAB_GetPatientRadResults_List']; + iNPMRadGetPatientRadOrdersCVIList = + json['INPM_Rad_GetPatientRadOrders_CVI_List']; + iNPMRadGetPatientRadOrdersList = json['INPM_Rad_GetPatientRadOrders_List']; + iNPMRadGetRadMedicalRecordsList = + json['INPM_Rad_GetRadMedicalRecords_List']; + iNPGetPrescriptionDischargesList = + json['INP_GetPrescriptionDischarges_List']; + iNPGetPrescriptionReportList = json['INP_GetPrescriptionReport_List']; + identificationNo = json['IdentificationNo']; + isHomeMedicineDeliverySupported = json['IsHomeMedicineDeliverySupported']; + isInsertedOrUpdated = json['IsInsertedOrUpdated']; + isMainAcoountEqualPatienID = json['IsMainAcoountEqualPatienID']; + isPatientAlreadyAgreed = json['IsPatientAlreadyAgreed']; + isPatientCallBackBlackList = json['IsPatientCallBackBlackList']; + isPatientHaveFingerPrint = json['IsPatientHaveFingerPrint']; + isPatientOnline = json['IsPatientOnline']; + isPatientTokenRemoved = json['IsPatientTokenRemoved']; + isPaused = json['IsPaused']; + isProjectWorkingHours = json['IsProjectWorkingHours']; + isStoreRateAllowed = json['IsStoreRateAllowed']; + isStoreRateInserted = json['IsStoreRateInserted']; + isStoreRateUpdated = json['IsStoreRateUpdated']; + labRadUpdatedToRead = json['LabRadUpdatedToRead']; + labReportUnreadNo = json['LabReportUnreadNo']; + lakumInquiryInformationObj = json['LakumInquiryInformationObj']; + lakumInquiryInformationObjVersion = + json['LakumInquiryInformationObjVersion'] != null + ? new LakumInquiryInformationObjVersion.fromJson( + json['LakumInquiryInformationObjVersion']) + : null; + lakumResponseList = json['LakumResponseList']; + laserGetBodyPartsByCategoryList = json['Laser_GetBodyPartsByCategoryList']; + laserGetCategoriesList = json['Laser_GetCategoriesList']; + list = json['List']; + listCount = json['ListCount']; + listCountDeliverd = json['ListCountDeliverd']; + listCountUnDeliverd = json['ListCountUnDeliverd']; + listDeviceInfo = json['ListDeviceInfo']; + listFamilyAppointments = json['ListFamilyAppointments']; + listLabResultsByAppNo = json['ListLabResultsByAppNo']; + listLakumInquiryInformationObj = json['ListLakumInquiryInformationObj']; + listOpinionGetAllPeriod = json['ListOpinion_GetAllPeriod']; + listOpinionGetAllServices = json['ListOpinion_GetAllServices']; + listOpinionGetIsAgreeValue = json['ListOpinion_GetIsAgreeValue']; + listOpinionGetOpinionLogin = json['ListOpinion_GetOpinionLogin']; + listOpinionGetRequestedSerives = json['ListOpinion_GetRequestedSerives']; + listOpinionGetShareServicesDetails = + json['ListOpinion_GetShareServicesDetails']; + listOpinionUserTerms = json['ListOpinion_UserTerms']; + listPLO = json['ListPLO']; + listPLR = json['ListPLR']; + listPLSR = json['ListPLSR']; + listPRM = json['ListPRM']; + listPatientFamilyFiles = json['ListPatientFamilyFiles']; + listPatientFileInfo = json['ListPatientFileInfo']; + listRAD = json['ListRAD']; + listRADAPI = json['ListRADAPI']; + listActiveGetPrescriptionReportByPatientID = + json['List_ActiveGetPrescriptionReportByPatientID']; + listAppointmentsForDentalClinic = json['List_AppointmentsForDentalClinic']; + listBabyInfoResult = json['List_BabyInfoResult']; + listCheckInsuranceCoverage = json['List_CheckInsuranceCoverage']; + listCompanyClass = json['List_CompanyClass']; + listConsentMedicalReport = json['List_ConsentMedicalReport']; + listDentalAppointments = json['List_DentalAppointments']; + listDeviceTokenIDByAppointmentNo = + json['List_DeviceTokenIDByAppointmentNo']; + listDischargeDiagnosis = json['List_DischargeDiagnosis']; + listDischargeMedicine = json['List_DischargeMedicine']; + listDischargeSummary = json['List_DischargeSummary']; + listDoctorResponse = json['List_DoctorResponse']; + listDoneVaccines = json['List_DoneVaccines']; + listEReferralResult = json['List_EReferralResult']; + listEReferrals = json['List_EReferrals']; + listGetAllPatientsLiveCareAdmin = + json['List_GetAllPatients_LiveCare_Admin']; + listGetDataForExcel = json['List_GetDataForExcel']; + listGetMainCountID = json['List_GetMainCountID']; + listGetPrescriptionReportByPatientID = + json['List_GetPrescriptionReportByPatientID']; + listGetSickLeave = json['List_GetSickLeave']; + listHISInvoice = json['List_HISInvoice']; + listHISInvoiceProcedures = json['List_HISInvoiceProcedures']; + listInpatientInvoices = json['List_InpatientInvoices']; + listInsuranceCheckList = json['List_InsuranceCheckList']; + listInsuranceCompanies = json['List_InsuranceCompanies']; + listInsuranceCompaniesGroup = json['List_InsuranceCompaniesGroup']; + listInsuranceUpdateDetails = json['List_InsuranceUpdateDetails']; + listInvoiceApprovalProcedureInfo = + json['List_InvoiceApprovalProcedureInfo']; + listIsLastSatisfactionSurveyReviewedModel = + json['List_IsLastSatisfactionSurveyReviewedModel']; + listLabOrderDetailsModel = json['List_LabOrderDetailsModel']; + listMedicalReport = json['List_MedicalReport']; + listMedicalReportApprovals = json['List_MedicalReportApprovals']; + listMedicalReportStatus = json['List_MedicalReportStatus']; + listMonthBloodPressureResult = json['List_MonthBloodPressureResult']; + listMonthBloodPressureResultAverage = + json['List_MonthBloodPressureResultAverage']; + listMonthDiabtecPatientResult = json['List_MonthDiabtecPatientResult']; + listMonthDiabtectResultAverage = json['List_MonthDiabtectResultAverage']; + listMonthWeightMeasurementResult = + json['List_MonthWeightMeasurementResult']; + listMonthWeightMeasurementResultAverage = + json['List_MonthWeightMeasurementResultAverage']; + listOnlinePrescriptionResult = json['List_OnlinePrescriptionResult']; + listOutPatientInvoices = json['List_OutPatientInvoices']; + listPHRInvoice = json['List_PHRInvoice']; + listPHRInvoiceItems = json['List_PHRInvoiceItems']; + listPHRPaymentMethods = json['List_PHRPaymentMethods']; + listPateintDetails = json['List_PateintDetails']; + listPateintInformation = json['List_PateintInformation']; + listPatientAdmissionInfo = json['List_PatientAdmissionInfo']; + listPatientAdvanceBalanceAmount = json['List_PatientAdvanceBalanceAmount']; + listPatientCallBackLogs = json['List_PatientCallBackLogs']; + listPatientCallBackToUpdateFromICServer = + json['List_PatientCallBackToUpdateFromICServer']; + listPatientCount = json['List_PatientCount']; + listPatientDashboard = json['List_PatientDashboard']; + listPatientERGetAdminClinicsModel = + json['List_PatientER_GetAdminClinicsModel']; + listPatientERGetAdminProjectsModel = + json['List_PatientER_GetAdminProjectsModel']; + listPatientERGetAllClinicsModel = json['List_PatientER_GetAllClinicsModel']; + listPatientHISInvoices = json['List_PatientHISInvoices']; + listPatientICProjects = json['List_PatientICProjects']; + listPatientICProjectsByID = json['List_PatientICProjectsByID']; + listPatientICProjectsTimings = json['List_PatientICProjectsTimings']; + listPatientIDByUID = json['List_PatientIDByUID']; + listPatientIDForSurveyResult = json['List_PatientIDForSurveyResult']; + listPatientInfo = json['List_PatientInfo']; + listPatientInfoForDDScreen = json['List_PatientInfoForDDScreen']; + listPatientInfoForSickleaveReport = + json['List_PatientInfoForSickleaveReport']; + listPatientInsuranceCard = json['List_PatientInsuranceCard']; + listPatientInsuranceCardHistory = json['List_PatientInsuranceCardHistory']; + listPatientInsuranceDetails = json['List_PatientInsuranceDetails']; + listPatientPHRInvoices = json['List_PatientPHRInvoices']; + listPatientServicePoint = json['List_PatientServicePoint']; + listPatientStatusCount = json['List_PatientStatusCount']; + listPatientChatRequestMapModel = json['List_Patient_ChatRequestMapModel']; + listPatientChatRequestModel = json['List_Patient_ChatRequestModel']; + listPatientChatRequestVCModel = json['List_Patient_ChatRequestVCModel']; + listPaymentMethods = json['List_PaymentMethods']; + listPointServices = json['List_PointServices']; + listPregnancyStagesInfo = json['List_PregnancyStagesInfo']; + listProjectAvgERWaitingTime = json['List_ProjectAvgERWaitingTime']; + listProjectAvgERWaitingTimeHourly = + json['List_ProjectAvgERWaitingTimeHourly']; + listRadMedicalRecords = json['List_RadMedicalRecords']; + listRadMedicalRecordsAPI = json['List_RadMedicalRecordsAPI']; + listRadMedicalRecordsCVI = json['List_RadMedicalRecordsCVI']; + listRadMedicalRecordsCVIAPI = json['List_RadMedicalRecordsCVIAPI']; + listRadMedicalRecordsResults = json['List_RadMedicalRecordsResults']; + listSickLeave = json['List_SickLeave']; + listTransaction = json['List_Transaction']; + listVideoConferenceSessions = json['List_VideoConferenceSessions']; + listWeekBloodPressureResult = json['List_WeekBloodPressureResult']; + listWeekBloodPressureResultAverage = + json['List_WeekBloodPressureResultAverage']; + listWeekDiabtecPatientResult = json['List_WeekDiabtecPatientResult']; + listWeekDiabtectResultAverage = json['List_WeekDiabtectResultAverage']; + listWeekWeightMeasurementResult = json['List_WeekWeightMeasurementResult']; + listWeekWeightMeasurementResultAverage = + json['List_WeekWeightMeasurementResultAverage']; + listYearBloodPressureResult = json['List_YearBloodPressureResult']; + listYearBloodPressureResultAverage = + json['List_YearBloodPressureResultAverage']; + listYearDiabtecPatientResult = json['List_YearDiabtecPatientResult']; + listYearDiabtecResultAverage = json['List_YearDiabtecResultAverage']; + listYearWeightMeasurementResult = json['List_YearWeightMeasurementResult']; + listYearWeightMeasurementResultAverage = + json['List_YearWeightMeasurementResultAverage']; + listEInvoiceForDental = json['List_eInvoiceForDental']; + listEInvoiceForOnlineCheckIn = json['List_eInvoiceForOnlineCheckIn']; + medGetActivitiesTransactionsStsList = + json['Med_GetActivitiesTransactionsStsList']; + medGetAvgMonthTransactionsStsList = + json['Med_GetAvgMonthTransactionsStsList']; + medGetAvgWeekTransactionsStsList = + json['Med_GetAvgWeekTransactionsStsList']; + medGetCategoriesList = json['Med_GetCategoriesList']; + medGetMonthActivitiesTransactionsStsList = + json['Med_GetMonthActivitiesTransactionsStsList']; + medGetMonthStepsTransactionsStsList = + json['Med_GetMonthStepsTransactionsStsList']; + medGetMonthTransactionsStsList = json['Med_GetMonthTransactionsStsList']; + medGetPatientLastRecordList = json['Med_GetPatientLastRecordList']; + medGetSubCategoriesList = json['Med_GetSubCategoriesList']; + medGetTransactionsAndActTransactionsResult = + json['Med_GetTransactionsAndActTransactionsResult']; + medGetTransactionsList = json['Med_GetTransactionsList']; + medGetWeekActivitiesTransactionsStsList = + json['Med_GetWeekActivitiesTransactionsStsList']; + medGetWeekStepsTransactionsStsList = + json['Med_GetWeekStepsTransactionsStsList']; + medGetWeekTransactionsStsList = json['Med_GetWeekTransactionsStsList']; + medGetYearActivitiesTransactionsStsList = + json['Med_GetYearActivitiesTransactionsStsList']; + medGetYearSleepTransactionsStsList = + json['Med_GetYearSleepTransactionsStsList']; + medGetYearStepsTransactionsStsList = + json['Med_GetYearStepsTransactionsStsList']; + medGetYearTransactionsStsList = json['Med_GetYearTransactionsStsList']; + medInsertTransactionsOutputsList = + json['Med_InsertTransactionsOutputsList']; + medicalRecordImages = json['MedicalRecordImages']; + medicalReportToRead = json['MedicalReportToRead']; + medicalReportUnreadNo = json['MedicalReportUnreadNo']; + missingIDCardAttachment = json['Missing_IDCardAttachment']; + missingInsuranceCardAttachment = json['Missing_InsuranceCardAttachment']; + missingMedicalReportAttachment = json['Missing_MedicalReportAttachment']; + missingOtherRelationship = json['Missing_OtherRelationship']; + missingPatientContactNo = json['Missing_PatientContactNo']; + missingPatientId = json['Missing_PatientId']; + missingPatientIdentityNumber = json['Missing_PatientIdentityNumber']; + missingPatientName = json['Missing_PatientName']; + missingReferralContactNo = json['Missing_ReferralContactNo']; + missingReferralRelationship = json['Missing_ReferralRelationship']; + missingReferralRequesterName = json['Missing_ReferralRequesterName']; + mobileNumber = json['MobileNumber']; + nationalityNumber = json['NationalityNumber']; + onlineCheckInAppointments = json['OnlineCheckInAppointments']; + opinionUserAgreementContent = json['Opinion_UserAgreementContent']; + orderInsert = json['OrderInsert']; + pateintInfoForUpdateList = json['PateintInfoForUpdateList']; + pateintUpatedList = json['PateintUpatedList']; + patientBirthdayCertificate = json['PatientBirthdayCertificate']; + patientERCMCRequestSummaryByProject = + json['PatientER_CMCRequestSummaryByProject']; + patientERCMCRequestWithTotal = json['PatientER_CMCRequestWithTotal']; + patientERCMCGetAllServicesList = json['PatientER_CMC_GetAllServicesList']; + patientERCMCGetTransactionsForOrderList = + json['PatientER_CMC_GetTransactionsForOrderList']; + patientERCoordinates = json['PatientER_Coordinates']; + patientERCountOrderList = json['PatientER_CountOrderList']; + patientERCountsForApprovalOffice = + json['PatientER_CountsForApprovalOffice']; + patientERDeleteOldCurrentDoctorsOutputsList = + json['PatientER_DeleteOldCurrentDoctorsOutputsList']; + patientERDeliveryGetAllDeliverdOrderList = + json['PatientER_Delivery_GetAllDeliverdOrderList']; + patientERDeliveryGetAllOrderList = + json['PatientER_Delivery_GetAllOrderList']; + patientERDeliveryIsOrderInserted = + json['PatientER_Delivery_IsOrderInserted']; + patientERDeliveryIsOrderUpdated = json['PatientER_Delivery_IsOrderUpdated']; + patientERDeliveryIsPausedChanged = + json['PatientER_Delivery_IsPausedChanged']; + patientERDeliveryNextOrder = json['PatientER_Delivery_NextOrder']; + patientERDeliveryOrderInsert = json['PatientER_Delivery_OrderInsert']; + patientERDeliveryUpdateOrderStatus = + json['PatientER_Delivery_UpdateOrderStatus']; + patientERDriverUpdate = json['PatientER_DriverUpdate']; + patientERExacartCheckIsDispenseAccpetableList = + json['PatientER_Exacart_CheckIsDispenseAccpetableList']; + patientERExacartGetDispenseQuantitiesByOrderIDList = + json['PatientER_Exacart_GetDispenseQuantitiesByOrderIDList']; + patientERExacartGetOrderDetailsByePharmacyOrderNoList = + json['PatientER_Exacart_GetOrderDetailsByePharmacyOrderNoList']; + patientERExacartGetOrderDetailsList = + json['PatientER_Exacart_GetOrderDetailsList']; + patientERExacartGetTotalDispenseQuantitiesByPresNoList = + json['PatientER_Exacart_GetTotalDispenseQuantitiesByPresNoList']; + patientERExacartIsDispenseAdded = json['PatientER_Exacart_IsDispenseAdded']; + patientERExacartIsDispenseAddedList = + json['PatientER_Exacart_IsDispenseAddedList']; + patientERExacartIsOrderCompleted = + json['PatientER_Exacart_IsOrderCompleted']; + patientERGetAdminByProjectAndRoleList = + json['PatientER_GetAdminByProjectAndRoleList']; + patientERGetAdminProjectsList = json['PatientER_GetAdminProjectsList']; + patientERGetAllDriversList = json['PatientER_GetAllDriversList']; + patientERGetAllNeedAproveStatusList = + json['PatientER_GetAllNeedAproveStatusList']; + patientERGetAllPresOrdersStatusList = + json['PatientER_GetAllPresOrdersStatusList']; + patientERGetAllProjectsList = json['PatientER_GetAllProjectsList']; + patientERGetArchiveInformationList = + json['PatientER_GetArchiveInformation_List']; + patientERGetAskDoctorTotalByDateFilterList = + json['PatientER_GetAskDoctorTotalByDateFilterList']; + patientERGetBookScheduleConfigsList = + json['PatientER_GetBookScheduleConfigsList']; + patientERGetClinicAndTimeAndEpisodeForAppointmentList = + json['PatientER_GetClinicAndTimeAndEpisodeForAppointmentList']; + patientERGetClinicAndTimeForDischargeList = + json['PatientER_GetClinicAndTimeForDischargeList']; + patientERGetDashboardDataforApporvalSectionForAdminList = + json['PatientER_GetDashboardDataforApporvalSectionForAdminList']; + patientERGetDashboardDataforApporvalSectionList = + json['PatientER_GetDashboardDataforApporvalSectionList']; + patientERGetDashboardDataforHHCSectionForAdminList = + json['PatientER_GetDashboardDataforHHCSectionForAdminList']; + patientERGetDashboardDataforHHCSectionList = + json['PatientER_GetDashboardDataforHHCSectionList']; + patientERGetDashboardDataforPrescriptionSectionForAdminList = + json['PatientER_GetDashboardDataforPrescriptionSectionForAdminList']; + patientERGetDashboardDataforPrescriptionSectionList = + json['PatientER_GetDashboardDataforPrescriptionSectionList']; + patientERGetDoctorDashboardDataModelList = + json['PatientER_GetDoctorDashboardDataModelList']; + patientERGetDriverLocationList = json['PatientER_GetDriverLocationList']; + patientERGetInsuranceCardRequestByDateFilterList = + json['PatientER_GetInsuranceCardRequestByDateFilterList']; + patientERGetLiveCareSummaryBookedAppoinmentStatusList = + json['PatientER_GetLiveCareSummaryBookedAppoinmentStatusList']; + patientERGetLiveCareSummaryCovidList = + json['PatientER_GetLiveCareSummaryCovidList']; + patientERGetLiveCareSummaryForCMCList = + json['PatientER_GetLiveCareSummaryForCMCList']; + patientERGetLiveCareSummaryForHHCList = + json['PatientER_GetLiveCareSummaryForHHCList']; + patientERGetLiveCareSummaryForHomeDeliveryList = + json['PatientER_GetLiveCareSummaryForHomeDeliveryList']; + patientERGetLiveCareSummaryForInsuranceCardRequestList = + json['PatientER_GetLiveCareSummaryForInsuranceCardRequestList']; + patientERGetLiveCareSummaryForNewFilesList = + json['PatientER_GetLiveCareSummaryForNewFilesList']; + patientERGetLiveCareSummaryForOnlinePaymetRequestList = + json['PatientER_GetLiveCareSummaryForOnlinePaymetRequestList']; + patientERGetLiveCareSummaryForOnlinePharmacyOrdersList = + json['PatientER_GetLiveCareSummaryForOnlinePharmacyOrdersList']; + patientERGetLiveCareSummaryForTrasnportationList = + json['PatientER_GetLiveCareSummaryForTrasnportationList']; + patientERGetLiveCareSummaryLiveCareCountsList = + json['PatientER_GetLiveCareSummaryLiveCareCountsList']; + patientERGetMedicalRequestTotalByDateFilterList = + json['PatientER_GetMedicalRequestTotalByDateFilterList']; + patientERGetNearestPendingOrdersList = + json['PatientER_GetNearestPendingOrdersList']; + patientERGetNeedAproveHistoryForOrderList = + json['PatientER_GetNeedAproveHistoryForOrderList']; + patientERGetNeedAprovePendingOrdersList = + json['PatientER_GetNeedAprovePendingOrdersList']; + patientERGetNeedAproveStatusStatisticsList = + json['PatientER_GetNeedAproveStatusStatisticsList']; + patientERGetPatientAllPresOrdersList = + json['PatientER_GetPatientAllPresOrdersList']; + patientERGetPendingPatientsCountList = + json['PatientER_GetPendingPatientsCountList']; + patientERGetPresOrdersHistoryForAdminList = + json['PatientER_GetPresOrdersHistoryForAdminList']; + patientERGetPresOrdersHistoryForOrderList = + json['PatientER_GetPresOrdersHistoryForOrderList']; + patientERGetPresOrdersStatusStatisticsList = + json['PatientER_GetPresOrdersStatusStatisticsList']; + patientERHHCRequest = json['PatientER_HHCRequest']; + patientERHHCRequestSummaryByProject = + json['PatientER_HHCRequestSummaryByProject']; + patientERHHCRequestWithTotal = json['PatientER_HHCRequestWithTotal']; + patientERHHCGetAllServicesList = json['PatientER_HHC_GetAllServicesList']; + patientERHHCGetTransactionsForOrderList = + json['PatientER_HHC_GetTransactionsForOrderList']; + patientERHomeDeliveryCounts = json['PatientER_HomeDeliveryCounts']; + patientERInsertDriver = json['PatientER_InsertDriver']; + patientERInsertNewCurrentDoctorsOutputsList = + json['PatientER_InsertNewCurrentDoctorsOutputsList']; + patientERInsuranceStatusCountList = + json['PatientER_InsuranceStatusCountList']; + patientERIsNearestProjectUpdated = + json['PatientER_IsNearestProjectUpdated']; + patientERIsNeedAproveReturnedToQueue = + json['PatientER_IsNeedAproveReturnedToQueue']; + patientERIsNeedAproveUpdated = json['PatientER_IsNeedAproveUpdated']; + patientERIsOrderClientRequestUpdated = + json['PatientER_IsOrderClientRequestUpdated']; + patientERIsOrderReturnedToQueue = json['PatientER_IsOrderReturnedToQueue']; + patientERIsPresOrderInserted = json['PatientER_IsPresOrderInserted']; + patientERIsPresOrderUpdated = json['PatientER_IsPresOrderUpdated']; + patientERIsProjectUpdated = json['PatientER_IsProjectUpdated']; + patientERNotCompletedDetails = json['PatientER_NotCompletedDetails']; + patientERPatientsCountByCallStatus = + json['PatientER_PatientsCountByCallStatus']; + patientERPeakHourCounts = json['PatientER_PeakHourCounts']; + patientERPresOrderInfo = json['PatientER_PresOrderInfo']; + patientERPrescriptionCounts = json['PatientER_PrescriptionCounts']; + patientERProjectsContribution = json['PatientER_ProjectsContribution']; + patientERRRTGetAllQuestionsList = json['PatientER_RRT_GetAllQuestionsList']; + patientERRRTGetAllTransportationMethodList = + json['PatientER_RRT_GetAllTransportationMethodList']; + patientERRRTGetPickUpRequestByPresOrderIDList = + json['PatientER_RRT_GetPickUpRequestByPresOrderIDList']; + patientERRealRRTGetAllServicesList = + json['PatientER_RealRRT_GetAllServicesList']; + patientERRealRRTGetOrderDetailsList = + json['PatientER_RealRRT_GetOrderDetailsList']; + patientERRealRRTGetTransactionsForOrderList = + json['PatientER_RealRRT_GetTransactionsForOrderList']; + patientERRealRRTIsTransInserted = json['PatientER_RealRRT_IsTransInserted']; + patientERRequestList = json['PatientER_RequestList']; + patientERTransportationRequestWithTotal = + json['PatientER_TransportationRequestWithTotal']; + patientERealRRTGetServicePriceList = + json['PatientE_RealRRT_GetServicePriceList']; + patientInfoByAdmissionNoList = json['PatientInfoByAdmissionNo_List']; + patientMonitorGetPatientHeartRate = + json['PatientMonitor_GetPatientHeartRate']; + patientNotServedCounts = json['PatientNotServedCounts']; + patientPrescriptionList = json['PatientPrescriptionList']; + patientAllergies = json['Patient_Allergies']; + patientCheckAppointmentValidationList = + json['Patient_CheckAppointmentValidationList']; + patientLoginTokenList = json['Patient_LoginTokenList']; + patientQRLoginInfoList = json['Patient_QRLoginInfoList']; + patientSELECTDeviceIMEIbyIMEIList = + json['Patient_SELECTDeviceIMEIbyIMEIList']; + pharmList = json['PharmList']; + prefLang = json['PrefLang']; + radReportUnreadNo = json['RadReportUnreadNo']; + radGetPatientRadOrdersForDentalList = + json['Rad_GetPatientRadOrdersForDental_List']; + referralNumber = json['ReferralNumber']; + reminderConfigurations = json['ReminderConfigurations']; + requestNo = json['RequestNo']; + rowCount = json['RowCount']; + servicePrivilegeList = json['ServicePrivilegeList']; + shareFamilyFileObj = json['ShareFamilyFileObj']; + status = json['Status']; + successCode = json['SuccessCode']; + surveyRate = json['SurveyRate']; + symptomCheckerConditionList = json['SymptomChecker_ConditionList']; + symptomCheckerGetAllDefaultQuestionsList = + json['SymptomChecker_GetAllDefaultQuestionsList']; + symptomCheckerGetBodyPartSymptomsList = + json['SymptomChecker_GetBodyPartSymptomsList']; + symptomCheckerGetBodyPartsByCodeList = + json['SymptomChecker_GetBodyPartsByCodeList']; + symptomCheckerGetBodyPartsList = json['SymptomChecker_GetBodyPartsList']; + symptomCheckerJsonResponseInString = + json['SymptomChecker_JsonResponseInString']; + timerTime = json['TimerTime']; + totalAdvanceBalanceAmount = json['TotalAdvanceBalanceAmount']; + totalPatientsCount = json['TotalPatientsCount']; + totalPendingApprovalCount = json['TotalPendingApprovalCount']; + totalUnUsedCount = json['TotalUnUsedCount']; + transactionNo = json['TransactionNo']; + unReadCounts = json['UnReadCounts']; + updateStatus = json['UpdateStatus']; + userAgreementContent = json['UserAgreementContent']; + yahalaAccountNo = json['YahalaAccountNo']; + check24HourComplaint = json['check24HourComplaint']; + currency = json['currency']; + message = json['message']; + patientID = json['patientID']; + returnValue = json['returnValue']; + returnValueStr = json['returnValueStr']; + statusCode = json['statusCode']; + } + + Map toJson() { + final Map data = new Map(); + data['Date'] = this.date; + data['LanguageID'] = this.languageID; + data['ServiceName'] = this.serviceName; + data['Time'] = this.time; + data['AndroidLink'] = this.androidLink; + data['AuthenticationTokenID'] = this.authenticationTokenID; + data['Data'] = this.data; + data['Dataw'] = this.dataw; + data['DietType'] = this.dietType; + data['ErrorCode'] = this.errorCode; + data['ErrorEndUserMessage'] = this.errorEndUserMessage; + data['ErrorEndUserMessageN'] = this.errorEndUserMessageN; + data['ErrorMessage'] = this.errorMessage; + data['ErrorType'] = this.errorType; + data['FoodCategory'] = this.foodCategory; + data['IOSLink'] = this.iOSLink; + data['IsAuthenticated'] = this.isAuthenticated; + data['MealOrderStatus'] = this.mealOrderStatus; + data['MealType'] = this.mealType; + data['MessageStatus'] = this.messageStatus; + data['NumberOfResultRecords'] = this.numberOfResultRecords; + data['PatientBlodType'] = this.patientBlodType; + data['SuccessMsg'] = this.successMsg; + data['SuccessMsgN'] = this.successMsgN; + data['AccountStatus'] = this.accountStatus; + data['ActiveArchiveObject'] = this.activeArchiveObject; + data['ActiveMedicationCount'] = this.activeMedicationCount; + data['AllMedicationTakenDuringAdmission_List'] = + this.allMedicationTakenDuringAdmissionList; + data['AppointmentNo'] = this.appointmentNo; + data['ArePatientsOnlineList'] = this.arePatientsOnlineList; + data['BalanceAmount'] = this.balanceAmount; + data['BloodGroupList'] = this.bloodGroupList; + data['CVI_UnreadCount'] = this.cVIUnreadCount; + data['CheckUserHasAccount'] = this.checkUserHasAccount; + data['ComplaintNo'] = this.complaintNo; + data['DischargeList'] = this.dischargeList; + data['EpisodeID'] = this.episodeID; + data['FinalRadiologyList'] = this.finalRadiologyList; + data['FullName'] = this.fullName; + data['GeoF_PointsList'] = this.geoFPointsList; + data['GeoGetPateintInfo'] = this.geoGetPateintInfo; + data['GetAllDoctorsByProjectAndClinicList'] = + this.getAllDoctorsByProjectAndClinicList; + data['GetAppointmentNumbersForDoctorList'] = + this.getAppointmentNumbersForDoctorList; + data['GetCheckUpItemsList'] = this.getCheckUpItemsList; + data['GetCosmeticConferenceForTodayList'] = + this.getCosmeticConferenceForTodayList; + data['GetDoctorERClinicResult'] = this.getDoctorERClinicResult; + data['GetInvoiceApprovalList'] = this.getInvoiceApprovalList; + data['GetNearestProjectList'] = this.getNearestProjectList; + data['GetPatientAdmissionOrAppoinmentNo_List'] = + this.getPatientAdmissionOrAppoinmentNoList; + data['GetPatientBloodType'] = this.getPatientBloodType; + data['GetPatientInsuranceCardStatusStatisticsList'] = + this.getPatientInsuranceCardStatusStatisticsList; + data['GetSurveyList'] = this.getSurveyList; + data['GetTotalRegisteredPatientList'] = this.getTotalRegisteredPatientList; + data['GetUserDetailsList'] = this.getUserDetailsList; + data['Get_CustomerPointInfo'] = this.getCustomerPointInfo; + data['HIS_Approval_List'] = this.hISApprovalList; + data['HIS_InpAdmission_List'] = this.hISInpAdmissionList; + data['HIS_ProgNoteAssesmentModel_List'] = + this.hISProgNoteAssesmentModelList; + data['HMG_GetAllOffersList'] = this.hMGGetAllOffersList; + data['Has_Approval'] = this.hasApproval; + data['Has_Consultation'] = this.hasConsultation; + data['Has_Dental'] = this.hasDental; + data['Has_Lab'] = this.hasLab; + data['Has_Pharmacy'] = this.hasPharmacy; + data['Has_Rad'] = this.hasRad; + data['Hmg_SMS_Get_By_ProjectID_And_PatientIDList'] = + this.hmgSMSGetByProjectIDAndPatientIDList; + data['HoursLeft'] = this.hoursLeft; + data['INPM_GetAllAdmission_List'] = this.iNPMGetAllAdmissionList; + data['INPM_GetPatientInfoForSickLeaveReport_List'] = + this.iNPMGetPatientInfoForSickLeaveReportList; + data['INPM_HIS_PatientMedicalStatus_UnreadCount'] = + this.iNPMHISPatientMedicalStatusUnreadCount; + data['INPM_LAB_GetPatientLabOrdersResults_List'] = + this.iNPMLABGetPatientLabOrdersResultsList; + data['INPM_LAB_GetPatientLabResults_List'] = + this.iNPMLABGetPatientLabResultsList; + data['INPM_LAB_GetPatientRADReport_List'] = + this.iNPMLABGetPatientRADReportList; + data['INPM_LAB_GetPatientRadResults_List'] = + this.iNPMLABGetPatientRadResultsList; + data['INPM_Rad_GetPatientRadOrders_CVI_List'] = + this.iNPMRadGetPatientRadOrdersCVIList; + data['INPM_Rad_GetPatientRadOrders_List'] = + this.iNPMRadGetPatientRadOrdersList; + data['INPM_Rad_GetRadMedicalRecords_List'] = + this.iNPMRadGetRadMedicalRecordsList; + data['INP_GetPrescriptionDischarges_List'] = + this.iNPGetPrescriptionDischargesList; + data['INP_GetPrescriptionReport_List'] = this.iNPGetPrescriptionReportList; + data['IdentificationNo'] = this.identificationNo; + data['IsHomeMedicineDeliverySupported'] = + this.isHomeMedicineDeliverySupported; + data['IsInsertedOrUpdated'] = this.isInsertedOrUpdated; + data['IsMainAcoountEqualPatienID'] = this.isMainAcoountEqualPatienID; + data['IsPatientAlreadyAgreed'] = this.isPatientAlreadyAgreed; + data['IsPatientCallBackBlackList'] = this.isPatientCallBackBlackList; + data['IsPatientHaveFingerPrint'] = this.isPatientHaveFingerPrint; + data['IsPatientOnline'] = this.isPatientOnline; + data['IsPatientTokenRemoved'] = this.isPatientTokenRemoved; + data['IsPaused'] = this.isPaused; + data['IsProjectWorkingHours'] = this.isProjectWorkingHours; + data['IsStoreRateAllowed'] = this.isStoreRateAllowed; + data['IsStoreRateInserted'] = this.isStoreRateInserted; + data['IsStoreRateUpdated'] = this.isStoreRateUpdated; + data['LabRadUpdatedToRead'] = this.labRadUpdatedToRead; + data['LabReportUnreadNo'] = this.labReportUnreadNo; + data['LakumInquiryInformationObj'] = this.lakumInquiryInformationObj; + if (this.lakumInquiryInformationObjVersion != null) { + data['LakumInquiryInformationObjVersion'] = + this.lakumInquiryInformationObjVersion.toJson(); + } + data['LakumResponseList'] = this.lakumResponseList; + data['Laser_GetBodyPartsByCategoryList'] = + this.laserGetBodyPartsByCategoryList; + data['Laser_GetCategoriesList'] = this.laserGetCategoriesList; + data['List'] = this.list; + data['ListCount'] = this.listCount; + data['ListCountDeliverd'] = this.listCountDeliverd; + data['ListCountUnDeliverd'] = this.listCountUnDeliverd; + data['ListDeviceInfo'] = this.listDeviceInfo; + data['ListFamilyAppointments'] = this.listFamilyAppointments; + data['ListLabResultsByAppNo'] = this.listLabResultsByAppNo; + data['ListLakumInquiryInformationObj'] = + this.listLakumInquiryInformationObj; + data['ListOpinion_GetAllPeriod'] = this.listOpinionGetAllPeriod; + data['ListOpinion_GetAllServices'] = this.listOpinionGetAllServices; + data['ListOpinion_GetIsAgreeValue'] = this.listOpinionGetIsAgreeValue; + data['ListOpinion_GetOpinionLogin'] = this.listOpinionGetOpinionLogin; + data['ListOpinion_GetRequestedSerives'] = + this.listOpinionGetRequestedSerives; + data['ListOpinion_GetShareServicesDetails'] = + this.listOpinionGetShareServicesDetails; + data['ListOpinion_UserTerms'] = this.listOpinionUserTerms; + data['ListPLO'] = this.listPLO; + data['ListPLR'] = this.listPLR; + data['ListPLSR'] = this.listPLSR; + data['ListPRM'] = this.listPRM; + data['ListPatientFamilyFiles'] = this.listPatientFamilyFiles; + data['ListPatientFileInfo'] = this.listPatientFileInfo; + data['ListRAD'] = this.listRAD; + data['ListRADAPI'] = this.listRADAPI; + data['List_ActiveGetPrescriptionReportByPatientID'] = + this.listActiveGetPrescriptionReportByPatientID; + data['List_AppointmentsForDentalClinic'] = + this.listAppointmentsForDentalClinic; + data['List_BabyInfoResult'] = this.listBabyInfoResult; + data['List_CheckInsuranceCoverage'] = this.listCheckInsuranceCoverage; + data['List_CompanyClass'] = this.listCompanyClass; + data['List_ConsentMedicalReport'] = this.listConsentMedicalReport; + data['List_DentalAppointments'] = this.listDentalAppointments; + data['List_DeviceTokenIDByAppointmentNo'] = + this.listDeviceTokenIDByAppointmentNo; + data['List_DischargeDiagnosis'] = this.listDischargeDiagnosis; + data['List_DischargeMedicine'] = this.listDischargeMedicine; + data['List_DischargeSummary'] = this.listDischargeSummary; + data['List_DoctorResponse'] = this.listDoctorResponse; + data['List_DoneVaccines'] = this.listDoneVaccines; + data['List_EReferralResult'] = this.listEReferralResult; + data['List_EReferrals'] = this.listEReferrals; + data['List_GetAllPatients_LiveCare_Admin'] = + this.listGetAllPatientsLiveCareAdmin; + data['List_GetDataForExcel'] = this.listGetDataForExcel; + data['List_GetMainCountID'] = this.listGetMainCountID; + data['List_GetPrescriptionReportByPatientID'] = + this.listGetPrescriptionReportByPatientID; + data['List_GetSickLeave'] = this.listGetSickLeave; + data['List_HISInvoice'] = this.listHISInvoice; + data['List_HISInvoiceProcedures'] = this.listHISInvoiceProcedures; + data['List_InpatientInvoices'] = this.listInpatientInvoices; + data['List_InsuranceCheckList'] = this.listInsuranceCheckList; + data['List_InsuranceCompanies'] = this.listInsuranceCompanies; + data['List_InsuranceCompaniesGroup'] = this.listInsuranceCompaniesGroup; + data['List_InsuranceUpdateDetails'] = this.listInsuranceUpdateDetails; + data['List_InvoiceApprovalProcedureInfo'] = + this.listInvoiceApprovalProcedureInfo; + data['List_IsLastSatisfactionSurveyReviewedModel'] = + this.listIsLastSatisfactionSurveyReviewedModel; + data['List_LabOrderDetailsModel'] = this.listLabOrderDetailsModel; + data['List_MedicalReport'] = this.listMedicalReport; + data['List_MedicalReportApprovals'] = this.listMedicalReportApprovals; + data['List_MedicalReportStatus'] = this.listMedicalReportStatus; + data['List_MonthBloodPressureResult'] = this.listMonthBloodPressureResult; + data['List_MonthBloodPressureResultAverage'] = + this.listMonthBloodPressureResultAverage; + data['List_MonthDiabtecPatientResult'] = this.listMonthDiabtecPatientResult; + data['List_MonthDiabtectResultAverage'] = + this.listMonthDiabtectResultAverage; + data['List_MonthWeightMeasurementResult'] = + this.listMonthWeightMeasurementResult; + data['List_MonthWeightMeasurementResultAverage'] = + this.listMonthWeightMeasurementResultAverage; + data['List_OnlinePrescriptionResult'] = this.listOnlinePrescriptionResult; + data['List_OutPatientInvoices'] = this.listOutPatientInvoices; + data['List_PHRInvoice'] = this.listPHRInvoice; + data['List_PHRInvoiceItems'] = this.listPHRInvoiceItems; + data['List_PHRPaymentMethods'] = this.listPHRPaymentMethods; + data['List_PateintDetails'] = this.listPateintDetails; + data['List_PateintInformation'] = this.listPateintInformation; + data['List_PatientAdmissionInfo'] = this.listPatientAdmissionInfo; + data['List_PatientAdvanceBalanceAmount'] = + this.listPatientAdvanceBalanceAmount; + data['List_PatientCallBackLogs'] = this.listPatientCallBackLogs; + data['List_PatientCallBackToUpdateFromICServer'] = + this.listPatientCallBackToUpdateFromICServer; + data['List_PatientCount'] = this.listPatientCount; + data['List_PatientDashboard'] = this.listPatientDashboard; + data['List_PatientER_GetAdminClinicsModel'] = + this.listPatientERGetAdminClinicsModel; + data['List_PatientER_GetAdminProjectsModel'] = + this.listPatientERGetAdminProjectsModel; + data['List_PatientER_GetAllClinicsModel'] = + this.listPatientERGetAllClinicsModel; + data['List_PatientHISInvoices'] = this.listPatientHISInvoices; + data['List_PatientICProjects'] = this.listPatientICProjects; + data['List_PatientICProjectsByID'] = this.listPatientICProjectsByID; + data['List_PatientICProjectsTimings'] = this.listPatientICProjectsTimings; + data['List_PatientIDByUID'] = this.listPatientIDByUID; + data['List_PatientIDForSurveyResult'] = this.listPatientIDForSurveyResult; + data['List_PatientInfo'] = this.listPatientInfo; + data['List_PatientInfoForDDScreen'] = this.listPatientInfoForDDScreen; + data['List_PatientInfoForSickleaveReport'] = + this.listPatientInfoForSickleaveReport; + data['List_PatientInsuranceCard'] = this.listPatientInsuranceCard; + data['List_PatientInsuranceCardHistory'] = + this.listPatientInsuranceCardHistory; + data['List_PatientInsuranceDetails'] = this.listPatientInsuranceDetails; + data['List_PatientPHRInvoices'] = this.listPatientPHRInvoices; + data['List_PatientServicePoint'] = this.listPatientServicePoint; + data['List_PatientStatusCount'] = this.listPatientStatusCount; + data['List_Patient_ChatRequestMapModel'] = + this.listPatientChatRequestMapModel; + data['List_Patient_ChatRequestModel'] = this.listPatientChatRequestModel; + data['List_Patient_ChatRequestVCModel'] = + this.listPatientChatRequestVCModel; + data['List_PaymentMethods'] = this.listPaymentMethods; + data['List_PointServices'] = this.listPointServices; + data['List_PregnancyStagesInfo'] = this.listPregnancyStagesInfo; + data['List_ProjectAvgERWaitingTime'] = this.listProjectAvgERWaitingTime; + data['List_ProjectAvgERWaitingTimeHourly'] = + this.listProjectAvgERWaitingTimeHourly; + data['List_RadMedicalRecords'] = this.listRadMedicalRecords; + data['List_RadMedicalRecordsAPI'] = this.listRadMedicalRecordsAPI; + data['List_RadMedicalRecordsCVI'] = this.listRadMedicalRecordsCVI; + data['List_RadMedicalRecordsCVIAPI'] = this.listRadMedicalRecordsCVIAPI; + data['List_RadMedicalRecordsResults'] = this.listRadMedicalRecordsResults; + data['List_SickLeave'] = this.listSickLeave; + data['List_Transaction'] = this.listTransaction; + data['List_VideoConferenceSessions'] = this.listVideoConferenceSessions; + data['List_WeekBloodPressureResult'] = this.listWeekBloodPressureResult; + data['List_WeekBloodPressureResultAverage'] = + this.listWeekBloodPressureResultAverage; + data['List_WeekDiabtecPatientResult'] = this.listWeekDiabtecPatientResult; + data['List_WeekDiabtectResultAverage'] = this.listWeekDiabtectResultAverage; + data['List_WeekWeightMeasurementResult'] = + this.listWeekWeightMeasurementResult; + data['List_WeekWeightMeasurementResultAverage'] = + this.listWeekWeightMeasurementResultAverage; + data['List_YearBloodPressureResult'] = this.listYearBloodPressureResult; + data['List_YearBloodPressureResultAverage'] = + this.listYearBloodPressureResultAverage; + data['List_YearDiabtecPatientResult'] = this.listYearDiabtecPatientResult; + data['List_YearDiabtecResultAverage'] = this.listYearDiabtecResultAverage; + data['List_YearWeightMeasurementResult'] = + this.listYearWeightMeasurementResult; + data['List_YearWeightMeasurementResultAverage'] = + this.listYearWeightMeasurementResultAverage; + data['List_eInvoiceForDental'] = this.listEInvoiceForDental; + data['List_eInvoiceForOnlineCheckIn'] = this.listEInvoiceForOnlineCheckIn; + data['Med_GetActivitiesTransactionsStsList'] = + this.medGetActivitiesTransactionsStsList; + data['Med_GetAvgMonthTransactionsStsList'] = + this.medGetAvgMonthTransactionsStsList; + data['Med_GetAvgWeekTransactionsStsList'] = + this.medGetAvgWeekTransactionsStsList; + data['Med_GetCategoriesList'] = this.medGetCategoriesList; + data['Med_GetMonthActivitiesTransactionsStsList'] = + this.medGetMonthActivitiesTransactionsStsList; + data['Med_GetMonthStepsTransactionsStsList'] = + this.medGetMonthStepsTransactionsStsList; + data['Med_GetMonthTransactionsStsList'] = + this.medGetMonthTransactionsStsList; + data['Med_GetPatientLastRecordList'] = this.medGetPatientLastRecordList; + data['Med_GetSubCategoriesList'] = this.medGetSubCategoriesList; + data['Med_GetTransactionsAndActTransactionsResult'] = + this.medGetTransactionsAndActTransactionsResult; + data['Med_GetTransactionsList'] = this.medGetTransactionsList; + data['Med_GetWeekActivitiesTransactionsStsList'] = + this.medGetWeekActivitiesTransactionsStsList; + data['Med_GetWeekStepsTransactionsStsList'] = + this.medGetWeekStepsTransactionsStsList; + data['Med_GetWeekTransactionsStsList'] = this.medGetWeekTransactionsStsList; + data['Med_GetYearActivitiesTransactionsStsList'] = + this.medGetYearActivitiesTransactionsStsList; + data['Med_GetYearSleepTransactionsStsList'] = + this.medGetYearSleepTransactionsStsList; + data['Med_GetYearStepsTransactionsStsList'] = + this.medGetYearStepsTransactionsStsList; + data['Med_GetYearTransactionsStsList'] = this.medGetYearTransactionsStsList; + data['Med_InsertTransactionsOutputsList'] = + this.medInsertTransactionsOutputsList; + data['MedicalRecordImages'] = this.medicalRecordImages; + data['MedicalReportToRead'] = this.medicalReportToRead; + data['MedicalReportUnreadNo'] = this.medicalReportUnreadNo; + data['Missing_IDCardAttachment'] = this.missingIDCardAttachment; + data['Missing_InsuranceCardAttachment'] = + this.missingInsuranceCardAttachment; + data['Missing_MedicalReportAttachment'] = + this.missingMedicalReportAttachment; + data['Missing_OtherRelationship'] = this.missingOtherRelationship; + data['Missing_PatientContactNo'] = this.missingPatientContactNo; + data['Missing_PatientId'] = this.missingPatientId; + data['Missing_PatientIdentityNumber'] = this.missingPatientIdentityNumber; + data['Missing_PatientName'] = this.missingPatientName; + data['Missing_ReferralContactNo'] = this.missingReferralContactNo; + data['Missing_ReferralRelationship'] = this.missingReferralRelationship; + data['Missing_ReferralRequesterName'] = this.missingReferralRequesterName; + data['MobileNumber'] = this.mobileNumber; + data['NationalityNumber'] = this.nationalityNumber; + data['OnlineCheckInAppointments'] = this.onlineCheckInAppointments; + data['Opinion_UserAgreementContent'] = this.opinionUserAgreementContent; + data['OrderInsert'] = this.orderInsert; + data['PateintInfoForUpdateList'] = this.pateintInfoForUpdateList; + data['PateintUpatedList'] = this.pateintUpatedList; + data['PatientBirthdayCertificate'] = this.patientBirthdayCertificate; + data['PatientER_CMCRequestSummaryByProject'] = + this.patientERCMCRequestSummaryByProject; + data['PatientER_CMCRequestWithTotal'] = this.patientERCMCRequestWithTotal; + data['PatientER_CMC_GetAllServicesList'] = + this.patientERCMCGetAllServicesList; + data['PatientER_CMC_GetTransactionsForOrderList'] = + this.patientERCMCGetTransactionsForOrderList; + data['PatientER_Coordinates'] = this.patientERCoordinates; + data['PatientER_CountOrderList'] = this.patientERCountOrderList; + data['PatientER_CountsForApprovalOffice'] = + this.patientERCountsForApprovalOffice; + data['PatientER_DeleteOldCurrentDoctorsOutputsList'] = + this.patientERDeleteOldCurrentDoctorsOutputsList; + data['PatientER_Delivery_GetAllDeliverdOrderList'] = + this.patientERDeliveryGetAllDeliverdOrderList; + data['PatientER_Delivery_GetAllOrderList'] = + this.patientERDeliveryGetAllOrderList; + data['PatientER_Delivery_IsOrderInserted'] = + this.patientERDeliveryIsOrderInserted; + data['PatientER_Delivery_IsOrderUpdated'] = + this.patientERDeliveryIsOrderUpdated; + data['PatientER_Delivery_IsPausedChanged'] = + this.patientERDeliveryIsPausedChanged; + data['PatientER_Delivery_NextOrder'] = this.patientERDeliveryNextOrder; + data['PatientER_Delivery_OrderInsert'] = this.patientERDeliveryOrderInsert; + data['PatientER_Delivery_UpdateOrderStatus'] = + this.patientERDeliveryUpdateOrderStatus; + data['PatientER_DriverUpdate'] = this.patientERDriverUpdate; + data['PatientER_Exacart_CheckIsDispenseAccpetableList'] = + this.patientERExacartCheckIsDispenseAccpetableList; + data['PatientER_Exacart_GetDispenseQuantitiesByOrderIDList'] = + this.patientERExacartGetDispenseQuantitiesByOrderIDList; + data['PatientER_Exacart_GetOrderDetailsByePharmacyOrderNoList'] = + this.patientERExacartGetOrderDetailsByePharmacyOrderNoList; + data['PatientER_Exacart_GetOrderDetailsList'] = + this.patientERExacartGetOrderDetailsList; + data['PatientER_Exacart_GetTotalDispenseQuantitiesByPresNoList'] = + this.patientERExacartGetTotalDispenseQuantitiesByPresNoList; + data['PatientER_Exacart_IsDispenseAdded'] = + this.patientERExacartIsDispenseAdded; + data['PatientER_Exacart_IsDispenseAddedList'] = + this.patientERExacartIsDispenseAddedList; + data['PatientER_Exacart_IsOrderCompleted'] = + this.patientERExacartIsOrderCompleted; + data['PatientER_GetAdminByProjectAndRoleList'] = + this.patientERGetAdminByProjectAndRoleList; + data['PatientER_GetAdminProjectsList'] = this.patientERGetAdminProjectsList; + data['PatientER_GetAllDriversList'] = this.patientERGetAllDriversList; + data['PatientER_GetAllNeedAproveStatusList'] = + this.patientERGetAllNeedAproveStatusList; + data['PatientER_GetAllPresOrdersStatusList'] = + this.patientERGetAllPresOrdersStatusList; + data['PatientER_GetAllProjectsList'] = this.patientERGetAllProjectsList; + data['PatientER_GetArchiveInformation_List'] = + this.patientERGetArchiveInformationList; + data['PatientER_GetAskDoctorTotalByDateFilterList'] = + this.patientERGetAskDoctorTotalByDateFilterList; + data['PatientER_GetBookScheduleConfigsList'] = + this.patientERGetBookScheduleConfigsList; + data['PatientER_GetClinicAndTimeAndEpisodeForAppointmentList'] = + this.patientERGetClinicAndTimeAndEpisodeForAppointmentList; + data['PatientER_GetClinicAndTimeForDischargeList'] = + this.patientERGetClinicAndTimeForDischargeList; + data['PatientER_GetDashboardDataforApporvalSectionForAdminList'] = + this.patientERGetDashboardDataforApporvalSectionForAdminList; + data['PatientER_GetDashboardDataforApporvalSectionList'] = + this.patientERGetDashboardDataforApporvalSectionList; + data['PatientER_GetDashboardDataforHHCSectionForAdminList'] = + this.patientERGetDashboardDataforHHCSectionForAdminList; + data['PatientER_GetDashboardDataforHHCSectionList'] = + this.patientERGetDashboardDataforHHCSectionList; + data['PatientER_GetDashboardDataforPrescriptionSectionForAdminList'] = + this.patientERGetDashboardDataforPrescriptionSectionForAdminList; + data['PatientER_GetDashboardDataforPrescriptionSectionList'] = + this.patientERGetDashboardDataforPrescriptionSectionList; + data['PatientER_GetDoctorDashboardDataModelList'] = + this.patientERGetDoctorDashboardDataModelList; + data['PatientER_GetDriverLocationList'] = + this.patientERGetDriverLocationList; + data['PatientER_GetInsuranceCardRequestByDateFilterList'] = + this.patientERGetInsuranceCardRequestByDateFilterList; + data['PatientER_GetLiveCareSummaryBookedAppoinmentStatusList'] = + this.patientERGetLiveCareSummaryBookedAppoinmentStatusList; + data['PatientER_GetLiveCareSummaryCovidList'] = + this.patientERGetLiveCareSummaryCovidList; + data['PatientER_GetLiveCareSummaryForCMCList'] = + this.patientERGetLiveCareSummaryForCMCList; + data['PatientER_GetLiveCareSummaryForHHCList'] = + this.patientERGetLiveCareSummaryForHHCList; + data['PatientER_GetLiveCareSummaryForHomeDeliveryList'] = + this.patientERGetLiveCareSummaryForHomeDeliveryList; + data['PatientER_GetLiveCareSummaryForInsuranceCardRequestList'] = + this.patientERGetLiveCareSummaryForInsuranceCardRequestList; + data['PatientER_GetLiveCareSummaryForNewFilesList'] = + this.patientERGetLiveCareSummaryForNewFilesList; + data['PatientER_GetLiveCareSummaryForOnlinePaymetRequestList'] = + this.patientERGetLiveCareSummaryForOnlinePaymetRequestList; + data['PatientER_GetLiveCareSummaryForOnlinePharmacyOrdersList'] = + this.patientERGetLiveCareSummaryForOnlinePharmacyOrdersList; + data['PatientER_GetLiveCareSummaryForTrasnportationList'] = + this.patientERGetLiveCareSummaryForTrasnportationList; + data['PatientER_GetLiveCareSummaryLiveCareCountsList'] = + this.patientERGetLiveCareSummaryLiveCareCountsList; + data['PatientER_GetMedicalRequestTotalByDateFilterList'] = + this.patientERGetMedicalRequestTotalByDateFilterList; + data['PatientER_GetNearestPendingOrdersList'] = + this.patientERGetNearestPendingOrdersList; + data['PatientER_GetNeedAproveHistoryForOrderList'] = + this.patientERGetNeedAproveHistoryForOrderList; + data['PatientER_GetNeedAprovePendingOrdersList'] = + this.patientERGetNeedAprovePendingOrdersList; + data['PatientER_GetNeedAproveStatusStatisticsList'] = + this.patientERGetNeedAproveStatusStatisticsList; + data['PatientER_GetPatientAllPresOrdersList'] = + this.patientERGetPatientAllPresOrdersList; + data['PatientER_GetPendingPatientsCountList'] = + this.patientERGetPendingPatientsCountList; + data['PatientER_GetPresOrdersHistoryForAdminList'] = + this.patientERGetPresOrdersHistoryForAdminList; + data['PatientER_GetPresOrdersHistoryForOrderList'] = + this.patientERGetPresOrdersHistoryForOrderList; + data['PatientER_GetPresOrdersStatusStatisticsList'] = + this.patientERGetPresOrdersStatusStatisticsList; + data['PatientER_HHCRequest'] = this.patientERHHCRequest; + data['PatientER_HHCRequestSummaryByProject'] = + this.patientERHHCRequestSummaryByProject; + data['PatientER_HHCRequestWithTotal'] = this.patientERHHCRequestWithTotal; + data['PatientER_HHC_GetAllServicesList'] = + this.patientERHHCGetAllServicesList; + data['PatientER_HHC_GetTransactionsForOrderList'] = + this.patientERHHCGetTransactionsForOrderList; + data['PatientER_HomeDeliveryCounts'] = this.patientERHomeDeliveryCounts; + data['PatientER_InsertDriver'] = this.patientERInsertDriver; + data['PatientER_InsertNewCurrentDoctorsOutputsList'] = + this.patientERInsertNewCurrentDoctorsOutputsList; + data['PatientER_InsuranceStatusCountList'] = + this.patientERInsuranceStatusCountList; + data['PatientER_IsNearestProjectUpdated'] = + this.patientERIsNearestProjectUpdated; + data['PatientER_IsNeedAproveReturnedToQueue'] = + this.patientERIsNeedAproveReturnedToQueue; + data['PatientER_IsNeedAproveUpdated'] = this.patientERIsNeedAproveUpdated; + data['PatientER_IsOrderClientRequestUpdated'] = + this.patientERIsOrderClientRequestUpdated; + data['PatientER_IsOrderReturnedToQueue'] = + this.patientERIsOrderReturnedToQueue; + data['PatientER_IsPresOrderInserted'] = this.patientERIsPresOrderInserted; + data['PatientER_IsPresOrderUpdated'] = this.patientERIsPresOrderUpdated; + data['PatientER_IsProjectUpdated'] = this.patientERIsProjectUpdated; + data['PatientER_NotCompletedDetails'] = this.patientERNotCompletedDetails; + data['PatientER_PatientsCountByCallStatus'] = + this.patientERPatientsCountByCallStatus; + data['PatientER_PeakHourCounts'] = this.patientERPeakHourCounts; + data['PatientER_PresOrderInfo'] = this.patientERPresOrderInfo; + data['PatientER_PrescriptionCounts'] = this.patientERPrescriptionCounts; + data['PatientER_ProjectsContribution'] = this.patientERProjectsContribution; + data['PatientER_RRT_GetAllQuestionsList'] = + this.patientERRRTGetAllQuestionsList; + data['PatientER_RRT_GetAllTransportationMethodList'] = + this.patientERRRTGetAllTransportationMethodList; + data['PatientER_RRT_GetPickUpRequestByPresOrderIDList'] = + this.patientERRRTGetPickUpRequestByPresOrderIDList; + data['PatientER_RealRRT_GetAllServicesList'] = + this.patientERRealRRTGetAllServicesList; + data['PatientER_RealRRT_GetOrderDetailsList'] = + this.patientERRealRRTGetOrderDetailsList; + data['PatientER_RealRRT_GetTransactionsForOrderList'] = + this.patientERRealRRTGetTransactionsForOrderList; + data['PatientER_RealRRT_IsTransInserted'] = + this.patientERRealRRTIsTransInserted; + data['PatientER_RequestList'] = this.patientERRequestList; + data['PatientER_TransportationRequestWithTotal'] = + this.patientERTransportationRequestWithTotal; + data['PatientE_RealRRT_GetServicePriceList'] = + this.patientERealRRTGetServicePriceList; + data['PatientInfoByAdmissionNo_List'] = this.patientInfoByAdmissionNoList; + data['PatientMonitor_GetPatientHeartRate'] = + this.patientMonitorGetPatientHeartRate; + data['PatientNotServedCounts'] = this.patientNotServedCounts; + data['PatientPrescriptionList'] = this.patientPrescriptionList; + data['Patient_Allergies'] = this.patientAllergies; + data['Patient_CheckAppointmentValidationList'] = + this.patientCheckAppointmentValidationList; + data['Patient_LoginTokenList'] = this.patientLoginTokenList; + data['Patient_QRLoginInfoList'] = this.patientQRLoginInfoList; + data['Patient_SELECTDeviceIMEIbyIMEIList'] = + this.patientSELECTDeviceIMEIbyIMEIList; + data['PharmList'] = this.pharmList; + data['PrefLang'] = this.prefLang; + data['RadReportUnreadNo'] = this.radReportUnreadNo; + data['Rad_GetPatientRadOrdersForDental_List'] = + this.radGetPatientRadOrdersForDentalList; + data['ReferralNumber'] = this.referralNumber; + data['ReminderConfigurations'] = this.reminderConfigurations; + data['RequestNo'] = this.requestNo; + data['RowCount'] = this.rowCount; + data['ServicePrivilegeList'] = this.servicePrivilegeList; + data['ShareFamilyFileObj'] = this.shareFamilyFileObj; + data['Status'] = this.status; + data['SuccessCode'] = this.successCode; + data['SurveyRate'] = this.surveyRate; + data['SymptomChecker_ConditionList'] = this.symptomCheckerConditionList; + data['SymptomChecker_GetAllDefaultQuestionsList'] = + this.symptomCheckerGetAllDefaultQuestionsList; + data['SymptomChecker_GetBodyPartSymptomsList'] = + this.symptomCheckerGetBodyPartSymptomsList; + data['SymptomChecker_GetBodyPartsByCodeList'] = + this.symptomCheckerGetBodyPartsByCodeList; + data['SymptomChecker_GetBodyPartsList'] = + this.symptomCheckerGetBodyPartsList; + data['SymptomChecker_JsonResponseInString'] = + this.symptomCheckerJsonResponseInString; + data['TimerTime'] = this.timerTime; + data['TotalAdvanceBalanceAmount'] = this.totalAdvanceBalanceAmount; + data['TotalPatientsCount'] = this.totalPatientsCount; + data['TotalPendingApprovalCount'] = this.totalPendingApprovalCount; + data['TotalUnUsedCount'] = this.totalUnUsedCount; + data['TransactionNo'] = this.transactionNo; + data['UnReadCounts'] = this.unReadCounts; + data['UpdateStatus'] = this.updateStatus; + data['UserAgreementContent'] = this.userAgreementContent; + data['YahalaAccountNo'] = this.yahalaAccountNo; + data['check24HourComplaint'] = this.check24HourComplaint; + data['currency'] = this.currency; + data['message'] = this.message; + data['patientID'] = this.patientID; + data['returnValue'] = this.returnValue; + data['returnValueStr'] = this.returnValueStr; + data['statusCode'] = this.statusCode; + return data; + } +} \ No newline at end of file diff --git a/lib/core/model/pharmacies/ListUserAgreement.dart b/lib/core/model/pharmacies/ListUserAgreement.dart new file mode 100644 index 00000000..4237e304 --- /dev/null +++ b/lib/core/model/pharmacies/ListUserAgreement.dart @@ -0,0 +1,28 @@ +class ListUserAgreement { + String userAgreementLAKUM; + String userAgreementLAKUMn; + String userAgreementTxt; + String userAgreementTxtn; + + ListUserAgreement( + {this.userAgreementLAKUM, + this.userAgreementLAKUMn, + this.userAgreementTxt, + this.userAgreementTxtn}); + + ListUserAgreement.fromJson(Map json) { + userAgreementLAKUM = json['UserAgreementLAKUM']; + userAgreementLAKUMn = json['UserAgreementLAKUMn']; + userAgreementTxt = json['UserAgreementTxt']; + userAgreementTxtn = json['UserAgreementTxtn']; + } + + Map toJson() { + final Map data = new Map(); + data['UserAgreementLAKUM'] = this.userAgreementLAKUM; + data['UserAgreementLAKUMn'] = this.userAgreementLAKUMn; + data['UserAgreementTxt'] = this.userAgreementTxt; + data['UserAgreementTxtn'] = this.userAgreementTxtn; + return data; + } +} diff --git a/lib/core/model/pharmacies/PharmacyAddressesModel.dart b/lib/core/model/pharmacies/PharmacyAddressesModel.dart new file mode 100644 index 00000000..db9c20ae --- /dev/null +++ b/lib/core/model/pharmacies/PharmacyAddressesModel.dart @@ -0,0 +1,170 @@ + +import 'dart:convert'; + +PharmacyAddressesModel pharmacyAddressesModelFromJson(String str) => PharmacyAddressesModel.fromJson(json.decode(str)); + +String pharmacyAddressesModelToJson(PharmacyAddressesModel data) => json.encode(data.toJson()); + +class PharmacyAddressesModel { + PharmacyAddressesModel({ + this.customers, + }); + + List customers; + + factory PharmacyAddressesModel.fromJson(Map json) => PharmacyAddressesModel( + customers: List.from(json["customers"].map((x) => Customer.fromJson(x))), + ); + + Map toJson() => { + "customers": List.from(customers.map((x) => x.toJson())), + }; +} + +class Customer { + Customer({ + this.addresses, + }); + + List

addresses; + + factory Customer.fromJson(Map json) => Customer( + addresses: List
.from(json["addresses"].map((x) => Address.fromJson(x))), + ); + + Map toJson() => { + "addresses": List.from(addresses.map((x) => x.toJson())), + }; +} + +class Address { + Address({ + this.id, + this.firstName, + this.lastName, + this.email, + this.company, + this.countryId, + this.country, + this.stateProvinceId, + this.city, + this.address1, + this.address2, + this.zipPostalCode, + this.phoneNumber, + this.faxNumber, + this.customerAttributes, + this.createdOnUtc, + this.province, + this.latLong, + }); + + String id; + FirstName firstName; + LastName lastName; + Email email; + dynamic company; + int countryId; + Country country; + dynamic stateProvinceId; + City city; + String address1; + String address2; + String zipPostalCode; + String phoneNumber; + dynamic faxNumber; + String customerAttributes; + DateTime createdOnUtc; + dynamic province; + String latLong; + + factory Address.fromJson(Map json) => Address( + id: json["id"], + firstName: firstNameValues.map[json["first_name"]], + lastName: lastNameValues.map[json["last_name"]], + email: emailValues.map[json["email"]], + company: json["company"], + countryId: json["country_id"], + country: countryValues.map[json["country"]], + stateProvinceId: json["state_province_id"], + city: cityValues.map[json["city"]], + address1: json["address1"], + address2: json["address2"], + zipPostalCode: json["zip_postal_code"], + phoneNumber: json["phone_number"], + faxNumber: json["fax_number"], + customerAttributes: json["customer_attributes"], + createdOnUtc: DateTime.parse(json["created_on_utc"]), + province: json["province"], + latLong: json["lat_long"], + ); + + Map toJson() => { + "id": id, + "first_name": firstNameValues.reverse[firstName], + "last_name": lastNameValues.reverse[lastName], + "email": emailValues.reverse[email], + "company": company, + "country_id": countryId, + "country": countryValues.reverse[country], + "state_province_id": stateProvinceId, + "city": cityValues.reverse[city], + "address1": address1, + "address2": address2, + "zip_postal_code": zipPostalCode, + "phone_number": phoneNumber, + "fax_number": faxNumber, + "customer_attributes": customerAttributes, + "created_on_utc": createdOnUtc.toIso8601String(), + "province": province, + "lat_long": latLong, + }; +} + +enum City { RIYADH, AL_OYUN } + +final cityValues = EnumValues({ + "Al Oyun": City.AL_OYUN, + "Riyadh": City.RIYADH +}); + +enum Country { SAUDI_ARABIA } + +final countryValues = EnumValues({ + "Saudi Arabia": Country.SAUDI_ARABIA +}); + +enum Email { TAMER_FANASHEH_GMAIL_COM, TAMER_DASDASDAS_GMAIL_COM } + +final emailValues = EnumValues({ + "Tamer.dasdasdas@gmail.com": Email.TAMER_DASDASDAS_GMAIL_COM, + "Tamer.fanasheh@gmail.com": Email.TAMER_FANASHEH_GMAIL_COM +}); + +enum FirstName { TAMER, TAMER_FANASHEH } + +final firstNameValues = EnumValues({ + "TAMER": FirstName.TAMER, + "TAMER FANASHEH": FirstName.TAMER_FANASHEH +}); + +enum LastName { FANASHEH, MUSA } + +final lastNameValues = EnumValues({ + "FANASHEH": LastName.FANASHEH, + "MUSA": LastName.MUSA +}); + +class EnumValues { + Map map; + Map reverseMap; + + EnumValues(this.map); + + Map get reverse { + if (reverseMap == null) { + reverseMap = map.map((k, v) => new MapEntry(v, k)); + } + return reverseMap; + } +} diff --git a/lib/core/model/pharmacies/PharmacyProduct.dart b/lib/core/model/pharmacies/PharmacyProduct.dart index cd461ae5..c472cb4c 100644 --- a/lib/core/model/pharmacies/PharmacyProduct.dart +++ b/lib/core/model/pharmacies/PharmacyProduct.dart @@ -1,149 +1,538 @@ +import 'package:diplomaticquarterapp/core/model/pharmacies/Specifications.dart'; + import 'PharmacyImageObject.dart'; import 'Reviews.dart'; class PharmacyProduct { String id; + bool visibleIndividually; String name; String namen; String shortDescription; + String shortDescriptionn; String fullDescription; String fullDescriptionn; + bool markasNew; + bool showOnHomePage; + String metaKeywords; + String metaDescription; + String metaTitle; + bool allowCustomerReviews; int approvedRatingSum; + int notApprovedRatingSum; int approvedTotalReviews; + int notApprovedTotalReviews; String sku; bool isRx; + bool prescriptionRequired; String rxMessage; String rxMessagen; + String manufacturerPartNumber; + String gtin; + bool isGiftCard; + bool requireOtherProducts; + bool automaticallyAddRequiredProducts; + bool isDownload; + bool unlimitedDownloads; + int maxNumberOfDownloads; + String downloadExpirationDays; + bool hasSampleDownload; + bool hasUserAgreement; + bool isRecurring; + int recurringCycleLength; + int recurringTotalCycles; + bool isRental; + int rentalPriceLength; + bool isShipEnabled; + bool isFreeShipping; + bool shipSeparately; + double additionalShippingCharge; + bool isTaxExempt; + bool isTelecommunicationsOrBroadcastingOrElectronicServices; + bool useMultipleWarehouses; + int manageInventoryMethodId; int stockQuantity; String stockAvailability; String stockAvailabilityn; + bool displayStockAvailability; + bool displayStockQuantity; + int minStockQuantity; + int notifyAdminForQuantityBelow; bool allowBackInStockSubscriptions; int orderMinimumQuantity; int orderMaximumQuantity; + String allowedQuantities; + bool allowAddingOnlyExistingAttributeCombinations; + bool disableBuyButton; + bool disableWishlistButton; + bool availableForPreOrder; + String preOrderAvailabilityStartDateTimeUtc; + bool callForPrice; double price; double oldPrice; + double productCost; + String specialPrice; + String specialPriceStartDateTimeUtc; + String specialPriceEndDateTimeUtc; + bool customerEntersPrice; + double minimumCustomerEnteredPrice; + double maximumCustomerEnteredPrice; + bool basepriceEnabled; + double basepriceAmount; + double basepriceBaseAmount; + bool hasTierPrices; + bool hasDiscountsApplied; String discountName; String discountNamen; + String discountDescription; + String discountDescriptionn; String discountPercentage; + String currency; + String currencyn; + double weight; + double length; + double width; + double height; + String availableStartDateTimeUtc; + String availableEndDateTimeUtc; int displayOrder; + bool published; + bool deleted; + String createdOnUtc; + String updatedOnUtc; + String productType; + int parentGroupedProductId; + List roleIds; List discountIds; + List storeIds; + List manufacturerIds; List reviews; List images; + List attributes; + List specifications; + List associatedProductIds; + List tags; + int vendorId; + String seName; + PharmacyProduct( {this.id, + this.visibleIndividually, this.name, this.namen, this.shortDescription, + this.shortDescriptionn, this.fullDescription, this.fullDescriptionn, + this.markasNew, + this.showOnHomePage, + this.metaKeywords, + this.metaDescription, + this.metaTitle, + this.allowCustomerReviews, this.approvedRatingSum, + this.notApprovedRatingSum, this.approvedTotalReviews, + this.notApprovedTotalReviews, this.sku, this.isRx, + this.prescriptionRequired, this.rxMessage, this.rxMessagen, + this.manufacturerPartNumber, + this.gtin, + this.isGiftCard, + this.requireOtherProducts, + this.automaticallyAddRequiredProducts, + this.isDownload, + this.unlimitedDownloads, + this.maxNumberOfDownloads, + this.downloadExpirationDays, + this.hasSampleDownload, + this.hasUserAgreement, + this.isRecurring, + this.recurringCycleLength, + this.recurringTotalCycles, + this.isRental, + this.rentalPriceLength, + this.isShipEnabled, + this.isFreeShipping, + this.shipSeparately, + this.additionalShippingCharge, + this.isTaxExempt, + this.isTelecommunicationsOrBroadcastingOrElectronicServices, + this.useMultipleWarehouses, + this.manageInventoryMethodId, this.stockQuantity, this.stockAvailability, this.stockAvailabilityn, + this.displayStockAvailability, + this.displayStockQuantity, + this.minStockQuantity, + this.notifyAdminForQuantityBelow, this.allowBackInStockSubscriptions, this.orderMinimumQuantity, this.orderMaximumQuantity, + this.allowedQuantities, + this.allowAddingOnlyExistingAttributeCombinations, + this.disableBuyButton, + this.disableWishlistButton, + this.availableForPreOrder, + this.preOrderAvailabilityStartDateTimeUtc, + this.callForPrice, this.price, this.oldPrice, + this.productCost, + this.specialPrice, + this.specialPriceStartDateTimeUtc, + this.specialPriceEndDateTimeUtc, + this.customerEntersPrice, + this.minimumCustomerEnteredPrice, + this.maximumCustomerEnteredPrice, + this.basepriceEnabled, + this.basepriceAmount, + this.basepriceBaseAmount, + this.hasTierPrices, + this.hasDiscountsApplied, this.discountName, this.discountNamen, + this.discountDescription, + this.discountDescriptionn, this.discountPercentage, + this.currency, + this.currencyn, + this.weight, + this.length, + this.width, + this.height, + this.availableStartDateTimeUtc, + this.availableEndDateTimeUtc, this.displayOrder, + this.published, + this.deleted, + this.createdOnUtc, + this.updatedOnUtc, + this.productType, + this.parentGroupedProductId, + this.roleIds, this.discountIds, + this.storeIds, + this.manufacturerIds, this.reviews, - this.images}); + this.images, + this.attributes, + this.specifications, + this.associatedProductIds, + this.tags, + this.vendorId, + this.seName}); PharmacyProduct.fromJson(Map json) { - try { - id = json['id']; - name = json['name']; - namen = json['namen']; - shortDescription = json['short_description']; - fullDescription = json['full_description']; - fullDescriptionn = json['full_descriptionn']; - approvedRatingSum = json['approved_rating_sum']; - approvedTotalReviews = json['approved_total_reviews']; - sku = json['sku']; - isRx = json['is_rx']; - rxMessage = json['rx_message']; - rxMessagen = json['rx_messagen']; - stockQuantity = json['stock_quantity']; - stockAvailability = json['stock_availability']; - stockAvailabilityn = json['stock_availabilityn']; - allowBackInStockSubscriptions = json['allow_back_in_stock_subscriptions']; - orderMinimumQuantity = json['order_minimum_quantity']; - orderMaximumQuantity = json['order_maximum_quantity']; - price = json['price']; - oldPrice = json['old_price']; - discountName = json['discount_name']; - discountNamen = json['discount_namen']; - discountPercentage = json['discount_percentage']; - displayOrder = json['display_order']; - if (json['discount_ids'] != null) { - discountIds = new List(); - json['discount_ids'].forEach((v) { - discountIds.add(v); - }); - } - if (json['reviews'] != null) { - reviews = new List(); - json['reviews'].forEach((v) { - reviews.add(new Reviews.fromJson(v)); - }); - } - if (json['images'] != null) { - images = new List(); - json['images'].forEach((v) { - images.add(new PharmacyImageObject.fromJson(v)); - }); - } - } catch (e) { - print(e); + id = json['id']; + visibleIndividually = json['visible_individually']; + name = json['name']; + namen = json['namen']; + shortDescription = json['short_description']; + shortDescriptionn = json['short_descriptionn']; + fullDescription = json['full_description']; + fullDescriptionn = json['full_descriptionn']; + markasNew = json['markas_new']; + showOnHomePage = json['show_on_home_page']; + metaKeywords = json['meta_keywords']; + metaDescription = json['meta_description']; + metaTitle = json['meta_title']; + allowCustomerReviews = json['allow_customer_reviews']; + approvedRatingSum = json['approved_rating_sum']; + notApprovedRatingSum = json['not_approved_rating_sum']; + approvedTotalReviews = json['approved_total_reviews']; + notApprovedTotalReviews = json['not_approved_total_reviews']; + sku = json['sku']; + isRx = json['is_rx']; + prescriptionRequired = json['prescription_required']; + rxMessage = json['rx_message']; + rxMessagen = json['rx_messagen']; + manufacturerPartNumber = json['manufacturer_part_number']; + gtin = json['gtin']; + isGiftCard = json['is_gift_card']; + requireOtherProducts = json['require_other_products']; + automaticallyAddRequiredProducts = + json['automatically_add_required_products']; + isDownload = json['is_download']; + unlimitedDownloads = json['unlimited_downloads']; + maxNumberOfDownloads = json['max_number_of_downloads']; + downloadExpirationDays = json['download_expiration_days']; + hasSampleDownload = json['has_sample_download']; + hasUserAgreement = json['has_user_agreement']; + isRecurring = json['is_recurring']; + recurringCycleLength = json['recurring_cycle_length']; + recurringTotalCycles = json['recurring_total_cycles']; + isRental = json['is_rental']; + rentalPriceLength = json['rental_price_length']; + isShipEnabled = json['is_ship_enabled']; + isFreeShipping = json['is_free_shipping']; + shipSeparately = json['ship_separately']; + additionalShippingCharge = json['additional_shipping_charge']; + isTaxExempt = json['is_tax_exempt']; + isTelecommunicationsOrBroadcastingOrElectronicServices = + json['is_telecommunications_or_broadcasting_or_electronic_services']; + useMultipleWarehouses = json['use_multiple_warehouses']; + manageInventoryMethodId = json['manage_inventory_method_id']; + stockQuantity = json['stock_quantity']; + stockAvailability = json['stock_availability']; + stockAvailabilityn = json['stock_availabilityn']; + displayStockAvailability = json['display_stock_availability']; + displayStockQuantity = json['display_stock_quantity']; + minStockQuantity = json['min_stock_quantity']; + notifyAdminForQuantityBelow = json['notify_admin_for_quantity_below']; + allowBackInStockSubscriptions = json['allow_back_in_stock_subscriptions']; + orderMinimumQuantity = json['order_minimum_quantity']; + orderMaximumQuantity = json['order_maximum_quantity']; + allowedQuantities = json['allowed_quantities']; + allowAddingOnlyExistingAttributeCombinations = + json['allow_adding_only_existing_attribute_combinations']; + disableBuyButton = json['disable_buy_button']; + disableWishlistButton = json['disable_wishlist_button']; + availableForPreOrder = json['available_for_pre_order']; + preOrderAvailabilityStartDateTimeUtc = + json['pre_order_availability_start_date_time_utc']; + callForPrice = json['call_for_price']; + price = json['price']; + oldPrice = json['old_price']; + productCost = json['product_cost']; + specialPrice = json['special_price']; + specialPriceStartDateTimeUtc = json['special_price_start_date_time_utc']; + specialPriceEndDateTimeUtc = json['special_price_end_date_time_utc']; + customerEntersPrice = json['customer_enters_price']; + minimumCustomerEnteredPrice = json['minimum_customer_entered_price']; + maximumCustomerEnteredPrice = json['maximum_customer_entered_price']; + basepriceEnabled = json['baseprice_enabled']; + basepriceAmount = json['baseprice_amount']; + basepriceBaseAmount = json['baseprice_base_amount']; + hasTierPrices = json['has_tier_prices']; + hasDiscountsApplied = json['has_discounts_applied']; + discountName = json['discount_name']; + discountNamen = json['discount_namen']; + discountDescription = json['discount_description']; + discountDescriptionn = json['discount_Descriptionn']; + discountPercentage = json['discount_percentage']; + currency = json['currency']; + currencyn = json['currencyn']; + weight = json['weight']; + length = json['length']; + width = json['width']; + height = json['height']; + availableStartDateTimeUtc = json['available_start_date_time_utc']; + availableEndDateTimeUtc = json['available_end_date_time_utc']; + displayOrder = json['display_order']; + published = json['published']; + deleted = json['deleted']; + createdOnUtc = json['created_on_utc']; + updatedOnUtc = json['updated_on_utc']; + productType = json['product_type']; + parentGroupedProductId = json['parent_grouped_product_id']; + if (json['role_ids'] != null) { + roleIds = new List(); + json['role_ids'].forEach((v) { + roleIds.add(v); + }); + } + if (json['discount_ids'] != null) { + discountIds = new List(); + json['discount_ids'].forEach((v) { + discountIds.add(v); + }); + } + if (json['store_ids'] != null) { + storeIds = new List(); + json['store_ids'].forEach((v) { + storeIds.add(v); + }); + } + if (json['manufacturer_ids'] != null) { + manufacturerIds = new List(); + json['manufacturer_ids'].forEach((v) { + manufacturerIds.add(v); + }); + } + if (json['reviews'] != null) { + reviews = new List(); + json['reviews'].forEach((v) { + reviews.add(new Reviews.fromJson(v)); + }); + } + if (json['images'] != null) { + images = new List(); + json['images'].forEach((v) { + images.add(new PharmacyImageObject.fromJson(v)); + }); + } + if (json['attributes'] != null) { + attributes = new List(); + json['attributes'].forEach((v) { + attributes.add(v); + }); + } + if (json['specifications'] != null) { + specifications = new List(); + json['specifications'].forEach((v) { + specifications.add(new Specifications.fromJson(v)); + }); } + if (json['associated_product_ids'] != null) { + associatedProductIds = new List(); + json['associated_product_ids'].forEach((v) { + associatedProductIds.add(v); + }); + } + if (json['tags'] != null) { + tags = new List(); + json['tags'].forEach((v) { + tags.add(v); + }); + } + vendorId = json['vendor_id']; + seName = json['se_name']; } Map toJson() { final Map data = new Map(); data['id'] = this.id; + data['visible_individually'] = this.visibleIndividually; data['name'] = this.name; data['namen'] = this.namen; data['short_description'] = this.shortDescription; + data['short_descriptionn'] = this.shortDescriptionn; data['full_description'] = this.fullDescription; data['full_descriptionn'] = this.fullDescriptionn; + data['markas_new'] = this.markasNew; + data['show_on_home_page'] = this.showOnHomePage; + data['meta_keywords'] = this.metaKeywords; + data['meta_description'] = this.metaDescription; + data['meta_title'] = this.metaTitle; + data['allow_customer_reviews'] = this.allowCustomerReviews; data['approved_rating_sum'] = this.approvedRatingSum; + data['not_approved_rating_sum'] = this.notApprovedRatingSum; data['approved_total_reviews'] = this.approvedTotalReviews; + data['not_approved_total_reviews'] = this.notApprovedTotalReviews; data['sku'] = this.sku; data['is_rx'] = this.isRx; + data['prescription_required'] = this.prescriptionRequired; data['rx_message'] = this.rxMessage; data['rx_messagen'] = this.rxMessagen; + data['manufacturer_part_number'] = this.manufacturerPartNumber; + data['gtin'] = this.gtin; + data['is_gift_card'] = this.isGiftCard; + data['require_other_products'] = this.requireOtherProducts; + data['automatically_add_required_products'] = + this.automaticallyAddRequiredProducts; + data['is_download'] = this.isDownload; + data['unlimited_downloads'] = this.unlimitedDownloads; + data['max_number_of_downloads'] = this.maxNumberOfDownloads; + data['download_expiration_days'] = this.downloadExpirationDays; + data['has_sample_download'] = this.hasSampleDownload; + data['has_user_agreement'] = this.hasUserAgreement; + data['is_recurring'] = this.isRecurring; + data['recurring_cycle_length'] = this.recurringCycleLength; + data['recurring_total_cycles'] = this.recurringTotalCycles; + data['is_rental'] = this.isRental; + data['rental_price_length'] = this.rentalPriceLength; + data['is_ship_enabled'] = this.isShipEnabled; + data['is_free_shipping'] = this.isFreeShipping; + data['ship_separately'] = this.shipSeparately; + data['additional_shipping_charge'] = this.additionalShippingCharge; + data['is_tax_exempt'] = this.isTaxExempt; + data['is_telecommunications_or_broadcasting_or_electronic_services'] = + this.isTelecommunicationsOrBroadcastingOrElectronicServices; + data['use_multiple_warehouses'] = this.useMultipleWarehouses; + data['manage_inventory_method_id'] = this.manageInventoryMethodId; data['stock_quantity'] = this.stockQuantity; data['stock_availability'] = this.stockAvailability; data['stock_availabilityn'] = this.stockAvailabilityn; + data['display_stock_availability'] = this.displayStockAvailability; + data['display_stock_quantity'] = this.displayStockQuantity; + data['min_stock_quantity'] = this.minStockQuantity; + data['notify_admin_for_quantity_below'] = this.notifyAdminForQuantityBelow; data['allow_back_in_stock_subscriptions'] = this.allowBackInStockSubscriptions; data['order_minimum_quantity'] = this.orderMinimumQuantity; data['order_maximum_quantity'] = this.orderMaximumQuantity; + data['allowed_quantities'] = this.allowedQuantities; + data['allow_adding_only_existing_attribute_combinations'] = + this.allowAddingOnlyExistingAttributeCombinations; + data['disable_buy_button'] = this.disableBuyButton; + data['disable_wishlist_button'] = this.disableWishlistButton; + data['available_for_pre_order'] = this.availableForPreOrder; + data['pre_order_availability_start_date_time_utc'] = + this.preOrderAvailabilityStartDateTimeUtc; + data['call_for_price'] = this.callForPrice; data['price'] = this.price; data['old_price'] = this.oldPrice; + data['product_cost'] = this.productCost; + data['special_price'] = this.specialPrice; + data['special_price_start_date_time_utc'] = + this.specialPriceStartDateTimeUtc; + data['special_price_end_date_time_utc'] = this.specialPriceEndDateTimeUtc; + data['customer_enters_price'] = this.customerEntersPrice; + data['minimum_customer_entered_price'] = this.minimumCustomerEnteredPrice; + data['maximum_customer_entered_price'] = this.maximumCustomerEnteredPrice; + data['baseprice_enabled'] = this.basepriceEnabled; + data['baseprice_amount'] = this.basepriceAmount; + data['baseprice_base_amount'] = this.basepriceBaseAmount; + data['has_tier_prices'] = this.hasTierPrices; + data['has_discounts_applied'] = this.hasDiscountsApplied; data['discount_name'] = this.discountName; data['discount_namen'] = this.discountNamen; + data['discount_description'] = this.discountDescription; + data['discount_Descriptionn'] = this.discountDescriptionn; data['discount_percentage'] = this.discountPercentage; + data['currency'] = this.currency; + data['currencyn'] = this.currencyn; + data['weight'] = this.weight; + data['length'] = this.length; + data['width'] = this.width; + data['height'] = this.height; + data['available_start_date_time_utc'] = this.availableStartDateTimeUtc; + data['available_end_date_time_utc'] = this.availableEndDateTimeUtc; data['display_order'] = this.displayOrder; - if (this.discountIds != String) { + data['published'] = this.published; + data['deleted'] = this.deleted; + data['created_on_utc'] = this.createdOnUtc; + data['updated_on_utc'] = this.updatedOnUtc; + data['product_type'] = this.productType; + data['parent_grouped_product_id'] = this.parentGroupedProductId; + if (this.roleIds != null) { + data['role_ids'] = this.roleIds.map((v) => v).toList(); + } + if (this.discountIds != null) { data['discount_ids'] = this.discountIds.map((v) => v).toList(); } - if (this.reviews != String) { + if (this.storeIds != null) { + data['store_ids'] = this.storeIds.map((v) => v).toList(); + } + data['manufacturer_ids'] = this.manufacturerIds; + if (this.reviews != null) { data['reviews'] = this.reviews.map((v) => v.toJson()).toList(); } - if (this.images != String) { + if (this.images != null) { data['images'] = this.images.map((v) => v.toJson()).toList(); } + if (this.attributes != null) { + data['attributes'] = this.attributes.map((v) => v).toList(); + } + if (this.specifications != null) { + data['specifications'] = + this.specifications.map((v) => v.toJson()).toList(); + } + if (this.associatedProductIds != null) { + data['associated_product_ids'] = + this.associatedProductIds.map((v) => v).toList(); + } + if (this.tags != null) { + data['tags'] = this.tags.map((v) => v).toList(); + } + data['vendor_id'] = this.vendorId; + data['se_name'] = this.seName; return data; } } diff --git a/lib/core/model/pharmacies/PointsAmountPerMonth.dart b/lib/core/model/pharmacies/PointsAmountPerMonth.dart new file mode 100644 index 00000000..71cf3498 --- /dev/null +++ b/lib/core/model/pharmacies/PointsAmountPerMonth.dart @@ -0,0 +1,42 @@ +import 'PointsAmountPerday.dart'; + +class PointsAmountPerMonth { + double amountPerMonth; + String month; + int monthNumber; + List pointsAmountPerday; + double pointsPerMonth; + + PointsAmountPerMonth( + {this.amountPerMonth, + this.month, + this.monthNumber, + this.pointsAmountPerday, + this.pointsPerMonth}); + + PointsAmountPerMonth.fromJson(Map json) { + amountPerMonth = json['AmountPerMonth']; + month = json['Month']; + monthNumber = json['MonthNumber']; + if (json['PointsAmountPerday'] != null) { + pointsAmountPerday = new List(); + json['PointsAmountPerday'].forEach((v) { + pointsAmountPerday.add(new PointsAmountPerday.fromJson(v)); + }); + } + pointsPerMonth = json['PointsPerMonth']; + } + + Map toJson() { + final Map data = new Map(); + data['AmountPerMonth'] = this.amountPerMonth; + data['Month'] = this.month; + data['MonthNumber'] = this.monthNumber; + if (this.pointsAmountPerday != null) { + data['PointsAmountPerday'] = + this.pointsAmountPerday.map((v) => v.toJson()).toList(); + } + data['PointsPerMonth'] = this.pointsPerMonth; + return data; + } +} diff --git a/lib/core/model/pharmacies/PointsAmountPerYear.dart b/lib/core/model/pharmacies/PointsAmountPerYear.dart new file mode 100644 index 00000000..eef74064 --- /dev/null +++ b/lib/core/model/pharmacies/PointsAmountPerYear.dart @@ -0,0 +1,38 @@ +import 'PointsAmountPerMonth.dart'; + +class PointsAmountPerYear { + int amountPerYear; + List pointsAmountPerMonth; + int pointsPerYear; + int year; + + PointsAmountPerYear( + {this.amountPerYear, + this.pointsAmountPerMonth, + this.pointsPerYear, + this.year}); + + PointsAmountPerYear.fromJson(Map json) { + amountPerYear = json['AmountPerYear']; + if (json['PointsAmountPerMonth'] != null) { + pointsAmountPerMonth = new List(); + json['PointsAmountPerMonth'].forEach((v) { + pointsAmountPerMonth.add(new PointsAmountPerMonth.fromJson(v)); + }); + } + pointsPerYear = json['PointsPerYear']; + year = json['Year']; + } + + Map toJson() { + final Map data = new Map(); + data['AmountPerYear'] = this.amountPerYear; + if (this.pointsAmountPerMonth != null) { + data['PointsAmountPerMonth'] = + this.pointsAmountPerMonth.map((v) => v.toJson()).toList(); + } + data['PointsPerYear'] = this.pointsPerYear; + data['Year'] = this.year; + return data; + } +} diff --git a/lib/core/model/pharmacies/PointsAmountPerday.dart b/lib/core/model/pharmacies/PointsAmountPerday.dart new file mode 100644 index 00000000..e78e87b7 --- /dev/null +++ b/lib/core/model/pharmacies/PointsAmountPerday.dart @@ -0,0 +1,42 @@ +import 'PointsDetails.dart'; + +class PointsAmountPerday { + double amountPerDay; + String day; + List pointsDetails; + double pointsPerDay; + String transationDate; + + PointsAmountPerday( + {this.amountPerDay, + this.day, + this.pointsDetails, + this.pointsPerDay, + this.transationDate}); + + PointsAmountPerday.fromJson(Map json) { + amountPerDay = json['AmountPerDay']; + day = json['Day']; + if (json['PointsDetails'] != null) { + pointsDetails = new List(); + json['PointsDetails'].forEach((v) { + pointsDetails.add(new PointsDetails.fromJson(v)); + }); + } + pointsPerDay = json['PointsPerDay']; + transationDate = json['TransationDate']; + } + + Map toJson() { + final Map data = new Map(); + data['AmountPerDay'] = this.amountPerDay; + data['Day'] = this.day; + if (this.pointsDetails != null) { + data['PointsDetails'] = + this.pointsDetails.map((v) => v.toJson()).toList(); + } + data['PointsPerDay'] = this.pointsPerDay; + data['TransationDate'] = this.transationDate; + return data; + } +} \ No newline at end of file diff --git a/lib/core/model/pharmacies/PointsDetails.dart b/lib/core/model/pharmacies/PointsDetails.dart new file mode 100644 index 00000000..7b342af9 --- /dev/null +++ b/lib/core/model/pharmacies/PointsDetails.dart @@ -0,0 +1,57 @@ +class PointsDetails { + int accNumber; + String accountStatus; + double amount; + int lineItemNo; + String operationType; + double points; + double purchasePoints; + int subTransactionType; + String subTransactionTypeDescription; + String transactionDate; + + PointsDetails( + {this.accNumber, + this.accountStatus, + this.amount, + this.lineItemNo, + this.operationType, + this.points, + this.purchasePoints, + this.subTransactionType, + this.subTransactionTypeDescription, + this.transactionDate}); + + PointsDetails.fromJson(Map json) { + accNumber = json['AccNumber']; + accountStatus = json['AccountStatus']; + amount = json['Amount']; + lineItemNo = json['LineItemNo']; + operationType = json['OperationType']; + points = json['Points']; + var purchasePoints = json['PurchasePoints']; + if(purchasePoints is int){ + this.purchasePoints = (purchasePoints).roundToDouble(); + }else { + this.purchasePoints = purchasePoints; + } + subTransactionType = json['SubTransactionType']; + subTransactionTypeDescription = json['SubTransactionTypeDescription']; + transactionDate = json['TransactionDate']; + } + + Map toJson() { + final Map data = new Map(); + data['AccNumber'] = this.accNumber; + data['AccountStatus'] = this.accountStatus; + data['Amount'] = this.amount; + data['LineItemNo'] = this.lineItemNo; + data['OperationType'] = this.operationType; + data['Points'] = this.points; + data['PurchasePoints'] = this.purchasePoints; + data['SubTransactionType'] = this.subTransactionType; + data['SubTransactionTypeDescription'] = this.subTransactionTypeDescription; + data['TransactionDate'] = this.transactionDate; + return data; + } +} diff --git a/lib/core/model/pharmacies/ShippingOption.dart b/lib/core/model/pharmacies/ShippingOption.dart new file mode 100644 index 00000000..1b589537 --- /dev/null +++ b/lib/core/model/pharmacies/ShippingOption.dart @@ -0,0 +1,97 @@ +class ShippingOption { + String shippingRateComputationMethodSystemName; + double rate; + double rateVat; + double rateVatPercent; + String name; + String namen; + String description; + String descriptionn; + bool allowShippingSunday; + bool allowShippingMonday; + bool allowShippingTuesday; + bool allowShippingWednesday; + bool allowShippingThursday; + bool allowShippingFriday; + bool allowShippingSaturday; + String allowShippingTime1From; + String allowShippingTime1To; + String allowShippingTime2From; + String allowShippingTime2To; + String allowShippingNote; + String allowShippingNoten; + + ShippingOption( + {this.shippingRateComputationMethodSystemName, + this.rate, + this.rateVat, + this.rateVatPercent, + this.name, + this.namen, + this.description, + this.descriptionn, + this.allowShippingSunday, + this.allowShippingMonday, + this.allowShippingTuesday, + this.allowShippingWednesday, + this.allowShippingThursday, + this.allowShippingFriday, + this.allowShippingSaturday, + this.allowShippingTime1From, + this.allowShippingTime1To, + this.allowShippingTime2From, + this.allowShippingTime2To, + this.allowShippingNote, + this.allowShippingNoten}); + + ShippingOption.fromJson(Map json) { + shippingRateComputationMethodSystemName = json['shipping_rate_computation_method_system_name']; + rate = json['rate']; + rateVat = json['rate_vat']; + rateVatPercent = json['rate_vat_percent']; + name = json['name']; + namen = json['namen']; + description = json['description']; + descriptionn = json['descriptionn']; + allowShippingSunday = json['AllowShippingSunday']; + allowShippingMonday = json['AllowShippingMonday']; + allowShippingTuesday = json['AllowShippingTuesday']; + allowShippingWednesday = json['AllowShippingWednesday']; + allowShippingThursday = json['AllowShippingThursday']; + allowShippingFriday = json['AllowShippingFriday']; + allowShippingSaturday = json['AllowShippingSaturday']; + allowShippingTime1From = json['AllowShippingTime1From']; + allowShippingTime1To = json['AllowShippingTime1To']; + allowShippingTime2From = json['AllowShippingTime2From']; + allowShippingTime2To = json['AllowShippingTime2To']; + allowShippingNote = json['AllowShippingNote']; + allowShippingNoten = json['AllowShippingNoten']; + } + + Map toJson() { + final Map data = new Map(); + data['shipping_rate_computation_method_system_name'] = + this.shippingRateComputationMethodSystemName; + data['rate'] = this.rate; + data['rate_vat'] = this.rateVat; + data['rate_vat_percent'] = this.rateVatPercent; + data['name'] = this.name; + data['namen'] = this.namen; + data['description'] = this.description; + data['descriptionn'] = this.descriptionn; + data['AllowShippingSunday'] = this.allowShippingSunday; + data['AllowShippingMonday'] = this.allowShippingMonday; + data['AllowShippingTuesday'] = this.allowShippingTuesday; + data['AllowShippingWednesday'] = this.allowShippingWednesday; + data['AllowShippingThursday'] = this.allowShippingThursday; + data['AllowShippingFriday'] = this.allowShippingFriday; + data['AllowShippingSaturday'] = this.allowShippingSaturday; + data['AllowShippingTime1From'] = this.allowShippingTime1From; + data['AllowShippingTime1To'] = this.allowShippingTime1To; + data['AllowShippingTime2From'] = this.allowShippingTime2From; + data['AllowShippingTime2To'] = this.allowShippingTime2To; + data['AllowShippingNote'] = this.allowShippingNote; + data['AllowShippingNoten'] = this.allowShippingNoten; + return data; + } +} diff --git a/lib/core/model/pharmacies/ShoppingCart.dart b/lib/core/model/pharmacies/ShoppingCart.dart new file mode 100644 index 00000000..f965203a --- /dev/null +++ b/lib/core/model/pharmacies/ShoppingCart.dart @@ -0,0 +1,115 @@ +import 'package:diplomaticquarterapp/core/model/pharmacies/Customer.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacies/PharmacyProduct.dart'; + +class ShoppingCart { + int languageId; + String id; + // List productAttributes; + double customerEnteredPrice; + int quantity; + String discountAmountInclTax; + String subtotal; + String subtotalWithVat; + String subtotalVatAmount; + String subtotalVatRate; + String currency; + String currencyn; + String rentalStartDateUtc; + String rentalEndDateUtc; + String createdOnUtc; + String updatedOnUtc; + String shoppingCartType; + int productId; + PharmacyProduct product; + int customerId; + Customer customer; + + ShoppingCart( + {this.languageId, + this.id, + // this.productAttributes, + this.customerEnteredPrice, + this.quantity, + this.discountAmountInclTax, + this.subtotal, + this.subtotalWithVat, + this.subtotalVatAmount, + this.subtotalVatRate, + this.currency, + this.currencyn, + this.rentalStartDateUtc, + this.rentalEndDateUtc, + this.createdOnUtc, + this.updatedOnUtc, + this.shoppingCartType, + this.productId, + this.product, + this.customerId, + this.customer}); + + ShoppingCart.fromJson(Map json) { + languageId = json['language_id']; + id = json['id']; + /*if (json['product_attributes'] != null) { + productAttributes = new List(); + json['product_attributes'].forEach((v) { + productAttributes.add(new Null.fromJson(v)); + }); + }*/ + customerEnteredPrice = json['customer_entered_price']; + quantity = json['quantity']; + discountAmountInclTax = json['discount_amount_incl_tax']; + subtotal = json['subtotal']; + subtotalWithVat = json['subtotal_with_vat']; + subtotalVatAmount = json['subtotal_vat_amount']; + subtotalVatRate = json['subtotal_vat_rate']; + currency = json['currency']; + currencyn = json['currencyn']; + rentalStartDateUtc = json['rental_start_date_utc']; + rentalEndDateUtc = json['rental_end_date_utc']; + createdOnUtc = json['created_on_utc']; + updatedOnUtc = json['updated_on_utc']; + shoppingCartType = json['shopping_cart_type']; + productId = json['product_id']; + product = json['product'] != null + ? new PharmacyProduct.fromJson(json['product']) + : null; + customerId = json['customer_id']; + customer = json['customer'] != null + ? new Customer.fromJson(json['customer']) + : null; + } + + Map toJson() { + final Map data = new Map(); + data['language_id'] = this.languageId; + data['id'] = this.id; + /*if (this.productAttributes != null) { + data['product_attributes'] = + this.productAttributes.map((v) => v.toJson()).toList(); + }*/ + data['customer_entered_price'] = this.customerEnteredPrice; + data['quantity'] = this.quantity; + data['discount_amount_incl_tax'] = this.discountAmountInclTax; + data['subtotal'] = this.subtotal; + data['subtotal_with_vat'] = this.subtotalWithVat; + data['subtotal_vat_amount'] = this.subtotalVatAmount; + data['subtotal_vat_rate'] = this.subtotalVatRate; + data['currency'] = this.currency; + data['currencyn'] = this.currencyn; + data['rental_start_date_utc'] = this.rentalStartDateUtc; + data['rental_end_date_utc'] = this.rentalEndDateUtc; + data['created_on_utc'] = this.createdOnUtc; + data['updated_on_utc'] = this.updatedOnUtc; + data['shopping_cart_type'] = this.shoppingCartType; + data['product_id'] = this.productId; + if (this.product != null) { + data['product'] = this.product.toJson(); + } + data['customer_id'] = this.customerId; + if (this.customer != null) { + data['customer'] = this.customer.toJson(); + } + return data; + } +} diff --git a/lib/core/model/pharmacies/ShoppingCartResponse.dart b/lib/core/model/pharmacies/ShoppingCartResponse.dart new file mode 100644 index 00000000..96b751ae --- /dev/null +++ b/lib/core/model/pharmacies/ShoppingCartResponse.dart @@ -0,0 +1,55 @@ +import 'package:diplomaticquarterapp/core/model/pharmacies/ShoppingCart.dart'; +import 'package:flutter/material.dart'; + +class ShoppingCartResponse with ChangeNotifier { + int itemCount; + int quantityCount; + double subtotal; + double subtotalWithVat; + double subtotalVatAmount; + double subtotalVatRate; + List shoppingCarts; + + ShoppingCartResponse( + {this.itemCount, + this.quantityCount, + this.subtotal, + this.subtotalWithVat, + this.subtotalVatAmount, + this.subtotalVatRate, + this.shoppingCarts}); + + void updateShoppingCard() { + notifyListeners(); + } + + ShoppingCartResponse.fromJson(Map json) { + itemCount = json['item_count']; + quantityCount = json['quantity_count']; + subtotal = json['subtotal']; + subtotalWithVat = json['subtotal_with_vat']; + subtotalVatAmount = json['subtotal_vat_amount']; + subtotalVatRate = json['subtotal_vat_rate']; + if (json['shopping_carts'] != null) { + shoppingCarts = new List(); + json['shopping_carts'].forEach((v) { + shoppingCarts.add(new ShoppingCart.fromJson(v)); + }); + } + } + + Map toJson() { + final Map data = new Map(); + data['item_count'] = this.itemCount; + data['quantity_count'] = this.quantityCount; + data['subtotal'] = this.subtotal; + data['subtotal_with_vat'] = this.subtotalWithVat; + data['subtotal_vat_amount'] = this.subtotalVatAmount; + data['subtotal_vat_rate'] = this.subtotalVatRate; + if (this.shoppingCarts != null) { + data['shopping_carts'] = + this.shoppingCarts.map((v) => v.toJson()).toList(); + } + return data; + } +} diff --git a/lib/core/model/pharmacies/Specifications.dart b/lib/core/model/pharmacies/Specifications.dart new file mode 100644 index 00000000..f227de69 --- /dev/null +++ b/lib/core/model/pharmacies/Specifications.dart @@ -0,0 +1,36 @@ +class Specifications { + int id; + int displayOrder; + String defaultValue; + String defaultValuen; + String name; + String nameN; + + Specifications( + {this.id, + this.displayOrder, + this.defaultValue, + this.defaultValuen, + this.name, + this.nameN}); + + Specifications.fromJson(Map json) { + id = json['id']; + displayOrder = json['display_order']; + defaultValue = json['default_value']; + defaultValuen = json['default_valuen']; + name = json['name']; + nameN = json['nameN']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['display_order'] = this.displayOrder; + data['default_value'] = this.defaultValue; + data['default_valuen'] = this.defaultValuen; + data['name'] = this.name; + data['nameN'] = this.nameN; + return data; + } +} diff --git a/lib/core/model/pharmacies/payment-checkout-data.dart b/lib/core/model/pharmacies/payment-checkout-data.dart new file mode 100644 index 00000000..dd9e0e54 --- /dev/null +++ b/lib/core/model/pharmacies/payment-checkout-data.dart @@ -0,0 +1,21 @@ +import 'package:diplomaticquarterapp/core/model/pharmacies/Addresses.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacies/LacumAccountInformation.dart'; +import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/OrderPreviewViewModel.dart'; +import 'package:flutter/material.dart'; + +import 'ShippingOption.dart'; + +class PaymentCheckoutData with ChangeNotifier{ + Addresses address; + PaymentOption paymentOption; + LacumAccountInformation lacumInformation; + bool cartDataVisible; + ShippingOption shippingOption; + int usedLakumPoints; + + PaymentCheckoutData({this.address, this.paymentOption, this.lacumInformation, this.cartDataVisible = false, this.shippingOption, this.usedLakumPoints = 0}); + + void updateData() { + notifyListeners(); + } +} diff --git a/lib/core/model/pharmacy/brands_model.dart b/lib/core/model/pharmacy/brands_model.dart new file mode 100644 index 00000000..03cd689e --- /dev/null +++ b/lib/core/model/pharmacy/brands_model.dart @@ -0,0 +1,24 @@ +class BrandsModel { + String id; + String name; + String namen; + Null image; + + BrandsModel({this.id, this.name, this.namen, this.image}); + + BrandsModel.fromJson(Map json) { + id = json['id']; + name = json['name']; + namen = json['namen']; + image = json['image']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['name'] = this.name; + data['namen'] = this.namen; + data['image'] = this.image; + return data; + } +} diff --git a/lib/core/model/pharmacy/categorise_parent_model.dart b/lib/core/model/pharmacy/categorise_parent_model.dart new file mode 100644 index 00000000..82c5b55f --- /dev/null +++ b/lib/core/model/pharmacy/categorise_parent_model.dart @@ -0,0 +1,75 @@ +class CategoriseParentModel { + String id; + String name; + String namen; + List localizedNames; + dynamic description; + int parentCategoryId; + int displayOrder; + dynamic image; + bool isLeaf; + + CategoriseParentModel( + {this.id, + this.name, + this.namen, + this.localizedNames, + this.description, + this.parentCategoryId, + this.displayOrder, + this.image, + this.isLeaf}); + + CategoriseParentModel.fromJson(Map json) { + id = json['id']; + name = json['name']; + namen = json['namen']; + if (json['localized_names'] != null) { + localizedNames = new List(); + json['localized_names'].forEach((v) { + localizedNames.add(new LocalizedNames.fromJson(v)); + }); + } + description = json['description']; + parentCategoryId = json['parent_category_id']; + displayOrder = json['display_order']; + image = json['image']; + isLeaf = json['is_leaf']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['name'] = this.name; + data['namen'] = this.namen; + if (this.localizedNames != null) { + data['localized_names'] = + this.localizedNames.map((v) => v.toJson()).toList(); + } + data['description'] = this.description; + data['parent_category_id'] = this.parentCategoryId; + data['display_order'] = this.displayOrder; + data['image'] = this.image; + data['is_leaf'] = this.isLeaf; + return data; + } +} + +class LocalizedNames { + int languageId; + String localizedName; + + LocalizedNames({this.languageId, this.localizedName}); + + LocalizedNames.fromJson(Map json) { + languageId = json['language_id']; + localizedName = json['localized_name']; + } + + Map toJson() { + final Map data = new Map(); + data['language_id'] = this.languageId; + data['localized_name'] = this.localizedName; + return data; + } +} diff --git a/lib/core/model/pharmacy/final_products_model.dart b/lib/core/model/pharmacy/final_products_model.dart new file mode 100644 index 00000000..52ab1d2d --- /dev/null +++ b/lib/core/model/pharmacy/final_products_model.dart @@ -0,0 +1,184 @@ +class FinalProductsModel { + String id; + String name; + String namen; + List localizedNames; + String shortDescription; + String fullDescription; + String fullDescriptionn; + dynamic approvedRatingSum; + dynamic approvedTotalReviews; + String sku; + bool isRx; + dynamic rxMessage; + dynamic rxMessagen; + dynamic stockQuantity; + String stockAvailability; + String stockAvailabilityn; + bool allowBackInStockSubscriptions; + dynamic orderMinimumQuantity; + dynamic orderMaximumQuantity; + dynamic price; + dynamic oldPrice; + dynamic discountName; + dynamic discountNamen; + dynamic discountPercentage; + dynamic displayOrder; + List discountIds; + List reviews; + List images; + + FinalProductsModel( + {this.id, + this.name, + this.namen, + this.localizedNames, + this.shortDescription, + this.fullDescription, + this.fullDescriptionn, + this.approvedRatingSum, + this.approvedTotalReviews, + this.sku, + this.isRx, + this.rxMessage, + this.rxMessagen, + this.stockQuantity, + this.stockAvailability, + this.stockAvailabilityn, + this.allowBackInStockSubscriptions, + this.orderMinimumQuantity, + this.orderMaximumQuantity, + this.price, + this.oldPrice, + this.discountName, + this.discountNamen, + this.discountPercentage, + this.displayOrder, + this.discountIds, + this.reviews, + this.images}); + + FinalProductsModel.fromJson(Map json) { + id = json['id']; + name = json['name']; + if (json['images'] != null) { + images = new List(); + json['images'].forEach((v) { + images.add(new Images.fromJson(v)); + }); + } + namen = json['namen']; + if (json['localized_names'] != null) { + localizedNames = new List(); + json['localized_names'].forEach((v) { + localizedNames.add(new LocalizedNames.fromJson(v)); + }); + } + shortDescription = json['short_description']; + fullDescription = json['full_description']; + fullDescriptionn = json['full_descriptionn']; + approvedRatingSum = json['approved_rating_sum']; + approvedTotalReviews = json['approved_total_reviews']; + sku = json['sku']; + isRx = json['is_rx']; + rxMessage = json['rx_message']; + rxMessagen = json['rx_messagen']; + stockQuantity = json['stock_quantity']; + stockAvailability = json['stock_availability']; + stockAvailabilityn = json['stock_availabilityn']; + allowBackInStockSubscriptions = json['allow_back_in_stock_subscriptions']; + orderMinimumQuantity = json['order_minimum_quantity']; + orderMaximumQuantity = json['order_maximum_quantity']; + price = json['price']; + oldPrice = json['old_price']; + discountName = json['discount_name']; + discountNamen = json['discount_namen']; + discountPercentage = json['discount_percentage']; + displayOrder = json['display_order']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['name'] = this.name; + data['namen'] = this.namen; + if (this.localizedNames != null) { + data['localized_names'] = + this.localizedNames.map((v) => v.toJson()).toList(); + } + data['short_description'] = this.shortDescription; + data['full_description'] = this.fullDescription; + data['full_descriptionn'] = this.fullDescriptionn; + data['approved_rating_sum'] = this.approvedRatingSum; + data['approved_total_reviews'] = this.approvedTotalReviews; + data['sku'] = this.sku; + data['is_rx'] = this.isRx; + data['rx_message'] = this.rxMessage; + data['rx_messagen'] = this.rxMessagen; + data['stock_quantity'] = this.stockQuantity; + data['stock_availability'] = this.stockAvailability; + data['stock_availabilityn'] = this.stockAvailabilityn; + data['allow_back_in_stock_subscriptions'] = + this.allowBackInStockSubscriptions; + data['order_minimum_quantity'] = this.orderMinimumQuantity; + data['order_maximum_quantity'] = this.orderMaximumQuantity; + data['price'] = this.price; + data['old_price'] = this.oldPrice; + data['discount_name'] = this.discountName; + data['discount_namen'] = this.discountNamen; + data['discount_percentage'] = this.discountPercentage; + data['display_order'] = this.displayOrder; + + if (this.images != null) { + data['images'] = this.images.map((v) => v.toJson()).toList(); + } + return data; + } +} + +class LocalizedNames { + int languageId; + String localizedName; + + LocalizedNames({this.languageId, this.localizedName}); + + LocalizedNames.fromJson(Map json) { + languageId = json['language_id']; + localizedName = json['localized_name']; + } + + Map toJson() { + final Map data = new Map(); + data['language_id'] = this.languageId; + data['localized_name'] = this.localizedName; + return data; + } +} + +class Images { + int id; + int position; + String src; + String thumb; + String attachment; + + Images({this.id, this.position, this.src, this.thumb, this.attachment}); + + Images.fromJson(Map json) { + id = json['id']; + position = json['position']; + src = json['src']; + thumb = json['thumb']; + attachment = json['attachment']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['position'] = this.position; + data['src'] = this.src; + data['thumb'] = this.thumb; + data['attachment'] = this.attachment; + return data; + } +} diff --git a/lib/core/model/pharmacy/offer_products_model.dart b/lib/core/model/pharmacy/offer_products_model.dart new file mode 100644 index 00000000..f41b731b --- /dev/null +++ b/lib/core/model/pharmacy/offer_products_model.dart @@ -0,0 +1,579 @@ +class OfferProductsModel { + String id; + bool visibleIndividually; + String name; + String namen; + List localizedNames; + String shortDescription; + String shortDescriptionn; + String fullDescription; + String fullDescriptionn; + bool markasNew; + bool showOnHomePage; + dynamic metaKeywords; + dynamic metaDescription; + dynamic metaTitle; + bool allowCustomerReviews; + dynamic approvedRatingSum; + dynamic notApprovedRatingSum; + dynamic approvedTotalReviews; + dynamic notApprovedTotalReviews; + String sku; + bool isRx; + bool prescriptionRequired; + dynamic rxMessage; + dynamic rxMessagen; + dynamic manufacturerPartNumber; + dynamic gtin; + bool isGiftCard; + bool requireOtherProducts; + bool automaticallyAddRequiredProducts; + bool isDownload; + bool unlimitedDownloads; + dynamic maxNumberOfDownloads; + dynamic downloadExpirationDays; + bool hasSampleDownload; + bool hasUserAgreement; + bool isRecurring; + dynamic recurringCycleLength; + dynamic recurringTotalCycles; + bool isRental; + dynamic rentalPriceLength; + bool isShipEnabled; + bool isFreeShipping; + bool shipSeparately; + dynamic additionalShippingCharge; + bool isTaxExempt; + bool isTelecommunicationsOrBroadcastingOrElectronicServices; + bool useMultipleWarehouses; + dynamic manageInventoryMethodId; + dynamic stockQuantity; + String stockAvailability; + String stockAvailabilityn; + bool displayStockAvailability; + bool displayStockQuantity; + dynamic minStockQuantity; + dynamic notifyAdminForQuantityBelow; + bool allowBackInStockSubscriptions; + dynamic orderMinimumQuantity; + dynamic orderMaximumQuantity; + dynamic allowedQuantities; + bool allowAddingOnlyExistingAttributeCombinations; + bool disableBuyButton; + bool disableWishlistButton; + bool availableForPreOrder; + dynamic preOrderAvailabilityStartDateTimeUtc; + bool callForPrice; + dynamic price; + dynamic oldPrice; + dynamic productCost; + dynamic specialPrice; + dynamic specialPriceStartDateTimeUtc; + dynamic specialPriceEndDateTimeUtc; + bool customerEntersPrice; + dynamic minimumCustomerEnteredPrice; + dynamic maximumCustomerEnteredPrice; + bool basepriceEnabled; + dynamic basepriceAmount; + dynamic basepriceBaseAmount; + bool hasTierPrices; + bool hasDiscountsApplied; + String discountName; + String discountNamen; + String discountDescription; + String discountDescriptionn; + dynamic discountPercentage; + String currency; + String currencyn; + dynamic weight; + dynamic length; + dynamic width; + dynamic height; + dynamic availableStartDateTimeUtc; + dynamic availableEndDateTimeUtc; + dynamic displayOrder; + bool published; + bool deleted; + String createdOnUtc; + String updatedOnUtc; + String productType; + dynamic parentGroupedProductId; + List roleIds; + List discountIds; + List storeIds; + List manufacturerIds; + List reviews; + List images; + List attributes; + List specifications; + List associatedProductIds; + List tags; + dynamic vendorId; + String seName; + + OfferProductsModel( + {this.id, + this.visibleIndividually, + this.name, + this.namen, + this.localizedNames, + this.shortDescription, + this.shortDescriptionn, + this.fullDescription, + this.fullDescriptionn, + this.markasNew, + this.showOnHomePage, + this.metaKeywords, + this.metaDescription, + this.metaTitle, + this.allowCustomerReviews, + this.approvedRatingSum, + this.notApprovedRatingSum, + this.approvedTotalReviews, + this.notApprovedTotalReviews, + this.sku, + this.isRx, + this.prescriptionRequired, + this.rxMessage, + this.rxMessagen, + this.manufacturerPartNumber, + this.gtin, + this.isGiftCard, + this.requireOtherProducts, + this.automaticallyAddRequiredProducts, + this.isDownload, + this.unlimitedDownloads, + this.maxNumberOfDownloads, + this.downloadExpirationDays, + this.hasSampleDownload, + this.hasUserAgreement, + this.isRecurring, + this.recurringCycleLength, + this.recurringTotalCycles, + this.isRental, + this.rentalPriceLength, + this.isShipEnabled, + this.isFreeShipping, + this.shipSeparately, + this.additionalShippingCharge, + this.isTaxExempt, + this.isTelecommunicationsOrBroadcastingOrElectronicServices, + this.useMultipleWarehouses, + this.manageInventoryMethodId, + this.stockQuantity, + this.stockAvailability, + this.stockAvailabilityn, + this.displayStockAvailability, + this.displayStockQuantity, + this.minStockQuantity, + this.notifyAdminForQuantityBelow, + this.allowBackInStockSubscriptions, + this.orderMinimumQuantity, + this.orderMaximumQuantity, + this.allowedQuantities, + this.allowAddingOnlyExistingAttributeCombinations, + this.disableBuyButton, + this.disableWishlistButton, + this.availableForPreOrder, + this.preOrderAvailabilityStartDateTimeUtc, + this.callForPrice, + this.price, + this.oldPrice, + this.productCost, + this.specialPrice, + this.specialPriceStartDateTimeUtc, + this.specialPriceEndDateTimeUtc, + this.customerEntersPrice, + this.minimumCustomerEnteredPrice, + this.maximumCustomerEnteredPrice, + this.basepriceEnabled, + this.basepriceAmount, + this.basepriceBaseAmount, + this.hasTierPrices, + this.hasDiscountsApplied, + this.discountName, + this.discountNamen, + this.discountDescription, + this.discountDescriptionn, + this.discountPercentage, + this.currency, + this.currencyn, + this.weight, + this.length, + this.width, + this.height, + this.availableStartDateTimeUtc, + this.availableEndDateTimeUtc, + this.displayOrder, + this.published, + this.deleted, + this.createdOnUtc, + this.updatedOnUtc, + this.productType, + this.parentGroupedProductId, + this.roleIds, + this.discountIds, + this.storeIds, + this.manufacturerIds, + this.reviews, + this.images, + this.attributes, + this.specifications, + this.associatedProductIds, + this.tags, + this.vendorId, + this.seName}); + + OfferProductsModel.fromJson(Map json) { + id = json['id']; + visibleIndividually = json['visible_individually']; + name = json['name']; + namen = json['namen']; + if (json['localized_names'] != null) { + localizedNames = new List(); + json['localized_names'].forEach((v) { + localizedNames.add(new LocalizedNames.fromJson(v)); + }); + } + shortDescription = json['short_description']; + shortDescriptionn = json['short_descriptionn']; + fullDescription = json['full_description']; + fullDescriptionn = json['full_descriptionn']; + markasNew = json['markas_new']; + showOnHomePage = json['show_on_home_page']; + metaKeywords = json['meta_keywords']; + metaDescription = json['meta_description']; + metaTitle = json['meta_title']; + allowCustomerReviews = json['allow_customer_reviews']; + approvedRatingSum = json['approved_rating_sum']; + notApprovedRatingSum = json['not_approved_rating_sum']; + approvedTotalReviews = json['approved_total_reviews']; + notApprovedTotalReviews = json['not_approved_total_reviews']; + sku = json['sku']; + isRx = json['is_rx']; + prescriptionRequired = json['prescription_required']; + rxMessage = json['rx_message']; + rxMessagen = json['rx_messagen']; + manufacturerPartNumber = json['manufacturer_part_number']; + gtin = json['gtin']; + isGiftCard = json['is_gift_card']; + requireOtherProducts = json['require_other_products']; + automaticallyAddRequiredProducts = + json['automatically_add_required_products']; + isDownload = json['is_download']; + unlimitedDownloads = json['unlimited_downloads']; + maxNumberOfDownloads = json['max_number_of_downloads']; + downloadExpirationDays = json['download_expiration_days']; + hasSampleDownload = json['has_sample_download']; + hasUserAgreement = json['has_user_agreement']; + isRecurring = json['is_recurring']; + recurringCycleLength = json['recurring_cycle_length']; + recurringTotalCycles = json['recurring_total_cycles']; + isRental = json['is_rental']; + rentalPriceLength = json['rental_price_length']; + isShipEnabled = json['is_ship_enabled']; + isFreeShipping = json['is_free_shipping']; + shipSeparately = json['ship_separately']; + additionalShippingCharge = json['additional_shipping_charge']; + isTaxExempt = json['is_tax_exempt']; + isTelecommunicationsOrBroadcastingOrElectronicServices = + json['is_telecommunications_or_broadcasting_or_electronic_services']; + useMultipleWarehouses = json['use_multiple_warehouses']; + manageInventoryMethodId = json['manage_inventory_method_id']; + stockQuantity = json['stock_quantity']; + stockAvailability = json['stock_availability']; + stockAvailabilityn = json['stock_availabilityn']; + displayStockAvailability = json['display_stock_availability']; + displayStockQuantity = json['display_stock_quantity']; + minStockQuantity = json['min_stock_quantity']; + notifyAdminForQuantityBelow = json['notify_admin_for_quantity_below']; + allowBackInStockSubscriptions = json['allow_back_in_stock_subscriptions']; + orderMinimumQuantity = json['order_minimum_quantity']; + orderMaximumQuantity = json['order_maximum_quantity']; + allowedQuantities = json['allowed_quantities']; + allowAddingOnlyExistingAttributeCombinations = + json['allow_adding_only_existing_attribute_combinations']; + disableBuyButton = json['disable_buy_button']; + disableWishlistButton = json['disable_wishlist_button']; + availableForPreOrder = json['available_for_pre_order']; + preOrderAvailabilityStartDateTimeUtc = + json['pre_order_availability_start_date_time_utc']; + callForPrice = json['call_for_price']; + price = json['price']; + oldPrice = json['old_price']; + productCost = json['product_cost']; + specialPrice = json['special_price']; + specialPriceStartDateTimeUtc = json['special_price_start_date_time_utc']; + specialPriceEndDateTimeUtc = json['special_price_end_date_time_utc']; + customerEntersPrice = json['customer_enters_price']; + minimumCustomerEnteredPrice = json['minimum_customer_entered_price']; + maximumCustomerEnteredPrice = json['maximum_customer_entered_price']; + basepriceEnabled = json['baseprice_enabled']; + basepriceAmount = json['baseprice_amount']; + basepriceBaseAmount = json['baseprice_base_amount']; + hasTierPrices = json['has_tier_prices']; + hasDiscountsApplied = json['has_discounts_applied']; + discountName = json['discount_name']; + discountNamen = json['discount_namen']; + discountDescription = json['discount_description']; + discountDescriptionn = json['discount_Descriptionn']; + discountPercentage = json['discount_percentage']; + currency = json['currency']; + currencyn = json['currencyn']; + weight = json['weight']; + length = json['length']; + width = json['width']; + height = json['height']; + availableStartDateTimeUtc = json['available_start_date_time_utc']; + availableEndDateTimeUtc = json['available_end_date_time_utc']; + displayOrder = json['display_order']; + published = json['published']; + deleted = json['deleted']; + createdOnUtc = json['created_on_utc']; + updatedOnUtc = json['updated_on_utc']; + productType = json['product_type']; + parentGroupedProductId = json['parent_grouped_product_id']; + + discountIds = json['discount_ids'].cast(); + + if (json['images'] != null) { + images = new List(); + json['images'].forEach((v) { + images.add(new Images.fromJson(v)); + }); + } + + vendorId = json['vendor_id']; + seName = json['se_name']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['visible_individually'] = this.visibleIndividually; + data['name'] = this.name; + data['namen'] = this.namen; + if (this.localizedNames != null) { + data['localized_names'] = + this.localizedNames.map((v) => v.toJson()).toList(); + } + data['short_description'] = this.shortDescription; + data['short_descriptionn'] = this.shortDescriptionn; + data['full_description'] = this.fullDescription; + data['full_descriptionn'] = this.fullDescriptionn; + data['markas_new'] = this.markasNew; + data['show_on_home_page'] = this.showOnHomePage; + data['meta_keywords'] = this.metaKeywords; + data['meta_description'] = this.metaDescription; + data['meta_title'] = this.metaTitle; + data['allow_customer_reviews'] = this.allowCustomerReviews; + data['approved_rating_sum'] = this.approvedRatingSum; + data['not_approved_rating_sum'] = this.notApprovedRatingSum; + data['approved_total_reviews'] = this.approvedTotalReviews; + data['not_approved_total_reviews'] = this.notApprovedTotalReviews; + data['sku'] = this.sku; + data['is_rx'] = this.isRx; + data['prescription_required'] = this.prescriptionRequired; + data['rx_message'] = this.rxMessage; + data['rx_messagen'] = this.rxMessagen; + data['manufacturer_part_number'] = this.manufacturerPartNumber; + data['gtin'] = this.gtin; + data['is_gift_card'] = this.isGiftCard; + data['require_other_products'] = this.requireOtherProducts; + data['automatically_add_required_products'] = + this.automaticallyAddRequiredProducts; + data['is_download'] = this.isDownload; + data['unlimited_downloads'] = this.unlimitedDownloads; + data['max_number_of_downloads'] = this.maxNumberOfDownloads; + data['download_expiration_days'] = this.downloadExpirationDays; + data['has_sample_download'] = this.hasSampleDownload; + data['has_user_agreement'] = this.hasUserAgreement; + data['is_recurring'] = this.isRecurring; + data['recurring_cycle_length'] = this.recurringCycleLength; + data['recurring_total_cycles'] = this.recurringTotalCycles; + data['is_rental'] = this.isRental; + data['rental_price_length'] = this.rentalPriceLength; + data['is_ship_enabled'] = this.isShipEnabled; + data['is_free_shipping'] = this.isFreeShipping; + data['ship_separately'] = this.shipSeparately; + data['additional_shipping_charge'] = this.additionalShippingCharge; + data['is_tax_exempt'] = this.isTaxExempt; + data['is_telecommunications_or_broadcasting_or_electronic_services'] = + this.isTelecommunicationsOrBroadcastingOrElectronicServices; + data['use_multiple_warehouses'] = this.useMultipleWarehouses; + data['manage_inventory_method_id'] = this.manageInventoryMethodId; + data['stock_quantity'] = this.stockQuantity; + data['stock_availability'] = this.stockAvailability; + data['stock_availabilityn'] = this.stockAvailabilityn; + data['display_stock_availability'] = this.displayStockAvailability; + data['display_stock_quantity'] = this.displayStockQuantity; + data['min_stock_quantity'] = this.minStockQuantity; + data['notify_admin_for_quantity_below'] = this.notifyAdminForQuantityBelow; + data['allow_back_in_stock_subscriptions'] = + this.allowBackInStockSubscriptions; + data['order_minimum_quantity'] = this.orderMinimumQuantity; + data['order_maximum_quantity'] = this.orderMaximumQuantity; + data['allowed_quantities'] = this.allowedQuantities; + data['allow_adding_only_existing_attribute_combinations'] = + this.allowAddingOnlyExistingAttributeCombinations; + data['disable_buy_button'] = this.disableBuyButton; + data['disable_wishlist_button'] = this.disableWishlistButton; + data['available_for_pre_order'] = this.availableForPreOrder; + data['pre_order_availability_start_date_time_utc'] = + this.preOrderAvailabilityStartDateTimeUtc; + data['call_for_price'] = this.callForPrice; + data['price'] = this.price; + data['old_price'] = this.oldPrice; + data['product_cost'] = this.productCost; + data['special_price'] = this.specialPrice; + data['special_price_start_date_time_utc'] = + this.specialPriceStartDateTimeUtc; + data['special_price_end_date_time_utc'] = this.specialPriceEndDateTimeUtc; + data['customer_enters_price'] = this.customerEntersPrice; + data['minimum_customer_entered_price'] = this.minimumCustomerEnteredPrice; + data['maximum_customer_entered_price'] = this.maximumCustomerEnteredPrice; + data['baseprice_enabled'] = this.basepriceEnabled; + data['baseprice_amount'] = this.basepriceAmount; + data['baseprice_base_amount'] = this.basepriceBaseAmount; + data['has_tier_prices'] = this.hasTierPrices; + data['has_discounts_applied'] = this.hasDiscountsApplied; + data['discount_name'] = this.discountName; + data['discount_namen'] = this.discountNamen; + data['discount_description'] = this.discountDescription; + data['discount_Descriptionn'] = this.discountDescriptionn; + data['discount_percentage'] = this.discountPercentage; + data['currency'] = this.currency; + data['currencyn'] = this.currencyn; + data['weight'] = this.weight; + data['length'] = this.length; + data['width'] = this.width; + data['height'] = this.height; + data['available_start_date_time_utc'] = this.availableStartDateTimeUtc; + data['available_end_date_time_utc'] = this.availableEndDateTimeUtc; + data['display_order'] = this.displayOrder; + data['published'] = this.published; + data['deleted'] = this.deleted; + data['created_on_utc'] = this.createdOnUtc; + data['updated_on_utc'] = this.updatedOnUtc; + data['product_type'] = this.productType; + data['parent_grouped_product_id'] = this.parentGroupedProductId; + if (this.roleIds != null) { + data['role_ids'] = this.roleIds.map((v) => v.toJson()).toList(); + } + data['discount_ids'] = this.discountIds; + if (this.storeIds != null) { + data['store_ids'] = this.storeIds.map((v) => v.toJson()).toList(); + } + if (this.manufacturerIds != null) { + data['manufacturer_ids'] = + this.manufacturerIds.map((v) => v.toJson()).toList(); + } + if (this.reviews != null) { + data['reviews'] = this.reviews.map((v) => v.toJson()).toList(); + } + if (this.images != null) { + data['images'] = this.images.map((v) => v.toJson()).toList(); + } + if (this.attributes != null) { + data['attributes'] = this.attributes.map((v) => v.toJson()).toList(); + } + if (this.specifications != null) { + data['specifications'] = + this.specifications.map((v) => v.toJson()).toList(); + } + if (this.associatedProductIds != null) { + data['associated_product_ids'] = + this.associatedProductIds.map((v) => v.toJson()).toList(); + } + if (this.tags != null) { + data['tags'] = this.tags.map((v) => v.toJson()).toList(); + } + data['vendor_id'] = this.vendorId; + data['se_name'] = this.seName; + return data; + } +} + +class LocalizedNames { + int languageId; + String localizedName; + + LocalizedNames({this.languageId, this.localizedName}); + + LocalizedNames.fromJson(Map json) { + languageId = json['language_id']; + localizedName = json['localized_name']; + } + + Map toJson() { + final Map data = new Map(); + data['language_id'] = this.languageId; + data['localized_name'] = this.localizedName; + return data; + } +} + +class Images { + int id; + int position; + String src; + String thumb; + String attachment; + + Images({this.id, this.position, this.src, this.thumb, this.attachment}); + + Images.fromJson(Map json) { + id = json['id']; + position = json['position']; + src = json['src']; + thumb = json['thumb']; + attachment = json['attachment']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['position'] = this.position; + data['src'] = this.src; + data['thumb'] = this.thumb; + data['attachment'] = this.attachment; + return data; + } +} + +class Specifications { + int id; + int displayOrder; + String defaultValue; + String defaultValuen; + String name; + String nameN; + + Specifications( + {this.id, + this.displayOrder, + this.defaultValue, + this.defaultValuen, + this.name, + this.nameN}); + + Specifications.fromJson(Map json) { + id = json['id']; + displayOrder = json['display_order']; + defaultValue = json['default_value']; + defaultValuen = json['default_valuen']; + name = json['name']; + nameN = json['nameN']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['display_order'] = this.displayOrder; + data['default_value'] = this.defaultValue; + data['default_valuen'] = this.defaultValuen; + data['name'] = this.name; + data['nameN'] = this.nameN; + return data; + } +} diff --git a/lib/core/model/pharmacy/offers_model.dart b/lib/core/model/pharmacy/offers_model.dart new file mode 100644 index 00000000..3add1d3d --- /dev/null +++ b/lib/core/model/pharmacy/offers_model.dart @@ -0,0 +1,175 @@ +class OffersModel { + String id; + String name; + String namen; + List localizedNames; + Null description; + int categoryTemplateId; + String metaKeywords; + String metaDescription; + String metaTitle; + int parentCategoryId; + int pageSize; + String pageSizeOptions; + Null priceRanges; + bool showOnHomePage; + bool includeInTopMenu; + Null hasDiscountsApplied; + bool published; + bool deleted; + int displayOrder; + String createdOnUtc; + String updatedOnUtc; + List roleIds; + List discountIds; + List storeIds; + Image image; + String seName; + bool isLeaf; + + OffersModel( + {this.id, + this.name, + this.namen, + this.localizedNames, + this.description, + this.categoryTemplateId, + this.metaKeywords, + this.metaDescription, + this.metaTitle, + this.parentCategoryId, + this.pageSize, + this.pageSizeOptions, + this.priceRanges, + this.showOnHomePage, + this.includeInTopMenu, + this.hasDiscountsApplied, + this.published, + this.deleted, + this.displayOrder, + this.createdOnUtc, + this.updatedOnUtc, + this.roleIds, + this.discountIds, + this.storeIds, + this.image, + this.seName, + this.isLeaf}); + + OffersModel.fromJson(Map json) { + id = json['id']; + name = json['name']; + namen = json['namen']; + if (json['localized_names'] != null) { + localizedNames = new List(); + json['localized_names'].forEach((v) { + localizedNames.add(new LocalizedNames.fromJson(v)); + }); + } + description = json['description']; + categoryTemplateId = json['category_template_id']; + metaKeywords = json['meta_keywords']; + metaDescription = json['meta_description']; + metaTitle = json['meta_title']; + parentCategoryId = json['parent_category_id']; + pageSize = json['page_size']; + pageSizeOptions = json['page_size_options']; + priceRanges = json['price_ranges']; + showOnHomePage = json['show_on_home_page']; + includeInTopMenu = json['include_in_top_menu']; + hasDiscountsApplied = json['has_discounts_applied']; + published = json['published']; + deleted = json['deleted']; + displayOrder = json['display_order']; + createdOnUtc = json['created_on_utc']; + updatedOnUtc = json['updated_on_utc']; + + image = json['image'] != null ? new Image.fromJson(json['image']) : null; + seName = json['se_name']; + isLeaf = json['is_leaf']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['name'] = this.name; + data['namen'] = this.namen; + if (this.localizedNames != null) { + data['localized_names'] = + this.localizedNames.map((v) => v.toJson()).toList(); + } + data['description'] = this.description; + data['category_template_id'] = this.categoryTemplateId; + data['meta_keywords'] = this.metaKeywords; + data['meta_description'] = this.metaDescription; + data['meta_title'] = this.metaTitle; + data['parent_category_id'] = this.parentCategoryId; + data['page_size'] = this.pageSize; + data['page_size_options'] = this.pageSizeOptions; + data['price_ranges'] = this.priceRanges; + data['show_on_home_page'] = this.showOnHomePage; + data['include_in_top_menu'] = this.includeInTopMenu; + data['has_discounts_applied'] = this.hasDiscountsApplied; + data['published'] = this.published; + data['deleted'] = this.deleted; + data['display_order'] = this.displayOrder; + data['created_on_utc'] = this.createdOnUtc; + data['updated_on_utc'] = this.updatedOnUtc; + if (this.roleIds != null) { + data['role_ids'] = this.roleIds.map((v) => v.toJson()).toList(); + } + if (this.discountIds != null) { + data['discount_ids'] = this.discountIds.map((v) => v.toJson()).toList(); + } + if (this.storeIds != null) { + data['store_ids'] = this.storeIds.map((v) => v.toJson()).toList(); + } + if (this.image != null) { + data['image'] = this.image.toJson(); + } + data['se_name'] = this.seName; + data['is_leaf'] = this.isLeaf; + return data; + } +} + +class LocalizedNames { + int languageId; + String localizedName; + + LocalizedNames({this.languageId, this.localizedName}); + + LocalizedNames.fromJson(Map json) { + languageId = json['language_id']; + localizedName = json['localized_name']; + } + + Map toJson() { + final Map data = new Map(); + data['language_id'] = this.languageId; + data['localized_name'] = this.localizedName; + return data; + } +} + +class Image { + String src; + Null thumb; + Null attachment; + + Image({this.src, this.thumb, this.attachment}); + + Image.fromJson(Map json) { + src = json['src']; + thumb = json['thumb']; + attachment = json['attachment']; + } + + Map toJson() { + final Map data = new Map(); + data['src'] = this.src; + data['thumb'] = this.thumb; + data['attachment'] = this.attachment; + return data; + } +} diff --git a/lib/core/model/pharmacy/parent_products_model.dart b/lib/core/model/pharmacy/parent_products_model.dart new file mode 100644 index 00000000..55495416 --- /dev/null +++ b/lib/core/model/pharmacy/parent_products_model.dart @@ -0,0 +1,566 @@ +class ParentProductsModel { + dynamic id; + dynamic visibleIndividually; + dynamic name; + dynamic namen; + List localizedNames; + dynamic shortDescription; + dynamic shortDescriptionn; + dynamic fullDescription; + dynamic fullDescriptionn; + dynamic markasNew; + dynamic showOnHomePage; + dynamic metaKeywords; + dynamic metaDescription; + dynamic metaTitle; + dynamic allowCustomerReviews; + dynamic approvedRatingSum; + dynamic notApprovedRatingSum; + dynamic approvedTotalReviews; + dynamic notApprovedTotalReviews; + dynamic sku; + dynamic isRx; + dynamic prescriptionRequired; + dynamic rxMessage; + dynamic rxMessagen; + dynamic manufacturerPartNumber; + dynamic gtin; + dynamic isGiftCard; + dynamic requireOtherProducts; + dynamic automaticallyAddRequiredProducts; + dynamic isDownload; + dynamic unlimitedDownloads; + dynamic maxNumberOfDownloads; + dynamic downloadExpirationDays; + dynamic hasSampleDownload; + dynamic hasUserAgreement; + dynamic isRecurring; + dynamic recurringCycleLength; + dynamic recurringTotalCycles; + dynamic isRental; + dynamic rentalPriceLength; + dynamic isShipEnabled; + dynamic isFreeShipping; + dynamic shipSeparately; + dynamic additionalShippingCharge; + dynamic isTaxExempt; + dynamic isTelecommunicationsOrBroadcastingOrElectronicServices; + dynamic useMultipleWarehouses; + dynamic manageInventoryMethodId; + dynamic stockQuantity; + dynamic stockAvailability; + dynamic stockAvailabilityn; + dynamic displayStockAvailability; + dynamic displayStockQuantity; + dynamic minStockQuantity; + dynamic notifyAdminForQuantityBelow; + dynamic allowBackInStockSubscriptions; + dynamic orderMinimumQuantity; + dynamic orderMaximumQuantity; + dynamic allowedQuantities; + dynamic allowAddingOnlyExistingAttributeCombinations; + dynamic disableBuyButton; + dynamic disableWishlistButton; + dynamic availableForPreOrder; + dynamic preOrderAvailabilityStartDateTimeUtc; + dynamic callForPrice; + dynamic price; + dynamic oldPrice; + dynamic productCost; + dynamic specialPrice; + dynamic specialPriceStartDateTimeUtc; + dynamic specialPriceEndDateTimeUtc; + dynamic customerEntersPrice; + dynamic minimumCustomerEnteredPrice; + dynamic maximumCustomerEnteredPrice; + dynamic basepriceEnabled; + dynamic basepriceAmount; + dynamic basepriceBaseAmount; + dynamic hasTierPrices; + dynamic hasDiscountsApplied; + dynamic discountName; + dynamic discountNamen; + dynamic discountDescription; + dynamic discountDescriptionn; + dynamic discountPercentage; + dynamic currency; + dynamic currencyn; + dynamic weight; + dynamic length; + dynamic width; + dynamic height; + dynamic availableStartDateTimeUtc; + dynamic availableEndDateTimeUtc; + dynamic displayOrder; + dynamic published; + dynamic deleted; + dynamic createdOnUtc; + dynamic updatedOnUtc; + dynamic productType; + dynamic parentGroupedProductId; + List roleIds; + List discountIds; + List storeIds; + List manufacturerIds; + List reviews; + List images; + List attributes; + List specifications; + List associatedProductIds; + List tags; + dynamic vendorId; + String seName; + + ParentProductsModel( + {this.id, + this.visibleIndividually, + this.name, + this.namen, + this.localizedNames, + this.shortDescription, + this.shortDescriptionn, + this.fullDescription, + this.fullDescriptionn, + this.markasNew, + this.showOnHomePage, + this.metaKeywords, + this.metaDescription, + this.metaTitle, + this.allowCustomerReviews, + this.approvedRatingSum, + this.notApprovedRatingSum, + this.approvedTotalReviews, + this.notApprovedTotalReviews, + this.sku, + this.isRx, + this.prescriptionRequired, + this.rxMessage, + this.rxMessagen, + this.manufacturerPartNumber, + this.gtin, + this.isGiftCard, + this.requireOtherProducts, + this.automaticallyAddRequiredProducts, + this.isDownload, + this.unlimitedDownloads, + this.maxNumberOfDownloads, + this.downloadExpirationDays, + this.hasSampleDownload, + this.hasUserAgreement, + this.isRecurring, + this.recurringCycleLength, + this.recurringTotalCycles, + this.isRental, + this.rentalPriceLength, + this.isShipEnabled, + this.isFreeShipping, + this.shipSeparately, + this.additionalShippingCharge, + this.isTaxExempt, + this.isTelecommunicationsOrBroadcastingOrElectronicServices, + this.useMultipleWarehouses, + this.manageInventoryMethodId, + this.stockQuantity, + this.stockAvailability, + this.stockAvailabilityn, + this.displayStockAvailability, + this.displayStockQuantity, + this.minStockQuantity, + this.notifyAdminForQuantityBelow, + this.allowBackInStockSubscriptions, + this.orderMinimumQuantity, + this.orderMaximumQuantity, + this.allowedQuantities, + this.allowAddingOnlyExistingAttributeCombinations, + this.disableBuyButton, + this.disableWishlistButton, + this.availableForPreOrder, + this.preOrderAvailabilityStartDateTimeUtc, + this.callForPrice, + this.price, + this.oldPrice, + this.productCost, + this.specialPrice, + this.specialPriceStartDateTimeUtc, + this.specialPriceEndDateTimeUtc, + this.customerEntersPrice, + this.minimumCustomerEnteredPrice, + this.maximumCustomerEnteredPrice, + this.basepriceEnabled, + this.basepriceAmount, + this.basepriceBaseAmount, + this.hasTierPrices, + this.hasDiscountsApplied, + this.discountName, + this.discountNamen, + this.discountDescription, + this.discountDescriptionn, + this.discountPercentage, + this.currency, + this.currencyn, + this.weight, + this.length, + this.width, + this.height, + this.availableStartDateTimeUtc, + this.availableEndDateTimeUtc, + this.displayOrder, + this.published, + this.deleted, + this.createdOnUtc, + this.updatedOnUtc, + this.productType, + this.parentGroupedProductId, + this.roleIds, + this.discountIds, + this.storeIds, + this.manufacturerIds, + this.reviews, + this.images, + this.attributes, + this.specifications, + this.associatedProductIds, + this.tags, + this.vendorId, + this.seName}); + + ParentProductsModel.fromJson(Map json) { + id = json['id']; + visibleIndividually = json['visible_individually']; + name = json['name']; + if (json['images'] != null) { + images = new List(); + json['images'].forEach((v) { + images.add(new Images.fromJson(v)); + }); + } + namen = json['namen']; + if (json['localized_names'] != null) { + localizedNames = new List(); + json['localized_names'].forEach((v) { + localizedNames.add(new LocalizedNames.fromJson(v)); + }); + } + shortDescription = json['short_description']; + shortDescriptionn = json['short_descriptionn']; + fullDescription = json['full_description']; + fullDescriptionn = json['full_descriptionn']; + markasNew = json['markas_new']; + showOnHomePage = json['show_on_home_page']; + metaKeywords = json['meta_keywords']; + metaDescription = json['meta_description']; + metaTitle = json['meta_title']; + allowCustomerReviews = json['allow_customer_reviews']; + approvedRatingSum = json['approved_rating_sum']; + notApprovedRatingSum = json['not_approved_rating_sum']; + approvedTotalReviews = json['approved_total_reviews']; + notApprovedTotalReviews = json['not_approved_total_reviews']; + sku = json['sku']; + isRx = json['is_rx']; + prescriptionRequired = json['prescription_required']; + rxMessage = json['rx_message']; + rxMessagen = json['rx_messagen']; + manufacturerPartNumber = json['manufacturer_part_number']; + gtin = json['gtin']; + isGiftCard = json['is_gift_card']; + requireOtherProducts = json['require_other_products']; + automaticallyAddRequiredProducts = + json['automatically_add_required_products']; + isDownload = json['is_download']; + unlimitedDownloads = json['unlimited_downloads']; + maxNumberOfDownloads = json['max_number_of_downloads']; + downloadExpirationDays = json['download_expiration_days']; + hasSampleDownload = json['has_sample_download']; + hasUserAgreement = json['has_user_agreement']; + isRecurring = json['is_recurring']; + recurringCycleLength = json['recurring_cycle_length']; + recurringTotalCycles = json['recurring_total_cycles']; + isRental = json['is_rental']; + rentalPriceLength = json['rental_price_length']; + isShipEnabled = json['is_ship_enabled']; + isFreeShipping = json['is_free_shipping']; + shipSeparately = json['ship_separately']; + additionalShippingCharge = json['additional_shipping_charge']; + isTaxExempt = json['is_tax_exempt']; + isTelecommunicationsOrBroadcastingOrElectronicServices = + json['is_telecommunications_or_broadcasting_or_electronic_services']; + useMultipleWarehouses = json['use_multiple_warehouses']; + manageInventoryMethodId = json['manage_inventory_method_id']; + stockQuantity = json['stock_quantity']; + stockAvailability = json['stock_availability']; + stockAvailabilityn = json['stock_availabilityn']; + displayStockAvailability = json['display_stock_availability']; + displayStockQuantity = json['display_stock_quantity']; + minStockQuantity = json['min_stock_quantity']; + notifyAdminForQuantityBelow = json['notify_admin_for_quantity_below']; + allowBackInStockSubscriptions = json['allow_back_in_stock_subscriptions']; + orderMinimumQuantity = json['order_minimum_quantity']; + orderMaximumQuantity = json['order_maximum_quantity']; + allowedQuantities = json['allowed_quantities']; + allowAddingOnlyExistingAttributeCombinations = + json['allow_adding_only_existing_attribute_combinations']; + disableBuyButton = json['disable_buy_button']; + disableWishlistButton = json['disable_wishlist_button']; + availableForPreOrder = json['available_for_pre_order']; + preOrderAvailabilityStartDateTimeUtc = + json['pre_order_availability_start_date_time_utc']; + callForPrice = json['call_for_price']; + price = json['price']; + oldPrice = json['old_price']; + productCost = json['product_cost']; + specialPrice = json['special_price']; + specialPriceStartDateTimeUtc = json['special_price_start_date_time_utc']; + specialPriceEndDateTimeUtc = json['special_price_end_date_time_utc']; + customerEntersPrice = json['customer_enters_price']; + minimumCustomerEnteredPrice = json['minimum_customer_entered_price']; + maximumCustomerEnteredPrice = json['maximum_customer_entered_price']; + basepriceEnabled = json['baseprice_enabled']; + basepriceAmount = json['baseprice_amount']; + basepriceBaseAmount = json['baseprice_base_amount']; + hasTierPrices = json['has_tier_prices']; + hasDiscountsApplied = json['has_discounts_applied']; + discountName = json['discount_name']; + discountNamen = json['discount_namen']; + discountDescription = json['discount_description']; + discountDescriptionn = json['discount_Descriptionn']; + discountPercentage = json['discount_percentage']; + currency = json['currency']; + currencyn = json['currencyn']; + weight = json['weight']; + length = json['length']; + width = json['width']; + height = json['height']; + availableStartDateTimeUtc = json['available_start_date_time_utc']; + availableEndDateTimeUtc = json['available_end_date_time_utc']; + displayOrder = json['display_order']; + published = json['published']; + deleted = json['deleted']; + createdOnUtc = json['created_on_utc']; + updatedOnUtc = json['updated_on_utc']; + productType = json['product_type']; + parentGroupedProductId = json['parent_grouped_product_id']; + + manufacturerIds = json['manufacturer_ids'].cast(); + + if (json['specifications'] != null) { + specifications = new List(); + json['specifications'].forEach((v) { + specifications.add(new Specifications.fromJson(v)); + }); + } + + vendorId = json['vendor_id']; + seName = json['se_name']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['visible_individually'] = this.visibleIndividually; + data['name'] = this.name; + data['namen'] = this.namen; + if (this.localizedNames != null) { + data['localized_names'] = + this.localizedNames.map((v) => v.toJson()).toList(); + } + data['short_description'] = this.shortDescription; + data['short_descriptionn'] = this.shortDescriptionn; + data['full_description'] = this.fullDescription; + data['full_descriptionn'] = this.fullDescriptionn; + data['markas_new'] = this.markasNew; + data['show_on_home_page'] = this.showOnHomePage; + data['meta_keywords'] = this.metaKeywords; + data['meta_description'] = this.metaDescription; + data['meta_title'] = this.metaTitle; + data['allow_customer_reviews'] = this.allowCustomerReviews; + data['approved_rating_sum'] = this.approvedRatingSum; + data['not_approved_rating_sum'] = this.notApprovedRatingSum; + data['approved_total_reviews'] = this.approvedTotalReviews; + data['not_approved_total_reviews'] = this.notApprovedTotalReviews; + data['sku'] = this.sku; + data['is_rx'] = this.isRx; + data['prescription_required'] = this.prescriptionRequired; + data['rx_message'] = this.rxMessage; + data['rx_messagen'] = this.rxMessagen; + data['manufacturer_part_number'] = this.manufacturerPartNumber; + data['gtin'] = this.gtin; + data['is_gift_card'] = this.isGiftCard; + data['require_other_products'] = this.requireOtherProducts; + data['automatically_add_required_products'] = + this.automaticallyAddRequiredProducts; + data['is_download'] = this.isDownload; + data['unlimited_downloads'] = this.unlimitedDownloads; + data['max_number_of_downloads'] = this.maxNumberOfDownloads; + data['download_expiration_days'] = this.downloadExpirationDays; + data['has_sample_download'] = this.hasSampleDownload; + data['has_user_agreement'] = this.hasUserAgreement; + data['is_recurring'] = this.isRecurring; + data['recurring_cycle_length'] = this.recurringCycleLength; + data['recurring_total_cycles'] = this.recurringTotalCycles; + data['is_rental'] = this.isRental; + data['rental_price_length'] = this.rentalPriceLength; + data['is_ship_enabled'] = this.isShipEnabled; + data['is_free_shipping'] = this.isFreeShipping; + data['ship_separately'] = this.shipSeparately; + data['additional_shipping_charge'] = this.additionalShippingCharge; + data['is_tax_exempt'] = this.isTaxExempt; + data['is_telecommunications_or_broadcasting_or_electronic_services'] = + this.isTelecommunicationsOrBroadcastingOrElectronicServices; + data['use_multiple_warehouses'] = this.useMultipleWarehouses; + data['manage_inventory_method_id'] = this.manageInventoryMethodId; + data['stock_quantity'] = this.stockQuantity; + data['stock_availability'] = this.stockAvailability; + data['stock_availabilityn'] = this.stockAvailabilityn; + data['display_stock_availability'] = this.displayStockAvailability; + data['display_stock_quantity'] = this.displayStockQuantity; + data['min_stock_quantity'] = this.minStockQuantity; + data['notify_admin_for_quantity_below'] = this.notifyAdminForQuantityBelow; + data['allow_back_in_stock_subscriptions'] = + this.allowBackInStockSubscriptions; + data['order_minimum_quantity'] = this.orderMinimumQuantity; + data['order_maximum_quantity'] = this.orderMaximumQuantity; + data['allowed_quantities'] = this.allowedQuantities; + data['allow_adding_only_existing_attribute_combinations'] = + this.allowAddingOnlyExistingAttributeCombinations; + data['disable_buy_button'] = this.disableBuyButton; + data['disable_wishlist_button'] = this.disableWishlistButton; + data['available_for_pre_order'] = this.availableForPreOrder; + data['pre_order_availability_start_date_time_utc'] = + this.preOrderAvailabilityStartDateTimeUtc; + data['call_for_price'] = this.callForPrice; + data['price'] = this.price; + data['old_price'] = this.oldPrice; + data['product_cost'] = this.productCost; + data['special_price'] = this.specialPrice; + data['special_price_start_date_time_utc'] = + this.specialPriceStartDateTimeUtc; + data['special_price_end_date_time_utc'] = this.specialPriceEndDateTimeUtc; + data['customer_enters_price'] = this.customerEntersPrice; + data['minimum_customer_entered_price'] = this.minimumCustomerEnteredPrice; + data['maximum_customer_entered_price'] = this.maximumCustomerEnteredPrice; + data['baseprice_enabled'] = this.basepriceEnabled; + data['baseprice_amount'] = this.basepriceAmount; + data['baseprice_base_amount'] = this.basepriceBaseAmount; + data['has_tier_prices'] = this.hasTierPrices; + data['has_discounts_applied'] = this.hasDiscountsApplied; + data['discount_name'] = this.discountName; + data['discount_namen'] = this.discountNamen; + data['discount_description'] = this.discountDescription; + data['discount_Descriptionn'] = this.discountDescriptionn; + data['discount_percentage'] = this.discountPercentage; + data['currency'] = this.currency; + data['currencyn'] = this.currencyn; + data['weight'] = this.weight; + data['length'] = this.length; + data['width'] = this.width; + data['height'] = this.height; + data['available_start_date_time_utc'] = this.availableStartDateTimeUtc; + data['available_end_date_time_utc'] = this.availableEndDateTimeUtc; + data['display_order'] = this.displayOrder; + data['published'] = this.published; + data['deleted'] = this.deleted; + data['created_on_utc'] = this.createdOnUtc; + data['updated_on_utc'] = this.updatedOnUtc; + data['product_type'] = this.productType; + data['parent_grouped_product_id'] = this.parentGroupedProductId; + + data['manufacturer_ids'] = this.manufacturerIds; + + if (this.images != null) { + data['images'] = this.images.map((v) => v.toJson()).toList(); + } + + if (this.specifications != null) { + data['specifications'] = + this.specifications.map((v) => v.toJson()).toList(); + } + + data['vendor_id'] = this.vendorId; + data['se_name'] = this.seName; + return data; + } +} + +class LocalizedNames { + int languageId; + String localizedName; + + LocalizedNames({this.languageId, this.localizedName}); + + LocalizedNames.fromJson(Map json) { + languageId = json['language_id']; + localizedName = json['localized_name']; + } + + Map toJson() { + final Map data = new Map(); + data['language_id'] = this.languageId; + data['localized_name'] = this.localizedName; + return data; + } +} + +class Images { + int id; + int position; + String src; + String thumb; + String attachment; + + Images({this.id, this.position, this.src, this.thumb, this.attachment}); + + Images.fromJson(Map json) { + id = json['id']; + position = json['position']; + src = json['src']; + thumb = json['thumb']; + attachment = json['attachment']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['position'] = this.position; + data['src'] = this.src; + data['thumb'] = this.thumb; + data['attachment'] = this.attachment; + return data; + } +} + +class Specifications { + int id; + int displayOrder; + String defaultValue; + String defaultValuen; + String name; + String nameN; + + Specifications( + {this.id, + this.displayOrder, + this.defaultValue, + this.defaultValuen, + this.name, + this.nameN}); + + Specifications.fromJson(Map json) { + id = json['id']; + displayOrder = json['display_order']; + defaultValue = json['default_value']; + defaultValuen = json['default_valuen']; + name = json['name']; + nameN = json['nameN']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['display_order'] = this.displayOrder; + data['default_value'] = this.defaultValue; + data['default_valuen'] = this.defaultValuen; + data['name'] = this.name; + data['nameN'] = this.nameN; + return data; + } +} diff --git a/lib/core/model/pharmacy/pharmacy_categorise.dart b/lib/core/model/pharmacy/pharmacy_categorise.dart new file mode 100644 index 00000000..33ac26f1 --- /dev/null +++ b/lib/core/model/pharmacy/pharmacy_categorise.dart @@ -0,0 +1,103 @@ +class PharmacyCategorise { + dynamic id; + String name; + dynamic namen; + List localizedNames; + dynamic description; + dynamic parentCategoryId; + dynamic displayOrder; + dynamic image; + dynamic isLeaf; + + PharmacyCategorise( + {this.id, + this.name, + this.namen, + this.localizedNames, + this.description, + this.parentCategoryId, + this.displayOrder, + this.image, + this.isLeaf}); + + PharmacyCategorise.fromJson(Map json) { + try { + id = json['id']; + name = json['name']; + namen = json['namen']; + if (json['localized_names'] != null) { + localizedNames = new List(); + json['localized_names'].forEach((v) { + localizedNames.add(new LocalizedNames.fromJson(v)); + }); + } + description = json['description']; + parentCategoryId = json['parent_category_id']; + displayOrder = json['display_order']; + image = json['image'] != null ? new Image.fromJson(json['image']) : null; + isLeaf = json['is_leaf']; + } catch (e) { + print(e); + } + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['name'] = this.name; + data['namen'] = this.namen; + if (this.localizedNames != null) { + data['localized_names'] = + this.localizedNames.map((v) => v.toJson()).toList(); + } + data['description'] = this.description; + data['parent_category_id'] = this.parentCategoryId; + data['display_order'] = this.displayOrder; + if (this.image != null) { + data['image'] = this.image.toJson(); + } + data['is_leaf'] = this.isLeaf; + return data; + } +} + +class LocalizedNames { + int languageId; + String localizedName; + + LocalizedNames({this.languageId, this.localizedName}); + + LocalizedNames.fromJson(Map json) { + languageId = json['language_id']; + localizedName = json['localized_name']; + } + + Map toJson() { + final Map data = new Map(); + data['language_id'] = this.languageId; + data['localized_name'] = this.localizedName; + return data; + } +} + +class Image { + String src; + Null thumb; + Null attachment; + + Image({this.src, this.thumb, this.attachment}); + + Image.fromJson(Map json) { + src = json['src']; + thumb = json['thumb']; + attachment = json['attachment']; + } + + Map toJson() { + final Map data = new Map(); + data['src'] = this.src; + data['thumb'] = this.thumb; + data['attachment'] = this.attachment; + return data; + } +} diff --git a/lib/core/model/pharmacy/scan_qr_model.dart b/lib/core/model/pharmacy/scan_qr_model.dart new file mode 100644 index 00000000..71e25e8d --- /dev/null +++ b/lib/core/model/pharmacy/scan_qr_model.dart @@ -0,0 +1,584 @@ +class ScanQrModel { + String id; + bool visibleIndividually; + String name; + String namen; + List localizedNames; + String shortDescription; + String shortDescriptionn; + String fullDescription; + String fullDescriptionn; + bool markasNew; + bool showOnHomePage; + dynamic metaKeywords; + dynamic metaDescription; + dynamic metaTitle; + bool allowCustomerReviews; + dynamic approvedRatingSum; + dynamic notApprovedRatingSum; + dynamic approvedTotalReviews; + dynamic notApprovedTotalReviews; + String sku; + bool isRx; + bool prescriptionRequired; + dynamic rxMessage; + dynamic rxMessagen; + dynamic manufacturerPartNumber; + dynamic gtin; + bool isGiftCard; + bool requireOtherProducts; + bool automaticallyAddRequiredProducts; + bool isDownload; + bool unlimitedDownloads; + dynamic maxNumberOfDownloads; + dynamic downloadExpirationDays; + bool hasSampleDownload; + bool hasUserAgreement; + bool isRecurring; + dynamic recurringCycleLength; + dynamic recurringTotalCycles; + bool isRental; + dynamic rentalPriceLength; + bool isShipEnabled; + bool isFreeShipping; + bool shipSeparately; + dynamic additionalShippingCharge; + bool isTaxExempt; + bool isTelecommunicationsOrBroadcastingOrElectronicServices; + bool useMultipleWarehouses; + dynamic manageInventoryMethodId; + dynamic stockQuantity; + String stockAvailability; + String stockAvailabilityn; + bool displayStockAvailability; + bool displayStockQuantity; + dynamic minStockQuantity; + dynamic notifyAdminForQuantityBelow; + bool allowBackInStockSubscriptions; + dynamic orderMinimumQuantity; + dynamic orderMaximumQuantity; + dynamic allowedQuantities; + bool allowAddingOnlyExistingAttributeCombinations; + bool disableBuyButton; + bool disableWishlistButton; + bool availableForPreOrder; + dynamic preOrderAvailabilityStartDateTimeUtc; + bool callForPrice; + dynamic price; + dynamic oldPrice; + dynamic productCost; + dynamic specialPrice; + dynamic specialPriceStartDateTimeUtc; + dynamic specialPriceEndDateTimeUtc; + bool customerEntersPrice; + dynamic minimumCustomerEnteredPrice; + dynamic maximumCustomerEnteredPrice; + bool basepriceEnabled; + dynamic basepriceAmount; + dynamic basepriceBaseAmount; + bool hasTierPrices; + bool hasDiscountsApplied; + dynamic discountName; + dynamic discountNamen; + dynamic discountDescription; + dynamic discountDescriptionn; + dynamic discountPercentage; + String currency; + String currencyn; + double weight; + dynamic length; + dynamic width; + dynamic height; + dynamic availableStartDateTimeUtc; + dynamic availableEndDateTimeUtc; + dynamic displayOrder; + bool published; + bool deleted; + String createdOnUtc; + String updatedOnUtc; + String productType; + dynamic parentGroupedProductId; + List roleIds; + List discountIds; + List storeIds; + List manufacturerIds; + List reviews; + List images; + List attributes; + List specifications; + List associatedProductIds; + List tags; + dynamic vendorId; + String seName; + + ScanQrModel( + {this.id, + this.visibleIndividually, + this.name, + this.namen, + this.localizedNames, + this.shortDescription, + this.shortDescriptionn, + this.fullDescription, + this.fullDescriptionn, + this.markasNew, + this.showOnHomePage, + this.metaKeywords, + this.metaDescription, + this.metaTitle, + this.allowCustomerReviews, + this.approvedRatingSum, + this.notApprovedRatingSum, + this.approvedTotalReviews, + this.notApprovedTotalReviews, + this.sku, + this.isRx, + this.prescriptionRequired, + this.rxMessage, + this.rxMessagen, + this.manufacturerPartNumber, + this.gtin, + this.isGiftCard, + this.requireOtherProducts, + this.automaticallyAddRequiredProducts, + this.isDownload, + this.unlimitedDownloads, + this.maxNumberOfDownloads, + this.downloadExpirationDays, + this.hasSampleDownload, + this.hasUserAgreement, + this.isRecurring, + this.recurringCycleLength, + this.recurringTotalCycles, + this.isRental, + this.rentalPriceLength, + this.isShipEnabled, + this.isFreeShipping, + this.shipSeparately, + this.additionalShippingCharge, + this.isTaxExempt, + this.isTelecommunicationsOrBroadcastingOrElectronicServices, + this.useMultipleWarehouses, + this.manageInventoryMethodId, + this.stockQuantity, + this.stockAvailability, + this.stockAvailabilityn, + this.displayStockAvailability, + this.displayStockQuantity, + this.minStockQuantity, + this.notifyAdminForQuantityBelow, + this.allowBackInStockSubscriptions, + this.orderMinimumQuantity, + this.orderMaximumQuantity, + this.allowedQuantities, + this.allowAddingOnlyExistingAttributeCombinations, + this.disableBuyButton, + this.disableWishlistButton, + this.availableForPreOrder, + this.preOrderAvailabilityStartDateTimeUtc, + this.callForPrice, + this.price, + this.oldPrice, + this.productCost, + this.specialPrice, + this.specialPriceStartDateTimeUtc, + this.specialPriceEndDateTimeUtc, + this.customerEntersPrice, + this.minimumCustomerEnteredPrice, + this.maximumCustomerEnteredPrice, + this.basepriceEnabled, + this.basepriceAmount, + this.basepriceBaseAmount, + this.hasTierPrices, + this.hasDiscountsApplied, + this.discountName, + this.discountNamen, + this.discountDescription, + this.discountDescriptionn, + this.discountPercentage, + this.currency, + this.currencyn, + this.weight, + this.length, + this.width, + this.height, + this.availableStartDateTimeUtc, + this.availableEndDateTimeUtc, + this.displayOrder, + this.published, + this.deleted, + this.createdOnUtc, + this.updatedOnUtc, + this.productType, + this.parentGroupedProductId, + this.roleIds, + this.discountIds, + this.storeIds, + this.manufacturerIds, + this.reviews, + this.images, + this.attributes, + this.specifications, + this.associatedProductIds, + this.tags, + this.vendorId, + this.seName}); + + ScanQrModel.fromJson(Map json) { + id = json['id']; + visibleIndividually = json['visible_individually']; + name = json['name']; + namen = json['namen']; + if (json['localized_names'] != null) { + localizedNames = new List(); + json['localized_names'].forEach((v) { + localizedNames.add(new LocalizedNames.fromJson(v)); + }); + } + shortDescription = json['short_description']; + shortDescriptionn = json['short_descriptionn']; + fullDescription = json['full_description']; + fullDescriptionn = json['full_descriptionn']; + markasNew = json['markas_new']; + showOnHomePage = json['show_on_home_page']; + metaKeywords = json['meta_keywords']; + metaDescription = json['meta_description']; + metaTitle = json['meta_title']; + allowCustomerReviews = json['allow_customer_reviews']; + approvedRatingSum = json['approved_rating_sum']; + notApprovedRatingSum = json['not_approved_rating_sum']; + approvedTotalReviews = json['approved_total_reviews']; + notApprovedTotalReviews = json['not_approved_total_reviews']; + sku = json['sku']; + isRx = json['is_rx']; + prescriptionRequired = json['prescription_required']; + rxMessage = json['rx_message']; + rxMessagen = json['rx_messagen']; + manufacturerPartNumber = json['manufacturer_part_number']; + gtin = json['gtin']; + isGiftCard = json['is_gift_card']; + requireOtherProducts = json['require_other_products']; + automaticallyAddRequiredProducts = + json['automatically_add_required_products']; + isDownload = json['is_download']; + unlimitedDownloads = json['unlimited_downloads']; + maxNumberOfDownloads = json['max_number_of_downloads']; + downloadExpirationDays = json['download_expiration_days']; + hasSampleDownload = json['has_sample_download']; + hasUserAgreement = json['has_user_agreement']; + isRecurring = json['is_recurring']; + recurringCycleLength = json['recurring_cycle_length']; + recurringTotalCycles = json['recurring_total_cycles']; + isRental = json['is_rental']; + rentalPriceLength = json['rental_price_length']; + isShipEnabled = json['is_ship_enabled']; + isFreeShipping = json['is_free_shipping']; + shipSeparately = json['ship_separately']; + additionalShippingCharge = json['additional_shipping_charge']; + isTaxExempt = json['is_tax_exempt']; + isTelecommunicationsOrBroadcastingOrElectronicServices = + json['is_telecommunications_or_broadcasting_or_electronic_services']; + useMultipleWarehouses = json['use_multiple_warehouses']; + manageInventoryMethodId = json['manage_inventory_method_id']; + stockQuantity = json['stock_quantity']; + stockAvailability = json['stock_availability']; + stockAvailabilityn = json['stock_availabilityn']; + displayStockAvailability = json['display_stock_availability']; + displayStockQuantity = json['display_stock_quantity']; + minStockQuantity = json['min_stock_quantity']; + notifyAdminForQuantityBelow = json['notify_admin_for_quantity_below']; + allowBackInStockSubscriptions = json['allow_back_in_stock_subscriptions']; + orderMinimumQuantity = json['order_minimum_quantity']; + orderMaximumQuantity = json['order_maximum_quantity']; + allowedQuantities = json['allowed_quantities']; + allowAddingOnlyExistingAttributeCombinations = + json['allow_adding_only_existing_attribute_combinations']; + disableBuyButton = json['disable_buy_button']; + disableWishlistButton = json['disable_wishlist_button']; + availableForPreOrder = json['available_for_pre_order']; + preOrderAvailabilityStartDateTimeUtc = + json['pre_order_availability_start_date_time_utc']; + callForPrice = json['call_for_price']; + price = json['price']; + oldPrice = json['old_price']; + productCost = json['product_cost']; + specialPrice = json['special_price']; + specialPriceStartDateTimeUtc = json['special_price_start_date_time_utc']; + specialPriceEndDateTimeUtc = json['special_price_end_date_time_utc']; + customerEntersPrice = json['customer_enters_price']; + minimumCustomerEnteredPrice = json['minimum_customer_entered_price']; + maximumCustomerEnteredPrice = json['maximum_customer_entered_price']; + basepriceEnabled = json['baseprice_enabled']; + basepriceAmount = json['baseprice_amount']; + basepriceBaseAmount = json['baseprice_base_amount']; + hasTierPrices = json['has_tier_prices']; + hasDiscountsApplied = json['has_discounts_applied']; + discountName = json['discount_name']; + discountNamen = json['discount_namen']; + discountDescription = json['discount_description']; + discountDescriptionn = json['discount_Descriptionn']; + discountPercentage = json['discount_percentage']; + currency = json['currency']; + currencyn = json['currencyn']; + weight = json['weight']; + length = json['length']; + width = json['width']; + height = json['height']; + availableStartDateTimeUtc = json['available_start_date_time_utc']; + availableEndDateTimeUtc = json['available_end_date_time_utc']; + displayOrder = json['display_order']; + published = json['published']; + deleted = json['deleted']; + createdOnUtc = json['created_on_utc']; + updatedOnUtc = json['updated_on_utc']; + productType = json['product_type']; + parentGroupedProductId = json['parent_grouped_product_id']; + if (json['role_ids'] != null) { + roleIds = new List(); + } + if (json['discount_ids'] != null) { + discountIds = new List(); + } + if (json['store_ids'] != null) { + storeIds = new List(); + } + manufacturerIds = json['manufacturer_ids'].cast(); + if (json['reviews'] != null) { + reviews = new List(); + } + if (json['images'] != null) { + images = new List(); + json['images'].forEach((v) { + images.add(new Images.fromJson(v)); + }); + } + if (json['attributes'] != null) { + attributes = new List(); + } + if (json['specifications'] != null) { + specifications = new List(); + json['specifications'].forEach((v) { + specifications.add(new Specifications.fromJson(v)); + }); + } + if (json['associated_product_ids'] != null) { + associatedProductIds = new List(); + } + if (json['tags'] != null) { + tags = new List(); + } + vendorId = json['vendor_id']; + seName = json['se_name']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['visible_individually'] = this.visibleIndividually; + data['name'] = this.name; + data['namen'] = this.namen; + if (this.localizedNames != null) { + data['localized_names'] = + this.localizedNames.map((v) => v.toJson()).toList(); + } + data['short_description'] = this.shortDescription; + data['short_descriptionn'] = this.shortDescriptionn; + data['full_description'] = this.fullDescription; + data['full_descriptionn'] = this.fullDescriptionn; + data['markas_new'] = this.markasNew; + data['show_on_home_page'] = this.showOnHomePage; + data['meta_keywords'] = this.metaKeywords; + data['meta_description'] = this.metaDescription; + data['meta_title'] = this.metaTitle; + data['allow_customer_reviews'] = this.allowCustomerReviews; + data['approved_rating_sum'] = this.approvedRatingSum; + data['not_approved_rating_sum'] = this.notApprovedRatingSum; + data['approved_total_reviews'] = this.approvedTotalReviews; + data['not_approved_total_reviews'] = this.notApprovedTotalReviews; + data['sku'] = this.sku; + data['is_rx'] = this.isRx; + data['prescription_required'] = this.prescriptionRequired; + data['rx_message'] = this.rxMessage; + data['rx_messagen'] = this.rxMessagen; + data['manufacturer_part_number'] = this.manufacturerPartNumber; + data['gtin'] = this.gtin; + data['is_gift_card'] = this.isGiftCard; + data['require_other_products'] = this.requireOtherProducts; + data['automatically_add_required_products'] = + this.automaticallyAddRequiredProducts; + data['is_download'] = this.isDownload; + data['unlimited_downloads'] = this.unlimitedDownloads; + data['max_number_of_downloads'] = this.maxNumberOfDownloads; + data['download_expiration_days'] = this.downloadExpirationDays; + data['has_sample_download'] = this.hasSampleDownload; + data['has_user_agreement'] = this.hasUserAgreement; + data['is_recurring'] = this.isRecurring; + data['recurring_cycle_length'] = this.recurringCycleLength; + data['recurring_total_cycles'] = this.recurringTotalCycles; + data['is_rental'] = this.isRental; + data['rental_price_length'] = this.rentalPriceLength; + data['is_ship_enabled'] = this.isShipEnabled; + data['is_free_shipping'] = this.isFreeShipping; + data['ship_separately'] = this.shipSeparately; + data['additional_shipping_charge'] = this.additionalShippingCharge; + data['is_tax_exempt'] = this.isTaxExempt; + data['is_telecommunications_or_broadcasting_or_electronic_services'] = + this.isTelecommunicationsOrBroadcastingOrElectronicServices; + data['use_multiple_warehouses'] = this.useMultipleWarehouses; + data['manage_inventory_method_id'] = this.manageInventoryMethodId; + data['stock_quantity'] = this.stockQuantity; + data['stock_availability'] = this.stockAvailability; + data['stock_availabilityn'] = this.stockAvailabilityn; + data['display_stock_availability'] = this.displayStockAvailability; + data['display_stock_quantity'] = this.displayStockQuantity; + data['min_stock_quantity'] = this.minStockQuantity; + data['notify_admin_for_quantity_below'] = this.notifyAdminForQuantityBelow; + data['allow_back_in_stock_subscriptions'] = + this.allowBackInStockSubscriptions; + data['order_minimum_quantity'] = this.orderMinimumQuantity; + data['order_maximum_quantity'] = this.orderMaximumQuantity; + data['allowed_quantities'] = this.allowedQuantities; + data['allow_adding_only_existing_attribute_combinations'] = + this.allowAddingOnlyExistingAttributeCombinations; + data['disable_buy_button'] = this.disableBuyButton; + data['disable_wishlist_button'] = this.disableWishlistButton; + data['available_for_pre_order'] = this.availableForPreOrder; + data['pre_order_availability_start_date_time_utc'] = + this.preOrderAvailabilityStartDateTimeUtc; + data['call_for_price'] = this.callForPrice; + data['price'] = this.price; + data['old_price'] = this.oldPrice; + data['product_cost'] = this.productCost; + data['special_price'] = this.specialPrice; + data['special_price_start_date_time_utc'] = + this.specialPriceStartDateTimeUtc; + data['special_price_end_date_time_utc'] = this.specialPriceEndDateTimeUtc; + data['customer_enters_price'] = this.customerEntersPrice; + data['minimum_customer_entered_price'] = this.minimumCustomerEnteredPrice; + data['maximum_customer_entered_price'] = this.maximumCustomerEnteredPrice; + data['baseprice_enabled'] = this.basepriceEnabled; + data['baseprice_amount'] = this.basepriceAmount; + data['baseprice_base_amount'] = this.basepriceBaseAmount; + data['has_tier_prices'] = this.hasTierPrices; + data['has_discounts_applied'] = this.hasDiscountsApplied; + data['discount_name'] = this.discountName; + data['discount_namen'] = this.discountNamen; + data['discount_description'] = this.discountDescription; + data['discount_Descriptionn'] = this.discountDescriptionn; + data['discount_percentage'] = this.discountPercentage; + data['currency'] = this.currency; + data['currencyn'] = this.currencyn; + data['weight'] = this.weight; + data['length'] = this.length; + data['width'] = this.width; + data['height'] = this.height; + data['available_start_date_time_utc'] = this.availableStartDateTimeUtc; + data['available_end_date_time_utc'] = this.availableEndDateTimeUtc; + data['display_order'] = this.displayOrder; + data['published'] = this.published; + data['deleted'] = this.deleted; + data['created_on_utc'] = this.createdOnUtc; + data['updated_on_utc'] = this.updatedOnUtc; + data['product_type'] = this.productType; + data['parent_grouped_product_id'] = this.parentGroupedProductId; + + data['manufacturer_ids'] = this.manufacturerIds; + + if (this.images != null) { + data['images'] = this.images.map((v) => v.toJson()).toList(); + } + + if (this.specifications != null) { + data['specifications'] = + this.specifications.map((v) => v.toJson()).toList(); + } + + data['vendor_id'] = this.vendorId; + data['se_name'] = this.seName; + return data; + } +} + +class LocalizedNames { + int languageId; + String localizedName; + + LocalizedNames({this.languageId, this.localizedName}); + + LocalizedNames.fromJson(Map json) { + languageId = json['language_id']; + localizedName = json['localized_name']; + } + + Map toJson() { + final Map data = new Map(); + data['language_id'] = this.languageId; + data['localized_name'] = this.localizedName; + return data; + } +} + +class Images { + int id; + int position; + String src; + String thumb; + String attachment; + + Images({this.id, this.position, this.src, this.thumb, this.attachment}); + + Images.fromJson(Map json) { + id = json['id']; + position = json['position']; + src = json['src']; + thumb = json['thumb']; + attachment = json['attachment']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['position'] = this.position; + data['src'] = this.src; + data['thumb'] = this.thumb; + data['attachment'] = this.attachment; + return data; + } +} + +class Specifications { + int id; + int displayOrder; + String defaultValue; + String defaultValuen; + String name; + String nameN; + + Specifications( + {this.id, + this.displayOrder, + this.defaultValue, + this.defaultValuen, + this.name, + this.nameN}); + + Specifications.fromJson(Map json) { + id = json['id']; + displayOrder = json['display_order']; + defaultValue = json['default_value']; + defaultValuen = json['default_valuen']; + name = json['name']; + nameN = json['nameN']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['display_order'] = this.displayOrder; + data['default_value'] = this.defaultValue; + data['default_valuen'] = this.defaultValuen; + data['name'] = this.name; + data['nameN'] = this.nameN; + return data; + } +} diff --git a/lib/core/model/pharmacy/sub_categories_model.dart b/lib/core/model/pharmacy/sub_categories_model.dart new file mode 100644 index 00000000..916ec023 --- /dev/null +++ b/lib/core/model/pharmacy/sub_categories_model.dart @@ -0,0 +1,75 @@ +class SubCategoriesModel { + String id; + String name; + String namen; + List localizedNames; + String description; + int parentCategoryId; + int displayOrder; + dynamic image; + bool isLeaf; + + SubCategoriesModel( + {this.id, + this.name, + this.namen, + this.localizedNames, + this.description, + this.parentCategoryId, + this.displayOrder, + this.image, + this.isLeaf}); + + SubCategoriesModel.fromJson(Map json) { + id = json['id']; + name = json['name']; + namen = json['namen']; + if (json['localized_names'] != null) { + localizedNames = new List(); + json['localized_names'].forEach((v) { + localizedNames.add(new LocalizedNames.fromJson(v)); + }); + } + description = json['description']; + parentCategoryId = json['parent_category_id']; + displayOrder = json['display_order']; + image = json['image']; + isLeaf = json['is_leaf']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['name'] = this.name; + data['namen'] = this.namen; + if (this.localizedNames != null) { + data['localized_names'] = + this.localizedNames.map((v) => v.toJson()).toList(); + } + data['description'] = this.description; + data['parent_category_id'] = this.parentCategoryId; + data['display_order'] = this.displayOrder; + data['image'] = this.image; + data['is_leaf'] = this.isLeaf; + return data; + } +} + +class LocalizedNames { + int languageId; + String localizedName; + + LocalizedNames({this.languageId, this.localizedName}); + + LocalizedNames.fromJson(Map json) { + languageId = json['language_id']; + localizedName = json['localized_name']; + } + + Map toJson() { + final Map data = new Map(); + data['language_id'] = this.languageId; + data['localized_name'] = this.localizedName; + return data; + } +} diff --git a/lib/core/model/pharmacy/sub_products_model.dart b/lib/core/model/pharmacy/sub_products_model.dart new file mode 100644 index 00000000..6e8964c9 --- /dev/null +++ b/lib/core/model/pharmacy/sub_products_model.dart @@ -0,0 +1,562 @@ +class SubProductsModel { + String id; + bool visibleIndividually; + String name; + String namen; + List localizedNames; + String shortDescription; + String shortDescriptionn; + String fullDescription; + String fullDescriptionn; + bool markasNew; + bool showOnHomePage; + dynamic metaKeywords; + dynamic metaDescription; + dynamic metaTitle; + bool allowCustomerReviews; + dynamic approvedRatingSum; + dynamic notApprovedRatingSum; + dynamic approvedTotalReviews; + dynamic notApprovedTotalReviews; + String sku; + bool isRx; + bool prescriptionRequired; + dynamic rxMessage; + dynamic rxMessagen; + dynamic manufacturerPartNumber; + dynamic gtin; + bool isGiftCard; + bool requireOtherProducts; + bool automaticallyAddRequiredProducts; + bool isDownload; + bool unlimitedDownloads; + dynamic maxNumberOfDownloads; + dynamic downloadExpirationDays; + bool hasSampleDownload; + bool hasUserAgreement; + bool isRecurring; + dynamic recurringCycleLength; + dynamic recurringTotalCycles; + bool isRental; + dynamic rentalPriceLength; + bool isShipEnabled; + bool isFreeShipping; + bool shipSeparately; + dynamic additionalShippingCharge; + bool isTaxExempt; + bool isTelecommunicationsOrBroadcastingOrElectronicServices; + bool useMultipleWarehouses; + dynamic manageInventoryMethodId; + dynamic stockQuantity; + String stockAvailability; + String stockAvailabilityn; + bool displayStockAvailability; + bool displayStockQuantity; + dynamic minStockQuantity; + dynamic notifyAdminForQuantityBelow; + bool allowBackInStockSubscriptions; + dynamic orderMinimumQuantity; + dynamic orderMaximumQuantity; + dynamic allowedQuantities; + bool allowAddingOnlyExistingAttributeCombinations; + bool disableBuyButton; + bool disableWishlistButton; + bool availableForPreOrder; + dynamic preOrderAvailabilityStartDateTimeUtc; + bool callForPrice; + dynamic price; + dynamic oldPrice; + dynamic productCost; + dynamic specialPrice; + dynamic specialPriceStartDateTimeUtc; + dynamic specialPriceEndDateTimeUtc; + bool customerEntersPrice; + dynamic minimumCustomerEnteredPrice; + dynamic maximumCustomerEnteredPrice; + bool basepriceEnabled; + dynamic basepriceAmount; + dynamic basepriceBaseAmount; + bool hasTierPrices; + bool hasDiscountsApplied; + dynamic discountName; + dynamic discountNamen; + dynamic discountDescription; + dynamic discountDescriptionn; + dynamic discountPercentage; + String currency; + String currencyn; + double weight; + dynamic length; + dynamic width; + dynamic height; + dynamic availableStartDateTimeUtc; + dynamic availableEndDateTimeUtc; + dynamic displayOrder; + bool published; + bool deleted; + String createdOnUtc; + String updatedOnUtc; + String productType; + dynamic parentGroupedProductId; + List roleIds; + List discountIds; + List storeIds; + List manufacturerIds; + List reviews; + List images; + List attributes; + List specifications; + List associatedProductIds; + List tags; + dynamic vendorId; + String seName; + + SubProductsModel( + {this.id, + this.visibleIndividually, + this.name, + this.namen, + this.localizedNames, + this.shortDescription, + this.shortDescriptionn, + this.fullDescription, + this.fullDescriptionn, + this.markasNew, + this.showOnHomePage, + this.metaKeywords, + this.metaDescription, + this.metaTitle, + this.allowCustomerReviews, + this.approvedRatingSum, + this.notApprovedRatingSum, + this.approvedTotalReviews, + this.notApprovedTotalReviews, + this.sku, + this.isRx, + this.prescriptionRequired, + this.rxMessage, + this.rxMessagen, + this.manufacturerPartNumber, + this.gtin, + this.isGiftCard, + this.requireOtherProducts, + this.automaticallyAddRequiredProducts, + this.isDownload, + this.unlimitedDownloads, + this.maxNumberOfDownloads, + this.downloadExpirationDays, + this.hasSampleDownload, + this.hasUserAgreement, + this.isRecurring, + this.recurringCycleLength, + this.recurringTotalCycles, + this.isRental, + this.rentalPriceLength, + this.isShipEnabled, + this.isFreeShipping, + this.shipSeparately, + this.additionalShippingCharge, + this.isTaxExempt, + this.isTelecommunicationsOrBroadcastingOrElectronicServices, + this.useMultipleWarehouses, + this.manageInventoryMethodId, + this.stockQuantity, + this.stockAvailability, + this.stockAvailabilityn, + this.displayStockAvailability, + this.displayStockQuantity, + this.minStockQuantity, + this.notifyAdminForQuantityBelow, + this.allowBackInStockSubscriptions, + this.orderMinimumQuantity, + this.orderMaximumQuantity, + this.allowedQuantities, + this.allowAddingOnlyExistingAttributeCombinations, + this.disableBuyButton, + this.disableWishlistButton, + this.availableForPreOrder, + this.preOrderAvailabilityStartDateTimeUtc, + this.callForPrice, + this.price, + this.oldPrice, + this.productCost, + this.specialPrice, + this.specialPriceStartDateTimeUtc, + this.specialPriceEndDateTimeUtc, + this.customerEntersPrice, + this.minimumCustomerEnteredPrice, + this.maximumCustomerEnteredPrice, + this.basepriceEnabled, + this.basepriceAmount, + this.basepriceBaseAmount, + this.hasTierPrices, + this.hasDiscountsApplied, + this.discountName, + this.discountNamen, + this.discountDescription, + this.discountDescriptionn, + this.discountPercentage, + this.currency, + this.currencyn, + this.weight, + this.length, + this.width, + this.height, + this.availableStartDateTimeUtc, + this.availableEndDateTimeUtc, + this.displayOrder, + this.published, + this.deleted, + this.createdOnUtc, + this.updatedOnUtc, + this.productType, + this.parentGroupedProductId, + this.roleIds, + this.discountIds, + this.storeIds, + this.manufacturerIds, + this.reviews, + this.images, + this.attributes, + this.specifications, + this.associatedProductIds, + this.tags, + this.vendorId, + this.seName}); + + SubProductsModel.fromJson(Map json) { + id = json['id']; + visibleIndividually = json['visible_individually']; + name = json['name']; + if (json['images'] != null) { + images = new List(); + json['images'].forEach((v) { + images.add(new Images.fromJson(v)); + }); + } + namen = json['namen']; + if (json['localized_names'] != null) { + localizedNames = new List(); + json['localized_names'].forEach((v) { + localizedNames.add(new LocalizedNames.fromJson(v)); + }); + } + shortDescription = json['short_description']; + shortDescriptionn = json['short_descriptionn']; + fullDescription = json['full_description']; + fullDescriptionn = json['full_descriptionn']; + markasNew = json['markas_new']; + showOnHomePage = json['show_on_home_page']; + metaKeywords = json['meta_keywords']; + metaDescription = json['meta_description']; + metaTitle = json['meta_title']; + allowCustomerReviews = json['allow_customer_reviews']; + approvedRatingSum = json['approved_rating_sum']; + notApprovedRatingSum = json['not_approved_rating_sum']; + approvedTotalReviews = json['approved_total_reviews']; + notApprovedTotalReviews = json['not_approved_total_reviews']; + sku = json['sku']; + isRx = json['is_rx']; + prescriptionRequired = json['prescription_required']; + rxMessage = json['rx_message']; + rxMessagen = json['rx_messagen']; + manufacturerPartNumber = json['manufacturer_part_number']; + gtin = json['gtin']; + isGiftCard = json['is_gift_card']; + requireOtherProducts = json['require_other_products']; + automaticallyAddRequiredProducts = + json['automatically_add_required_products']; + isDownload = json['is_download']; + unlimitedDownloads = json['unlimited_downloads']; + maxNumberOfDownloads = json['max_number_of_downloads']; + downloadExpirationDays = json['download_expiration_days']; + hasSampleDownload = json['has_sample_download']; + hasUserAgreement = json['has_user_agreement']; + isRecurring = json['is_recurring']; + recurringCycleLength = json['recurring_cycle_length']; + recurringTotalCycles = json['recurring_total_cycles']; + isRental = json['is_rental']; + rentalPriceLength = json['rental_price_length']; + isShipEnabled = json['is_ship_enabled']; + isFreeShipping = json['is_free_shipping']; + shipSeparately = json['ship_separately']; + additionalShippingCharge = json['additional_shipping_charge']; + isTaxExempt = json['is_tax_exempt']; + isTelecommunicationsOrBroadcastingOrElectronicServices = + json['is_telecommunications_or_broadcasting_or_electronic_services']; + useMultipleWarehouses = json['use_multiple_warehouses']; + manageInventoryMethodId = json['manage_inventory_method_id']; + stockQuantity = json['stock_quantity']; + stockAvailability = json['stock_availability']; + stockAvailabilityn = json['stock_availabilityn']; + displayStockAvailability = json['display_stock_availability']; + displayStockQuantity = json['display_stock_quantity']; + minStockQuantity = json['min_stock_quantity']; + notifyAdminForQuantityBelow = json['notify_admin_for_quantity_below']; + allowBackInStockSubscriptions = json['allow_back_in_stock_subscriptions']; + orderMinimumQuantity = json['order_minimum_quantity']; + orderMaximumQuantity = json['order_maximum_quantity']; + allowedQuantities = json['allowed_quantities']; + allowAddingOnlyExistingAttributeCombinations = + json['allow_adding_only_existing_attribute_combinations']; + disableBuyButton = json['disable_buy_button']; + disableWishlistButton = json['disable_wishlist_button']; + availableForPreOrder = json['available_for_pre_order']; + preOrderAvailabilityStartDateTimeUtc = + json['pre_order_availability_start_date_time_utc']; + callForPrice = json['call_for_price']; + price = json['price']; + oldPrice = json['old_price']; + productCost = json['product_cost']; + specialPrice = json['special_price']; + specialPriceStartDateTimeUtc = json['special_price_start_date_time_utc']; + specialPriceEndDateTimeUtc = json['special_price_end_date_time_utc']; + customerEntersPrice = json['customer_enters_price']; + minimumCustomerEnteredPrice = json['minimum_customer_entered_price']; + maximumCustomerEnteredPrice = json['maximum_customer_entered_price']; + basepriceEnabled = json['baseprice_enabled']; + basepriceAmount = json['baseprice_amount']; + basepriceBaseAmount = json['baseprice_base_amount']; + hasTierPrices = json['has_tier_prices']; + hasDiscountsApplied = json['has_discounts_applied']; + discountName = json['discount_name']; + discountNamen = json['discount_namen']; + discountDescription = json['discount_description']; + discountDescriptionn = json['discount_Descriptionn']; + discountPercentage = json['discount_percentage']; + currency = json['currency']; + currencyn = json['currencyn']; + weight = json['weight']; + length = json['length']; + width = json['width']; + height = json['height']; + availableStartDateTimeUtc = json['available_start_date_time_utc']; + availableEndDateTimeUtc = json['available_end_date_time_utc']; + displayOrder = json['display_order']; + published = json['published']; + deleted = json['deleted']; + createdOnUtc = json['created_on_utc']; + updatedOnUtc = json['updated_on_utc']; + productType = json['product_type']; + parentGroupedProductId = json['parent_grouped_product_id']; + + manufacturerIds = json['manufacturer_ids'].cast(); + + if (json['specifications'] != null) { + specifications = new List(); + json['specifications'].forEach((v) { + specifications.add(new Specifications.fromJson(v)); + }); + } + + vendorId = json['vendor_id']; + seName = json['se_name']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['visible_individually'] = this.visibleIndividually; + data['name'] = this.name; + data['namen'] = this.namen; + if (this.localizedNames != null) { + data['localized_names'] = + this.localizedNames.map((v) => v.toJson()).toList(); + } + data['short_description'] = this.shortDescription; + data['short_descriptionn'] = this.shortDescriptionn; + data['full_description'] = this.fullDescription; + data['full_descriptionn'] = this.fullDescriptionn; + data['markas_new'] = this.markasNew; + data['show_on_home_page'] = this.showOnHomePage; + data['meta_keywords'] = this.metaKeywords; + data['meta_description'] = this.metaDescription; + data['meta_title'] = this.metaTitle; + data['allow_customer_reviews'] = this.allowCustomerReviews; + data['approved_rating_sum'] = this.approvedRatingSum; + data['not_approved_rating_sum'] = this.notApprovedRatingSum; + data['approved_total_reviews'] = this.approvedTotalReviews; + data['not_approved_total_reviews'] = this.notApprovedTotalReviews; + data['sku'] = this.sku; + data['is_rx'] = this.isRx; + data['prescription_required'] = this.prescriptionRequired; + data['rx_message'] = this.rxMessage; + data['rx_messagen'] = this.rxMessagen; + data['manufacturer_part_number'] = this.manufacturerPartNumber; + data['gtin'] = this.gtin; + data['is_gift_card'] = this.isGiftCard; + data['require_other_products'] = this.requireOtherProducts; + data['automatically_add_required_products'] = + this.automaticallyAddRequiredProducts; + data['is_download'] = this.isDownload; + data['unlimited_downloads'] = this.unlimitedDownloads; + data['max_number_of_downloads'] = this.maxNumberOfDownloads; + data['download_expiration_days'] = this.downloadExpirationDays; + data['has_sample_download'] = this.hasSampleDownload; + data['has_user_agreement'] = this.hasUserAgreement; + data['is_recurring'] = this.isRecurring; + data['recurring_cycle_length'] = this.recurringCycleLength; + data['recurring_total_cycles'] = this.recurringTotalCycles; + data['is_rental'] = this.isRental; + data['rental_price_length'] = this.rentalPriceLength; + data['is_ship_enabled'] = this.isShipEnabled; + data['is_free_shipping'] = this.isFreeShipping; + data['ship_separately'] = this.shipSeparately; + data['additional_shipping_charge'] = this.additionalShippingCharge; + data['is_tax_exempt'] = this.isTaxExempt; + data['is_telecommunications_or_broadcasting_or_electronic_services'] = + this.isTelecommunicationsOrBroadcastingOrElectronicServices; + data['use_multiple_warehouses'] = this.useMultipleWarehouses; + data['manage_inventory_method_id'] = this.manageInventoryMethodId; + data['stock_quantity'] = this.stockQuantity; + data['stock_availability'] = this.stockAvailability; + data['stock_availabilityn'] = this.stockAvailabilityn; + data['display_stock_availability'] = this.displayStockAvailability; + data['display_stock_quantity'] = this.displayStockQuantity; + data['min_stock_quantity'] = this.minStockQuantity; + data['notify_admin_for_quantity_below'] = this.notifyAdminForQuantityBelow; + data['allow_back_in_stock_subscriptions'] = + this.allowBackInStockSubscriptions; + data['order_minimum_quantity'] = this.orderMinimumQuantity; + data['order_maximum_quantity'] = this.orderMaximumQuantity; + data['allowed_quantities'] = this.allowedQuantities; + data['allow_adding_only_existing_attribute_combinations'] = + this.allowAddingOnlyExistingAttributeCombinations; + data['disable_buy_button'] = this.disableBuyButton; + data['disable_wishlist_button'] = this.disableWishlistButton; + data['available_for_pre_order'] = this.availableForPreOrder; + data['pre_order_availability_start_date_time_utc'] = + this.preOrderAvailabilityStartDateTimeUtc; + data['call_for_price'] = this.callForPrice; + data['price'] = this.price; + data['old_price'] = this.oldPrice; + data['product_cost'] = this.productCost; + data['special_price'] = this.specialPrice; + data['special_price_start_date_time_utc'] = + this.specialPriceStartDateTimeUtc; + data['special_price_end_date_time_utc'] = this.specialPriceEndDateTimeUtc; + data['customer_enters_price'] = this.customerEntersPrice; + data['minimum_customer_entered_price'] = this.minimumCustomerEnteredPrice; + data['maximum_customer_entered_price'] = this.maximumCustomerEnteredPrice; + data['baseprice_enabled'] = this.basepriceEnabled; + data['baseprice_amount'] = this.basepriceAmount; + data['baseprice_base_amount'] = this.basepriceBaseAmount; + data['has_tier_prices'] = this.hasTierPrices; + data['has_discounts_applied'] = this.hasDiscountsApplied; + data['discount_name'] = this.discountName; + data['discount_namen'] = this.discountNamen; + data['discount_description'] = this.discountDescription; + data['discount_Descriptionn'] = this.discountDescriptionn; + data['discount_percentage'] = this.discountPercentage; + data['currency'] = this.currency; + data['currencyn'] = this.currencyn; + data['weight'] = this.weight; + data['length'] = this.length; + data['width'] = this.width; + data['height'] = this.height; + data['available_start_date_time_utc'] = this.availableStartDateTimeUtc; + data['available_end_date_time_utc'] = this.availableEndDateTimeUtc; + data['display_order'] = this.displayOrder; + data['published'] = this.published; + data['deleted'] = this.deleted; + data['created_on_utc'] = this.createdOnUtc; + data['updated_on_utc'] = this.updatedOnUtc; + data['product_type'] = this.productType; + data['parent_grouped_product_id'] = this.parentGroupedProductId; + + data['manufacturer_ids'] = this.manufacturerIds; + + if (this.specifications != null) { + data['specifications'] = + this.specifications.map((v) => v.toJson()).toList(); + } + + data['vendor_id'] = this.vendorId; + data['se_name'] = this.seName; + return data; + } +} + +class LocalizedNames { + int languageId; + String localizedName; + + LocalizedNames({this.languageId, this.localizedName}); + + LocalizedNames.fromJson(Map json) { + languageId = json['language_id']; + localizedName = json['localized_name']; + } + + Map toJson() { + final Map data = new Map(); + data['language_id'] = this.languageId; + data['localized_name'] = this.localizedName; + return data; + } +} + +class Images { + int id; + int position; + String src; + String thumb; + String attachment; + + Images({this.id, this.position, this.src, this.thumb, this.attachment}); + + Images.fromJson(Map json) { + id = json['id']; + position = json['position']; + src = json['src']; + thumb = json['thumb']; + attachment = json['attachment']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['position'] = this.position; + data['src'] = this.src; + data['thumb'] = this.thumb; + data['attachment'] = this.attachment; + return data; + } +} + +class Specifications { + int id; + int displayOrder; + String defaultValue; + String defaultValuen; + String name; + String nameN; + + Specifications( + {this.id, + this.displayOrder, + this.defaultValue, + this.defaultValuen, + this.name, + this.nameN}); + + Specifications.fromJson(Map json) { + id = json['id']; + displayOrder = json['display_order']; + defaultValue = json['default_value']; + defaultValuen = json['default_valuen']; + name = json['name']; + nameN = json['nameN']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['display_order'] = this.displayOrder; + data['default_value'] = this.defaultValue; + data['default_valuen'] = this.defaultValuen; + data['name'] = this.name; + data['nameN'] = this.nameN; + return data; + } +} diff --git a/lib/core/model/search_products_model.dart b/lib/core/model/search_products_model.dart new file mode 100644 index 00000000..d63fd4b0 --- /dev/null +++ b/lib/core/model/search_products_model.dart @@ -0,0 +1,185 @@ +class SearchProductsModel { + String id; + String name; + String namen; + List localizedNames; + String shortDescription; + String fullDescription; + String fullDescriptionn; + dynamic approvedRatingSum; + dynamic approvedTotalReviews; + String sku; + bool isRx; + dynamic rxMessage; + dynamic rxMessagen; + dynamic stockQuantity; + String stockAvailability; + String stockAvailabilityn; + bool allowBackInStockSubscriptions; + dynamic orderMinimumQuantity; + dynamic orderMaximumQuantity; + double price; + dynamic oldPrice; + dynamic discountName; + dynamic discountNamen; + dynamic discountPercentage; + dynamic displayOrder; + List discountIds; + List reviews; + List images; + + SearchProductsModel( + {this.id, + this.name, + this.namen, + this.localizedNames, + this.shortDescription, + this.fullDescription, + this.fullDescriptionn, + this.approvedRatingSum, + this.approvedTotalReviews, + this.sku, + this.isRx, + this.rxMessage, + this.rxMessagen, + this.stockQuantity, + this.stockAvailability, + this.stockAvailabilityn, + this.allowBackInStockSubscriptions, + this.orderMinimumQuantity, + this.orderMaximumQuantity, + this.price, + this.oldPrice, + this.discountName, + this.discountNamen, + this.discountPercentage, + this.displayOrder, + this.discountIds, + this.reviews, + this.images}); + + SearchProductsModel.fromJson(Map json) { + id = json['id']; + name = json['name']; + namen = json['namen']; + if (json['localized_names'] != null) { + localizedNames = new List(); + json['localized_names'].forEach((v) { + localizedNames.add(new LocalizedNames.fromJson(v)); + }); + } + shortDescription = json['short_description']; + fullDescription = json['full_description']; + fullDescriptionn = json['full_descriptionn']; + approvedRatingSum = json['approved_rating_sum']; + approvedTotalReviews = json['approved_total_reviews']; + sku = json['sku']; + isRx = json['is_rx']; + rxMessage = json['rx_message']; + rxMessagen = json['rx_messagen']; + stockQuantity = json['stock_quantity']; + stockAvailability = json['stock_availability']; + stockAvailabilityn = json['stock_availabilityn']; + allowBackInStockSubscriptions = json['allow_back_in_stock_subscriptions']; + orderMinimumQuantity = json['order_minimum_quantity']; + orderMaximumQuantity = json['order_maximum_quantity']; + price = json['price']; + oldPrice = json['old_price']; + discountName = json['discount_name']; + discountNamen = json['discount_namen']; + discountPercentage = json['discount_percentage']; + displayOrder = json['display_order']; + + if (json['images'] != null) { + images = new List(); + json['images'].forEach((v) { + images.add(new Images.fromJson(v)); + }); + } + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['name'] = this.name; + data['namen'] = this.namen; + if (this.localizedNames != null) { + data['localized_names'] = + this.localizedNames.map((v) => v.toJson()).toList(); + } + data['short_description'] = this.shortDescription; + data['full_description'] = this.fullDescription; + data['full_descriptionn'] = this.fullDescriptionn; + data['approved_rating_sum'] = this.approvedRatingSum; + data['approved_total_reviews'] = this.approvedTotalReviews; + data['sku'] = this.sku; + data['is_rx'] = this.isRx; + data['rx_message'] = this.rxMessage; + data['rx_messagen'] = this.rxMessagen; + data['stock_quantity'] = this.stockQuantity; + data['stock_availability'] = this.stockAvailability; + data['stock_availabilityn'] = this.stockAvailabilityn; + data['allow_back_in_stock_subscriptions'] = + this.allowBackInStockSubscriptions; + data['order_minimum_quantity'] = this.orderMinimumQuantity; + data['order_maximum_quantity'] = this.orderMaximumQuantity; + data['price'] = this.price; + data['old_price'] = this.oldPrice; + data['discount_name'] = this.discountName; + data['discount_namen'] = this.discountNamen; + data['discount_percentage'] = this.discountPercentage; + data['display_order'] = this.displayOrder; + + if (this.images != null) { + data['images'] = this.images.map((v) => v.toJson()).toList(); + } + return data; + } +} + +class LocalizedNames { + int languageId; + String localizedName; + + LocalizedNames({this.languageId, this.localizedName}); + + LocalizedNames.fromJson(Map json) { + languageId = json['language_id']; + localizedName = json['localized_name']; + } + + Map toJson() { + final Map data = new Map(); + data['language_id'] = this.languageId; + data['localized_name'] = this.localizedName; + return data; + } +} + +class Images { + int id; + int position; + String src; + String thumb; + String attachment; + + Images({this.id, this.position, this.src, this.thumb, this.attachment}); + + Images.fromJson(Map json) { + id = json['id']; + position = json['position']; + src = json['src']; + thumb = json['thumb']; + attachment = json['attachment']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['position'] = this.position; + data['src'] = this.src; + data['thumb'] = this.thumb; + data['attachment'] = this.attachment; + return data; + } +} diff --git a/lib/core/service/AlHabibMedicalService/customer_addresses_service.dart b/lib/core/service/AlHabibMedicalService/customer_addresses_service.dart new file mode 100644 index 00000000..da12b48b --- /dev/null +++ b/lib/core/service/AlHabibMedicalService/customer_addresses_service.dart @@ -0,0 +1,202 @@ +import 'package:diplomaticquarterapp/config/config.dart'; +import 'package:diplomaticquarterapp/core/viewModels/AlHabibMedicalService/add_new_address_Request_Model.dart'; +import 'package:intl/intl.dart'; + +import '../base_service.dart'; + +class CustomerAddressesService extends BaseService { + + List addressesList = List(); + CustomerInfo customerInfo; + + Future addAddressInfo({ AddNewAddressRequestModel + addNewAddressRequestModel }) async { + + addNewAddressRequestModel.customer.email = customerInfo.email; + addNewAddressRequestModel.customer.id = customerInfo.customerId; + addNewAddressRequestModel.customer.roleIds = [3]; + addNewAddressRequestModel.customer.addresses[0].email = customerInfo.email; + addNewAddressRequestModel.customer.addresses[0].phoneNumber = customerInfo.mobileNumber; + addNewAddressRequestModel.customer.addresses[0].firstName = user.firstName; + addNewAddressRequestModel.customer.addresses[0].lastName = user.lastName; + addNewAddressRequestModel.customer.addresses[0].countryId = 69; + + var f = DateFormat('E, d MMM yyyy HH:mm:ss'); + var date = f.format(DateTime.now().toUtc()) + " GMT"; + addNewAddressRequestModel.customer.addresses[0].createdOnUtc = date; + hasError = false; + await baseAppClient.post(ADD_ADDRESS_INFO, + onSuccess: (dynamic response, int statusCode) { + addressesList.clear(); + response["customers"][0]["addresses"].forEach((data) { + addressesList + .add(AddressInfo.fromJson(data)); + }); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: addNewAddressRequestModel.toJson(), isExternal: true, isAllowAny: true); + } + + Future getCustomerAddresses() async { + Map queryParams = { + 'fields':'addresses' + }; + hasError = false; + await baseAppClient.get("$GET_CUSTOMER_ADDRESSES${customerInfo.customerId}", + onSuccess: (dynamic response, int statusCode) { + addressesList.clear(); + response["customers"][0]["addresses"].forEach((data) { + addressesList + .add(AddressInfo.fromJson(data)); + }); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, queryParams: queryParams, isExternal: true); + } + + + Future getCustomerInfo() async { + Map queryParams = { + 'FileNumber':'${user.patientID}' + }; + + hasError = false; + await baseAppClient.get(GET_CUSTOMER_INFO, + onSuccess: (dynamic response, int statusCode) { + customerInfo= CustomerInfo.fromJson(response); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, queryParams: queryParams, isExternal: true); + } +} + + +class CustomerInfo { + bool isRegistered; + String userName; + Null password; + String email; + Null errorMessage; + String mobileNumber; + int customerId; + + CustomerInfo( + {this.isRegistered, + this.userName, + this.password, + this.email, + this.errorMessage, + this.mobileNumber, + this.customerId}); + + CustomerInfo.fromJson(Map json) { + isRegistered = json['IsRegistered']; + userName = json['UserName']; + password = json['Password']; + email = json['Email']; + errorMessage = json['ErrorMessage']; + mobileNumber = json['MobileNumber']; + customerId = json['CustomerId']; + } + + Map toJson() { + final Map data = new Map(); + data['IsRegistered'] = this.isRegistered; + data['UserName'] = this.userName; + data['Password'] = this.password; + data['Email'] = this.email; + data['ErrorMessage'] = this.errorMessage; + data['MobileNumber'] = this.mobileNumber; + data['CustomerId'] = this.customerId; + return data; + } +} + + +class AddressInfo { + String id; + String firstName; + String lastName; + String email; + Null company; + int countryId; + String country; + Null stateProvinceId; + String city; + String address1; + String address2; + String zipPostalCode; + String phoneNumber; + Null faxNumber; + String customerAttributes; + String createdOnUtc; + Null province; + String latLong; + + AddressInfo( + {this.id, + this.firstName, + this.lastName, + this.email, + this.company, + this.countryId, + this.country, + this.stateProvinceId, + this.city, + this.address1, + this.address2, + this.zipPostalCode, + this.phoneNumber, + this.faxNumber, + this.customerAttributes, + this.createdOnUtc, + this.province, + this.latLong}); + + AddressInfo.fromJson(Map json) { + id = json['id']; + firstName = json['first_name']; + lastName = json['last_name']; + email = json['email']; + company = json['company']; + countryId = json['country_id']; + country = json['country']; + stateProvinceId = json['state_province_id']; + city = json['city']; + address1 = json['address1']; + address2 = json['address2']; + zipPostalCode = json['zip_postal_code']; + phoneNumber = json['phone_number']; + faxNumber = json['fax_number']; + customerAttributes = json['customer_attributes']; + createdOnUtc = json['created_on_utc']; + province = json['province']; + latLong = json['lat_long']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['first_name'] = this.firstName; + data['last_name'] = this.lastName; + data['email'] = this.email; + data['company'] = this.company; + data['country_id'] = this.countryId; + data['country'] = this.country; + data['state_province_id'] = this.stateProvinceId; + data['city'] = this.city; + data['address1'] = this.address1; + data['address2'] = this.address2; + data['zip_postal_code'] = this.zipPostalCode; + data['phone_number'] = this.phoneNumber; + data['fax_number'] = this.faxNumber; + data['customer_attributes'] = this.customerAttributes; + data['created_on_utc'] = this.createdOnUtc; + data['province'] = this.province; + data['lat_long'] = this.latLong; + return data; + } +} diff --git a/lib/core/service/client/base_app_client.dart b/lib/core/service/client/base_app_client.dart index 648ec140..04f599f1 100644 --- a/lib/core/service/client/base_app_client.dart +++ b/lib/core/service/client/base_app_client.dart @@ -6,8 +6,10 @@ import 'package:diplomaticquarterapp/core/service/medical/vital_sign_service.dar import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; import 'package:diplomaticquarterapp/models/Appointments/toDoCountProviderModel.dart'; import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; +import 'package:diplomaticquarterapp/pages/appUpdatePage/app_update_page.dart'; import 'package:diplomaticquarterapp/uitl/utils.dart'; import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; import 'package:http/http.dart' as http; import 'package:provider/provider.dart'; @@ -32,66 +34,83 @@ class BaseAppClient { {Map body, Function(dynamic response, int statusCode) onSuccess, Function(String error, int statusCode) onFailure, - bool isAllowAny = false}) async { - String url = BASE_URL + endPoint; + bool isAllowAny = false, + bool isExternal = false}) async { + String url; + if (isExternal) { + url = endPoint; + } else { + url = BASE_URL + endPoint; + } try { //Map profile = await sharedPref.getObj(DOCTOR_PROFILE); - String token = await sharedPref.getString(TOKEN); - var languageID = await sharedPref.getString(APP_LANGUAGE) ?? 'ar'; - var user = await sharedPref.getObject(USER_PROFILE); - if (body.containsKey('SetupID')) { - body['SetupID'] = body.containsKey('SetupID') - ? body['SetupID'] != null - ? body['SetupID'] - : SETUP_ID - : SETUP_ID; - } - body['VersionID'] = VERSION_ID; - body['Channel'] = CHANNEL; - body['LanguageID'] = languageID == 'ar' ? 1 : 2; + if (!isExternal) { + String token = await sharedPref.getString(TOKEN); + var languageID = await sharedPref.getString(APP_LANGUAGE); + var user = await sharedPref.getObject(USER_PROFILE); + if (body.containsKey('SetupID')) { + body['SetupID'] = body.containsKey('SetupID') + ? body['SetupID'] != null + ? body['SetupID'] + : SETUP_ID + : SETUP_ID; + } + body['VersionID'] = VERSION_ID; + body['Channel'] = CHANNEL; + body['LanguageID'] = body.containsKey('LanguageID') + ? body['LanguageID'] != null + ? body['LanguageID'] + : languageID == 'ar' + ? 1 + : 2 + : languageID == 'en' + ? 2 + : 1; - body['IPAdress'] = IP_ADDRESS; - body['generalid'] = GENERAL_ID; - body['PatientOutSA'] = body.containsKey('PatientOutSA') - ? body['PatientOutSA'] != null - ? body['PatientOutSA'] - : PATIENT_OUT_SA - : PATIENT_OUT_SA; + body['IPAdress'] = IP_ADDRESS; + body['generalid'] = GENERAL_ID; + body['PatientOutSA'] = body.containsKey('PatientOutSA') + ? body['PatientOutSA'] != null + ? body['PatientOutSA'] + : PATIENT_OUT_SA + : PATIENT_OUT_SA; - if (body.containsKey('isDentalAllowedBackend')) { - body['isDentalAllowedBackend'] = - body.containsKey('isDentalAllowedBackend') - ? body['isDentalAllowedBackend'] != null - ? body['isDentalAllowedBackend'] - : IS_DENTAL_ALLOWED_BACKEND - : IS_DENTAL_ALLOWED_BACKEND; - } + if (body.containsKey('isDentalAllowedBackend')) { + body['isDentalAllowedBackend'] = + body.containsKey('isDentalAllowedBackend') + ? body['isDentalAllowedBackend'] != null + ? body['isDentalAllowedBackend'] + : IS_DENTAL_ALLOWED_BACKEND + : IS_DENTAL_ALLOWED_BACKEND; + } - body['DeviceTypeID'] = DeviceTypeID; + body['DeviceTypeID'] = DeviceTypeID; - if (!body.containsKey('IsPublicRequest')) { - body['PatientType'] = body.containsKey('PatientType') - ? body['PatientType'] != null - ? body['PatientType'] - : user['PatientType'] != null - ? user['PatientType'] - : PATIENT_TYPE - : PATIENT_TYPE; + if (!body.containsKey('IsPublicRequest')) { + body['PatientType'] = body.containsKey('PatientType') + ? body['PatientType'] != null + ? body['PatientType'] + : user['PatientType'] != null + ? user['PatientType'] + : PATIENT_TYPE + : PATIENT_TYPE; - body['PatientTypeID'] = body.containsKey('PatientTypeID') - ? body['PatientTypeID'] != null - ? body['PatientTypeID'] - : user['PatientType'] != null - ? user['PatientType'] - : PATIENT_TYPE_ID - : PATIENT_TYPE_ID; - if (user != null) { - body['TokenID'] = token; - body['PatientID'] = - body['PatientID'] != null ? body['PatientID'] : user['PatientID']; - body['PatientOutSA'] = user['OutSA']; - body['SessionID'] = getSessionId(token); + body['PatientTypeID'] = body.containsKey('PatientTypeID') + ? body['PatientTypeID'] != null + ? body['PatientTypeID'] + : user['PatientType'] != null + ? user['PatientType'] + : PATIENT_TYPE_ID + : PATIENT_TYPE_ID; + if (user != null) { + body['TokenID'] = token; + body['PatientID'] = body['PatientID'] != null + ? body['PatientID'] + : user['PatientID']; + body['PatientOutSA'] = user['OutSA']; + body['SessionID'] = SESSION_ID; //getSessionId(token); + } } } @@ -115,6 +134,10 @@ class BaseAppClient { if (parsed['Response_Message'] != null) { onSuccess(parsed, statusCode); } else { + if (parsed['ErrorType'] == 4) { + navigateToAppUpdate( + AppGlobal.context, parsed['ErrorEndUserMessage']); + } if (isAllowAny) { onSuccess(parsed, statusCode); } else if (parsed['IsAuthenticated'] == null) { @@ -125,9 +148,14 @@ class BaseAppClient { } else if (parsed['Result'] == 'OK') { onSuccess(parsed, statusCode); } else { - onFailure( - parsed['ErrorEndUserMessage'] ?? parsed['ErrorMessage'], - statusCode); + if (parsed != null) { + onSuccess(parsed, statusCode); + } else { + onFailure( + parsed['ErrorEndUserMessage'] ?? parsed['ErrorMessage'], + statusCode); + logout(); + } } } else if (parsed['MessageStatus'] == 1 || parsed['SMSLoginRequired'] == true) { @@ -146,9 +174,13 @@ class BaseAppClient { if (parsed['SameClinicApptList'] != null) { onSuccess(parsed, statusCode); } else { - onFailure( - parsed['ErrorEndUserMessage'] ?? parsed['ErrorMessage'], - statusCode); + if (parsed['message'] != null) { + onFailure(parsed['message'] ?? parsed['message'], statusCode); + } else { + onFailure( + parsed['ErrorEndUserMessage'] ?? parsed['ErrorMessage'], + statusCode); + } } } } @@ -161,12 +193,59 @@ class BaseAppClient { onFailure(e.toString(), -1); } } + Future navigateToAppUpdate(context, String text) async { + Navigator.pushReplacement( + context, + MaterialPageRoute( + builder: (context) => AppUpdatePage(appUpdateText: text))); + } get(String endPoint, {Function(dynamic response, int statusCode) onSuccess, - Function(String error, int statusCode) onFailure, - Map queryParams}) async { - String url = BASE_URL + endPoint; + Function(String error, int statusCode) onFailure, + Map queryParams, + bool isExternal = false}) async { + String url; + if (isExternal) { + url = endPoint; + } else { + url = BASE_URL + endPoint; + } + if (queryParams != null) { + String queryString = Uri(queryParameters: queryParams).query; + url += '?' + queryString; + } + + print("URL : $url"); + + if (await Utils.checkConnection()) { + final response = await http.get( + url.trim(), + headers: { + 'Content-Type': 'application/json', + 'Accept': 'application/json' + }, + ); + final int statusCode = response.statusCode; + print("statusCode :$statusCode"); + + if (statusCode < 200 || statusCode >= 400 || json == null) { + onFailure('Error While Fetching data', statusCode); + } else { + var parsed = json.decode(response.body.toString()); + onSuccess(parsed, statusCode); + } + } else { + onFailure('Please Check The Internet Connection', -1); + } + } + + getPharmacy(String endPoint, + {Function(dynamic response, int statusCode) onSuccess, + Function(String error, int statusCode) onFailure, + bool isAllowAny = false, + Map queryParams}) async { + String url = PHARMACY_BASE_URL + endPoint; if (queryParams != null) { String queryString = Uri(queryParameters: queryParams).query; url += '?' + queryString; @@ -178,7 +257,7 @@ class BaseAppClient { final response = await http.get(url.trim(), headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' - },); + }); final int statusCode = response.statusCode; print("statusCode :$statusCode"); @@ -193,7 +272,6 @@ class BaseAppClient { } } - simpleGet(String fullUrl, {Function(dynamic response, int statusCode) onSuccess, Function(String error, int statusCode) onFailure, Map queryParams}) async { String url = fullUrl; var haveParams = (queryParams != null); @@ -224,6 +302,7 @@ class BaseAppClient { logout() async { await sharedPref.remove(LOGIN_TOKEN_ID); + await sharedPref.remove(PHARMACY_CUSTOMER_ID); await authenticatedUserObject.getUser(); Provider.of(AppGlobal.context, listen: false).isLogin = false; diff --git a/lib/core/service/offers_service.dart b/lib/core/service/offers_service.dart new file mode 100644 index 00000000..2247c833 --- /dev/null +++ b/lib/core/service/offers_service.dart @@ -0,0 +1,56 @@ +import 'package:diplomaticquarterapp/config/config.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacy/offer_products_model.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacy/offers_model.dart'; + +import 'base_service.dart'; + +class OffersCategoriseService extends BaseService { + List _offersList = List(); + List get offersList => _offersList; + List _offerProducts = List(); + List get offersProducts => _offerProducts; + + clearCategorise() { + _offerProducts.clear(); + } + + // clearCategorise2() { + // _offersList.clear(); + // } + + Future getOffersCategorise() async { + hasError = false; + _offersList.clear(); + await baseAppClient.get( + GET_OFFERS_CATEGORISE, + onSuccess: (dynamic response, int statusCode) { + response['categories'].forEach((item) { + _offersList.add(OffersModel.fromJson(item)); + }); + }, + onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, + ); + } + + Future getOffersProducts({String id}) async { + hasError = false; + _offerProducts.clear(); + String endPoint = + id != null ? GET_OFFERS_PRODUCTS + "$id" : GET_OFFERS_PRODUCTS + "1"; + await baseAppClient.get( + endPoint, + onSuccess: (dynamic response, int statusCode) { + response['products'].forEach((item) { + _offerProducts.add(OfferProductsModel.fromJson(item)); + }); + }, + onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, + ); + } +} diff --git a/lib/core/service/parmacyModule/lacum-registration-service.dart b/lib/core/service/parmacyModule/lacum-registration-service.dart new file mode 100644 index 00000000..b3e64e69 --- /dev/null +++ b/lib/core/service/parmacyModule/lacum-registration-service.dart @@ -0,0 +1,50 @@ +import 'package:diplomaticquarterapp/config/config.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacies/LacumAccountInformation.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacies/ListUserAgreement.dart'; + +import 'lacum-service.dart'; + +class LacumRegistrationService extends LacumService{ + + ListUserAgreement listUserAgreement; + + Future getLacumAccountInformationById(String patientIdentificationNo) async { + hasError = false; + super.error = ""; + + Map body = Map(); + body['IdentificationNo'] = patientIdentificationNo; + + try { + await baseAppClient.post(GET_LACUM_ACCOUNT_INFORMATION, + onSuccess: (response, statusCode) async { + lacumInformation = LacumAccountInformation.fromJson(response); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: body); + } catch (error) { + throw error; + } + } + + Future getUserTermsAndConditionsForEPharmcy() async { + hasError = false; + super.error = ""; + + Map body = Map(); + + try { + await baseAppClient.post(LAKUM_GET_USER_TERMS_AND_CONDITIONS, + onSuccess: (response, statusCode) async { + listUserAgreement = ListUserAgreement.fromJson(response['ListUserAgreement'][0]); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: body); + } catch (error) { + throw error; + } + } + +} \ No newline at end of file diff --git a/lib/core/service/parmacyModule/lacum-service.dart b/lib/core/service/parmacyModule/lacum-service.dart new file mode 100644 index 00000000..c7117303 --- /dev/null +++ b/lib/core/service/parmacyModule/lacum-service.dart @@ -0,0 +1,133 @@ +import 'package:diplomaticquarterapp/config/config.dart'; +import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacies/LacumAccountInformation.dart'; +import 'package:diplomaticquarterapp/core/service/base_service.dart'; + +class LacumService extends BaseService{ + bool isFinished = true; + bool hasError = false; + String errorMsg = ''; + String successMsg = ''; + + LacumAccountInformation lacumInformation; + LacumAccountInformation lacumGroupInformation; + + Future getLacumAccountInformation() async { + hasError = false; + super.error = ""; + + Map body = Map(); + body['IdentificationNo'] = user.patientIdentificationNo; + + try { + await baseAppClient.post(GET_LACUM_ACCOUNT_INFORMATION, + onSuccess: (response, statusCode) async { + lacumInformation = LacumAccountInformation.fromJson(response); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: body); + } catch (error) { + throw error; + } + } + + Future getLacumGroupInformation() async { + hasError = false; + super.error = ""; + + Map body = Map(); + body['IdentificationNo'] = user.patientIdentificationNo; + body['AccountNumber'] = "${lacumInformation.yahalaAccountNo}"; + body['IsDetailsRequired'] = true; + + try { + await baseAppClient.post(GET_LACUM_GROUP_INFORMATION, + onSuccess: (response, statusCode) async { + lacumGroupInformation = LacumAccountInformation.fromJson(response); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: body); + } catch (error) { + throw error; + } + } + + Future makeAccountActivate() async { + hasError = false; + super.error = ""; + int yahalaAccountNo = lacumInformation.yahalaAccountNo; + + Map body = Map(); + body['CreatedBy'] = 103; + body['YahalaAccountNumber'] = yahalaAccountNo; + + try { + await baseAppClient.post(LACUM_ACCOUNT_ACTIVATE, + onSuccess: (response, statusCode) async { + // lacumInformation = LacumAccountInformation.fromJson(response); + // lacumInformation.yahalaAccountNo = yahalaAccountNo; + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: body); + } catch (error) { + throw error; + } + } + + Future makeAccountDeactivate() async { + hasError = false; + super.error = ""; + int yahalaAccountNo = lacumInformation.yahalaAccountNo; + + Map body = Map(); + body['CreatedBy'] = 103; + body['YahalaAccountNumber'] = yahalaAccountNo; + + try { + await baseAppClient.post(LACUM_ACCOUNT_DEACTIVATE, + onSuccess: (response, statusCode) async { + // lacumInformation = LacumAccountInformation.fromJson(response); + // lacumInformation.yahalaAccountNo = yahalaAccountNo; + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: body); + } catch (error) { + throw error; + } + } + + Future createLakumAccount(String name, String phone, int accountID, String patientIdentificationID, var prefLang) async { + hasError = false; + super.error = ""; + if(prefLang == null){ + var languageID = + await sharedPref.getStringWithDefaultValue(APP_LANGUAGE, 'en'); + prefLang = languageID == 'ar' ? 1 : 2; + } + + + Map body = Map(); + body['PrefLang'] = prefLang; + body['AccountID'] = accountID; + body['FullName'] = name; + body['MobileNo'] = phone; + body['PatientIdentificationID'] = patientIdentificationID; + body['PatientID'] = user.patientID; + + try { + await baseAppClient.post(CREATE_LAKUM_ACCOUNT, + onSuccess: (response, statusCode) async { + successMsg = LacumAccountInformation.fromJson(response).message; + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: body); + } catch (error) { + throw error; + } + } +} \ No newline at end of file diff --git a/lib/core/service/parmacyModule/lacum-transfer-service.dart b/lib/core/service/parmacyModule/lacum-transfer-service.dart new file mode 100644 index 00000000..b15696f9 --- /dev/null +++ b/lib/core/service/parmacyModule/lacum-transfer-service.dart @@ -0,0 +1,57 @@ +import 'package:diplomaticquarterapp/config/config.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacies/LacumAccountInformation.dart'; + +import 'lacum-service.dart'; + +class LacumTransferService extends LacumService{ + LacumAccountInformation lacumReceiverInformation; + + Future getLacumGroupDataBuAccountId(String accountId) async { + hasError = false; + super.error = ""; + + Map body = Map(); + body['IdentificationNo'] = user.patientIdentificationNo; + body['AccountNumber'] = accountId; + + try { + await baseAppClient.post(GET_LACUM_GROUP_INFORMATION, + onSuccess: (response, statusCode) async { + lacumReceiverInformation = LacumAccountInformation.fromJson(response); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + return null; + }, body: body); + } catch (error) { + throw error; + } + } + + Future transferYaHalaLoyaltyPoints(String points) async { + hasError = false; + super.error = ""; + + Map body = Map(); + body['MobileNo'] = lacumGroupInformation.lakumInquiryInformationObjVersion.mobileNumber; + body['UserName'] = lacumGroupInformation.lakumInquiryInformationObjVersion.memberName; + body['YaHalaSenderAccNumber'] = lacumGroupInformation.lakumInquiryInformationObjVersion.accountNumber; + body['Yahala_IdentificationNo'] = lacumGroupInformation.lakumInquiryInformationObjVersion.memberUniversalId; + body['YaHalaPointsToTransfer'] = points; + body['YaHalaReceiverAccNumber'] = lacumReceiverInformation.lakumInquiryInformationObjVersion.accountNumber; + body['YaHalaReceiverMobileNumber'] = lacumReceiverInformation.lakumInquiryInformationObjVersion.mobileNumber; + body['YaHalaReceiverName'] = lacumReceiverInformation.lakumInquiryInformationObjVersion.memberName; + + try { + await baseAppClient.post(TRANSFER_YAHALA_LOYALITY_POINTS, + onSuccess: (response, statusCode) async { + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: body); + } catch (error) { + throw error; + } + } + +} \ No newline at end of file diff --git a/lib/core/service/parmacyModule/order-preview-service.dart b/lib/core/service/parmacyModule/order-preview-service.dart index 89d5550e..5648ff6d 100644 --- a/lib/core/service/parmacyModule/order-preview-service.dart +++ b/lib/core/service/parmacyModule/order-preview-service.dart @@ -1,29 +1,248 @@ import 'package:diplomaticquarterapp/config/config.dart'; +import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; import 'package:diplomaticquarterapp/core/model/pharmacies/Addresses.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacies/LacumAccountInformation.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacies/ShoppingCart.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacies/payment-checkout-data.dart'; import 'package:diplomaticquarterapp/core/service/base_service.dart'; +import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/OrderPreviewViewModel.dart'; -class OrderPreviewService extends BaseService{ +class OrderPreviewService extends BaseService { bool isFinished = true; bool hasError = false; String errorMsg = ''; List addresses = List(); + LacumAccountInformation lacumInformation; + LacumAccountInformation lacumGroupInformation; - Future getBannerListList() async { - // hasError = false; - // try { - // await baseAppClient.get(GET_CUSTOMERS_ADDRESSES, - // onSuccess: (dynamic response, int statusCode) { - // addresses.clear(); - // response['customers'][0]['addresses'].forEach((item) { - // addresses.add(Addresses.fromJson(item)); - // }); - // }, onFailure: (String error, int statusCode) { - // hasError = true; - // super.error = error; - // }); - // } catch (error) { - // throw error; - // } - } -} \ No newline at end of file + Future getAddresses() async { + var customerId = await sharedPref.getString(PHARMACY_CUSTOMER_ID); + Map queryParams = {'fields': 'addresses'}; + hasError = false; + try { + await baseAppClient.get("$GET_CUSTOMERS_ADDRESSES$customerId", + onSuccess: (dynamic response, int statusCode) { + addresses.clear(); + response['customers'][0]['addresses'].forEach((item) { + addresses.add(Addresses.fromJson(item)); + }); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, queryParams: queryParams); + } catch (error) { + throw error; + } + } + + Future getShippingOption(Addresses selectedAddress) async { + var customerId = await sharedPref.getString(PHARMACY_CUSTOMER_ID); + Map queryParams = Map(); + dynamic localRes; + hasError = false; + try { + await baseAppClient.get("$GET_SHIPPING_OPTIONS$customerId/${selectedAddress.id}", + onSuccess: (dynamic response, int statusCode) { + localRes = response['shipping_option'][0]; + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, queryParams: queryParams); + } catch (error) { + throw error; + } + return Future.value(localRes); + } + + Future getShoppingCart() async { + var customerId = await sharedPref.getString(PHARMACY_CUSTOMER_ID); + Map queryParams = {'shopping_cart_type': '1'}; + dynamic localRes; + hasError = false; + try { + await baseAppClient.get("$GET_SHOPPING_CART$customerId", + onSuccess: (dynamic response, int statusCode) { + localRes = response; + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, queryParams: queryParams); + } catch (error) { + throw error; + } + return Future.value(localRes); + } + + Future changeProductQuantity( + String productId, ShoppingCart product) async { + hasError = false; + super.error = ""; + dynamic localRes; + Map choppingCartObject = Map(); + choppingCartObject['id'] = product.id; + choppingCartObject['quantity'] = product.quantity; + choppingCartObject['shopping_cart_type'] = "1"; + choppingCartObject['product_id'] = product.productId; + choppingCartObject['customer_id'] = product.customerId; + + Map body = Map(); + body["shopping_cart_item"] = choppingCartObject; + + await baseAppClient.post("$GET_SHOPPING_CART$productId", + onSuccess: (response, statusCode) async { + localRes = response; + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: body); + + return Future.value(localRes); + } + + Future deleteProduct(String productId) async { + hasError = false; + super.error = ""; + dynamic localRes; + + Map body = Map(); + + await baseAppClient.post("$DELETE_SHOPPING_CART$productId", + onSuccess: (response, statusCode) async { + localRes = response; + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: body); + + return Future.value(localRes); + } + + Future deleteShoppingCart() async { + var customerId = await sharedPref.getString(PHARMACY_CUSTOMER_ID); + + hasError = false; + super.error = ""; + dynamic localRes; + + await baseAppClient.get("$DELETE_SHOPPING_CART_ALL$customerId/ShoppingCart", + onSuccess: (response, statusCode) async { + localRes = response; + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }); + + return Future.value(localRes); + } + + Future getLacumAccountInformation() async { + hasError = false; + super.error = ""; + + Map body = Map(); + body['IdentificationNo'] = user.patientIdentificationNo; + + try { + await baseAppClient.post(GET_LACUM_ACCOUNT_INFORMATION, + onSuccess: (response, statusCode) async { + lacumInformation = LacumAccountInformation.fromJson(response); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: body); + } catch (error) { + throw error; + } + } + + Future getLacumGroupInformation() async { + hasError = false; + super.error = ""; + + Map body = Map(); + body['IdentificationNo'] = user.patientIdentificationNo; + body['AccountNumber'] = "${lacumInformation.yahalaAccountNo}"; + + try { + await baseAppClient.post(GET_LACUM_GROUP_INFORMATION, + onSuccess: (response, statusCode) async { + lacumGroupInformation = LacumAccountInformation.fromJson(response); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: body); + } catch (error) { + throw error; + } + } + + Future makeOrder(PaymentCheckoutData paymentCheckoutData, List shoppingCarts) async { + paymentCheckoutData.address.isChecked = true; + hasError = false; + super.error = ""; + + var languageID = + await sharedPref.getStringWithDefaultValue(APP_LANGUAGE, 'en'); + var customerId = await sharedPref.getString(PHARMACY_CUSTOMER_ID); + + Map orderBody = Map(); + orderBody['rx_attachments'] = ""; + orderBody['customer_language_id'] = languageID == 'ar' ? 1 : 2; + orderBody['billing_address'] = paymentCheckoutData.address; + orderBody['pick_up_in_store'] = false; + orderBody['payment_method_system_name'] = "Payments.PayFort"; + orderBody['shipping_method'] = languageID == 'ar' ? paymentCheckoutData.shippingOption.namen : paymentCheckoutData.shippingOption.name ; + orderBody['shipping_rate_computation_method_system_name'] = paymentCheckoutData.shippingOption.shippingRateComputationMethodSystemName; + orderBody['customer_id'] = customerId; + orderBody['custom_values_xml'] = "PaymentOption:${getPaymentOptionName(paymentCheckoutData.paymentOption)}"; + orderBody['shippingOption'] = paymentCheckoutData.shippingOption; + orderBody['shipping_address'] = paymentCheckoutData.address; + orderBody['lakum_amount'] = paymentCheckoutData.usedLakumPoints; + + List> itemsList = List(); + shoppingCarts.forEach((item) { + Map orderItemsBody = Map(); + orderItemsBody['product_id'] = item.product.id; + orderItemsBody['quantity'] = item.quantity; + itemsList.add(orderItemsBody); + }); + orderBody['order_items'] = itemsList; + + Map body = Map(); + body['order'] = orderBody; + + try { + await baseAppClient.post(ORDER_SHOPPING_CART, + onSuccess: (response, statusCode) async { + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: body); + } catch (error) { + throw error; + } + } + + String getPaymentOptionName(PaymentOption paymentOption) { + switch (paymentOption.index) { + case 0: + return "MADA"; + break; + case 1: + return "SADAD"; + break; + case 2: + return "VISA"; + break; + case 3: + return "MASTERCARD"; + break; + case 4: + return "INSTALLMENT"; + break; + default: + return ""; + } + } +} diff --git a/lib/core/service/parmacyModule/parmacy_module_service.dart b/lib/core/service/parmacyModule/parmacy_module_service.dart index 53dc7e0a..c3bce324 100644 --- a/lib/core/service/parmacyModule/parmacy_module_service.dart +++ b/lib/core/service/parmacyModule/parmacy_module_service.dart @@ -4,8 +4,10 @@ import 'package:diplomaticquarterapp/core/model/pharmacies/Manufacturer.dart'; import 'package:diplomaticquarterapp/core/model/pharmacies/PharmacyImageObject.dart'; import 'package:diplomaticquarterapp/core/model/pharmacies/PharmacyProduct.dart'; import 'package:diplomaticquarterapp/core/service/base_service.dart'; +import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; class PharmacyModuleService extends BaseService { + final AppSharedPreferences sharedPref = AppSharedPreferences(); bool isFinished = true; bool hasError = false; String errorMsg = ''; @@ -15,19 +17,68 @@ class PharmacyModuleService extends BaseService { List bestSellerProducts = List(); List lastVisitedProducts = List(); + Future makeVerifyCustomer(dynamic data) async { + Map queryParams = {'FileNumber': data['PatientID'].toString()}; + hasError = false; + try { + await baseAppClient.get(PHARMACY_VERIFY_CUSTOMER, + onSuccess: (dynamic response, int statusCode) { + if (response['UserName'] != null) { + sharedPref.setString(PHARMACY_CUSTOMER_ID, response['CustomerId'].toString()); + print(response); + } else { + createUser(); + } + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, queryParams: queryParams); + } catch (error) { + throw error; + } + } + + Future createUser() async { + var data = await sharedPref.getObject(USER_PROFILE); + var languageID = await sharedPref.getString(APP_LANGUAGE); + Map queryParams = { + 'Phone': data['MobileNumber'], + 'Email': data['EmailAddress'], + 'FileNumber': data['PatientID'].toString(), + 'Language': languageID.toString(), + 'Gender': data['Gender'].toString(), + 'FirstName': data['FirstName'], + 'LastName': data['LastName'], + 'LanguageId': languageID.toString(), + 'CountryCode': data['ZipCode'], + }; + hasError = false; + try { + await baseAppClient.get(PHARMACY_CREATE_CUSTOMER, + onSuccess: (dynamic response, int statusCode) { + if (!response['IsRegistered']) {} + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, queryParams: queryParams); + } catch (error) { + throw error; + } + } + Future getBannerListList() async { hasError = false; try { - // await baseAppClient.get(GET_PHARMACY_BANNER, - // onSuccess: (dynamic response, int statusCode) { - // bannerItems.clear(); - // response['images'].forEach((item) { - // bannerItems.add(PharmacyImageObject.fromJson(item)); - // }); - // }, onFailure: (String error, int statusCode) { - // hasError = true; - // super.error = error; - // }); + await baseAppClient.get(GET_PHARMACY_BANNER, + onSuccess: (dynamic response, int statusCode) { + bannerItems.clear(); + response['images'].forEach((item) { + bannerItems.add(PharmacyImageObject.fromJson(item)); + }); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }); } catch (error) { throw error; } @@ -36,16 +87,19 @@ class PharmacyModuleService extends BaseService { Future getTopManufacturerList() async { Map queryParams = {'page': '1', 'limit': '8'}; try { - // await baseAppClient.get(GET_PHARMACY_TOP_MANUFACTURER, - // onSuccess: (dynamic response, int statusCode) { - // manufacturerList.clear(); - // response['manufacturer'].forEach((item) { - // manufacturerList.add(Manufacturer.fromJson(item)); - // }); - // }, onFailure: (String error, int statusCode) { - // hasError = true; - // super.error = error; - // }, queryParams: queryParams); + await baseAppClient.get(GET_PHARMACY_TOP_MANUFACTURER, + onSuccess: (dynamic response, int statusCode) { + manufacturerList.clear(); + response['manufacturer'].forEach((item) { + Manufacturer manufacturer = Manufacturer.fromJson(item); + if(manufacturer.image != null){ + manufacturerList.add(Manufacturer.fromJson(item)); + } + }); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, queryParams: queryParams); } catch (error) { throw error; } @@ -57,16 +111,16 @@ class PharmacyModuleService extends BaseService { 'id,discount_ids,name,namen,localized_names,display_order,short_description,full_description,full_descriptionn,sku,order_minimum_quantity,order_maximum_quantity,price,old_price,images,is_rx,rx_message,rx_messagen,discount_name,discount_namen,approved_rating_sum,approved_total_reviews,allow_back_in_stock_subscriptions,stock_quantity,stock_availability,stock_availabilityn,discount_percentage,reviews', }; try { - // await baseAppClient.get(GET_PHARMACY_BEST_SELLER_PRODUCT, - // onSuccess: (dynamic response, int statusCode) { - // bestSellerProducts.clear(); - // response['products'].forEach((item) { - // bestSellerProducts.add(PharmacyProduct.fromJson(item)); - // }); - // }, onFailure: (String error, int statusCode) { - // hasError = true; - // super.error = error; - // }, queryParams: queryParams); + await baseAppClient.get(GET_PHARMACY_BEST_SELLER_PRODUCT, + onSuccess: (dynamic response, int statusCode) { + bestSellerProducts.clear(); + response['products'].forEach((item) { + bestSellerProducts.add(PharmacyProduct.fromJson(item)); + }); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, queryParams: queryParams); } catch (error) { throw error; } @@ -79,16 +133,16 @@ class PharmacyModuleService extends BaseService { lastVisited = await this.sharedPref.getString(PHARMACY_LAST_VISITED_PRODUCTS); try { - // await baseAppClient.get("$GET_PHARMACY_PRODUCTs_BY_IDS$lastVisited", - // onSuccess: (dynamic response, int statusCode) { - // lastVisitedProducts.clear(); - // response['products'].forEach((item) { - // lastVisitedProducts.add(PharmacyProduct.fromJson(item)); - // }); - // }, onFailure: (String error, int statusCode) { - // hasError = true; - // super.error = error; - // }); + await baseAppClient.get("$GET_PHARMACY_PRODUCTs_BY_IDS$lastVisited", + onSuccess: (dynamic response, int statusCode) { + lastVisitedProducts.clear(); + response['products'].forEach((item) { + lastVisitedProducts.add(PharmacyProduct.fromJson(item)); + }); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }); } catch (error) { throw error; } diff --git a/lib/core/service/parmacyModule/terms-condition-service.dart b/lib/core/service/parmacyModule/terms-condition-service.dart new file mode 100644 index 00000000..68fac632 --- /dev/null +++ b/lib/core/service/parmacyModule/terms-condition-service.dart @@ -0,0 +1,33 @@ +import 'package:diplomaticquarterapp/config/config.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacies/ListUserAgreement.dart'; + +import '../base_service.dart'; + +class TermsConditionService extends BaseService{ + bool isFinished = true; + bool hasError = false; + String errorMsg = ''; + String successMsg = ''; + + ListUserAgreement listUserAgreement; + + Future getUserTermsAndConditionsForEPharmcy() async { + hasError = false; + super.error = ""; + + Map body = Map(); + + try { + await baseAppClient.post(LAKUM_GET_USER_TERMS_AND_CONDITIONS, + onSuccess: (response, statusCode) async { + listUserAgreement = ListUserAgreement.fromJson(response['ListUserAgreement'][0]); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: body); + } catch (error) { + throw error; + } + } + +} \ No newline at end of file diff --git a/lib/core/service/pharmacy_categorise_service.dart b/lib/core/service/pharmacy_categorise_service.dart new file mode 100644 index 00000000..b55a755d --- /dev/null +++ b/lib/core/service/pharmacy_categorise_service.dart @@ -0,0 +1,225 @@ +import 'package:diplomaticquarterapp/config/config.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacy/brands_model.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacy/categorise_parent_model.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacy/final_products_model.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacy/parent_products_model.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacy/pharmacy_categorise.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacy/scan_qr_model.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacy/sub_categories_model.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacy/sub_products_model.dart'; +import 'package:diplomaticquarterapp/core/model/search_products_model.dart'; + +import 'base_service.dart'; + +class PharmacyCategoriseService extends BaseService { + //service one + List _categoriseList = List(); + List get categoriseList => _categoriseList; + + //service two + List _parentCategoriseList = List(); + List get parentCategoriseList => _parentCategoriseList; + + //service three + List _parentProductsList = List(); + List get parentProductsList => _parentProductsList; + + //service four + List _subCategoriseList = List(); + List get subCategoriseList => _subCategoriseList; + + //service five + List _subProductsList = List(); + List get subProductsList => _subProductsList; + + //service six + List _finalProducts = List(); + List get finalProducts => _finalProducts; + + //service 7 + + List _brandsList = List(); + List get brandsList => _brandsList; + + // service 8 + + List _searchList = List(); + List get searchList => _searchList; + + List _scanList = List(); + List get scanList => _scanList; + + clearSearchList() { + _searchList.clear(); + } + + Future getCategorise() async { + hasError = false; + _categoriseList.clear(); + await baseAppClient.get( + GET_PHARMACY_CATEGORISE, + onSuccess: (dynamic response, int statusCode) { + response['categories'].forEach((item) { + _categoriseList.add(PharmacyCategorise.fromJson(item)); + }); + }, + onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, + ); + } + + Future scanQr({String id}) async { + hasError = false; + _scanList.clear(); + String endPoint = id != null ? SCAN_QR_CODE + "$id" : SCAN_QR_CODE + ""; + await baseAppClient.get( + endPoint, + onSuccess: (dynamic response, int statusCode) { + response['products'].forEach((item) { + _scanList.add(ScanQrModel.fromJson(item)); + }); + }, + onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, + ); + } + + Future searchProducts({String productName}) async { + hasError = false; + _searchList.clear(); + String endPoint = productName != null + ? GET_SEARCH_PRODUCTS + "$productName" + '&language_id=1' + : GET_SEARCH_PRODUCTS + ""; + await baseAppClient.get( + endPoint, + onSuccess: (dynamic response, int statusCode) { + response['products'].forEach((item) { + _searchList.add(SearchProductsModel.fromJson(item)); + }); + }, + onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, + ); + } + + Future getBrands() async { + hasError = false; + _brandsList.clear(); + await baseAppClient.get( + GET_BRANDS_LIST, + onSuccess: (dynamic response, int statusCode) { + response['manufacturer'].forEach((item) { + _brandsList.add(BrandsModel.fromJson(item)); + }); + }, + onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, + ); + } + + Future getCategoriseParent({String id}) async { + hasError = false; + _parentCategoriseList.clear(); + String endPoint = + id != null ? GET_CATEGORISE_PARENT + "$id" : GET_CATEGORISE_PARENT + ""; + await baseAppClient.get( + endPoint, + onSuccess: (dynamic response, int statusCode) { + response['categories'].forEach((item) { + _parentCategoriseList.add(CategoriseParentModel.fromJson(item)); + }); + }, + onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, + ); + } + + Future getParentProducts({String id}) async { + hasError = false; + _parentProductsList.clear(); + String endPoint = id != null + ? GET_PARENT_PRODUCTS + "$id" + '&page=1&limit=50' + : GET_PARENT_PRODUCTS + ""; + await baseAppClient.get( + endPoint, + onSuccess: (dynamic response, int statusCode) { + response['products'].forEach((item) { + _parentProductsList.add(ParentProductsModel.fromJson(item)); + }); + }, + onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, + ); + } + + Future getSubCategorise({String id}) async { + hasError = false; + _subCategoriseList.clear(); + + String endPoint = + id != null ? GET_SUB_CATEGORISE + "$id" : GET_SUB_CATEGORISE + ""; + await baseAppClient.get( + endPoint, + onSuccess: (dynamic response, int statusCode) { + response['categories'].forEach((item) { + _subCategoriseList.add(SubCategoriesModel.fromJson(item)); + }); + }, + onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, + ); + } + + Future getSubProducts({String id}) async { + hasError = false; + _subProductsList.clear(); + String endPoint = id != null + ? GET_SUB_PRODUCTS + "$id" + '&page=1&limit=50' + : GET_SUB_PRODUCTS + ""; + await baseAppClient.get( + endPoint, + onSuccess: (dynamic response, int statusCode) { + response['products'].forEach((item) { + _subProductsList.add(SubProductsModel.fromJson(item)); + }); + }, + onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, + ); + } + + Future getFinalProducts({String id}) async { + hasError = false; + _finalProducts.clear(); + String endPoint = + id != null ? GET_FINAL_PRODUCTS + "$id" : GET_FINAL_PRODUCTS + ""; + await baseAppClient.get( + endPoint, + onSuccess: (dynamic response, int statusCode) { + response['products'].forEach((item) { + _finalProducts.add(FinalProductsModel.fromJson(item)); + }); + }, + onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, + ); + } +} diff --git a/lib/core/viewModels/AlHabibMedicalService/add_new_address_Request_Model.dart b/lib/core/viewModels/AlHabibMedicalService/add_new_address_Request_Model.dart new file mode 100644 index 00000000..5bde5a5f --- /dev/null +++ b/lib/core/viewModels/AlHabibMedicalService/add_new_address_Request_Model.dart @@ -0,0 +1,136 @@ +class AddNewAddressRequestModel { + Customer customer; + + AddNewAddressRequestModel({this.customer}); + + AddNewAddressRequestModel.fromJson(Map json) { + customer = json['customer'] != null + ? new Customer.fromJson(json['customer']) + : null; + } + + Map toJson() { + final Map data = new Map(); + if (this.customer != null) { + data['customer'] = this.customer.toJson(); + } + return data; + } +} + +class Customer { + List addresses; + int id; + String email; + List roleIds; + + Customer({this.addresses, this.id, this.email, this.roleIds}); + + Customer.fromJson(Map json) { + if (json['addresses'] != null) { + addresses = new List(); + json['addresses'].forEach((v) { + addresses.add(new Addresses.fromJson(v)); + }); + } + id = json['id']; + email = json['email']; + roleIds = json['role_ids'].cast(); + } + + Map toJson() { + final Map data = new Map(); + if (this.addresses != null) { + data['addresses'] = this.addresses.map((v) => v.toJson()).toList(); + } + data['id'] = this.id; + data['email'] = this.email; + data['role_ids'] = this.roleIds; + return data; + } +} + +class Addresses { + int id; + String firstName; + String lastName; + String email; + Null company; + int countryId; + String country; + Null stateProvinceId; + String city; + String address1; + String address2; + String zipPostalCode; + String phoneNumber; + Null faxNumber; + String customerAttributes; + String createdOnUtc; + Null province; + String latLong; + + Addresses( + {this.id, + this.firstName, + this.lastName, + this.email, + this.company, + this.countryId, + this.country, + this.stateProvinceId, + this.city, + this.address1, + this.address2, + this.zipPostalCode, + this.phoneNumber, + this.faxNumber, + this.customerAttributes, + this.createdOnUtc, + this.province, + this.latLong}); + + Addresses.fromJson(Map json) { + id = json['id']; + firstName = json['first_name']; + lastName = json['last_name']; + email = json['email']; + company = json['company']; + countryId = json['country_id']; + country = json['country']; + stateProvinceId = json['state_province_id']; + city = json['city']; + address1 = json['address1']; + address2 = json['address2']; + zipPostalCode = json['zip_postal_code']; + phoneNumber = json['phone_number']; + faxNumber = json['fax_number']; + customerAttributes = json['customer_attributes']; + createdOnUtc = json['created_on_utc']; + province = json['province']; + latLong = json['lat_long']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['first_name'] = this.firstName; + data['last_name'] = this.lastName; + data['email'] = this.email; + data['company'] = this.company; + data['country_id'] = this.countryId; + data['country'] = this.country; + data['state_province_id'] = this.stateProvinceId; + data['city'] = this.city; + data['address1'] = this.address1; + data['address2'] = this.address2; + data['zip_postal_code'] = this.zipPostalCode; + data['phone_number'] = this.phoneNumber; + data['fax_number'] = this.faxNumber; + data['customer_attributes'] = this.customerAttributes; + data['created_on_utc'] = this.createdOnUtc; + data['province'] = this.province; + data['lat_long'] = this.latLong; + return data; + } +} diff --git a/lib/core/viewModels/AlHabibMedicalService/cmc_view_model.dart b/lib/core/viewModels/AlHabibMedicalService/cmc_view_model.dart index bf3404a9..f2c81956 100644 --- a/lib/core/viewModels/AlHabibMedicalService/cmc_view_model.dart +++ b/lib/core/viewModels/AlHabibMedicalService/cmc_view_model.dart @@ -9,14 +9,19 @@ import 'package:diplomaticquarterapp/core/model/AlHabibMedicalService/HomeHealth import 'package:diplomaticquarterapp/core/model/AlHabibMedicalService/HomeHealthCare/get_order_detail_by_order_iD_response_model.dart'; import 'package:diplomaticquarterapp/core/model/AlHabibMedicalService/HomeHealthCare/update_pres_oreder_request_model.dart'; import 'package:diplomaticquarterapp/core/service/AlHabibMedicalService/cmc_service.dart'; +import 'package:diplomaticquarterapp/core/service/AlHabibMedicalService/customer_addresses_service.dart'; import 'package:diplomaticquarterapp/core/viewModels/base_view_model.dart'; import '../../../locator.dart'; +import 'add_new_address_Request_Model.dart'; class CMCViewModel extends BaseViewModel { CMCService _cMCService = locator(); - + CustomerAddressesService _customerAddressesService = + locator(); + List get addressesList => + _customerAddressesService.addressesList; List get cmcAllServicesList => _cMCService.cmcAllServicesList; @@ -107,4 +112,44 @@ class CMCViewModel extends BaseViewModel { getCmcAllPresOrders(); } } + + Future getCustomerAddresses() async { + setState(ViewState.Busy); + await _customerAddressesService.getCustomerAddresses( + ); + if (_customerAddressesService.hasError) { + error = _customerAddressesService.error; + setState(ViewState.ErrorLocal); + } else { + setState(ViewState.Idle); + } + } + + Future getCustomerInfo() async { + setState(ViewState.Busy); + await _customerAddressesService.getCustomerInfo( + ); + if (_customerAddressesService.hasError) { + error = _customerAddressesService.error; + setState(ViewState.ErrorLocal); + } else { + await getCustomerAddresses(); + } + } + + Future addAddressInfo( + {AddNewAddressRequestModel addNewAddressRequestModel}) async { + + + setState(ViewState.Busy); + await _customerAddressesService.addAddressInfo( + addNewAddressRequestModel: addNewAddressRequestModel + ); + if (_customerAddressesService.hasError) { + error = _customerAddressesService.error; + setState(ViewState.ErrorLocal); + } else { + setState(ViewState.Idle); + } + } } \ No newline at end of file diff --git a/lib/core/viewModels/AlHabibMedicalService/home_health_care_view_model.dart b/lib/core/viewModels/AlHabibMedicalService/home_health_care_view_model.dart index 031d0a0c..20a19b23 100644 --- a/lib/core/viewModels/AlHabibMedicalService/home_health_care_view_model.dart +++ b/lib/core/viewModels/AlHabibMedicalService/home_health_care_view_model.dart @@ -8,18 +8,28 @@ import 'package:diplomaticquarterapp/core/model/AlHabibMedicalService/HomeHealth import 'package:diplomaticquarterapp/core/model/AlHabibMedicalService/HomeHealthCare/get_order_detail_by_order_iD_response_model.dart'; import 'package:diplomaticquarterapp/core/model/AlHabibMedicalService/HomeHealthCare/patient_er_insert_pres_order_request_model.dart'; import 'package:diplomaticquarterapp/core/model/AlHabibMedicalService/HomeHealthCare/update_pres_oreder_request_model.dart'; +import 'package:diplomaticquarterapp/core/service/AlHabibMedicalService/customer_addresses_service.dart'; import 'package:diplomaticquarterapp/core/service/AlHabibMedicalService/home_health_care_service.dart'; import 'package:diplomaticquarterapp/core/viewModels/base_view_model.dart'; +import 'package:intl/intl.dart'; import '../../../locator.dart'; +import 'add_new_address_Request_Model.dart'; class HomeHealthCareViewModel extends BaseViewModel { HomeHealthCareService _homeHealthCareService = locator(); + CustomerAddressesService _customerAddressesService = + locator(); + List get hhcAllServicesList => _homeHealthCareService.hhcAllServicesList; + + List get addressesList => + _customerAddressesService.addressesList; + List get hhcAllPresOrders => _homeHealthCareService.hhcAllPresOrdersList; @@ -93,5 +103,44 @@ class HomeHealthCareViewModel extends BaseViewModel { } + Future getCustomerAddresses() async { + setState(ViewState.Busy); + await _customerAddressesService.getCustomerAddresses( + ); + if (_customerAddressesService.hasError) { + error = _customerAddressesService.error; + setState(ViewState.ErrorLocal); + } else { + setState(ViewState.Idle); + } + } + + Future getCustomerInfo() async { + setState(ViewState.Busy); + await _customerAddressesService.getCustomerInfo( + ); + if (_customerAddressesService.hasError) { + error = _customerAddressesService.error; + setState(ViewState.ErrorLocal); + } else { + await getCustomerAddresses(); + } + } + + Future addAddressInfo( + {AddNewAddressRequestModel addNewAddressRequestModel}) async { + + setState(ViewState.Busy); + await _customerAddressesService.addAddressInfo( + addNewAddressRequestModel: addNewAddressRequestModel + ); + if (_customerAddressesService.hasError) { + error = _customerAddressesService.error; + setState(ViewState.ErrorLocal); + } else { + setState(ViewState.Idle); + } + } + } \ No newline at end of file diff --git a/lib/core/viewModels/offers_Categorise_view_model.dart b/lib/core/viewModels/offers_Categorise_view_model.dart new file mode 100644 index 00000000..b63dd553 --- /dev/null +++ b/lib/core/viewModels/offers_Categorise_view_model.dart @@ -0,0 +1,48 @@ +import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacy/offer_products_model.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacy/offers_model.dart'; +import 'package:diplomaticquarterapp/core/service/offers_service.dart'; +import 'package:diplomaticquarterapp/locator.dart'; + +import 'base_view_model.dart'; + +class OffersCategoriseViewModel extends BaseViewModel { + bool hasError = false; + + OffersCategoriseService _offersCategoriseService = + locator(); + List get categorise => _offersCategoriseService.offersList; + + List get products => + _offersCategoriseService.offersProducts; + + Future getOffersCategorise() async { + hasError = false; + _offersCategoriseService.clearCategorise(); + setState(ViewState.Busy); + await _offersCategoriseService.getOffersCategorise(); + if (_offersCategoriseService.hasError) { + error = _offersCategoriseService.error; + setState(ViewState.ErrorLocal); + } else + await getOffersProducts(); + } + + Future getOffersProducts({String i}) async { + hasError = false; + + setState(ViewState.Busy); + await _offersCategoriseService.getOffersProducts(id: i); + if (_offersCategoriseService.hasError) { + error = _offersCategoriseService.error; + setState(ViewState.ErrorLocal); + } else + setState(ViewState.Idle); + } +} +// await _offersCategoriseService.getOffersProducts(); +// if (_offersCategoriseService.hasError) { +// error = _offersCategoriseService.error; +// setState(ViewState.ErrorLocal); +// } else +// setState(ViewState.Idle); diff --git a/lib/core/viewModels/pharmacyModule/OrderPreviewViewModel.dart b/lib/core/viewModels/pharmacyModule/OrderPreviewViewModel.dart index 00f4819b..06295188 100644 --- a/lib/core/viewModels/pharmacyModule/OrderPreviewViewModel.dart +++ b/lib/core/viewModels/pharmacyModule/OrderPreviewViewModel.dart @@ -1,3 +1,11 @@ +import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; +import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacies/Addresses.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacies/LacumAccountInformation.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacies/ShippingOption.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacies/ShoppingCart.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacies/ShoppingCartResponse.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacies/payment-checkout-data.dart'; import 'package:diplomaticquarterapp/core/service/parmacyModule/order-preview-service.dart'; import '../../../locator.dart'; @@ -5,4 +13,183 @@ import '../base_view_model.dart'; class OrderPreviewViewModel extends BaseViewModel { OrderPreviewService _orderService = locator(); + + List get addresses => _orderService.addresses; + LacumAccountInformation get lacumInformation => + _orderService.lacumInformation; + ShoppingCartResponse cartResponse = ShoppingCartResponse(); + PaymentCheckoutData paymentCheckoutData = PaymentCheckoutData(); + double totalAdditionalShippingCharge = 0; + + Future getOrderPreviewData() async { + setState(ViewState.Busy); + await _orderService.getAddresses(); + if (_orderService.hasError) { + error = _orderService.error; + setState(ViewState.Error); + } else { + getShoppingCart(); + } + } + + getShoppingCart() async { + setState(ViewState.Busy); + await _orderService.getShoppingCart().then((res) { + _handleGetShoppingCartResponse(res); + }); + if (_orderService.hasError) { + error = _orderService.error; + setState(ViewState.Error); + } else { + if (paymentCheckoutData != null) { + paymentCheckoutData.cartDataVisible = true; + } + setState(ViewState.Idle); + } + } + + changeProductQuantity(ShoppingCart product) async { + setState(ViewState.Busy); + await _orderService.changeProductQuantity(product.id, product).then((res) { + _handleGetShoppingCartResponse(res); + }); + if (_orderService.hasError) { + error = _orderService.error; + setState(ViewState.Error); + } else { + setState(ViewState.Idle); + } + } + + deleteProduct(ShoppingCart product) async { + setState(ViewState.Busy); + await _orderService.deleteProduct(product.id).then((res) { + _handleGetShoppingCartResponse(res); + }); + if (_orderService.hasError) { + error = _orderService.error; + setState(ViewState.Error); + } else { + setState(ViewState.Idle); + } + } + + deleteShoppingCart() async { + setState(ViewState.Busy); + await _orderService.deleteShoppingCart().then((res) { + _handleGetShoppingCartResponse(res); + }); + if (_orderService.hasError) { + error = _orderService.error; + setState(ViewState.Error); + } else { + setState(ViewState.Idle); + } + } + + _handleGetShoppingCartResponse(Map res) { + totalAdditionalShippingCharge = 0; + if (res == null) { + error = "response is null"; + setState(ViewState.Error); + return; + } + print(res); + cartResponse.itemCount = res["item_count"]; + cartResponse.quantityCount = res["quantity_count"]; + cartResponse.subtotal = res["subtotal"]; + cartResponse.subtotalWithVat = res["subtotal_with_vat"]; + cartResponse.subtotalVatAmount = res["subtotal_vat_amount"]; + cartResponse.subtotalVatRate = res["subtotal_vat_rate"]; + cartResponse.shoppingCarts = List(); + res["shopping_carts"].forEach((item) { + ShoppingCart shoppingCart = ShoppingCart.fromJson(item); + cartResponse.shoppingCarts.add(shoppingCart); + totalAdditionalShippingCharge += shoppingCart.product.additionalShippingCharge; + }); + cartResponse.updateShoppingCard(); + } + + String getPaymentOptionImage(PaymentOption paymentOption) { + String assetFile = "assets/images/pharmacy_module/payment/"; + switch (paymentOption.index) { + case 0: + return "${assetFile}mada.png"; + break; + case 1: + return "${assetFile}sadad.png"; + break; + case 2: + return "${assetFile}visa.png"; + break; + case 3: + return "${assetFile}mastercard.png"; + break; + case 4: + return "${assetFile}installment.png"; + break; + default: + return ""; + } + } + + String getPaymentOptionName(PaymentOption paymentOption) { + return _orderService.getPaymentOptionName(paymentOption); + } + + getInformationsByAddress() async { + await getLacumAccountInformation(); + await getShippingOption(); + } + + getLacumAccountInformation() async { + setState(ViewState.Busy); + await _orderService.getLacumAccountInformation(); + if (_orderService.hasError) { + error = _orderService.error; + setState(ViewState.Error); + } else { + getLacumGroupData(); + } + } + + Future getLacumGroupData() async { + setState(ViewState.Busy); + await _orderService.getLacumGroupInformation(); + paymentCheckoutData.lacumInformation = _orderService.lacumGroupInformation; + paymentCheckoutData.usedLakumPoints = paymentCheckoutData.lacumInformation.lakumInquiryInformationObjVersion.pointsBalanceAmount; + if (_orderService.hasError) { + error = _orderService.error; + setState(ViewState.Error); + } else { + setState(ViewState.Idle); + } + } + + getShippingOption() async { + setState(ViewState.Busy); + await _orderService.getShippingOption(paymentCheckoutData.address).then((res) { + paymentCheckoutData.shippingOption = ShippingOption.fromJson(res); + paymentCheckoutData.updateData(); + }); + if (_orderService.hasError) { + error = _orderService.error; + setState(ViewState.Error); + } else { + setState(ViewState.Idle); + } + } + + Future makeOrder() async { + setState(ViewState.Busy); + await _orderService.makeOrder(paymentCheckoutData, cartResponse.shoppingCarts); + if (_orderService.hasError) { + error = _orderService.error; + setState(ViewState.Error); + } else { + setState(ViewState.Idle); + } + } } + +enum PaymentOption { meda, sadad, visa, mastercard, installments } diff --git a/lib/core/viewModels/pharmacyModule/lacum-registration-viewModel.dart b/lib/core/viewModels/pharmacyModule/lacum-registration-viewModel.dart new file mode 100644 index 00000000..f8f5ea05 --- /dev/null +++ b/lib/core/viewModels/pharmacyModule/lacum-registration-viewModel.dart @@ -0,0 +1,55 @@ +import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacies/LacumAccountInformation.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacies/ListUserAgreement.dart'; +import 'package:diplomaticquarterapp/core/service/parmacyModule/lacum-registration-service.dart'; +import 'package:diplomaticquarterapp/core/service/parmacyModule/lacum-transfer-service.dart'; + +import '../../../locator.dart'; +import 'lacum-viewmodel.dart'; + +class LacumRegistrationViewModel extends LacumViewModel { + LacumRegistrationService _lacumService = locator(); + + ListUserAgreement get listUserAgreement => _lacumService.listUserAgreement; + + Future checkLacumAccountActivation(String patientIdentificationNo) async { + setState(ViewState.Busy); + await _lacumService.getLacumAccountInformationById(patientIdentificationNo); + if (_lacumService.hasError) { + error = _lacumService.error; + setState(ViewState.Error); + } else { + if(_lacumService.lacumInformation.yahalaAccountNo != 0){ + error = "The account has already been activated"; + setState(ViewState.Error); + } else { + setState(ViewState.Idle); + } + } + } + + Future getUserTermsAndConditionsForEPharmcy() async { + setState(ViewState.Busy); + await _lacumService.getUserTermsAndConditionsForEPharmcy(); + if (_lacumService.hasError) { + error = _lacumService.error; + setState(ViewState.Error); + } else { + setState(ViewState.Idle); + } + } + + Future createNewLakumAccount(String name, String phone, String identificationNo, int languageId) async { + setState(ViewState.Busy); + await _lacumService.createLakumAccount(name, phone, 0, identificationNo, languageId); + if (_lacumService.hasError) { + error = _lacumService.error; + setState(ViewState.Error); + return 404; + } else { + setState(ViewState.Idle); + return 200; + } + } + +} diff --git a/lib/core/viewModels/pharmacyModule/lacum-trasnfer-viewModel.dart b/lib/core/viewModels/pharmacyModule/lacum-trasnfer-viewModel.dart new file mode 100644 index 00000000..cd19a40f --- /dev/null +++ b/lib/core/viewModels/pharmacyModule/lacum-trasnfer-viewModel.dart @@ -0,0 +1,42 @@ +import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacies/LacumAccountInformation.dart'; +import 'package:diplomaticquarterapp/core/service/parmacyModule/lacum-transfer-service.dart'; + +import '../../../locator.dart'; +import 'lacum-viewmodel.dart'; + +class LacumTranferViewModel extends LacumViewModel { + LacumTransferService _lacumService = locator(); + + LacumAccountInformation get lacumReceiverInformation => + _lacumService.lacumReceiverInformation; + + Future getLacumGroupDataBuAccountId(String accountId) async { + setState(ViewState.Busy); + await _lacumService.getLacumGroupDataBuAccountId(accountId); + if (_lacumService.hasError) { + error = _lacumService.error; + setState(ViewState.Error); + } else { + setState(ViewState.Idle); + } + } + + Future transferYaHalaLoyaltyPoints(String points) async { + setState(ViewState.Busy); + await _lacumService.transferYaHalaLoyaltyPoints(points); + if (_lacumService.hasError) { + error = _lacumService.error; + setState(ViewState.Error); + return 404; + } else { + setState(ViewState.Idle); + return 200; + } + } + + setLakumData(LacumAccountInformation lacumInformation, LacumAccountInformation lacumGroupInformation){ + _lacumService.lacumInformation = lacumInformation; + _lacumService.lacumGroupInformation = lacumGroupInformation; + } +} diff --git a/lib/core/viewModels/pharmacyModule/lacum-viewmodel.dart b/lib/core/viewModels/pharmacyModule/lacum-viewmodel.dart new file mode 100644 index 00000000..ba8d70d9 --- /dev/null +++ b/lib/core/viewModels/pharmacyModule/lacum-viewmodel.dart @@ -0,0 +1,111 @@ +import 'dart:typed_data'; + +import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacies/LacumAccountInformation.dart'; +import 'package:diplomaticquarterapp/core/service/parmacyModule/lacum-service.dart'; +import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; +import 'dart:async'; +import 'dart:convert' as convert; + +import '../../../locator.dart'; +import '../base_view_model.dart'; + +class LacumViewModel extends BaseViewModel { + LacumService _lacumService = locator(); + + LacumAccountInformation get lacumInformation => + _lacumService.lacumInformation; + + LacumAccountInformation get lacumGroupInformation => + _lacumService.lacumGroupInformation; + + Future getLacumData() async { + await getLacumAccountData(); + getLacumGroupData(); + } + + Future getLacumAccountData() async { + setState(ViewState.Busy); + await _lacumService.getLacumAccountInformation(); + if (_lacumService.hasError) { + error = _lacumService.error; + setState(ViewState.Error); + } else { + setState(ViewState.Idle); + } + } + + Future getLacumGroupData() async { + setState(ViewState.Busy); + await _lacumService.getLacumGroupInformation(); + if (_lacumService.hasError) { + error = _lacumService.error; + setState(ViewState.Error); + } else { + setState(ViewState.Idle); + } + } + + Future makeAccountActivate() async { + setState(ViewState.Busy); + await _lacumService.makeAccountActivate(); + if (_lacumService.hasError) { + error = _lacumService.error; + setState(ViewState.Error); + } else { + lacumGroupInformation.lakumInquiryInformationObjVersion.accountStatus = "Active"; + getLacumAccountData(); + } + } + + Future makeAccountDeactivate() async { + setState(ViewState.Busy); + await _lacumService.makeAccountDeactivate(); + if (_lacumService.hasError) { + error = _lacumService.error; + setState(ViewState.Error); + } else { + lacumGroupInformation.lakumInquiryInformationObjVersion.accountStatus = "Cancelled"; + getLacumAccountData(); + } + } + + Future createLakumAccount(String name, String phone) async { + setState(ViewState.Busy); + await _lacumService.createLakumAccount(name, phone, lacumInformation.yahalaAccountNo, lacumInformation.identificationNo, null); + if (_lacumService.hasError) { + error = _lacumService.error; + setState(ViewState.Error); + return 404; + } else { + setState(ViewState.Idle); + return 200; + } + } + + String formatCreatedDateToString() { + DateTime createdDate = DateUtil.convertStringToDate( + lacumGroupInformation.lakumInquiryInformationObjVersion.createdDate); + return DateUtil.getFormattedDate(createdDate, "MMM dd,yyyy"); + } + + Uint8List convertBase64ToBarCodeImage() { + try { + final _byteImage = convert.base64Decode( + lacumGroupInformation.lakumInquiryInformationObjVersion.barCode); + return _byteImage; + } catch (e) { + print(e); + return null; + } + } + + setLakumData(LacumAccountInformation lacumInformation, LacumAccountInformation lacumGroupInformation){ + _lacumService.lacumInformation = lacumInformation; + _lacumService.lacumGroupInformation = lacumGroupInformation; + } + + clearLakumGroupData(){ + _lacumService.lacumGroupInformation = null; + } +} diff --git a/lib/core/viewModels/pharmacyModule/pharmacy_module_view_model.dart b/lib/core/viewModels/pharmacyModule/pharmacy_module_view_model.dart index f8c574f7..4dfc6a26 100644 --- a/lib/core/viewModels/pharmacyModule/pharmacy_module_view_model.dart +++ b/lib/core/viewModels/pharmacyModule/pharmacy_module_view_model.dart @@ -1,3 +1,4 @@ +import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; import 'package:diplomaticquarterapp/core/model/pharmacies/Manufacturer.dart'; import 'package:diplomaticquarterapp/core/model/pharmacies/PharmacyImageObject.dart'; @@ -21,6 +22,25 @@ class PharmacyModuleViewModel extends BaseViewModel { _pharmacyService.lastVisitedProducts; Future getPharmacyHomeData() async { + setState(ViewState.Busy); + var data = await sharedPref.getObject(USER_PROFILE); + var customerId = await sharedPref.getString(PHARMACY_CUSTOMER_ID); + + if (authenticatedUserObject.isLogin && data != null && customerId == null) { + await _pharmacyService.makeVerifyCustomer(data); + // here must call getShoppingCard() + if (_pharmacyService.hasError) { + error = _pharmacyService.error; + setState(ViewState.Error); + } else { + await getBannerList(); + } + } else { + await getBannerList(); + } + } + + Future getBannerList() async { setState(ViewState.Busy); await _pharmacyService.getBannerListList(); if (_pharmacyService.hasError) { @@ -47,6 +67,7 @@ class PharmacyModuleViewModel extends BaseViewModel { error = _pharmacyService.error; setState(ViewState.Error); } else { + setState(ViewState.Idle); _getBestSellerProducts(); } } @@ -70,4 +91,18 @@ class PharmacyModuleViewModel extends BaseViewModel { setState(ViewState.Idle); } } + + Future checkUserIsActivated() async { + if (authenticatedUserObject.isLogin) { + var customerId = await sharedPref.getString(PHARMACY_CUSTOMER_ID); + if (customerId != null) { + return true; + } else { + return false; + } + } else { + // go to login page + return false; + } + } } diff --git a/lib/core/viewModels/pharmacyModule/tems-condition-viewmodel.dart b/lib/core/viewModels/pharmacyModule/tems-condition-viewmodel.dart new file mode 100644 index 00000000..6a5bd476 --- /dev/null +++ b/lib/core/viewModels/pharmacyModule/tems-condition-viewmodel.dart @@ -0,0 +1,24 @@ +import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacies/ListUserAgreement.dart'; +import 'package:diplomaticquarterapp/core/service/parmacyModule/terms-condition-service.dart'; +import 'dart:async'; + +import '../../../locator.dart'; +import '../base_view_model.dart'; + +class TermsConditionViewModel extends BaseViewModel { + TermsConditionService _termsConditionService = locator(); + + ListUserAgreement get listUserAgreement => _termsConditionService.listUserAgreement; + + Future getUserTermsAndConditionsForEPharmcy() async { + setState(ViewState.Busy); + await _termsConditionService.getUserTermsAndConditionsForEPharmcy(); + if (_termsConditionService.hasError) { + error = _termsConditionService.error; + setState(ViewState.Error); + } else { + setState(ViewState.Idle); + } + } +} diff --git a/lib/core/viewModels/pharmacy_categorise_view_model.dart b/lib/core/viewModels/pharmacy_categorise_view_model.dart new file mode 100644 index 00000000..5e1f4f9f --- /dev/null +++ b/lib/core/viewModels/pharmacy_categorise_view_model.dart @@ -0,0 +1,158 @@ +import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacy/brands_model.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacy/categorise_parent_model.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacy/final_products_model.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacy/parent_products_model.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacy/pharmacy_categorise.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacy/scan_qr_model.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacy/sub_categories_model.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacy/sub_products_model.dart'; +import 'package:diplomaticquarterapp/core/model/search_products_model.dart'; + +import 'package:diplomaticquarterapp/core/service/pharmacy_categorise_service.dart'; +import 'package:diplomaticquarterapp/locator.dart'; + +import 'base_view_model.dart'; + +class PharmacyCategoriseViewModel extends BaseViewModel { + bool hasError = false; + PharmacyCategoriseService _pharmacyCategoriseService = + locator(); + + List get categorise => + _pharmacyCategoriseService.categoriseList; + + List get categoriseParent => + _pharmacyCategoriseService.parentCategoriseList; + + List get parentProducts => + _pharmacyCategoriseService.parentProductsList; + + List get subCategorise => + _pharmacyCategoriseService.subCategoriseList; + + List get subProducts => + _pharmacyCategoriseService.subProductsList; + + List get finalProducts => + _pharmacyCategoriseService.finalProducts; + List get brandsList => _pharmacyCategoriseService.brandsList; + + List get searchList => + _pharmacyCategoriseService.searchList; + + List get scanList => _pharmacyCategoriseService.scanList; + + Future getCategorise() async { + hasError = false; + // _insuranceCardService.clearInsuranceCard(); + setState(ViewState.Busy); + await _pharmacyCategoriseService.getCategorise(); + if (_pharmacyCategoriseService.hasError) { + error = _pharmacyCategoriseService.error; + setState(ViewState.ErrorLocal); + } else + setState(ViewState.Idle); + } + + Future getBrands() async { + hasError = false; + // _insuranceCardService.clearInsuranceCard(); + setState(ViewState.Busy); + await _pharmacyCategoriseService.getBrands(); + if (_pharmacyCategoriseService.hasError) { + error = _pharmacyCategoriseService.error; + setState(ViewState.ErrorLocal); + } else + setState(ViewState.Idle); + } + + Future scanQr({String id}) async { + hasError = false; + // _insuranceCardService.clearInsuranceCard(); + setState(ViewState.Busy); + await _pharmacyCategoriseService.scanQr(id: id); + if (_pharmacyCategoriseService.hasError) { + error = _pharmacyCategoriseService.error; + setState(ViewState.ErrorLocal); + } else + setState(ViewState.Idle); + } + + clearSearchList() { + _pharmacyCategoriseService.clearSearchList(); + } + + Future searchProducts({String productName}) async { + hasError = false; + _pharmacyCategoriseService.clearSearchList(); + setState(ViewState.Busy); + await _pharmacyCategoriseService.searchProducts(productName: productName); + if (_pharmacyCategoriseService.hasError) { + error = _pharmacyCategoriseService.error; + setState(ViewState.ErrorLocal); + } else + setState(ViewState.Idle); + } + + Future getCategoriseParent({String i}) async { + hasError = false; + // _insuranceCardService.clearInsuranceCard(); + setState(ViewState.Busy); + await _pharmacyCategoriseService.getCategoriseParent(id: i); + if (_pharmacyCategoriseService.hasError) { + error = _pharmacyCategoriseService.error; + setState(ViewState.ErrorLocal); + } else + await getParentProducts(i: i); + await getBrands(); + } + + Future getParentProducts({String i}) async { + hasError = false; + // _insuranceCardService.clearInsuranceCard(); + setState(ViewState.Busy); + await _pharmacyCategoriseService.getParentProducts(id: i); + if (_pharmacyCategoriseService.hasError) { + error = _pharmacyCategoriseService.error; + setState(ViewState.ErrorLocal); + } else + setState(ViewState.Idle); + } + + Future getSubCategorise({String i}) async { + hasError = false; + // _insuranceCardService.clearInsuranceCard(); + setState(ViewState.Busy); + await _pharmacyCategoriseService.getSubCategorise(id: i); + if (_pharmacyCategoriseService.hasError) { + error = _pharmacyCategoriseService.error; + setState(ViewState.ErrorLocal); + } else + getSubProducts(i: i); + } + + Future getSubProducts({String i}) async { + hasError = false; + // _insuranceCardService.clearInsuranceCard(); + setState(ViewState.Busy); + await _pharmacyCategoriseService.getSubProducts(id: i); + if (_pharmacyCategoriseService.hasError) { + error = _pharmacyCategoriseService.error; + setState(ViewState.ErrorLocal); + } else + setState(ViewState.Idle); + } + + Future getFinalProducts({String i}) async { + hasError = false; + // _insuranceCardService.clearInsuranceCard(); + setState(ViewState.Busy); + await _pharmacyCategoriseService.getFinalProducts(id: i); + if (_pharmacyCategoriseService.hasError) { + error = _pharmacyCategoriseService.error; + setState(ViewState.ErrorLocal); + } else + setState(ViewState.Idle); + } +} diff --git a/lib/locator.dart b/lib/locator.dart index e65ead6d..cfdad053 100644 --- a/lib/locator.dart +++ b/lib/locator.dart @@ -51,12 +51,15 @@ import 'core/service/medical/prescriptions_service.dart'; import 'core/service/medical/radiology_service.dart'; import 'core/service/medical/reports_monthly_service.dart'; import 'core/service/medical/vital_sign_service.dart'; +import 'core/service/packages_offers/PackagesOffersServices.dart'; import 'core/service/parmacyModule/lacum-registration-service.dart'; import 'core/service/parmacyModule/lacum-service.dart'; import 'core/service/parmacyModule/lacum-transfer-service.dart'; import 'core/service/parmacyModule/order-preview-service.dart'; import 'core/service/notifications_service.dart'; import 'core/service/parmacyModule/terms-condition-service.dart'; +import 'core/service/privilege_service.dart'; +import 'core/service/weather_service.dart'; import 'core/viewModels/AlHabibMedicalService/cmc_view_model.dart'; import 'core/service/parmacyModule/parmacy_module_service.dart'; @@ -94,6 +97,7 @@ import 'core/viewModels/medical/vital_sign_view_model.dart'; import 'core/viewModels/medical/reports_view_model.dart'; import 'core/viewModels/medical/weight_pressure_view_model.dart'; import 'core/viewModels/notifications_view_model.dart'; +import 'core/viewModels/offers_Categorise_view_model.dart'; import 'core/viewModels/packages_offers/PackagesOffersViewModel.dart'; import 'core/viewModels/pharmacies_view_model.dart'; import 'core/service/pharmacies_service.dart'; @@ -107,6 +111,7 @@ import 'core/viewModels/pharmacyModule/wishlist_view_model.dart'; import 'core/viewModels/qr_view_model.dart'; import 'core/viewModels/vaccine_view_model.dart'; import 'core/service/vaccine_service.dart'; +import 'core/viewModels/weather/weather_view_model.dart'; import 'services/pharmacy_services/brands_service.dart'; import 'services/pharmacy_services/product_detail_service.dart'; import 'core/viewModels/pharmacyModule/OrderPreviewViewModel.dart'; @@ -197,6 +202,8 @@ void setupLocator() { locator.registerLazySingleton(() => CustomerAddressesService()); locator.registerLazySingleton(() => TermsConditionService()); locator.registerLazySingleton(() => CancelOrderService()); + locator.registerLazySingleton(() => PrivilegeService()); + locator.registerLazySingleton(() => WeatherService()); /// View Model locator.registerFactory(() => HospitalViewModel()); @@ -250,6 +257,7 @@ void setupLocator() { locator.registerFactory(() => ReviewViewModel()); locator.registerFactory(() => BrandsViewModel()); locator.registerFactory(() => ProductDetailViewModel()); + locator.registerFactory(() => WeatherViewModel()); locator.registerFactory(() => OrderPreviewViewModel()); @@ -257,6 +265,10 @@ void setupLocator() { locator.registerFactory(() => LacumTranferViewModel()); locator.registerFactory(() => LacumRegistrationViewModel()); + //pharmacy + locator.registerFactory(() => PharmacyCategoriseViewModel()); + locator.registerFactory(() => OffersCategoriseViewModel()); + // Offer And Packages //---------------------- locator.registerLazySingleton(() => OffersAndPackagesServices()); // offerPackagesServices Service diff --git a/lib/models/id-name-pair.dart b/lib/models/id-name-pair.dart new file mode 100644 index 00000000..00336572 --- /dev/null +++ b/lib/models/id-name-pair.dart @@ -0,0 +1,12 @@ +import 'package:flutter/material.dart'; + +class IdNamePair with ChangeNotifier{ + var id; + var name; + + IdNamePair(this.id, this.name); + + void updateData() { + notifyListeners(); + } +} \ No newline at end of file diff --git a/lib/pages/appUpdatePage/app_update_page.dart b/lib/pages/appUpdatePage/app_update_page.dart new file mode 100644 index 00000000..7bcf2388 --- /dev/null +++ b/lib/pages/appUpdatePage/app_update_page.dart @@ -0,0 +1,109 @@ +import 'dart:io'; + +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:url_launcher/url_launcher.dart'; + +class AppUpdatePage extends StatefulWidget { + String appUpdateText; + + AppUpdatePage({@required this.appUpdateText}); + + @override + _AppUpdatePageState createState() => _AppUpdatePageState(); +} + +class _AppUpdatePageState extends State { + @override + Widget build(BuildContext context) { + return AppScaffold( + appBarTitle: "App Update", + backgroundColor: Colors.white, + isShowAppBar: false, + isShowDecPage: false, + body: SingleChildScrollView( + child: Container( + child: Column( + children: [ + Stack( + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + SvgPicture.asset( + "assets/images/new-design/update_rocket_image.svg", + fit: BoxFit.fill), + ]), + Container( + margin: EdgeInsets.only(top: 40.0), + width: MediaQuery.of(context).size.width, + child: Text(TranslationBase.of(context).appUpdate, + textAlign: TextAlign.center, + style: TextStyle( + color: Color(0xff2d6c90).withOpacity(1.0), + fontSize: 22.0, + fontWeight: FontWeight.bold))), + ], + ), + Container( + margin: EdgeInsets.only(top: 5.0, bottom: 5.0), + child: SvgPicture.asset("assets/images/new-design/HMG_logo.svg", + fit: BoxFit.fill), + ), + Container( + margin: EdgeInsets.only(top: 10.0, left: 10.0, right: 10.0), + width: MediaQuery.of(context).size.width, + child: Text(widget.appUpdateText, + textAlign: TextAlign.center, + style: TextStyle( + color: Colors.grey[600], + fontSize: 16.0, + height: 1.5, + fontWeight: FontWeight.bold))), + Container( + margin: EdgeInsets.only(left: 20.0, right: 20.0, top: 20.0), + child: ButtonTheme( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10.0), + ), + minWidth: MediaQuery.of(context).size.width, + height: 45.0, + child: RaisedButton( + color: Colors.red[800], + textColor: Colors.white, + disabledTextColor: Colors.white, + disabledColor: new Color(0xFFbcc2c4), + onPressed: () { + openAppUpdateLink(); + }, + child: Text(TranslationBase.of(context).appUpdate, + style: TextStyle(fontSize: 18.0)), + ), + ), + ), + ], + ), + ), + ), + ); + } + + openAppUpdateLink() { + if (Platform.isAndroid) { + _launchURL("https://play.google.com/store/apps/details?id=com.ejada.hmg"); + } + if (Platform.isIOS) { + _launchURL("https://itunes.apple.com/app/id733503978"); + } + } + + _launchURL(String url) async { + if (await canLaunch(url)) { + await launch(url); + } else { + throw 'Could not launch $url'; + } + } +} diff --git a/lib/pages/final_products_page.dart b/lib/pages/final_products_page.dart new file mode 100644 index 00000000..03adee97 --- /dev/null +++ b/lib/pages/final_products_page.dart @@ -0,0 +1,480 @@ +import 'package:diplomaticquarterapp/core/viewModels/pharmacy_categorise_view_model.dart'; +import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; +import 'package:diplomaticquarterapp/widgets/others/StarRating.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_scaffold_pharmacy_widget.dart'; +import 'package:diplomaticquarterapp/widgets/others/network_base_view.dart'; +import 'package:flutter/material.dart'; + +import 'base/base_view.dart'; + +class FinalProductsPage extends StatefulWidget { + String id; + FinalProductsPage({this.id}); + @override + _FinalProductsPageState createState() => _FinalProductsPageState(id: id); +} + +class _FinalProductsPageState extends State { + String id; + _FinalProductsPageState({this.id}); + String categoriseName = "Personal Care"; + bool styleOne = true; + bool styleTwo = false; + Icon styleIcon = Icon( + Icons.widgets_sharp, + color: Colors.blue, + size: 29.0, + ); + @override + Widget build(BuildContext context) { + return BaseView( + onModelReady: (model) => model.getFinalProducts(i: id), + builder: (BuildContext context, PharmacyCategoriseViewModel model, + Widget child) => + PharmacyAppScaffold( + appBarTitle: 'Products', + isBottomBar: false, + isShowAppBar: true, + backgroundColor: Colors.white, + isShowDecPage: false, + baseViewModel: model, + body: Container( + height: MediaQuery.of(context).size.height * 5.87, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ +//Expanded widget heree if nassery + + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Padding( + padding: EdgeInsets.all(8.0), + child: Texts( + 'Products', + fontWeight: FontWeight.w600, + ), + ), + Row( + children: [ + Container( + height: 44.0, + child: VerticalDivider( + color: Colors.black45, + thickness: 1.0, + //width: 0.3, + // indent: 0.0, + ), + ), + Padding( + padding: EdgeInsets.all(8.0), + child: InkWell( + child: styleIcon, + onTap: () { + setState(() { + if (styleOne == true) { + styleOne = false; + styleTwo = true; + styleIcon = Icon( + Icons.auto_awesome_mosaic, + color: Colors.blue, + size: 29.0, + ); + } else { + styleOne = true; + styleTwo = false; + styleIcon = Icon( + Icons.widgets_sharp, + color: Colors.blue, + size: 29.0, + ); + } + }); + }, + ), + ), + ], + ), + ], + ), + Divider( + thickness: 1.0, + color: Colors.grey.shade400, + ), + styleOne == true + ? Expanded( + child: Container( + height: MediaQuery.of(context).size.height * 3.90, + child: GridView.builder( + gridDelegate: + SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 2, + crossAxisSpacing: 0.5, + mainAxisSpacing: 2.0, + childAspectRatio: 1.0, + ), + itemCount: model.finalProducts.length, + itemBuilder: (BuildContext context, int index) { + return NetworkBaseView( + baseViewModel: model, + child: Card( + color: model.finalProducts[index] + .discountName != + null + ? Color(0xffFFFF00) + : Colors.white, + elevation: 0, + shape: Border( + right: BorderSide( + color: Colors.grey.shade300, + width: 1, + ), + left: BorderSide( + color: Colors.grey.shade300, + width: 1, + ), + bottom: BorderSide( + color: Colors.grey.shade300, + width: 1, + ), + top: BorderSide( + color: Colors.grey.shade300, + width: 1, + ), + ), + margin: EdgeInsets.symmetric( + horizontal: 8, + vertical: 4, + ), + child: Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.only( + topLeft: Radius.circular(110.0), + ), + color: Colors.white, + ), + padding: EdgeInsets.symmetric( + horizontal: 0), + width: MediaQuery.of(context) + .size + .width / + 3, + child: Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + Stack( + children: [ + Container( + margin: EdgeInsets.fromLTRB( + 0, 16, 0, 0), + alignment: Alignment.center, + child: Image.network( + model.finalProducts[index] + .images.isNotEmpty + ? model + .finalProducts[ + index] + .images[0] + .thumb + : 'https://upload.wikimedia.org/wikipedia/commons/thumb/6/6c/No_image_3x4.svg/1200px-No_image_3x4.svg.png', + fit: BoxFit.cover, + height: 80, + ), + ), + Container( + width: model + .finalProducts[ + index] + .rxMessage != + null + ? MediaQuery.of(context) + .size + .width / + 2.8 + : 0, + padding: EdgeInsets.all(4), + decoration: BoxDecoration( + color: Color(0xffb23838), + borderRadius: + BorderRadius.only( + topLeft: Radius + .circular(6)), + ), + child: Texts( + model.finalProducts[index] + .rxMessage != + null + ? model + .finalProducts[ + index] + .rxMessage + : "", + color: Colors.white, + regular: true, + fontSize: 10, + fontWeight: + FontWeight.w600, + ), + ), + ], + ), + Container( + margin: EdgeInsets.symmetric( + horizontal: 6, + vertical: 0, + ), + child: Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + if (model + .finalProducts[ + index] + .discountName != + null) + Container( + width: double.infinity, + height: 13.0, + decoration: + BoxDecoration( + color: + Color(0xff5AB145), + ), + child: Center( + child: Texts( + model + .finalProducts[ + index] + .discountName, + regular: true, + color: Colors.white, + fontSize: 10.4, + ), + ), + ), + Texts( + model.finalProducts[index] + .name, + regular: true, + fontSize: 12, + fontWeight: + FontWeight.w400, + ), + Padding( + padding: + const EdgeInsets.only( + top: 4, + bottom: 4), + child: Texts( + "SAR ${model.finalProducts[index].price}", + bold: true, + fontSize: 14, + ), + ), + Row( + children: [ + StarRating( + totalAverage: model + .finalProducts[ + index] + .approvedRatingSum > + 0 + ? (model.finalProducts[index].approvedRatingSum + .toDouble() / + model + .finalProducts[index] + .approvedRatingSum + .toDouble()) + .toDouble() + : 0, + forceStars: true), + Texts( + "(${model.finalProducts[index].approvedTotalReviews})", + regular: true, + fontSize: 10, + fontWeight: + FontWeight.w400, + ) + ], + ), + ], + ), + ), + ], + ), + ), + )); + }, + ), + ), + ) + : Expanded( + child: Container( + height: MediaQuery.of(context).size.height * 5.0, + child: ListView.builder( + itemCount: model.finalProducts.length, + itemBuilder: + (BuildContext context, int index) { + return Card( + child: Row( + children: [ + Stack( + children: [ + Column( + children: [ + Container( + decoration: BoxDecoration(), + child: Padding( + padding: EdgeInsets.only( + left: 9.0, + top: 8.0, + right: 10.0, + ), + ), + ), + Container( + margin: EdgeInsets.fromLTRB( + 0, 0, 0, 0), + alignment: Alignment.center, + child: Image.network( + model.finalProducts[index] + .images.isNotEmpty + ? model + .finalProducts[ + index] + .images[0] + .thumb + : 'https://upload.wikimedia.org/wikipedia/commons/thumb/6/6c/No_image_3x4.svg/1200px-No_image_3x4.svg.png', + fit: BoxFit.contain, + height: 80, + ), + ), + ], + ), + Column( + children: [ + Container( + width: model + .finalProducts[ + index] + .rxMessage != + null + ? MediaQuery.of(context) + .size + .width / + 3.5 + : 0, + padding: EdgeInsets.all(4), + decoration: BoxDecoration( + color: Color(0xffb23838), + borderRadius: + BorderRadius.only( + topLeft: Radius + .circular(6)), + ), + child: Texts( + model.finalProducts[index] + .rxMessage != + null + ? model + .finalProducts[ + index] + .rxMessage + : "", + color: Colors.white, + regular: true, + fontSize: 10, + fontWeight: + FontWeight.w600, + ), + ), + ], + ), + ], + ), + Container( + height: 100.0, + margin: EdgeInsets.symmetric( + horizontal: 6, + vertical: 0, + ), + child: Column( + mainAxisAlignment: + MainAxisAlignment.spaceAround, + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + SizedBox( + height: 4.0, + ), + Container( + height: 35.0, + width: 250.0, + child: Texts( + model.finalProducts[index] + .name, + regular: true, + fontSize: 13.2, + fontWeight: FontWeight.w500, + maxLines: 2, + ), + ), + SizedBox( + height: 8.0, + ), + Padding( + padding: + const EdgeInsets.only( + top: 4, bottom: 4), + child: Texts( + "SAR ${model.finalProducts[index].price}", + bold: true, + fontSize: 14, + ), + ), + Row( + children: [ + StarRating( + totalAverage: model + .finalProducts[ + index] + .approvedRatingSum > + 0 + ? (model + .finalProducts[ + index] + .approvedRatingSum + .toDouble() / + model + .finalProducts[ + index] + .approvedRatingSum + .toDouble()) + .toDouble() + : 0, + forceStars: true), + Texts( + "(${model.finalProducts[index].approvedTotalReviews})", + regular: true, + fontSize: 10, + fontWeight: + FontWeight.w400, + ) + ], + ), + ], + ), + ), + ], + ), + ); + }), + ), + ) + ], + ), + ), + )); + } +} diff --git a/lib/pages/landing/home_page.dart b/lib/pages/landing/home_page.dart index 3d49d707..cd8a8a2d 100644 --- a/lib/pages/landing/home_page.dart +++ b/lib/pages/landing/home_page.dart @@ -22,6 +22,8 @@ import 'package:flutter_svg/flutter_svg.dart'; import 'package:hexcolor/hexcolor.dart'; import 'package:provider/provider.dart'; +import 'landing_page_pharmcy.dart'; + class HomePage extends StatefulWidget { final Function goToMyProfile; @@ -482,7 +484,7 @@ class _HomePageState extends State { ), if(projectViewModel.havePrivilege(65)) DashboardItem( - onTap: () => Navigator.push(context, FadePage(page: PharmacyPage())), + onTap: () => Navigator.push(context, FadePage(page: LandingPagePharmacy())), child: Center( child: Padding( diff --git a/lib/pages/offers_categorise_page.dart b/lib/pages/offers_categorise_page.dart new file mode 100644 index 00000000..782ea018 --- /dev/null +++ b/lib/pages/offers_categorise_page.dart @@ -0,0 +1,620 @@ +import 'package:diplomaticquarterapp/config/size_config.dart'; +import 'package:diplomaticquarterapp/core/viewModels/offers_Categorise_view_model.dart'; +import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; +import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; +import 'package:diplomaticquarterapp/widgets/others/StarRating.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_scaffold_pharmacy_widget.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; +import 'package:diplomaticquarterapp/widgets/others/network_base_view.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +import 'base/base_view.dart'; + +class OffersCategorisePage extends StatefulWidget { + @override + _OffersCategorisePageState createState() => _OffersCategorisePageState(); +} + +class _OffersCategorisePageState extends State { + String categoriseName = "Personal Care"; + bool styleOne = true; + bool styleTwo = false; + Icon styleIcon = Icon( + Icons.widgets_sharp, + color: Colors.blue, + size: 29.0, + ); + + @override + Widget build(BuildContext context) { + ProjectViewModel projectProvider = Provider.of(context); + return BaseView( + onModelReady: (model) => model.getOffersCategorise(), + builder: (BuildContext context, OffersCategoriseViewModel model, + Widget child) => + PharmacyAppScaffold( + appBarTitle: 'Offers', + isShowAppBar: true, + backgroundColor: Colors.white, + isShowDecPage: false, + baseViewModel: model, + body: Container( + //height: MediaQuery.of(context).size.height * 0.57, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: EdgeInsets.all(10.0), + child: Container( + child: Texts( + 'Categories', + fontWeight: FontWeight.w800, + ), + ), + ), + Divider( + thickness: 1.0, + color: Colors.grey.shade400, + ), + //Expanded widget heree if nassery + Container( + height: MediaQuery.of(context).size.height * 0.20, + child: ListView.builder( + scrollDirection: Axis.horizontal, + itemCount: model.categorise.length, + itemBuilder: (BuildContext context, int index) { + return Padding( + padding: EdgeInsets.all(8.0), + child: Row( + children: [ + InkWell( + child: Column( + children: [ + Container( + height: 60.0, + width: 65.0, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: Colors.orange.shade200 + .withOpacity(0.45), + ), + child: Icon( + Icons.apps_sharp, + size: 32.0, + ), + ), + Container( + width: MediaQuery.of(context) + .size + .width * + 0.2, + height: MediaQuery.of(context) + .size + .height * + 0.09, + child: Center( + child: Texts( + model.categorise[index].name, + fontWeight: FontWeight.w600, + fontSize: 13.8, + ), + ), + ), + ], + ), + onTap: () { + model.getOffersProducts( + i: model.categorise[index].id); + String ids = model.categorise[index].id; + + categoriseName = + model.categorise[index].name; + }), + ], + ), + ); + }), + ), + Divider( + thickness: 1.0, + color: Colors.grey.shade400, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Padding( + padding: EdgeInsets.all(8.0), + child: Texts( + categoriseName, + fontWeight: FontWeight.w800, + ), + ), + Row( + children: [ + Container( + height: 44.0, + child: VerticalDivider( + color: Colors.black45, + thickness: 0.7, + //width: 0.3, + // indent: 0.0, + ), + ), + Padding( + padding: EdgeInsets.all(8.0), + child: InkWell( + child: styleIcon, + onTap: () { + setState(() { + if (styleOne == true) { + styleOne = false; + styleTwo = true; + styleIcon = Icon( + Icons.auto_awesome_mosaic, + color: Colors.blue, + size: 29.0, + ); + } else { + styleOne = true; + styleTwo = false; + styleIcon = Icon( + Icons.widgets_sharp, + color: Colors.blue, + size: 29.0, + ); + } + }); + }, + ), + ), + ], + ), + ], + ), + Divider( + thickness: 1.0, + color: Colors.grey.shade400, + ), + styleOne == true + ? Expanded( + child: Container( + height: MediaQuery.of(context).size.height * 0.50, + child: GridView.builder( + gridDelegate: + SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 2, + crossAxisSpacing: 0.5, + mainAxisSpacing: 2.0, + childAspectRatio: 0.85, + ), + itemCount: model.products.length, + itemBuilder: (BuildContext context, int index) { + return NetworkBaseView( + baseViewModel: model, + child: Card( + color: model.products[index] + .discountName != + null + ? Color(0xffFFFF00) + : Colors.white, + elevation: 0, + shape: Border( + right: BorderSide( + color: Colors.grey.shade300, + width: 1, + ), + left: BorderSide( + color: Colors.grey.shade300, + width: 1, + ), + bottom: BorderSide( + color: Colors.grey.shade300, + width: 1, + ), + top: BorderSide( + color: Colors.grey.shade300, + width: 1, + ), + ), + margin: EdgeInsets.symmetric( + horizontal: 8, + vertical: 4, + ), + child: Container( + height: 250.0, + decoration: BoxDecoration( + borderRadius: BorderRadius.only( + topLeft: Radius.circular(110.0), + ), + color: Colors.white, + ), + padding: EdgeInsets.symmetric( + horizontal: 0), + width: MediaQuery.of(context) + .size + .width / + 3, + child: Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + Stack( + children: [ + if (model.products[index] + .discountName != + null) + RotatedBox( + quarterTurns: 4, + child: Container( + decoration: + BoxDecoration(), + child: Padding( + padding: + EdgeInsets.only( + right: 5.0, + top: 20.0, + bottom: 5.0, + ), + child: Texts( + 'offer' + .toUpperCase(), + color: Colors.red, + fontSize: 13.0, + fontWeight: + FontWeight.w900, + ), + ), + transform: new Matrix4 + .rotationZ( + 5.837200), + ), + ), + Container( + margin: EdgeInsets.fromLTRB( + 0, 16, 0, 0), + alignment: Alignment.center, + child: Image.network( + model.products[index] + .images.isNotEmpty + ? model + .products[index] + .images[0] + .thumb + : 'https://upload.wikimedia.org/wikipedia/commons/thumb/6/6c/No_image_3x4.svg/1200px-No_image_3x4.svg.png', + fit: BoxFit.cover, + height: 80, + ), + ), + Container( + width: model.products[index] + .rxMessage != + null + ? MediaQuery.of(context) + .size + .width / + 5 + : 0, + padding: EdgeInsets.all(4), + decoration: BoxDecoration( + color: Color(0xffb23838), + borderRadius: + BorderRadius.only( + topLeft: Radius + .circular(6)), + ), + child: Texts( + model.products[index] + .rxMessage != + null + ? model + .products[index] + .rxMessage + : "", + color: Colors.white, + regular: true, + fontSize: 10, + fontWeight: + FontWeight.w400, + ), + ), + ], + ), + Container( + margin: EdgeInsets.symmetric( + horizontal: 6, + vertical: 0, + ), + child: Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + if (model.products[index] + .discountName != + null) + Container( + width: double.infinity, + height: 22.0, + decoration: + BoxDecoration( + color: + Color(0xff5AB145), + ), + child: Center( + child: Texts( + model + .products[index] + .discountName, + regular: true, + color: Colors.white, + fontSize: 12.0, + fontWeight: + FontWeight.w700, + ), + ), + ), + Texts( + model + .products[index].name, + regular: true, + fontSize: 12.58, + fontWeight: + FontWeight.w600, + ), + Padding( + padding: + const EdgeInsets.only( + top: 4, + bottom: 4), + child: Texts( + "SAR ${model.products[index].price}", + bold: true, + fontSize: 14, + ), + ), + Row( + children: [ + StarRating( + totalAverage: model + .products[ + index] + .approvedRatingSum > + 0 + ? (model.products[index].approvedRatingSum + .toDouble() / + model + .products[index] + .approvedRatingSum + .toDouble()) + .toDouble() + : 0, + forceStars: true), + Texts( + "(${model.products[index].approvedTotalReviews})", + regular: true, + fontSize: 10, + fontWeight: + FontWeight.w400, + ) + ], + ), + ], + ), + ), + ], + ), + ), + )); + }, + ), + ), + ) + : Expanded( + child: Container( + child: ListView.builder( + itemCount: model.products.length, + itemBuilder: + (BuildContext context, int index) { + return Card( + // color: + // model.products[index].discountName != + // null + // ? Color(0xffFFFF00) + // : Colors.white, + child: Row( + children: [ + Stack( + children: [ + Column( + children: [ + if (model.products[index] + .discountName != + null) + Container( + decoration: + BoxDecoration(), + child: Padding( + padding: + EdgeInsets.only( + left: 9.0, + top: 8.0, + right: 10.0, + ), + child: Container( + color: Colors.yellow, + height: 25.0, + width: 70.0, + child: Center( + child: Texts( + 'offer' + .toUpperCase(), + color: Colors.red, + fontSize: 13.0, + fontWeight: + FontWeight + .w900, + ), + ), + ), + ), + transform: + new Matrix4.rotationZ( + 6.15099), + ), + Container( + margin: EdgeInsets.fromLTRB( + 0, 0, 0, 0), + alignment: Alignment.center, + child: Image.network( + model.products[index] + .images.isNotEmpty + ? model + .products[index] + .images[0] + .thumb + : 'https://upload.wikimedia.org/wikipedia/commons/thumb/6/6c/No_image_3x4.svg/1200px-No_image_3x4.svg.png', + fit: BoxFit.cover, + height: 80, + ), + ), + ], + ), + Column( + children: [ + Container( + width: model.products[index] + .rxMessage != + null + ? MediaQuery.of(context) + .size + .width / + 5 + : 0, + padding: EdgeInsets.all(4), + decoration: BoxDecoration( + color: Color(0xffb23838), + borderRadius: + BorderRadius.only( + topLeft: Radius + .circular(6)), + ), + child: Texts( + model.products[index] + .rxMessage != + null + ? model + .products[index] + .rxMessage + : "", + color: Colors.white, + regular: true, + fontSize: 10, + fontWeight: + FontWeight.w400, + ), + ), + ], + ), + ], + ), + Container( + margin: EdgeInsets.symmetric( + horizontal: 6, + vertical: 0, + ), + child: Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + if (model.products[index] + .discountName != + null) + Container( + width: 250.0, + height: 22.5, + decoration: BoxDecoration( + color: Color(0xff5AB145), + ), + child: Padding( + padding: + EdgeInsets.symmetric( + horizontal: 5.5, + ), + child: Texts( + model.products[index] + .discountName, + regular: true, + color: Colors.white, + fontSize: 12.0, + fontWeight: + FontWeight.w700, + ), + ), + ), + SizedBox( + height: 4.0, + ), + Texts( + model.products[index].name, + regular: true, + fontSize: 14.0, + fontWeight: FontWeight.w600, + ), + SizedBox( + height: 8.0, + ), + Padding( + padding: + const EdgeInsets.only( + top: 4, bottom: 4), + child: Texts( + "SAR ${model.products[index].price}", + bold: true, + fontSize: 14, + ), + ), + Row( + children: [ + StarRating( + totalAverage: model + .products[ + index] + .approvedRatingSum > + 0 + ? (model + .products[ + index] + .approvedRatingSum + .toDouble() / + model + .products[ + index] + .approvedRatingSum + .toDouble()) + .toDouble() + : 0, + forceStars: true), + Texts( + "(${model.products[index].approvedTotalReviews})", + regular: true, + fontSize: 10, + fontWeight: + FontWeight.w500, + ) + ], + ), + ], + ), + ), + ], + ), + ); + }), + ), + ) + ], + ), + ), + )); + } +} diff --git a/lib/pages/pharmacies/compare.dart b/lib/pages/pharmacies/compare.dart index ec2882f1..d1872187 100644 --- a/lib/pages/pharmacies/compare.dart +++ b/lib/pages/pharmacies/compare.dart @@ -8,8 +8,6 @@ import 'package:provider/provider.dart'; int counter = 0; -void main() => runApp(ComparePage()); - class ComparePage extends StatefulWidget { @override _ComparePageState createState() => _ComparePageState(); diff --git a/lib/pages/pharmacies/my_reviews.dart b/lib/pages/pharmacies/my_reviews.dart index 990d15a6..7b17a359 100644 --- a/lib/pages/pharmacies/my_reviews.dart +++ b/lib/pages/pharmacies/my_reviews.dart @@ -5,8 +5,6 @@ import 'package:rating_bar/rating_bar.dart'; import 'package:diplomaticquarterapp/pages/base/base_view.dart'; import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; -void main() => runApp(MyReviewsPage()); - class MyReviewsPage extends StatefulWidget { @override _MyReviewsPageState createState() => _MyReviewsPageState(); @@ -24,9 +22,10 @@ class _MyReviewsPageState extends State { return BaseView( onModelReady: (model) => model.getReviewData(), builder: (_, model, wi) => AppScaffold( - appBarTitle: 'Wishlist page', + appBarTitle: 'My Reviews', isShowAppBar: true, isPharmacy: true, + baseViewModel: model, body: model.reviewListList.length == 0 ? Container( child: Center( diff --git a/lib/pages/pharmacies/product-brands.dart b/lib/pages/pharmacies/product-brands.dart index bde53566..b9e6db95 100644 --- a/lib/pages/pharmacies/product-brands.dart +++ b/lib/pages/pharmacies/product-brands.dart @@ -10,8 +10,6 @@ import 'package:diplomaticquarterapp/pages/base/base_view.dart'; import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/brand_view_model.dart'; import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; -void main() => runApp(ProductBrandsPage()); - class ProductBrandsPage extends StatefulWidget { @override _ProductBrandsPageState createState() => _ProductBrandsPageState(); @@ -20,7 +18,9 @@ class ProductBrandsPage extends StatefulWidget { var languageID; class _ProductBrandsPageState extends State { + @override void initState() { + super.initState(); getLanguageID(); } diff --git a/lib/pages/pharmacies/screens/address-select-page.dart b/lib/pages/pharmacies/screens/address-select-page.dart new file mode 100644 index 00000000..6c39ba3f --- /dev/null +++ b/lib/pages/pharmacies/screens/address-select-page.dart @@ -0,0 +1,34 @@ +import 'package:diplomaticquarterapp/core/model/pharmacies/Addresses.dart'; +import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/OrderPreviewViewModel.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; +import 'package:flutter/material.dart'; + +class AddressSelectPageTest extends StatelessWidget { + final List addresses; + + AddressSelectPageTest(this.addresses); + + @override + Widget build(BuildContext context) { + return AppScaffold( + title: "test", + isShowAppBar: true, + isShowDecPage: false, + body: Column( + children: [ + Container( + child: RaisedButton( + onPressed: () => {Navigator.pop(context, addresses[0])}, + child: new Text( + "Set address", + style: new TextStyle(color: Colors.white, fontSize: 14), + ), + color: Colors.blueAccent, + disabledColor: Colors.blueAccent, + ), + ), + ], + ), + ); + } +} diff --git a/lib/pages/pharmacies/screens/cart-order-preview.dart b/lib/pages/pharmacies/screens/cart-order-preview.dart index f052c54e..b4736d7a 100644 --- a/lib/pages/pharmacies/screens/cart-order-preview.dart +++ b/lib/pages/pharmacies/screens/cart-order-preview.dart @@ -38,6 +38,7 @@ class OrderPreviewPage extends StatelessWidget { child: AppScaffold( title: "${TranslationBase.of(context).checkOut}", isShowAppBar: true, + isPharmacy: true, isShowDecPage: false, appBarWidget: appBarWidget, backgroundColor: Colors.white, diff --git a/lib/pages/pharmacies/screens/lacum-activitaion-vida-page.dart b/lib/pages/pharmacies/screens/lacum-activitaion-vida-page.dart new file mode 100644 index 00000000..fc1270c0 --- /dev/null +++ b/lib/pages/pharmacies/screens/lacum-activitaion-vida-page.dart @@ -0,0 +1,101 @@ +import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; +import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/lacum-registration-viewModel.dart'; +import 'package:diplomaticquarterapp/pages/base/base_view.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:diplomaticquarterapp/widgets/buttons/borderedButton.dart'; +import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; +import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; +import 'package:flutter/material.dart'; + +import 'lacum-registration-page.dart'; + +class LakumActivationVidaPage extends StatelessWidget { + TextEditingController _identificationNumberController = + new TextEditingController(); + + @override + Widget build(BuildContext context) { + final mediaQuery = MediaQuery.of(context); + + return BaseView( + builder: (_, model, wi) => AppScaffold( + title: "Acount Activation", + isShowAppBar: true, + isShowDecPage: false, + backgroundColor: Colors.white, + baseViewModel: model, + body: Container( + margin: EdgeInsets.symmetric(vertical: 16, horizontal: 12), + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Texts( + " This service allows you to activate your LAKUM account after registering through the Vida system. ", + fontSize: 14, + ), + Padding( + padding: const EdgeInsets.all(8.0), + child: TextField( + controller: _identificationNumberController, + decoration: new InputDecoration( + hintText: 'Enter Identification Number', + ), + style: TextStyle( + fontSize: 16, + color: Colors.grey.shade700, + ), + ), + ), + ], + ), + Container( + margin: EdgeInsets.only(top: 4), + child: BorderedButton( + TranslationBase.of(context).accountActivation, + backgroundColor: + _identificationNumberController.text != null && + _identificationNumberController.text != "" + ? Color(0xff60686b) + : Color(0xffb0b4b5), + textColor: Colors.white, + fontSize: 16, + hPadding: 8, + vPadding: 12, + handler: _identificationNumberController.text != null && + _identificationNumberController.text != "" + ? () { + model + .checkLacumAccountActivation( + _identificationNumberController.text) + .then((_) => { + if (model.state == ViewState.Idle) + { + Navigator.push( + context, + FadePage( + page: LakumRegistrationPage( + _identificationNumberController + .text))) + .then((status) => { + if (status == 200) + {Navigator.pop(context, "")} + // back to previous page + }) + } + }); + } + : null, + ), + ), + ], + ), + ), + ), + ); + } +} diff --git a/lib/pages/pharmacies/screens/lacum-registration-page.dart b/lib/pages/pharmacies/screens/lacum-registration-page.dart new file mode 100644 index 00000000..53b9705d --- /dev/null +++ b/lib/pages/pharmacies/screens/lacum-registration-page.dart @@ -0,0 +1,236 @@ +import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/lacum-registration-viewModel.dart'; +import 'package:diplomaticquarterapp/models/id-name-pair.dart'; +import 'package:diplomaticquarterapp/pages/base/base_view.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:diplomaticquarterapp/widgets/buttons/borderedButton.dart'; +import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; +import 'package:diplomaticquarterapp/widgets/dialogs/radio-group-dialog.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; +import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; +import 'package:flutter/material.dart'; + +import 'lakum-terms-conditions-page.dart'; + +class LakumRegistrationPage extends StatefulWidget { + final String patientIdentificationNo; + + LakumRegistrationPage(this.patientIdentificationNo); + + @override + _LakumRegistrationPageState createState() => _LakumRegistrationPageState(); +} + +class _LakumRegistrationPageState extends State { + final TextEditingController _firstNameController = TextEditingController(); + + final TextEditingController _lastNameController = TextEditingController(); + + final TextEditingController _mobileNumberController = TextEditingController(); + + List languages = List(); + + IdNamePair selectedLanguage; + + @override + Widget build(BuildContext context) { + final mediaQuery = MediaQuery.of(context); + PreferredSizeWidget appBarWidget = AppBarWidget("Lakum", null, true); + languages.clear(); + languages.add(IdNamePair(1, TranslationBase.of(context).arabic)); + languages.add(IdNamePair(2, TranslationBase.of(context).english)); + + bool canSubmit = _firstNameController.text != null && + _firstNameController.text != "" && + _lastNameController.text != null && + _lastNameController.text != "" && + _mobileNumberController.text != null && + _mobileNumberController.text != "" && + selectedLanguage != null; + + return BaseView( + builder: (_, model, wi) => AppScaffold( + title: "Register Lakum", + isShowAppBar: true, + isShowDecPage: false, + backgroundColor: Colors.white, + appBarWidget: appBarWidget, + baseViewModel: model, + body: Container( + width: double.infinity, + child: SingleChildScrollView( + child: SizedBox( + height: mediaQuery.size.height - + appBarWidget.preferredSize.height - + mediaQuery.padding.top, + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + mainAxisSize: MainAxisSize.max, + children: [ + Column( + children: [ + Image.asset( + "assets/images/pharmacy_module/lakum/lakum_card_front_bg.png", + fit: BoxFit.fill, + height: 150, + width: mediaQuery.size.width, + ), + Container( + margin: EdgeInsets.symmetric(horizontal: 8), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + height: 10, + ), + Texts( + TranslationBase.of(context).firstName, + fontSize: 13, + fontWeight: FontWeight.normal, + color: Color(0xff8a8a8a), + ), + TextField( + controller: _firstNameController, + style: TextStyle( + fontSize: 16, + color: Colors.black, + ), + ), + SizedBox( + height: 10, + ), + Texts( + TranslationBase.of(context).lastName, + fontSize: 13, + fontWeight: FontWeight.normal, + color: Color(0xff8a8a8a), + ), + TextField( + controller: _lastNameController, + style: TextStyle( + fontSize: 16, + color: Colors.black, + ), + ), + SizedBox( + height: 10, + ), + Texts( + TranslationBase.of(context).mobileNumber, + fontSize: 13, + fontWeight: FontWeight.normal, + color: Color(0xff8a8a8a), + ), + TextField( + controller: _mobileNumberController, + style: TextStyle( + fontSize: 16, + color: Colors.black, + ), + ), + SizedBox( + height: 10, + ), + Texts( + TranslationBase.of(context) + .prefferedLanguage, + fontSize: 13, + fontWeight: FontWeight.normal, + color: Color(0xff8a8a8a), + ), + InkWell( + onTap: () { + RadioGroupDialog dialog = + new RadioGroupDialog( + context: context, + title: TranslationBase.of(context) + .prefferedLanguage, + okText: + TranslationBase.of(context) + .confirm, + cancelText: + TranslationBase.of(context) + .cancel_nocaps, + list: languages, + okFunction: (selectedValue) { + setState(() { + selectedLanguage = + selectedValue; + }); + print( + "selectedLanguage = ${selectedValue.name}"); + }, + cancelFunction: () => {}); + showDialog( + barrierDismissible: false, + context: context, + builder: (BuildContext context) { + return dialog; + }, + ); + }, + child: TextField( + enabled: false, + decoration: InputDecoration( + suffixIcon: + Icon(Icons.arrow_drop_down), + hintText: selectedLanguage == null + ? "${TranslationBase.of(context).prefferedLanguage}" + : "${selectedLanguage.name}", + hintStyle: TextStyle( + fontSize: 16, + color: Colors.black, + )), + style: TextStyle( + fontSize: 16, + color: Colors.grey.shade700, + ), + ), + ), + ], + ), + ), + ], + ), + Container( + color: Colors.green, + margin: EdgeInsets.all(8), + child: BorderedButton( + TranslationBase.of(context).register, + backgroundColor: canSubmit + ? Color(0xff339933) + : Color(0xff99cc99), + textColor: Colors.white, + fontSize: 16, + hPadding: 8, + vPadding: 12, + handler: canSubmit + ? () { + Navigator.push( + context, + FadePage( + page: LakumTermsConditions( + widget + .patientIdentificationNo, + _firstNameController.text, + _lastNameController.text, + _mobileNumberController + .text, + selectedLanguage.id))) + .then((status) => { + if (status == 200) + {Navigator.pop(context, "")} + // back to previous page + }); + } + : null, + ), + ), + ], + ), + ), + ), + ), + )); + } +} diff --git a/lib/pages/pharmacies/screens/lacum-setting-page.dart b/lib/pages/pharmacies/screens/lacum-setting-page.dart new file mode 100644 index 00000000..91e4c965 --- /dev/null +++ b/lib/pages/pharmacies/screens/lacum-setting-page.dart @@ -0,0 +1,240 @@ +import 'package:diplomaticquarterapp/core/model/pharmacies/LacumAccountInformation.dart'; +import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/lacum-viewmodel.dart'; +import 'package:diplomaticquarterapp/pages/base/base_view.dart'; +import 'package:diplomaticquarterapp/pages/pharmacies/widgets/lacum-banner-widget.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:diplomaticquarterapp/widgets/buttons/borderedButton.dart'; +import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; +import 'package:flutter/material.dart'; + +class LakumSettingPage extends StatefulWidget { + final LacumAccountInformation lacumInformation; + final LacumAccountInformation lacumGroupInformation; + + LakumSettingPage(this.lacumInformation, this.lacumGroupInformation); + + @override + _LakumSettingPageState createState() => _LakumSettingPageState(); +} + +class _LakumSettingPageState extends State { + bool _lakumAccountActivated = false; + TextEditingController _nameController = new TextEditingController(); + TextEditingController _phoneController = new TextEditingController(); + + @override + void initState() { + _lakumAccountActivated = widget.lacumGroupInformation + .lakumInquiryInformationObjVersion.accountStatus == + "Active"; + super.initState(); + _nameController.text = widget.lacumGroupInformation.lakumInquiryInformationObjVersion.memberName; + _phoneController.text = widget.lacumGroupInformation.lakumInquiryInformationObjVersion.mobileNumber; + } + + @override + Widget build(BuildContext context) { + final mediaQuery = MediaQuery.of(context); + PreferredSizeWidget appBarWidget = AppBarWidget("Lakum", null, true); + + return BaseView( + onModelReady: (model) => model.setLakumData( + widget.lacumInformation, widget.lacumGroupInformation), + builder: (_, model, wi) => AppScaffold( + title: "Lakum", + isShowAppBar: true, + isShowDecPage: false, + backgroundColor: Colors.white, + appBarWidget: appBarWidget, + baseViewModel: model, + body: Container( + width: double.infinity, + child: SingleChildScrollView( + child: SizedBox( + height: mediaQuery.size.height - + appBarWidget.preferredSize.height - + mediaQuery.padding.top, + child: _buildSettingScreen(mediaQuery, model), + ), + ), + ), + ), + ); + } + + _buildSettingScreen(MediaQueryData mediaQuery, LacumViewModel model) { + bool canUpdate = (_nameController.text != "" && + _phoneController.text != "" && + (_nameController.text != widget.lacumGroupInformation.lakumInquiryInformationObjVersion.memberName || + _phoneController.text != widget.lacumGroupInformation.lakumInquiryInformationObjVersion.mobileNumber)); + + return Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + mainAxisSize: MainAxisSize.max, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Stack( + children: [ + Container( + height: mediaQuery.size.height * 0.15, + color: Colors.green, + ), + Column( + children: [ + SizedBox( + height: mediaQuery.size.height * 0.05, + ), + Container( + width: mediaQuery.size.width * 1, + child: LakumBannerWidget(model, mediaQuery, false)), + ], + ) + ], + ), + SizedBox( + height: 20, + ), + SizedBox( + height: 1, + width: double.infinity, + child: Container( + color: Color(0xffefefef), + ), + ), + Container( + margin: EdgeInsets.symmetric(horizontal: 16), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Texts( + "Activate LAKUM Account", + fontSize: 16, + fontWeight: FontWeight.normal, + color: Colors.black, + ), + Switch.adaptive( + activeColor: Color.fromRGBO(51, 153, 51, 1), + inactiveThumbColor: Colors.red, + activeTrackColor: Colors.grey, + inactiveTrackColor: Colors.grey, + value: _lakumAccountActivated, + onChanged: (val) { + if (_lakumAccountActivated) { + model.makeAccountDeactivate(); + } else { + model.makeAccountActivate(); + } + setState(() { + _lakumAccountActivated = val; + }); + }, + ), + ], + ), + ), + SizedBox( + height: 30, + ), + Container( + margin: EdgeInsets.symmetric(horizontal: 16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Texts( + TranslationBase.of(context).name, + fontSize: 13, + fontWeight: _lakumAccountActivated + ? FontWeight.bold + : FontWeight.normal, + color: Colors.grey.shade400, + ), + _lakumAccountActivated + ? TextField( + controller: _nameController, + enabled: _lakumAccountActivated ? true : false, + style: TextStyle( + fontSize: 16, + color: _lakumAccountActivated + ? Colors.black + : Colors.white38, + ), + ) + : Texts( + _nameController.text, + fontSize: 16, + color: Colors.grey.shade600, + ), + SizedBox( + height: 10, + ), + Texts( + TranslationBase.of(context).mobileNumber, + fontSize: 13, + fontWeight: _lakumAccountActivated + ? FontWeight.bold + : FontWeight.normal, + color: Colors.grey.shade400, + ), + _lakumAccountActivated + ? TextField( + controller: _phoneController, + enabled: _lakumAccountActivated ? true : false, + keyboardType: TextInputType.phone, + style: TextStyle( + fontSize: 16, + color: _lakumAccountActivated + ? Colors.black + : Colors.white38, + ), + ) + : Texts( + _phoneController.text, + fontSize: 16, + color: Colors.grey.shade600, + ), + ], + ), + ), + ], + ), + Container( + child: Column( + children: [ + SizedBox( + height: 2, + width: double.infinity, + child: Container( + color: Color(0xffefefef), + ), + ), + Container( + margin: EdgeInsets.all(8), + child: BorderedButton( + TranslationBase.of(context).save, + backgroundColor: + canUpdate ? Color(0xff60686b) : Color(0xffb0b4b5), + textColor: Colors.white, + fontSize: 16, + hPadding: 8, + vPadding: 12, + handler: canUpdate + ? () { + model.createLakumAccount(_nameController.text, _phoneController.text).then((status) => { + if (status == 200) {Navigator.pop(context, "")} + // back to previous page + }); + } + : null, + ), + ) + ], + ), + ), + ], + ); + } +} diff --git a/lib/pages/pharmacies/screens/lacum-transfer-page.dart b/lib/pages/pharmacies/screens/lacum-transfer-page.dart new file mode 100644 index 00000000..0671f80a --- /dev/null +++ b/lib/pages/pharmacies/screens/lacum-transfer-page.dart @@ -0,0 +1,317 @@ +import 'package:diplomaticquarterapp/core/model/pharmacies/LacumAccountInformation.dart'; +import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/lacum-trasnfer-viewModel.dart'; +import 'package:diplomaticquarterapp/pages/base/base_view.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:diplomaticquarterapp/widgets/buttons/borderedButton.dart'; +import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; +import 'package:flutter/material.dart'; + +class LacumTransferPage extends StatefulWidget { + final LacumAccountInformation lacumInformation; + final LacumAccountInformation lacumGroupInformation; + + LacumTransferPage(this.lacumInformation, this.lacumGroupInformation); + + @override + _LacumTransferPageState createState() => _LacumTransferPageState(); +} + +class _LacumTransferPageState extends State { + TextEditingController _beneficieryAccountController = + new TextEditingController(); + TextEditingController _transferPointsController = new TextEditingController(); + + @override + void initState() { + super.initState(); + _beneficieryAccountController.text = ""; + _transferPointsController.text = "0"; + } + + @override + Widget build(BuildContext context) { + final mediaQuery = MediaQuery.of(context); + PreferredSizeWidget appBarWidget = AppBarWidget("Lakum", null, true); + + return BaseView( + onModelReady: (model) => model.setLakumData( + widget.lacumInformation, widget.lacumGroupInformation), + builder: (_, model, wi) => AppScaffold( + title: "Lakum", + isShowAppBar: true, + isShowDecPage: false, + backgroundColor: Colors.white, + appBarWidget: appBarWidget, + baseViewModel: model, + body: Container( + width: double.infinity, + child: SingleChildScrollView( + child: SizedBox( + height: + mediaQuery.size.height - 58 - mediaQuery.padding.top, + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Column( + children: [ + Row( + children: [ + Container( + height: 100, + width: mediaQuery.size.width / 2 - 26, + padding: EdgeInsets.only( + top: 12, left: 8, right: 8, bottom: 4), + decoration: BoxDecoration( + shape: BoxShape.rectangle, + borderRadius: BorderRadius.circular(8), + border: Border.fromBorderSide(BorderSide( + color: Color(0xffe1e1e1), + width: 0.4, + )), + color: Color(0xff6294ed), + ), + child: Row( + crossAxisAlignment: + CrossAxisAlignment.start, + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Expanded( + child: Column( + children: [ + Container( + child: Texts( + "Point Balance", + fontSize: 14, + fontWeight: FontWeight.bold, + color: Colors.white, + ), + ), + ], + ), + ), + Expanded( + child: Container( + padding: EdgeInsets.symmetric( + vertical: 8), + child: Column( + mainAxisAlignment: + MainAxisAlignment.end, + crossAxisAlignment: + CrossAxisAlignment.end, + children: [ + Texts( + "0", + fontSize: 14, + fontWeight: FontWeight.bold, + color: Colors.white, + ), + ], + ), + ), + ) + ], + ), + ), + SizedBox( + width: 20, + ), + Container( + height: 100, + width: mediaQuery.size.width / 2 - 26, + padding: EdgeInsets.only( + top: 12, left: 8, right: 8, bottom: 4), + decoration: BoxDecoration( + shape: BoxShape.rectangle, + borderRadius: BorderRadius.circular(8), + border: Border.fromBorderSide(BorderSide( + color: Color(0xffe1e1e1), + width: 0.4, + )), + color: Color(0xff339933), + ), + child: Row( + crossAxisAlignment: + CrossAxisAlignment.start, + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Expanded( + child: Column( + children: [ + Container( + child: Texts( + "Riyal Balance", + fontSize: 14, + fontWeight: FontWeight.bold, + color: Colors.white, + ), + ), + ], + ), + ), + Expanded( + child: Container( + padding: EdgeInsets.symmetric( + vertical: 8), + child: Column( + mainAxisAlignment: + MainAxisAlignment.end, + crossAxisAlignment: + CrossAxisAlignment.end, + children: [ + Texts( + "0", + fontSize: 14, + fontWeight: FontWeight.bold, + color: Colors.white, + ), + ], + ), + ), + ) + ], + ), + ), + ], + ), + Container( + margin: EdgeInsets.only(top: 16), + child: TextField( + controller: _beneficieryAccountController, + decoration: new InputDecoration( + hintText: 'Enter Beneficiary Account No.', + ), + style: TextStyle( + fontSize: 16, + color: Colors.grey.shade700, + ), + ), + ), + Container( + margin: EdgeInsets.only(top: 4), + child: BorderedButton( + TranslationBase.of(context).checkBeneficiary, + backgroundColor: + _beneficieryAccountController.text != "" + ? Color(0xff60686b) + : Color(0xffb0b4b5), + textColor: Colors.white, + fontSize: 16, + hPadding: 8, + vPadding: 12, + handler: + _beneficieryAccountController.text != "" + ? () { + model.getLacumGroupDataBuAccountId( + _beneficieryAccountController + .text); + } + : null, + ), + ), + (model.lacumReceiverInformation != null && + model.lacumReceiverInformation + .lakumInquiryInformationObjVersion != + null) + ? Container( + margin: EdgeInsets.only(top: 8), + child: Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + Texts( + TranslationBase.of(context) + .beneficiaryName, + color: Colors.black, + ), + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 8), + child: TextField( + enabled: false, + decoration: new InputDecoration( + hintText: + "${model.lacumReceiverInformation.lakumInquiryInformationObjVersion.memberName}", + hintStyle: TextStyle( + fontSize: 16, + color: Colors.grey.shade600, + )), + style: TextStyle( + fontSize: 16, + color: Colors.grey.shade700, + ), + ), + ), + SizedBox( + height: 10, + width: double.infinity, + ), + Texts( + "Point's to Transfer :", + color: Colors.black, + ), + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 8), + child: TextField( + controller: + _transferPointsController, + decoration: new InputDecoration( + focusColor: Colors.green, + hintStyle: TextStyle( + fontSize: 16, + color: Colors.grey.shade600, + )), + style: TextStyle( + fontSize: 16, + color: Colors.grey.shade700, + ), + ), + ), + ], + ), + ) + : Container() + ], + ), + if (model.lacumReceiverInformation != null && + model.lacumReceiverInformation + .lakumInquiryInformationObjVersion != + null) + Container( + margin: EdgeInsets.all(8), + child: BorderedButton( + "LACUM TRANSFER", + backgroundColor: Color(0xff339933), + textColor: Colors.white, + fontSize: 18, + hPadding: 8, + radius: 12, + vPadding: 16, + fontWeight: FontWeight.w600, + handler: () { + model + .transferYaHalaLoyaltyPoints( + _transferPointsController.text) + .then((status) => { + if (status == 200) + {Navigator.pop(context, "")} + // back to previous page + }); + }, + ), + ) + ], + ), + ), + ), + ), + ), + )); + } +} diff --git a/lib/pages/pharmacies/screens/lakum-main-page.dart b/lib/pages/pharmacies/screens/lakum-main-page.dart new file mode 100644 index 00000000..adbb07c2 --- /dev/null +++ b/lib/pages/pharmacies/screens/lakum-main-page.dart @@ -0,0 +1,555 @@ +import 'package:diplomaticquarterapp/config/config.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacies/PointsAmountPerYear.dart'; +import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/lacum-viewmodel.dart'; +import 'package:diplomaticquarterapp/pages/base/base_view.dart'; +import 'package:diplomaticquarterapp/pages/pharmacies/screens/lacum-setting-page.dart'; +import 'package:diplomaticquarterapp/pages/pharmacies/screens/lacum-transfer-page.dart'; +import 'package:diplomaticquarterapp/pages/pharmacies/screens/lakum-points-year-page.dart'; +import 'package:diplomaticquarterapp/pages/pharmacies/widgets/lacum-banner-widget.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; +import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; +import 'package:flutter/material.dart'; + +import 'lacum-activitaion-vida-page.dart'; + +class LakumMainPage extends StatelessWidget { + @override + Widget build(BuildContext context) { + final mediaQuery = MediaQuery.of(context); + + return BaseView( + onModelReady: (model) => model.getLacumData(), + builder: (_, model, wi) => AppScaffold( + title: "Lakum", + isShowAppBar: true, + isPharmacy: true, + isShowDecPage: false, + backgroundColor: Colors.white, + baseViewModel: model, + appBarIcons: _buildAppBarICons(context, model), + // preferredSize: mediaQuery.size.height * 0.20, + body: Container( + width: double.infinity, + child: SingleChildScrollView( + child: (model.lacumGroupInformation != null && + model.lacumGroupInformation + .lakumInquiryInformationObjVersion != + null) + ? Column( + children: [ + Stack( + children: [ + Container( + height: mediaQuery.size.height * 0.15, + color: Colors.green, + ), + Column( + children: [ + SizedBox( + height: mediaQuery.size.height * 0.05, + ), + Container( + width: mediaQuery.size.width * 1, + child: LakumBannerWidget( + model, mediaQuery, true)), + ], + ) + ], + ), + SizedBox( + height: 20, + ), + LakumHomeButtons(mediaQuery, model), + SizedBox( + height: 20, + ), + Container( + height: 100, + margin: EdgeInsets.symmetric(horizontal: 16), + child: ListView( + scrollDirection: Axis.horizontal, + children: [ + LacumPointsWidget( + mediaQuery, + 1, + TranslationBase.of(context).balance, + model + .lacumGroupInformation + .lakumInquiryInformationObjVersion + .pointsBalanceAmount, + model + .lacumGroupInformation + .lakumInquiryInformationObjVersion + .pointsBalance, + null), + SizedBox( + width: 8, + ), + LacumPointsWidget( + mediaQuery, + 2, + TranslationBase.of(context).gained, + model + .lacumGroupInformation + .lakumInquiryInformationObjVersion + .pointsBalanceAmount, + model + .lacumGroupInformation + .lakumInquiryInformationObjVersion + .gainedPoints, + model + .lacumGroupInformation + .lakumInquiryInformationObjVersion + .gainedPointsAmountPerYear), + SizedBox( + width: 8, + ), + LacumPointsWidget( + mediaQuery, + 3, + TranslationBase.of(context).consumed, + model + .lacumGroupInformation + .lakumInquiryInformationObjVersion + .consumedPointsAmount != + null + ? int.parse(model + .lacumGroupInformation + .lakumInquiryInformationObjVersion + .consumedPointsAmount) + : 0, + model + .lacumGroupInformation + .lakumInquiryInformationObjVersion + .consumedPoints, + model + .lacumGroupInformation + .lakumInquiryInformationObjVersion + .consumedPointsAmountPerYear), + SizedBox( + width: 8, + ), + LacumPointsWidget( + mediaQuery, + 4, + TranslationBase.of(context).transferred, + 0, + model + .lacumGroupInformation + .lakumInquiryInformationObjVersion + .transferPoints, + model + .lacumGroupInformation + .lakumInquiryInformationObjVersion + .transferPointsAmountPerYear), + ], + ), + ), + SizedBox( + height: 20, + ), + SizedBox( + height: 8, + width: double.infinity, + child: Container( + color: Color(0xffefefef), + ), + ), + Container( + margin: EdgeInsets.symmetric( + vertical: 16, horizontal: 8), + child: Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Row( + children: [ + Image.asset( + "assets/images/pharmacy_module/lakum/expired_icon.png", + fit: BoxFit.fill, + width: 25, + height: 25, + ), + Padding( + padding: + EdgeInsets.symmetric(horizontal: 8), + child: Texts( + "Expired", + fontSize: 14, + ), + ) + ], + ), + Texts( + "${model.lacumGroupInformation.lakumInquiryInformationObjVersion.expiredPoints} Points", + fontWeight: FontWeight.bold, + fontSize: 14, + ), + ], + ), + ), + SizedBox( + height: 2, + width: double.infinity, + child: Container( + color: Color(0xffefefef), + ), + ), + Container( + margin: EdgeInsets.symmetric( + vertical: 16, horizontal: 8), + child: Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Row( + children: [ + Image.asset( + "assets/images/pharmacy_module/lakum/waiting_gained_icon.png", + fit: BoxFit.fill, + width: 20, + height: 25, + ), + Padding( + padding: + EdgeInsets.symmetric(horizontal: 8), + child: Texts( + "Waiting gained", + fontSize: 14, + ), + ) + ], + ), + Texts( + "${model.lacumGroupInformation.lakumInquiryInformationObjVersion.waitingPoints} Points", + fontWeight: FontWeight.bold, + fontSize: 14, + ), + ], + ), + ), + SizedBox( + height: 2, + width: double.infinity, + child: Container( + color: Color(0xffefefef), + ), + ), + Container( + margin: EdgeInsets.symmetric( + vertical: 16, horizontal: 8), + child: Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Row( + children: [ + Image.asset( + "assets/images/pharmacy_module/lakum/will_be_expired_icon.png", + fit: BoxFit.fill, + width: 25, + height: 25, + ), + Padding( + padding: + EdgeInsets.symmetric(horizontal: 8), + child: Texts( + "Will Be Expired", + fontSize: 14, + ), + ) + ], + ), + Texts( + "${model.lacumGroupInformation.lakumInquiryInformationObjVersion.pointsWillBeExpired} Points", + fontWeight: FontWeight.bold, + fontSize: 14, + ), + ], + ), + ), + SizedBox( + height: 2, + width: double.infinity, + child: Container( + color: Color(0xffefefef), + ), + ), + ], + ) + : Container(), + ), + ), + )); + } +} + +List _buildAppBarICons(BuildContext context, LacumViewModel model) { + return [ + IconButton( + icon: Icon(Icons.settings), + color: Colors.white, + onPressed: () { + Navigator.push( + context, + FadePage( + page: LakumSettingPage( + model.lacumInformation, model.lacumGroupInformation))) + .then((result) => {model.getLacumGroupData()}); + }, + ), + ]; +} + +class LakumHomeButtons extends StatelessWidget { + final MediaQueryData mediaQuery; + final LacumViewModel model; + + LakumHomeButtons(this.mediaQuery, this.model); + + @override + Widget build(BuildContext context) { + return Container( + margin: EdgeInsets.symmetric(horizontal: 16), + child: Row( + children: [ + Expanded( + child: InkWell( + onTap: () { + print("Account activate click"); + Navigator.push( + context, FadePage(page: LakumActivationVidaPage())) + .then((result) => {model.getLacumGroupData()}); + }, + child: Container( + padding: EdgeInsets.symmetric(horizontal: 8), + decoration: BoxDecoration( + shape: BoxShape.rectangle, + borderRadius: BorderRadius.circular(8), + border: Border.fromBorderSide(BorderSide( + color: Color(0xffe1e1e1), + width: 0.4, + )), + color: Color(0xffe1e1e1)), + height: mediaQuery.size.height * 0.08, + child: Row( + children: [ + Image.asset( + "assets/images/pharmacy_module/lakum/Account_activation_icon.png", + fit: BoxFit.fill, + width: 30, + height: 30, + ), + Expanded( + child: Container( + padding: EdgeInsets.symmetric(horizontal: 16), + child: Texts( + "Account Activation", + fontSize: 14, + fontWeight: FontWeight.bold, + ), + ), + ) + ], + ), + ), + ), + ), + SizedBox( + width: 8, + ), + Expanded( + child: InkWell( + onTap: () { + print("Lacum transfer click"); + Navigator.push( + context, + FadePage( + page: LacumTransferPage(model.lacumInformation, + model.lacumGroupInformation))) + .then((result) => {model.getLacumGroupData()}); + }, + child: Container( + padding: EdgeInsets.symmetric(horizontal: 8), + decoration: BoxDecoration( + shape: BoxShape.rectangle, + borderRadius: BorderRadius.circular(8), + border: Border.fromBorderSide(BorderSide( + color: Color(0xffe1e1e1), + width: 0.4, + )), + color: Color(0xffe1e1e1)), + height: mediaQuery.size.height * 0.08, + child: Row( + children: [ + Image.asset( + "assets/images/pharmacy_module/lakum/Lakum_transfer_icon.png", + fit: BoxFit.fill, + width: 35, + height: 30, + ), + Expanded( + child: Container( + padding: EdgeInsets.symmetric(horizontal: 16), + child: Texts( + "Lakum Transfer", + fontSize: 14, + fontWeight: FontWeight.bold, + ), + ), + ) + ], + ), + ), + ), + ), + ], + ), + ); + } +} + +class LacumPointsWidget extends StatelessWidget { + final MediaQueryData mediaQuery; + final int pointType; // 1. balance, 2. gained, 3. consume, 4. transfer + final String title; + final int riyal; + final int point; + Color titleColor; + final List pointsAmountPerYear; + + LacumPointsWidget(this.mediaQuery, this.pointType, this.title, this.riyal, + this.point, this.pointsAmountPerYear) { + if (pointType == 1) { + titleColor = Color(0xffefefef); + } else if (pointType == 2) { + titleColor = Color(0xff004bcc); + } else if (pointType == 3) { + titleColor = Color(0xff339933); + } else { + titleColor = Color(0xffffa500); + } + } + + @override + Widget build(BuildContext context) { + return InkWell( + onTap: () { + if (pointType != 1) { + if (pointsAmountPerYear != null && pointsAmountPerYear.length > 0) { + Navigator.push(context, + FadePage(page: LakumPointsYearPage(pointsAmountPerYear))); + } else { + // show snackBar No Details Points are there + } + } + }, + child: Container( + width: mediaQuery.size.width / 2 - 16, + padding: EdgeInsets.only(top: 12, left: 8, right: 8, bottom: 4), + decoration: BoxDecoration( + shape: BoxShape.rectangle, + borderRadius: BorderRadius.circular(8), + border: Border.fromBorderSide(BorderSide( + color: Color(0xffe1e1e1), + width: 0.4, + )), + color: pointType == 1 ? Color(0xff004bcc) : Color(0xffefefef), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded( + child: Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Container( + child: Texts( + title, + fontSize: 14, + fontWeight: FontWeight.bold, + color: titleColor, + ), + ), + if (pointType != 1) + Icon( + Icons.arrow_forward, + color: titleColor, + ) + ], + ), + ], + ), + ), + Expanded( + child: Row( + children: [ + if (pointType != 4) + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Texts( + "RIYAL", + fontSize: 13, + fontWeight: FontWeight.bold, + color: pointType == 1 ? Colors.white : Colors.black, + ), + SizedBox( + height: 4, + ), + Texts( + "$riyal", + fontSize: 13, + fontWeight: FontWeight.bold, + color: pointType == 1 ? Colors.white : Colors.black, + ), + ], + ), + ), + if (pointType != 4) + SizedBox( + child: Container( + color: pointType == 1 ? Colors.white : Colors.grey, + ), + width: 1, + ), + Expanded( + child: Container( + margin: EdgeInsets.only(left: 4), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Texts( + "POINT", + fontSize: 12, + fontWeight: FontWeight.bold, + color: pointType == 1 ? Colors.white : Colors.black, + ), + SizedBox( + height: 4, + ), + Texts( + "$point", + fontSize: 12, + fontWeight: FontWeight.bold, + color: pointType == 1 ? Colors.white : Colors.black, + ), + ], + ), + ), + ), + ], + ), + ) + ], + ), + ), + ); + } +} diff --git a/lib/pages/pharmacies/screens/lakum-points-month-page.dart b/lib/pages/pharmacies/screens/lakum-points-month-page.dart new file mode 100644 index 00000000..47270eee --- /dev/null +++ b/lib/pages/pharmacies/screens/lakum-points-month-page.dart @@ -0,0 +1,271 @@ +import 'package:diplomaticquarterapp/core/model/pharmacies/PointsAmountPerMonth.dart'; +import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/lacum-viewmodel.dart'; +import 'package:diplomaticquarterapp/pages/base/base_view.dart'; +import 'package:diplomaticquarterapp/pages/pharmacies/widgets/lakum-point-table-row-widget.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +class LakumPointMonthPage extends StatefulWidget { + final PointsAmountPerMonth pointsAmountPerMonth; + final int year; + int expandedItemIndex = -1; + + LakumPointMonthPage(this.pointsAmountPerMonth, this.year); + + @override + _LakumPointsMonthPageState createState() => _LakumPointsMonthPageState(); +} + +class _LakumPointsMonthPageState extends State { + @override + Widget build(BuildContext context) { + final mediaQuery = MediaQuery.of(context); + + return BaseView( + builder: (_, model, wi) => AppScaffold( + title: "Lakum points", + isShowAppBar: true, + isShowDecPage: false, + backgroundColor: Colors.white, + baseViewModel: model, + body: Container( + width: double.infinity, + child: SingleChildScrollView( + child: Column( + children: [ + Container( + height: mediaQuery.size.height * 0.25, + child: Stack( + children: [ + Image.asset( + "assets/images/pharmacy_module/lakum/lakum_card_front_bg.png", + fit: BoxFit.fill, + width: mediaQuery.size.width * 1.0, + ), + Column( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + Container( + height: mediaQuery.size.height * 0.06, + margin: EdgeInsets.symmetric( + vertical: 16, horizontal: 24), + child: Row( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Expanded( + child: Column( + mainAxisAlignment: MainAxisAlignment.end, + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + Texts( + TranslationBase.of(context).month, + color: Colors.grey.shade600, + fontSize: 16, + ), + Texts( + "${widget.pointsAmountPerMonth.month}, ${widget.year}", + color: Colors.grey.shade700, + fontWeight: FontWeight.bold, + fontSize: 16, + ), + ], + ), + ), + Expanded( + child: Row( + crossAxisAlignment: CrossAxisAlignment.end, + mainAxisAlignment: + MainAxisAlignment.spaceEvenly, + children: [ + Expanded( + child: Column( + mainAxisAlignment: + MainAxisAlignment.end, + crossAxisAlignment: + CrossAxisAlignment.center, + children: [ + Texts( + TranslationBase.of(context).point, + color: Colors.grey.shade600, + fontSize: 16, + ), + Texts( + "${widget.pointsAmountPerMonth.pointsPerMonth}", + color: Colors.grey.shade700, + fontWeight: FontWeight.bold, + fontSize: 16, + ), + ], + ), + ), + SizedBox( + child: Container( + color: Colors.grey, + ), + width: 1, + ), + Expanded( + child: Column( + mainAxisAlignment: + MainAxisAlignment.end, + crossAxisAlignment: + CrossAxisAlignment.center, + children: [ + Texts( + TranslationBase.of(context).riyal, + color: Colors.grey.shade600, + fontSize: 16, + ), + Texts( + "${widget.pointsAmountPerMonth.amountPerMonth}", + color: Colors.grey.shade700, + fontWeight: FontWeight.bold, + fontSize: 16, + ), + ], + ), + ), + ], + ), + ), + ], + ), + ), + ], + ), + ], + ), + ), + SizedBox( + height: 10, + ), + LakumPointTableRowWidget(true, "DAY", 0, 0, null, 0), + ...List.generate( + widget.pointsAmountPerMonth.pointsAmountPerday.length, + (index) => LakumPointTableRowWidget( + false, + widget.pointsAmountPerMonth.pointsAmountPerday[index].day, + widget.pointsAmountPerMonth.pointsAmountPerday[index] + .pointsPerDay, + widget.pointsAmountPerMonth.pointsAmountPerday[index] + .amountPerDay, + () { + setState(() { + if (widget.expandedItemIndex == index) { + widget.expandedItemIndex = -1; + } else { + widget.expandedItemIndex = index; + } + }); + }, + index, + expandFlag: widget.expandedItemIndex == index, + collapsed: Column( + children: [ + ...List.generate( + widget.pointsAmountPerMonth.pointsAmountPerday[index] + .pointsDetails.length, + (index) => DayPointsDetailWidget( + widget + .pointsAmountPerMonth + .pointsAmountPerday[index] + .pointsDetails[index] + .subTransactionTypeDescription, + widget + .pointsAmountPerMonth + .pointsAmountPerday[index] + .pointsDetails[index].purchasePoints, + widget + .pointsAmountPerMonth + .pointsAmountPerday[index] + .pointsDetails[index].amount), + ), + ], + ), + ), + ), + ], + ), + ), + ), + ), + ); + } +} + +class DayPointsDetailWidget extends StatelessWidget { + final String rowTitle; + final double points; + final double riyal; + + DayPointsDetailWidget(this.rowTitle, this.points, this.riyal); + + @override + Widget build(BuildContext context) { + return Container( + color: Color(0xffe4e4e4), + padding: EdgeInsets.symmetric(vertical: 0, horizontal: 12), + child: Column( + children: [ + Padding( + padding: const EdgeInsets.symmetric(vertical: 8), + child: Row( + children: [ + Expanded( + child: Container( + child: Column( + children: [ + Texts( + "TYPE", + fontSize: 12, + fontWeight: FontWeight.bold, + ), + SizedBox( + height: 4, + ), + Texts( + rowTitle, + fontSize: 14, + fontWeight: FontWeight.normal, + ), + ], + crossAxisAlignment: CrossAxisAlignment.start, + ), + )), + Expanded( + + child: Container( + child: Texts( + "$points", + fontSize: 14, + fontWeight: FontWeight.normal, + ), + )), + Expanded( + child: Container( + child: Texts( + "$riyal", + fontSize: 14, + fontWeight: FontWeight.normal, + ), + )), + Expanded(child: Container()), + ], + ), + ), + const Divider( + color: Color(0xFFD6D6D6), + height: 1, + thickness: 1, + indent: 0, + endIndent: 0, + ), + ], + ), + ); + } +} diff --git a/lib/pages/pharmacies/screens/lakum-points-year-page.dart b/lib/pages/pharmacies/screens/lakum-points-year-page.dart new file mode 100644 index 00000000..f7b6d9e6 --- /dev/null +++ b/lib/pages/pharmacies/screens/lakum-points-year-page.dart @@ -0,0 +1,201 @@ +import 'package:diplomaticquarterapp/core/model/pharmacies/PointsAmountPerYear.dart'; +import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/lacum-viewmodel.dart'; +import 'package:diplomaticquarterapp/pages/base/base_view.dart'; +import 'package:diplomaticquarterapp/pages/pharmacies/widgets/lakum-point-table-row-widget.dart'; +import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; +import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; +import 'package:flutter/material.dart'; + +import 'lakum-points-month-page.dart'; + +class LakumPointsYearPage extends StatefulWidget { + final List pointsAmountPerYear; + int selectedIndexYear = 0; + + LakumPointsYearPage(this.pointsAmountPerYear); + + @override + _LakumPointsYearPageState createState() => _LakumPointsYearPageState(); +} + +class _LakumPointsYearPageState extends State { + @override + Widget build(BuildContext context) { + final mediaQuery = MediaQuery.of(context); + + return BaseView( + builder: (_, model, wi) => AppScaffold( + title: "Lakum points", + isShowAppBar: true, + isShowDecPage: false, + backgroundColor: Colors.white, + baseViewModel: model, + body: Container( + width: double.infinity, + child: SingleChildScrollView( + child: Column( + children: [ + Container( + height: 100, + margin: EdgeInsets.symmetric(horizontal: 16, vertical: 16), + child: ListView( + scrollDirection: Axis.horizontal, + children: [ + ...List.generate( + widget.pointsAmountPerYear.length, + (index) => LacumPointsYearWidget( + mediaQuery, + widget.selectedIndexYear == index, + widget.pointsAmountPerYear[index], () { + setState(() { + widget.selectedIndexYear = index; + }); + })), + ], + ), + ), + SizedBox( + height: 0, + ), + LakumPointTableRowWidget(true, "MONTH", 0, 0, null, 0), + ...List.generate( + widget.pointsAmountPerYear[widget.selectedIndexYear] + .pointsAmountPerMonth.length, + (index) => LakumPointTableRowWidget( + false, + widget.pointsAmountPerYear[widget.selectedIndexYear] + .pointsAmountPerMonth[index].month, + widget.pointsAmountPerYear[widget.selectedIndexYear] + .pointsAmountPerMonth[index].pointsPerMonth, + widget.pointsAmountPerYear[widget.selectedIndexYear] + .pointsAmountPerMonth[index].amountPerMonth, + (){ + Navigator.push(context, + FadePage(page: LakumPointMonthPage(widget.pointsAmountPerYear[widget.selectedIndexYear] + .pointsAmountPerMonth[index], widget.pointsAmountPerYear[widget.selectedIndexYear].year))); + }, + index), + ), + ], + ), + ), + ), + ), + ); + } +} + +class LacumPointsYearWidget extends StatelessWidget { + final MediaQueryData mediaQuery; + final bool isSelected; + final PointsAmountPerYear yearPoints; + final Function yearOnTap; + + LacumPointsYearWidget( + this.mediaQuery, this.isSelected, this.yearPoints, this.yearOnTap); + + @override + Widget build(BuildContext context) { + return InkWell( + onTap: yearOnTap, + child: Container( + width: mediaQuery.size.width / 2 - 16, + padding: EdgeInsets.only(top: 12, left: 8, right: 8, bottom: 4), + decoration: BoxDecoration( + shape: BoxShape.rectangle, + borderRadius: BorderRadius.circular(8), + border: Border.fromBorderSide(BorderSide( + color: Color(0xffe1e1e1), + width: 0.4, + )), + color: isSelected ? Color(0xff004bcc) : Color(0xffefefef), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded( + child: Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Container( + child: Texts( + "YEAR: ${yearPoints.year}", + fontSize: 14, + fontWeight: FontWeight.bold, + color: isSelected ? Colors.white : Colors.black, + ), + ), + ], + ), + ], + ), + ), + Expanded( + child: Row( + children: [ + Expanded( + child: Container( + margin: EdgeInsets.only(left: 4), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Texts( + "POINT", + fontSize: 12, + fontWeight: FontWeight.bold, + color: isSelected ? Colors.white : Colors.black, + ), + SizedBox( + height: 4, + ), + Texts( + "${yearPoints.pointsPerYear}", + fontSize: 12, + fontWeight: FontWeight.bold, + color: isSelected ? Colors.white : Colors.black, + ), + ], + ), + ), + ), + SizedBox( + child: Container( + color: isSelected ? Colors.white : Colors.grey, + ), + width: 1, + ), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Texts( + "RIYAL", + fontSize: 13, + fontWeight: FontWeight.bold, + color: isSelected ? Colors.white : Colors.black, + ), + SizedBox( + height: 4, + ), + Texts( + "${yearPoints.amountPerYear}", + fontSize: 13, + fontWeight: FontWeight.bold, + color: isSelected ? Colors.white : Colors.black, + ), + ], + ), + ), + ], + ), + ), + ], + ), + ), + ); + } +} diff --git a/lib/pages/pharmacies/screens/lakum-terms-conditions-page.dart b/lib/pages/pharmacies/screens/lakum-terms-conditions-page.dart new file mode 100644 index 00000000..30c3bb6e --- /dev/null +++ b/lib/pages/pharmacies/screens/lakum-terms-conditions-page.dart @@ -0,0 +1,84 @@ +import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/lacum-registration-viewModel.dart'; +import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; +import 'package:diplomaticquarterapp/pages/base/base_view.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:diplomaticquarterapp/widgets/buttons/borderedButton.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_html/flutter_html.dart'; +import 'package:provider/provider.dart'; + +class LakumTermsConditions extends StatelessWidget { + final String firstName, lastName, mobileNo, identificationNo; + final int languageId; + + LakumTermsConditions(this.identificationNo, this.firstName, this.lastName, + this.mobileNo, this.languageId); + + @override + Widget build(BuildContext context) { + ProjectViewModel projectProvider = Provider.of(context); + + final mediaQuery = MediaQuery.of(context); + PreferredSizeWidget appBarWidget = AppBarWidget("Lakum", null, true); + double height = mediaQuery.size.height - + appBarWidget.preferredSize.height - + mediaQuery.padding.top; + + return BaseView( + onModelReady: (model) => model.getUserTermsAndConditionsForEPharmcy(), + builder: (_, model, wi) => AppScaffold( + appBarTitle: "Register Lakum", + isShowAppBar: true, + isShowDecPage: false, + backgroundColor: Colors.white, + baseViewModel: model, + appBarWidget: appBarWidget, + body: Container( + margin: EdgeInsets.all(8), + width: double.infinity, + child: Stack( + children: [ + SingleChildScrollView( + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + if (model.listUserAgreement != null && + model.listUserAgreement.userAgreementLAKUM != + null) + Html( + data: projectProvider.isArabic + ? model.listUserAgreement.userAgreementLAKUMn + : model.listUserAgreement.userAgreementLAKUM, + ), + ], + ), + ), + Align( + alignment: Alignment.bottomCenter, + child: Container( + height: 50, + margin: EdgeInsets.all(8), + child: BorderedButton( + TranslationBase.of(context).acceptLbl, + backgroundColor: Color(0xff60686b), + textColor: Colors.white, + fontSize: 16, + hPadding: 8, + vPadding: 12, + handler: () { + model.createNewLakumAccount("$firstName $lastName", mobileNo, identificationNo, languageId).then((status) => { + if (status == 200) {Navigator.pop(context, "")} + // back to previous page + }); + }, + ), + ), + ), + ], + ), + ), + )); + } +} diff --git a/lib/pages/pharmacies/screens/payment-method-select-page.dart b/lib/pages/pharmacies/screens/payment-method-select-page.dart new file mode 100644 index 00000000..8cdbaf3c --- /dev/null +++ b/lib/pages/pharmacies/screens/payment-method-select-page.dart @@ -0,0 +1,202 @@ +import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/OrderPreviewViewModel.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:diplomaticquarterapp/widgets/buttons/borderedButton.dart'; +import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; +import 'package:flutter/material.dart'; + +class PaymentMethodSelectPage extends StatefulWidget { + @override + _PaymentMethodSelectPageState createState() => + _PaymentMethodSelectPageState(); +} + +class _PaymentMethodSelectPageState extends State { + PaymentOption selectedPaymentOption; + + @override + Widget build(BuildContext context) { + Size screenSize = MediaQuery.of(context).size; + double cardWidth = screenSize.width / 2 - 32; + + return AppScaffold( + title: "Payment method", + isShowAppBar: true, + isShowDecPage: false, + body: Container( + width: double.infinity, + margin: EdgeInsets.symmetric(horizontal: 0, vertical: 16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Center( + child: Texts( + TranslationBase.of(context).selectPaymentOption, + fontSize: 20, + fontWeight: FontWeight.bold, + color: Colors.black, + ), + ), + Container( + margin: EdgeInsets.symmetric(horizontal: 0, vertical: 16), + child: Column( + children: [ + Row( + children: [ + PaymentMethodCard( + cardWidth, + selectedPaymentOption, + PaymentOption.meda, + () => { + setState(() { + selectedPaymentOption = PaymentOption.meda; + }) + }), + PaymentMethodCard( + cardWidth, + selectedPaymentOption, + PaymentOption.sadad, + () => { + setState(() { + selectedPaymentOption = PaymentOption.sadad; + }) + }), + ], + ), + Row( + children: [ + PaymentMethodCard( + cardWidth, + selectedPaymentOption, + PaymentOption.visa, + () => { + setState(() { + selectedPaymentOption = PaymentOption.visa; + }) + }), + PaymentMethodCard( + cardWidth, + selectedPaymentOption, + PaymentOption.mastercard, + () => { + setState(() { + selectedPaymentOption = + PaymentOption.mastercard; + }) + }), + ], + ), + PaymentMethodCard( + (cardWidth * 2 + 32), + selectedPaymentOption, + PaymentOption.installments, + () => { + setState(() { + selectedPaymentOption = + PaymentOption.installments; + }) + }), + ], + ), + ), + ], + ), + ), + bottomSheet: Container( + height: screenSize.height * 0.08, + margin: EdgeInsets.symmetric(horizontal: 16, vertical: 8), + child: BorderedButton( + TranslationBase.of(context).next, + backgroundColor: Color(0xff5AB154), + textColor: Colors.white, + fontSize: 16, + hPadding: 8, + vPadding: 12, + handler: selectedPaymentOption != null + ? () => {Navigator.pop(context, selectedPaymentOption)} + : null, + ), + ), + ); + } +} + +class PaymentMethodCard extends StatelessWidget { + final double cardWidth; + final PaymentOption selectedPaymentOption; + final PaymentOption paymentOption; + final Function selectMethod; + + PaymentMethodCard(this.cardWidth, this.selectedPaymentOption, + this.paymentOption, this.selectMethod); + + @override + Widget build(BuildContext context) { + bool isSelected = false; + if (selectedPaymentOption != null && + selectedPaymentOption == paymentOption) { + isSelected = true; + } + + return InkWell( + onTap: selectMethod, + child: Container( + margin: EdgeInsets.symmetric(horizontal: 2, vertical: 0), + child: Stack( + children: [ + Container( + padding: EdgeInsets.symmetric(horizontal: 8, vertical: 8), + margin: EdgeInsets.symmetric(horizontal: 14, vertical: 8), + decoration: new BoxDecoration( + color: Colors.grey.shade100, + shape: BoxShape.rectangle, + borderRadius: BorderRadius.circular(8), + border: Border.fromBorderSide(BorderSide( + color: isSelected ? Color(0xff20BC11) : Colors.grey.shade300, + width: 0.8, + )), + ), + width: cardWidth, + child: Image.asset( + getPaymentOptionImage(paymentOption), + fit: BoxFit.cover, + ), + ), + if (isSelected) + Positioned( + right: 1, + child: Icon( + Icons.check_circle, + color: Color(0xff20BC11), + size: 30, + ), + ), + ], + ), + ), + ); + } + + String getPaymentOptionImage(PaymentOption paymentOption) { + String assetFile = "assets/images/pharmacy_module/payment/"; + switch (paymentOption.index) { + case 0: + return "${assetFile}mada.png"; + break; + case 1: + return "${assetFile}sadad.png"; + break; + case 2: + return "${assetFile}visa.png"; + break; + case 3: + return "${assetFile}mastercard.png"; + break; + case 4: + return "${assetFile}installment.png"; + break; + default: + return ""; + } + } +} diff --git a/lib/pages/pharmacies/screens/pharmacy-terms-conditions-page.dart b/lib/pages/pharmacies/screens/pharmacy-terms-conditions-page.dart new file mode 100644 index 00000000..87c1b97c --- /dev/null +++ b/lib/pages/pharmacies/screens/pharmacy-terms-conditions-page.dart @@ -0,0 +1,51 @@ +import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/tems-condition-viewmodel.dart'; +import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; +import 'package:diplomaticquarterapp/pages/base/base_view.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:diplomaticquarterapp/widgets/buttons/borderedButton.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_html/flutter_html.dart'; +import 'package:provider/provider.dart'; + +class PharmacyTermsConditions extends StatelessWidget { + @override + Widget build(BuildContext context) { + ProjectViewModel projectProvider = Provider.of(context); + + return BaseView( + onModelReady: (model) => model.getUserTermsAndConditionsForEPharmcy(), + builder: (_, model, wi) => AppScaffold( + appBarTitle: TranslationBase.of(context).termOfService, + isShowAppBar: true, + isShowDecPage: false, + isPharmacy: true, + backgroundColor: Colors.white, + baseViewModel: model, + body: Container( + margin: EdgeInsets.all(8), + width: double.infinity, + child: Stack( + children: [ + SingleChildScrollView( + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + if (model.listUserAgreement != null && + model.listUserAgreement.userAgreementLAKUM != + null) + Html( + data: projectProvider.isArabic + ? model.listUserAgreement.userAgreementTxtn + : model.listUserAgreement.userAgreementTxt, + ), + ], + ), + ), + ], + ), + ), + )); + } +} diff --git a/lib/pages/pharmacies/screens/pharmacy_module_page.dart b/lib/pages/pharmacies/screens/pharmacy_module_page.dart index 2710c998..fd51d6ef 100644 --- a/lib/pages/pharmacies/screens/pharmacy_module_page.dart +++ b/lib/pages/pharmacies/screens/pharmacy_module_page.dart @@ -54,7 +54,7 @@ class PharmacyPage extends StatelessWidget { vPadding: 6, hPadding: 4, borderColor: Colors.green, - color: Colors.green, + textColor: Colors.green, handler: () =>{ Navigator.push(context,FadePage(page: ProductBrandsPage())), }, @@ -119,7 +119,9 @@ class PharmacyPage extends StatelessWidget { textColor: Colors.green, vPadding: 6, hPadding: 4, - handler: () {}, + handler: () =>{ + Navigator.push(context,FadePage(page: ProductBrandsPage())), + }, ), ], ), @@ -178,15 +180,15 @@ class GridViewButtons extends StatelessWidget { hasColorFilter: false, child: GridViewCard(TranslationBase.of(context).medicationRefill, 'assets/images/pharmacy_module/medication_icon.png', () { - model.checkUserIsActivated().then((isActivated) { - if (isActivated) { - Navigator.push(context, FadePage(page: LakumMainPage())); - } else { - Navigator.push( - context, FadePage(page: LakumActivationVidaPage())); - } - }); - }), + model.checkUserIsActivated().then((isActivated) { + if (isActivated) { + Navigator.push(context, FadePage(page: LakumMainPage())); + } else { + Navigator.push( + context, FadePage(page: LakumActivationVidaPage())); + } + }); + }), ), DashboardItem( imageName: 'pharmacy_module/bg_3.png', @@ -204,7 +206,7 @@ class GridViewButtons extends StatelessWidget { child: GridViewCard( TranslationBase.of(context).searchAndScanMedication, 'assets/images/pharmacy_module/search_scan_icon.png', - () {}), + () {}), ), ], ), diff --git a/lib/pages/pharmacies/widgets/ProductOrderItem.dart b/lib/pages/pharmacies/widgets/ProductOrderItem.dart index 81b6068a..92e2c39d 100644 --- a/lib/pages/pharmacies/widgets/ProductOrderItem.dart +++ b/lib/pages/pharmacies/widgets/ProductOrderItem.dart @@ -1,13 +1,239 @@ +import 'package:diplomaticquarterapp/core/model/pharmacies/ShoppingCart.dart'; +import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; +import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class ProductOrderItem extends StatefulWidget { + final ShoppingCart item; + final VoidCallback changeCartItems; + final VoidCallback deleteCartItems; + + ProductOrderItem(this.item, this.changeCartItems, this.deleteCartItems); + + @override + _ProductOrderItemState createState() => _ProductOrderItemState(); +} + +class _ProductOrderItemState extends State { + TextEditingController _quantityController = new TextEditingController(); + String _totalPrice = "0"; + + @override + void initState() { + _quantityController.text = "${widget.item.quantity}"; + _totalPrice = + "${(widget.item.product.price * widget.item.quantity).toStringAsFixed(2)}"; + super.initState(); + } -class ProductOrderItem extends StatelessWidget { @override Widget build(BuildContext context) { - return ListTile( - leading: Icon( - Icons.delete_outline_sharp, - color: Colors.grey.shade800, - ), + ProjectViewModel projectProvider = Provider.of(context); + + return Column( + children: [ + ListTile( + leading: InkWell( + onTap: () => {widget.deleteCartItems()}, + child: Icon( + Icons.delete_outline_sharp, + color: Colors.grey.shade700, + ), + ), + title: Container( + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.max, + children: [ + (widget.item.product.images != null && widget.item.product.images.length > 0) + ? Image.network( + widget.item.product.images[0].src, + fit: BoxFit.cover, + height: 80, + ) + : Image.asset( + "assets/images/no_image.png", + fit: BoxFit.cover, + height: 80, + ), + Expanded( + child: Container( + margin: + const EdgeInsets.symmetric(vertical: 8, horizontal: 8), + child: Container( + child: Column( + mainAxisSize: MainAxisSize.max, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + child: Texts( + projectProvider.isArabic + ? widget.item.product.namen + : widget.item.product.name, + regular: true, + textAlign: TextAlign.justify, + fontSize: 12, + fontWeight: FontWeight.w400, + ), + margin: const EdgeInsets.only(bottom: 4), + ), + Container( + child: Texts( + "${(widget.item.product.price).toStringAsFixed(2)} ${projectProvider.isArabic ? widget.item.currencyn : widget.item.currency}", + fontSize: 14, + fontWeight: FontWeight.bold, + ), + margin: const EdgeInsets.only(bottom: 4), + ), + Row( + children: [ + InkWell( + onTap: () => + {_quantityOnChangeClick(Operation.dec)}, + child: Container( + width: 25, + height: 25, + child: Center( + child: Texts( + "-", + color: Colors.grey.shade400, + )), + decoration: BoxDecoration( + border: Border.all( + color: Colors.grey.shade400, + width: 1.0, + ), + ), + ), + ), + Container( + margin: + const EdgeInsets.symmetric(horizontal: 4), + width: 25, + height: 25, + color: Colors.grey.shade300, + child: Center( + child: TextField( + cursorColor: Colors.black, + keyboardType: TextInputType.number, + controller: _quantityController, + textAlign: TextAlign.center, + onChanged: (text) { + setState(() { + var value = int.tryParse(text); + if (value == null) { + widget.item.quantity = 0; + } else { + widget.item.quantity = int.parse(text); + } + _totalPrice = + "${(widget.item.product.price * widget.item.quantity).toStringAsFixed(2)}"; + }); + }, + )), + ), + InkWell( + onTap: () => + {_quantityOnChangeClick(Operation.inc)}, + child: Container( + width: 25, + height: 25, + child: Center( + child: Texts( + "+", + color: Colors.grey.shade400, + )), + decoration: BoxDecoration( + border: Border.all( + color: Colors.grey.shade400, + width: 1.0, + ), + ), + ), + ), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Texts( + TranslationBase.of(context).total, + color: Colors.grey.shade500, + fontWeight: FontWeight.bold, + fontSize: 12, + ), + Texts( + "$_totalPrice ${projectProvider.isArabic ? widget.item.currencyn : widget.item.currency}", + fontSize: 12, + fontWeight: FontWeight.bold, + ) + ], + ), + ) + ], + ) + ], + ), + ), + ), + ) + ], + ), + ), + ), + const Divider( + color: Color(0xFFD6D6D6), + height: 15, + thickness: 1, + indent: 0, + endIndent: 0, + ), + ], ); } + + _quantityOnChangeClick(Operation operation) { + int newValue = 0; + setState(() { + switch (operation) { + case Operation.inc: + { + newValue = widget.item.quantity + 1; + } + break; + + case Operation.dec: + { + newValue = widget.item.quantity - 1; + } + break; + default: + { + //statements; + } + break; + } + if (newValue > 0) { + widget.item.quantity = newValue; + _quantityController.text = "${widget.item.quantity}"; + _totalPrice = + "${(widget.item.product.price * widget.item.quantity).toStringAsFixed(2)}"; + } + }); + if (newValue > 0) { + widget.changeCartItems(); + } + } + + @override + void dispose() { + // Clean up the controller when the widget is removed from the + // widget tree. + _quantityController.dispose(); + super.dispose(); + } } + +enum Operation { inc, dec } diff --git a/lib/pages/pharmacies/widgets/ProductOrderPreviewItem.dart b/lib/pages/pharmacies/widgets/ProductOrderPreviewItem.dart new file mode 100644 index 00000000..d38f437c --- /dev/null +++ b/lib/pages/pharmacies/widgets/ProductOrderPreviewItem.dart @@ -0,0 +1,111 @@ +import 'package:diplomaticquarterapp/core/model/pharmacies/ShoppingCart.dart'; +import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class ProductOrderPreviewItem extends StatelessWidget { + final ShoppingCart item; + + ProductOrderPreviewItem(this.item); + + @override + Widget build(BuildContext context) { + ProjectViewModel projectProvider = Provider.of(context); + + return Container( + margin: EdgeInsets.only(top: 16), + child: Column( + children: [ + Row( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.max, + children: [ + (item.product.images != null && item.product.images.length > 0) + ? Image.network( + item.product.images[0].src, + fit: BoxFit.cover, + height: 80, + ) + : Image.asset( + "assets/images/no_image.png", + fit: BoxFit.cover, + height: 80, + ), + Expanded( + child: Container( + margin: const EdgeInsets.symmetric(vertical: 8, horizontal: 8), + child: Container( + child: Column( + mainAxisSize: MainAxisSize.max, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + child: Texts( + projectProvider.isArabic + ? item.product.namen + : item.product.name, + regular: true, + textAlign: TextAlign.justify, + fontSize: 12, + fontWeight: FontWeight.w400, + ), + margin: const EdgeInsets.only(bottom: 4), + ), + Container( + child: Texts( + "${(item.product.price).toStringAsFixed(2)} ${projectProvider.isArabic ? item.currencyn : item.currency}", + fontSize: 14, + fontWeight: FontWeight.bold, + ), + margin: const EdgeInsets.only(bottom: 4), + ), + Container( + width: double.infinity, + alignment: Alignment.centerRight, + child: Texts( + TranslationBase.of(context).total, + color: Colors.grey.shade700, + fontWeight: FontWeight.bold, + fontSize: 13, + ), + ), + Row( + children: [ + Texts( + "QTY: ${item.quantity}", + color: Colors.grey.shade500, + fontWeight: FontWeight.bold, + fontSize: 12, + ), + Expanded( + child: Container( + alignment: Alignment.centerRight, + child: Texts( + "${(item.product.price * item.quantity).toStringAsFixed(2)} ${projectProvider.isArabic ? item.currencyn : item.currency}", + fontSize: 14, + fontWeight: FontWeight.bold, + ), + ), + ) + ], + ), + ], + ), + ), + )), + ], + ), + const Divider( + color: Color(0xFFD6D6D6), + height: 0, + thickness: 1, + indent: 0, + endIndent: 0, + ), + ], + ), + ); + } +} diff --git a/lib/pages/pharmacies/widgets/ProductTileItem.dart b/lib/pages/pharmacies/widgets/ProductTileItem.dart index 89667db6..20d6b730 100644 --- a/lib/pages/pharmacies/widgets/ProductTileItem.dart +++ b/lib/pages/pharmacies/widgets/ProductTileItem.dart @@ -70,11 +70,17 @@ class ProductTileItem extends StatelessWidget { Container( margin: EdgeInsets.fromLTRB(0, 16, 0, 0), alignment: Alignment.center, - child: Image.network( - item.images[0].src, - fit: BoxFit.cover, - height: 80, - ), + child: (item.images != null && item.images.length > 0) + ? Image.network( + item.images[0].src, + fit: BoxFit.cover, + height: 80, + ) + : Image.asset( + "assets/images/no_image.png", + fit: BoxFit.cover, + height: 80, + ), ), Container( width: item.rxMessage != null @@ -105,7 +111,7 @@ class ProductTileItem extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Texts( - projectProvider.isArabic ? item.name : item.namen, + projectProvider.isArabic ? item.namen : item.name, regular: true, fontSize: 12, fontWeight: FontWeight.w400, @@ -120,19 +126,21 @@ class ProductTileItem extends StatelessWidget { ), Row( children: [ - StarRating( - totalAverage: item.approvedTotalReviews > 0 - ? (item.approvedRatingSum.toDouble() / - item.approvedTotalReviews.toDouble()) - .toDouble() - : 0, - forceStars: true), - Texts( + Expanded( + child: StarRating( + totalAverage: item.approvedTotalReviews > 0 + ? (item.approvedRatingSum.toDouble() / + item.approvedTotalReviews.toDouble()) + .toDouble() + : 0, + forceStars: true), + ), + /*Texts( "(${item.approvedTotalReviews})", regular: true, fontSize: 10, fontWeight: FontWeight.w400, - ) + ),*/ ], ), ], diff --git a/lib/pages/pharmacies/widgets/lacum-banner-widget.dart b/lib/pages/pharmacies/widgets/lacum-banner-widget.dart new file mode 100644 index 00000000..14a53e72 --- /dev/null +++ b/lib/pages/pharmacies/widgets/lacum-banner-widget.dart @@ -0,0 +1,289 @@ +import 'package:carousel_slider/carousel_slider.dart'; +import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/lacum-viewmodel.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:diplomaticquarterapp/widgets/buttons/borderedButton.dart'; +import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; +import 'package:flutter/material.dart'; + +class LakumBannerWidget extends StatefulWidget { + final LacumViewModel model; + final MediaQueryData mediaQuery; + final bool isLacumHomePage; + + LakumBannerWidget(this.model, this.mediaQuery, this.isLacumHomePage); + + @override + _LakumBannerWidgetState createState() => _LakumBannerWidgetState(); +} + +class _LakumBannerWidgetState extends State { + int _current = 0; + + @override + Widget build(BuildContext context) { + return Container( + child: Stack( + children: [ + CarouselSlider( + options: CarouselOptions( + enableInfiniteScroll: false, + enlargeCenterPage: false, + viewportFraction: 1.0, + scrollPhysics: widget.isLacumHomePage + ? ScrollPhysics() + : NeverScrollableScrollPhysics(), + initialPage: 0, + onPageChanged: (index, reason) { + setState(() { + _current = index; + }); + }, + ), + items: [ + Container( + decoration: BoxDecoration( + shape: BoxShape.rectangle, + borderRadius: BorderRadius.circular(4), + border: Border.fromBorderSide(BorderSide( + color: Colors.grey, + width: 0.4, + )), + ), + margin: EdgeInsets.symmetric(horizontal: 16), + child: Stack( + children: [ + Image.asset( + "assets/images/pharmacy_module/lakum/lakum_card_front_bg.png", + fit: BoxFit.fill, + width: widget.mediaQuery.size.width * 1.0, + height: widget.mediaQuery.size.width * 1.0, + ), + Container( + margin: EdgeInsets.fromLTRB(12, 70, 12, 4), + child: Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Texts( + widget.model.lacumGroupInformation.lakumInquiryInformationObjVersion.memberName, + fontSize: 14, + fontWeight: FontWeight.bold, + color: Colors.black, + ), + Texts( + "${widget.model.lacumInformation.yahalaAccountNo}", + fontSize: 16, + fontWeight: FontWeight.normal, + color: Colors.black, + ), + ], + ), + BorderedButton( + widget.model.lacumGroupInformation.lakumInquiryInformationObjVersion.accountStatus == "Active" + ? TranslationBase.of(context).active + : TranslationBase.of(context).inactive, + textColor: widget.model.lacumInformation + .accountStatus == + 1 + ? Colors.green + : Colors.red, + hasBorder: true, + borderColor: widget.model.lacumInformation + .accountStatus == + 1 + ? Colors.green + : Colors.red, + radius: 16, + rPadding: 16, + icon: widget.model.lacumInformation + .accountStatus == + 1 + ? Icon( + Icons.check_circle, + size: 25, + color: Colors.green, + ) + : Image.asset( + "assets/images/pharmacy_module/lakum/inactive_cross.png", + fit: BoxFit.fill, + width: 25, + height: 25, + ), + ), + ], + ), + SizedBox( + height: 10, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Texts( + "IDENTIFICATION #", + fontSize: 14, + fontWeight: FontWeight.bold, + color: Colors.black, + ), + Texts( + widget.model.lacumInformation + .identificationNo, + fontSize: 16, + fontWeight: FontWeight.normal, + color: Colors.black, + ), + ], + ), + Column( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Texts( + "MEMBER SINCE", + fontSize: 14, + fontWeight: FontWeight.bold, + color: Colors.black, + ), + Texts( + widget.model.formatCreatedDateToString(), + fontSize: 16, + fontWeight: FontWeight.normal, + color: Colors.black, + ), + ], + ), + ], + ), + SizedBox( + height: 10, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Texts( + "MOBILE #", + fontSize: 14, + fontWeight: FontWeight.bold, + color: Colors.black, + ), + Texts( + widget.model.lacumGroupInformation.lakumInquiryInformationObjVersion.mobileNumber, + fontSize: 16, + fontWeight: FontWeight.normal, + color: Colors.black, + ), + ], + ), + Column( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Texts( + TranslationBase.of(context).language, + fontSize: 14, + fontWeight: FontWeight.bold, + color: Colors.black, + ), + Texts( + widget.model.lacumInformation.prefLang == + "1" + ? TranslationBase.of(context).lanEnglish + : TranslationBase.of(context).lanArabic, + fontSize: 16, + fontWeight: FontWeight.normal, + color: Colors.black, + ), + ], + ), + ], + ), + ], + ), + ), + ], + ), + ), + widget.isLacumHomePage + ? Container( + decoration: BoxDecoration( + shape: BoxShape.rectangle, + borderRadius: BorderRadius.circular(4), + border: Border.fromBorderSide(BorderSide( + color: Colors.grey, + width: 0.4, + )), + ), + margin: EdgeInsets.symmetric(horizontal: 16), + child: Stack( + children: [ + Image.asset( + "assets/images/pharmacy_module/lakum/lakum_card_front_bg.png", + fit: BoxFit.fill, + width: widget.mediaQuery.size.width * 1.0, + height: widget.mediaQuery.size.width * 1.0, + ), + Container( + margin: EdgeInsets.fromLTRB(12, 70, 12, 4), + child: widget.model.convertBase64ToBarCodeImage() != + null + ? Image.memory( + widget.model.convertBase64ToBarCodeImage()) + : Container(), + ), + ], + ), + ) + : Container(), + ], + ), + widget.isLacumHomePage + ? Positioned( + bottom: 1, + left: 1, + right: 1, + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Container( + width: _current == 0 ? 12.0 : 8.0, + height: 4.0, + margin: EdgeInsets.symmetric( + vertical: 0.0, horizontal: 2.0), + decoration: BoxDecoration( + shape: BoxShape.rectangle, + color: _current == 0 + ? Color(0xff5ab145) + : Color.fromRGBO(0, 0, 0, 0.4), + ), + ), + Container( + width: _current == 1 ? 12.0 : 8.0, + height: 4.0, + margin: EdgeInsets.symmetric( + vertical: 0.0, horizontal: 2.0), + decoration: BoxDecoration( + shape: BoxShape.rectangle, + color: _current == 1 + ? Color(0xff5ab145) + : Color.fromRGBO(0, 0, 0, 0.4), + ), + ), + ], + ), + ), + ) + : Container(), + ], + ), + ); + } +} \ No newline at end of file diff --git a/lib/pages/pharmacies/widgets/lakum-banner-widget.dart b/lib/pages/pharmacies/widgets/lakum-banner-widget.dart new file mode 100644 index 00000000..14a53e72 --- /dev/null +++ b/lib/pages/pharmacies/widgets/lakum-banner-widget.dart @@ -0,0 +1,289 @@ +import 'package:carousel_slider/carousel_slider.dart'; +import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/lacum-viewmodel.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:diplomaticquarterapp/widgets/buttons/borderedButton.dart'; +import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; +import 'package:flutter/material.dart'; + +class LakumBannerWidget extends StatefulWidget { + final LacumViewModel model; + final MediaQueryData mediaQuery; + final bool isLacumHomePage; + + LakumBannerWidget(this.model, this.mediaQuery, this.isLacumHomePage); + + @override + _LakumBannerWidgetState createState() => _LakumBannerWidgetState(); +} + +class _LakumBannerWidgetState extends State { + int _current = 0; + + @override + Widget build(BuildContext context) { + return Container( + child: Stack( + children: [ + CarouselSlider( + options: CarouselOptions( + enableInfiniteScroll: false, + enlargeCenterPage: false, + viewportFraction: 1.0, + scrollPhysics: widget.isLacumHomePage + ? ScrollPhysics() + : NeverScrollableScrollPhysics(), + initialPage: 0, + onPageChanged: (index, reason) { + setState(() { + _current = index; + }); + }, + ), + items: [ + Container( + decoration: BoxDecoration( + shape: BoxShape.rectangle, + borderRadius: BorderRadius.circular(4), + border: Border.fromBorderSide(BorderSide( + color: Colors.grey, + width: 0.4, + )), + ), + margin: EdgeInsets.symmetric(horizontal: 16), + child: Stack( + children: [ + Image.asset( + "assets/images/pharmacy_module/lakum/lakum_card_front_bg.png", + fit: BoxFit.fill, + width: widget.mediaQuery.size.width * 1.0, + height: widget.mediaQuery.size.width * 1.0, + ), + Container( + margin: EdgeInsets.fromLTRB(12, 70, 12, 4), + child: Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Texts( + widget.model.lacumGroupInformation.lakumInquiryInformationObjVersion.memberName, + fontSize: 14, + fontWeight: FontWeight.bold, + color: Colors.black, + ), + Texts( + "${widget.model.lacumInformation.yahalaAccountNo}", + fontSize: 16, + fontWeight: FontWeight.normal, + color: Colors.black, + ), + ], + ), + BorderedButton( + widget.model.lacumGroupInformation.lakumInquiryInformationObjVersion.accountStatus == "Active" + ? TranslationBase.of(context).active + : TranslationBase.of(context).inactive, + textColor: widget.model.lacumInformation + .accountStatus == + 1 + ? Colors.green + : Colors.red, + hasBorder: true, + borderColor: widget.model.lacumInformation + .accountStatus == + 1 + ? Colors.green + : Colors.red, + radius: 16, + rPadding: 16, + icon: widget.model.lacumInformation + .accountStatus == + 1 + ? Icon( + Icons.check_circle, + size: 25, + color: Colors.green, + ) + : Image.asset( + "assets/images/pharmacy_module/lakum/inactive_cross.png", + fit: BoxFit.fill, + width: 25, + height: 25, + ), + ), + ], + ), + SizedBox( + height: 10, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Texts( + "IDENTIFICATION #", + fontSize: 14, + fontWeight: FontWeight.bold, + color: Colors.black, + ), + Texts( + widget.model.lacumInformation + .identificationNo, + fontSize: 16, + fontWeight: FontWeight.normal, + color: Colors.black, + ), + ], + ), + Column( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Texts( + "MEMBER SINCE", + fontSize: 14, + fontWeight: FontWeight.bold, + color: Colors.black, + ), + Texts( + widget.model.formatCreatedDateToString(), + fontSize: 16, + fontWeight: FontWeight.normal, + color: Colors.black, + ), + ], + ), + ], + ), + SizedBox( + height: 10, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Texts( + "MOBILE #", + fontSize: 14, + fontWeight: FontWeight.bold, + color: Colors.black, + ), + Texts( + widget.model.lacumGroupInformation.lakumInquiryInformationObjVersion.mobileNumber, + fontSize: 16, + fontWeight: FontWeight.normal, + color: Colors.black, + ), + ], + ), + Column( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Texts( + TranslationBase.of(context).language, + fontSize: 14, + fontWeight: FontWeight.bold, + color: Colors.black, + ), + Texts( + widget.model.lacumInformation.prefLang == + "1" + ? TranslationBase.of(context).lanEnglish + : TranslationBase.of(context).lanArabic, + fontSize: 16, + fontWeight: FontWeight.normal, + color: Colors.black, + ), + ], + ), + ], + ), + ], + ), + ), + ], + ), + ), + widget.isLacumHomePage + ? Container( + decoration: BoxDecoration( + shape: BoxShape.rectangle, + borderRadius: BorderRadius.circular(4), + border: Border.fromBorderSide(BorderSide( + color: Colors.grey, + width: 0.4, + )), + ), + margin: EdgeInsets.symmetric(horizontal: 16), + child: Stack( + children: [ + Image.asset( + "assets/images/pharmacy_module/lakum/lakum_card_front_bg.png", + fit: BoxFit.fill, + width: widget.mediaQuery.size.width * 1.0, + height: widget.mediaQuery.size.width * 1.0, + ), + Container( + margin: EdgeInsets.fromLTRB(12, 70, 12, 4), + child: widget.model.convertBase64ToBarCodeImage() != + null + ? Image.memory( + widget.model.convertBase64ToBarCodeImage()) + : Container(), + ), + ], + ), + ) + : Container(), + ], + ), + widget.isLacumHomePage + ? Positioned( + bottom: 1, + left: 1, + right: 1, + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Container( + width: _current == 0 ? 12.0 : 8.0, + height: 4.0, + margin: EdgeInsets.symmetric( + vertical: 0.0, horizontal: 2.0), + decoration: BoxDecoration( + shape: BoxShape.rectangle, + color: _current == 0 + ? Color(0xff5ab145) + : Color.fromRGBO(0, 0, 0, 0.4), + ), + ), + Container( + width: _current == 1 ? 12.0 : 8.0, + height: 4.0, + margin: EdgeInsets.symmetric( + vertical: 0.0, horizontal: 2.0), + decoration: BoxDecoration( + shape: BoxShape.rectangle, + color: _current == 1 + ? Color(0xff5ab145) + : Color.fromRGBO(0, 0, 0, 0.4), + ), + ), + ], + ), + ), + ) + : Container(), + ], + ), + ); + } +} \ No newline at end of file diff --git a/lib/pages/pharmacies/widgets/lakum-point-table-row-widget.dart b/lib/pages/pharmacies/widgets/lakum-point-table-row-widget.dart new file mode 100644 index 00000000..6e4e2309 --- /dev/null +++ b/lib/pages/pharmacies/widgets/lakum-point-table-row-widget.dart @@ -0,0 +1,116 @@ +import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_expandable_notifier.dart'; +import 'package:diplomaticquarterapp/widgets/others/points-expandable-notifier.dart'; +import 'package:expandable/expandable.dart'; +import 'package:flutter/material.dart'; + +class LakumPointTableRowWidget extends StatefulWidget { + final bool isTableTitle; // true : title , false: row + final String rowTitle; + final double points; + final double riyal; + final Function onTap; + final int rowIndex; + final Widget collapsed; + final bool expandFlag; + + LakumPointTableRowWidget(this.isTableTitle, this.rowTitle, this.points, + this.riyal, this.onTap, this.rowIndex, + {this.collapsed, this.expandFlag = false}); + + @override + _LakumPointTableRowWidgetState createState() => + _LakumPointTableRowWidgetState(); +} + +class _LakumPointTableRowWidgetState extends State { + @override + Widget build(BuildContext context) { + return InkWell( + onTap: widget.onTap, + child: Column( + children: [ + Column( + children: [ + widget.collapsed != null + ? PointsExpandableNotifier( + headerWidget: buildPointRowBody(), + // bodyWidget: widget.collapsed != null ? widget.collapsed : null, + bodyWidget: widget.collapsed, + isExpand: widget.expandFlag, + ) + : buildPointRowBody(), + ], + ), + const Divider( + color: Color(0xFFD6D6D6), + height: 1, + thickness: 1, + indent: 0, + endIndent: 0, + ), + ], + ), + ); + } + + Widget buildPointRowBody() { + bool isEven = widget.rowIndex % 2 == 0; + return Container( + padding: EdgeInsets.symmetric(vertical: 12, horizontal: 12), + color: widget.expandFlag ? Color(0xffe4e4e4) : isEven && !widget.isTableTitle ? Color(0xffefefef) : Colors.white, + child: Column( + children: [ + Row( + children: [ + Expanded( + child: Container( + child: Texts( + widget.rowTitle, + fontSize: 14, + fontWeight: + widget.isTableTitle ? FontWeight.bold : FontWeight.normal, + ), + )), + Expanded( + child: Container( + child: Texts( + widget.isTableTitle ? "POINTS" : "${widget.points}", + fontSize: 14, + fontWeight: + widget.isTableTitle ? FontWeight.bold : FontWeight.normal, + ), + )), + Expanded( + child: Container( + child: Texts( + widget.isTableTitle ? "RIYAL" : "${widget.riyal}", + fontSize: 14, + fontWeight: + widget.isTableTitle ? FontWeight.bold : FontWeight.normal, + ), + )), + Expanded( + child: widget.isTableTitle + ? Container() + : Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + Icon( + widget.collapsed == null + ? Icons.keyboard_arrow_right + : widget.expandFlag + ? Icons.keyboard_arrow_up + : Icons.keyboard_arrow_down, + size: 25, + color: Colors.grey.shade700, + ), + ], + )), + ], + ), + ], + ), + ); + } +} diff --git a/lib/pages/pharmacies/widgets/lakum_point_table_row_widget.dart b/lib/pages/pharmacies/widgets/lakum_point_table_row_widget.dart new file mode 100644 index 00000000..bddd2e3b --- /dev/null +++ b/lib/pages/pharmacies/widgets/lakum_point_table_row_widget.dart @@ -0,0 +1,116 @@ +import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_expandable_notifier.dart'; +import 'package:diplomaticquarterapp/widgets/others/points-expandable-notifier.dart'; +import 'package:expandable/expandable.dart'; +import 'package:flutter/material.dart'; + +class LakumPointTableRowWidget extends StatefulWidget { + final bool isTableTitle; // true : title , false: row + final String rowTitle; + final double points; + final double riyal; + final Function onTap; + final int rowIndex; + final Widget collapsed; + final bool expandFlag; + + LakumPointTableRowWidget(this.isTableTitle, this.rowTitle, this.points, + this.riyal, this.onTap, this.rowIndex, + {this.collapsed, this.expandFlag = false}); + + @override + _LakumPointTableRowWidgetState createState() => + _LakumPointTableRowWidgetState(); +} + +class _LakumPointTableRowWidgetState extends State { + @override + Widget build(BuildContext context) { + return InkWell( + onTap: widget.onTap, + child: Column( + children: [ + Column( + children: [ + widget.collapsed != null + ? PointsExpandableNotifier( + headerWidget: buildPointRowBody(), + // bodyWidget: widget.collapsed != null ? widget.collapsed : null, + bodyWidget: widget.collapsed, + isExpand: widget.expandFlag, + ) + : buildPointRowBody(), + ], + ), + const Divider( + color: Color(0xFFD6D6D6), + height: 1, + thickness: 1, + indent: 0, + endIndent: 0, + ), + ], + ), + ); + } + + Widget buildPointRowBody() { + bool isEven = widget.rowIndex % 2 == 0; + return Container( + padding: EdgeInsets.symmetric(vertical: 12, horizontal: 12), + color: widget.expandFlag ? Color(0xffe4e4e4) : isEven && !widget.isTableTitle ? Color(0xffefefef) : Colors.white, + child: Column( + children: [ + Row( + children: [ + Expanded( + child: Container( + child: Texts( + widget.rowTitle, + fontSize: 14, + fontWeight: + widget.isTableTitle ? FontWeight.bold : FontWeight.normal, + ), + )), + Expanded( + child: Container( + child: Texts( + widget.isTableTitle ? "POINTS" : "${widget.points}", + fontSize: 14, + fontWeight: + widget.isTableTitle ? FontWeight.bold : FontWeight.normal, + ), + )), + Expanded( + child: Container( + child: Texts( + widget.isTableTitle ? "RIYAL" : "${widget.riyal}", + fontSize: 14, + fontWeight: + widget.isTableTitle ? FontWeight.bold : FontWeight.normal, + ), + )), + Expanded( + child: widget.isTableTitle + ? Container() + : Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + Icon( + widget.collapsed == null + ? Icons.keyboard_arrow_right + : widget.expandFlag + ? Icons.keyboard_arrow_up + : Icons.keyboard_arrow_down, + size: 25, + color: Colors.grey.shade700, + ), + ], + )), + ], + ), + ], + ), + ); + } +} diff --git a/lib/pages/pharmacies/wishlist.dart b/lib/pages/pharmacies/wishlist.dart index 2d74212a..822dfe89 100644 --- a/lib/pages/pharmacies/wishlist.dart +++ b/lib/pages/pharmacies/wishlist.dart @@ -4,8 +4,6 @@ import 'package:diplomaticquarterapp/pages/pharmacies/ProductCheckTypeWidget.dar import 'package:flutter/material.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; -void main() => runApp(WishlistPage()); - class WishlistPage extends StatefulWidget { @override _WishlistPageState createState() => _WishlistPageState(); @@ -19,8 +17,10 @@ class _WishlistPageState extends State { onModelReady: (model) => model.getWishlistData(), builder: (_, model, wi) => AppScaffold( appBarTitle: 'Wishlist page', - isShowAppBar: true, - isPharmacy: true, + isShowAppBar: false, + isShowDecPage: false, + isPharmacy: false, + baseViewModel: model, body: model.wishListList.length == 0 ? Container( child: Center( diff --git a/lib/pages/pharmacy/order/OrderDetails.dart b/lib/pages/pharmacy/order/OrderDetails.dart index 1e4c5bb3..5438663d 100644 --- a/lib/pages/pharmacy/order/OrderDetails.dart +++ b/lib/pages/pharmacy/order/OrderDetails.dart @@ -328,6 +328,7 @@ class _OrderDetailsPageState extends State { totalPrice: "${(widget.orderModel.orderItems[index].product.price * widget.orderModel.orderItems[index].quantity).toStringAsFixed(2)}", qyt: widget.orderModel.orderItems[index].quantity.toString(), + isOrderDetails:true, imgs: widget.orderModel.orderItems[index].product.images != null && widget.orderModel.orderItems[index].product.images.length != 0 ? widget.orderModel.orderItems[index].product.images [0].src.toString() diff --git a/lib/pages/pharmacy/profile/profile.dart b/lib/pages/pharmacy/profile/profile.dart index 6e2f2a7c..1057a740 100644 --- a/lib/pages/pharmacy/profile/profile.dart +++ b/lib/pages/pharmacy/profile/profile.dart @@ -91,7 +91,8 @@ class _ProfilePageState extends State { onModelReady: (model) => model.getOrder(customerId, page_id), builder: (_, model, wi) => AppScaffold( appBarTitle: TranslationBase.of(context).myAccount, - isShowAppBar: true, + isShowAppBar:false, + isShowDecPage: false, isPharmacy: true, body: Container( child: SingleChildScrollView( diff --git a/lib/pages/pharmacy_categorise.dart b/lib/pages/pharmacy_categorise.dart new file mode 100644 index 00000000..06bba8c3 --- /dev/null +++ b/lib/pages/pharmacy_categorise.dart @@ -0,0 +1,239 @@ +import 'dart:convert'; + +import 'package:barcode_scan_fix/barcode_scan.dart'; +import 'package:charts_flutter/flutter.dart'; +import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; +import 'package:diplomaticquarterapp/core/viewModels/pharmacy_categorise_view_model.dart'; +import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; +import 'package:diplomaticquarterapp/pages/landing/landing_page_pharmcy.dart'; +import 'package:diplomaticquarterapp/pages/parent_categorise_page.dart'; +import 'package:diplomaticquarterapp/uitl/app_toast.dart'; +import 'package:diplomaticquarterapp/uitl/utils.dart'; +import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'base/base_view.dart'; +import 'final_products_page.dart'; + +class PharmacyCategorisePage extends StatefulWidget { + @override + _PharmacyCategorisePageState createState() => _PharmacyCategorisePageState(); +} + +class _PharmacyCategorisePageState extends State { + String idCategorise; + + @override + Widget build(BuildContext context) { + ProjectViewModel projectViewModel = Provider.of(context); + return BaseView( + onModelReady: (model) => model.getCategorise(), + builder: (BuildContext context, PharmacyCategoriseViewModel model, + Widget child) => + AppScaffold( + isShowDecPage: false, + baseViewModel: model, + body: Column( + children: [ + Container( + height: 400, + margin: EdgeInsets.only(bottom: 22), + child: GridView.builder( + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 2, + crossAxisSpacing: 0.5, + mainAxisSpacing: 1.0, + childAspectRatio: 3.2, + ), + itemCount: model.categorise.length, + itemBuilder: (BuildContext context, int index) { + return Padding( + padding: EdgeInsets.all(4.0), + child: InkWell( + child: Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(5), + color: Colors.grey.withOpacity(0.24), + ), + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 10.0), + child: Texts( + projectViewModel.isArabic + ? model.categorise[index].namen + : model.categorise[index].name, + fontWeight: FontWeight.w600, + ), + ), + ), + onTap: () => { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => + model.categorise[index].id != '12' + ? ParentCategorisePage( + id: model.categorise[index].id, + titleName: model.categorise[index].name, + ) + : FinalProductsPage( + id: model.categorise[index].id, + ), + ), + ), + }, + ), + ); + }, + ), + ), + Container( + height: 140, + child: Column( + children: [ + Divider( + height: 2.0, + thickness: 1.0, + color: Colors.black12.withOpacity(0.14)), + SizedBox( + height: 10.0, + ), + Row( + children: [ + Expanded( + child: Padding( + padding: EdgeInsets.all(4.0), + child: Container( + height: 50.0, + width: 55.0, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(5.0), + color: Colors.green.shade300.withOpacity(0.34), + ), + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 10.0), + child: Texts( + projectViewModel.isArabic + ? 'الاكثر مبيعا' + : 'Best Sellers', + fontWeight: FontWeight.w600, + ), + ), + ), + ), + ), + Expanded( + child: Padding( + padding: EdgeInsets.all(4.0), + child: Container( + height: 50.0, + width: 55.0, + decoration: BoxDecoration( + color: Colors.orangeAccent.shade200 + .withOpacity(0.34), + borderRadius: BorderRadius.circular(5.0), + ), + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 10.0), + child: Texts( + projectViewModel.isArabic + ? 'الاكثر مشاهدة' + : 'Most Viewed', + fontWeight: FontWeight.w600, + ), + ), + ), + ), + ), + ], + ), + Row( + children: [ + Expanded( + child: Padding( + padding: EdgeInsets.all(4.0), + child: Container( + height: 50.0, + width: 55.0, + decoration: BoxDecoration( + color: Colors.blue.shade200.withOpacity(0.34), + borderRadius: BorderRadius.circular(5.0), + ), + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 10.0), + child: Texts( + projectViewModel.isArabic + ? 'منتجات جديدة' + : 'New Products', + fontWeight: FontWeight.w600, + ), + ), + ), + ), + ), + Expanded( + child: Padding( + padding: EdgeInsets.all(4.0), + child: InkWell( + onTap: () { + _scanQrAndGetPatient(context, model); + }, + child: Container( + height: 50.0, + width: 55.0, + decoration: BoxDecoration( + color: + Colors.purple.shade200.withOpacity(0.34), + borderRadius: BorderRadius.circular(5.0), + ), + child: Padding( + padding: + EdgeInsets.symmetric(horizontal: 10.0), + child: Texts( + projectViewModel.isArabic + ? 'شوهد مؤخرا' + : 'Recently Viewed', + fontWeight: FontWeight.w600, + ), + ), + ), + ), + ), + ), + ], + ), + ], + )), + ], + ), + ), + ); + } + + _scanQrAndGetPatient( + BuildContext context, + PharmacyCategoriseViewModel model, + ) async { + //TODO fix it + /// When give qr we will change this method to get data + /// var result = await BarcodeScanner.scan(); + /// int patientID = get from qr result + String result = await BarcodeScanner.scan(); + var data = json.decode(result); + if (data!=null) { + var qRParkingID = data['QRParkingID']; + await model.scanQr(); + if (model.state == ViewState.ErrorLocal) { + Utils.showErrorToast(model.error); + } else { + AppToast.showSuccessToast(message: model.scanList[0].id); + { + Navigator.push( + context, + MaterialPageRoute(builder: (context) => LandingPagePharmacy()), + ); + } + } + } + } +} diff --git a/lib/pages/search_products_page.dart b/lib/pages/search_products_page.dart new file mode 100644 index 00000000..45cafd35 --- /dev/null +++ b/lib/pages/search_products_page.dart @@ -0,0 +1,287 @@ +import 'package:diplomaticquarterapp/config/size_config.dart'; +import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; +import 'package:diplomaticquarterapp/core/viewModels/pharmacy_categorise_view_model.dart'; +import 'package:diplomaticquarterapp/uitl/utils.dart'; +import 'package:diplomaticquarterapp/widgets/buttons/button.dart'; +import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; +import 'package:diplomaticquarterapp/widgets/input/text_field.dart'; +import 'package:diplomaticquarterapp/widgets/others/StarRating.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_scaffold_pharmacy_widget.dart'; +import 'package:diplomaticquarterapp/widgets/others/network_base_view.dart'; +import 'package:flutter/material.dart'; + +import 'base/base_view.dart'; + +class SearchProductsPage extends StatefulWidget { + @override + _SearchProductsPageState createState() => _SearchProductsPageState(); +} + +class _SearchProductsPageState extends State { + final textController = TextEditingController(); + final _formKey = GlobalKey(); + String msg = ''; + + @override + Widget build(BuildContext context) { + return BaseView( + onModelReady: (model) => model.clearSearchList(), + builder: (BuildContext context, PharmacyCategoriseViewModel model, + Widget child) => + PharmacyAppScaffold( + appBarTitle: 'Search', + isBottomBar: false, + isShowAppBar: true, + backgroundColor: Colors.white, + isShowDecPage: false, + //baseViewModel: model, + body: SingleChildScrollView( + child: Container( + height: SizeConfig.screenHeight, + child: Column( + children: [ + Padding( + padding: EdgeInsets.all(8.0), + child: Row( + children: [ + Container( + width: MediaQuery.of(context).size.width * 0.79, + child: Form( + key: _formKey, + child: TextFields( + autoFocus: true, + hintText: 'Search', + fontSize: 19.0, + prefixIcon: Icon(Icons.search), + inputAction: TextInputAction.search, + onSaved: (value) { + //searchMedicine(model, context); + }, + onSubmit: (value) { + searchMedicine(model, context); + msg = 'No Result Found'; + }, + controller: textController, + validator: (value) { + if (value.isEmpty) { + return 'please Enter Product Name'; + } + return null; + }, + ), + ), + ), + SizedBox( + width: 10.0, + ), + InkWell( + child: Texts( + 'Cancel', + fontSize: 17.0, + fontWeight: FontWeight.w500, + ), + onTap: () { + Navigator.pop(context); + }, + ), + + // child: Container( + // child: Button( + // backgroundColor: Colors.green, + // loading: model.state == ViewState.BusyLocal, + // label: 'Search', + // onTap: () { + // searchMedicine(model, context); + // }), + // width: MediaQuery.of(context).size.width * 0.09, + // ), + ], + ), + ), + Center( + child: NetworkBaseView( + baseViewModel: model, + child: model.searchList.isNotEmpty + ? Container( + height: MediaQuery.of(context).size.height * 0.80, + child: GridView.builder( + //physics: NeverScrollableScrollPhysics(), + gridDelegate: + SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 2, + crossAxisSpacing: 0.5, + mainAxisSpacing: 2.0, + childAspectRatio: 1.0, + ), + itemCount: model.searchList.length, + itemBuilder: (BuildContext context, int index) { + return Card( + color: model.searchList[index].discountName != + null + ? Color(0xffFFFF00) + : Colors.white, + elevation: 0, + shape: Border( + right: BorderSide( + color: Colors.grey.shade300, + width: 1, + ), + left: BorderSide( + color: Colors.grey.shade300, + width: 1, + ), + bottom: BorderSide( + color: Colors.grey.shade300, + width: 1, + ), + top: BorderSide( + color: Colors.grey.shade300, + width: 1, + ), + ), + margin: EdgeInsets.symmetric( + horizontal: 8, + vertical: 4, + ), + child: Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.only( + topLeft: Radius.circular(110.0), + ), + color: Colors.white, + ), + padding: + EdgeInsets.symmetric(horizontal: 0), + width: + MediaQuery.of(context).size.width / 3, + child: Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + Stack( + children: [ + Container( + margin: EdgeInsets.fromLTRB( + 0, 16, 0, 0), + alignment: Alignment.center, + child: Image.network( + model.searchList[index].images + .isNotEmpty + ? model.searchList[index] + .images[0].thumb + : 'https://upload.wikimedia.org/wikipedia/commons/thumb/6/6c/No_image_3x4.svg/1200px-No_image_3x4.svg.png', + fit: BoxFit.cover, + height: 80, + ), + ), + Container( + width: model.searchList[index] + .rxMessage != + null + ? MediaQuery.of(context) + .size + .width / + 5 + : 0, + padding: EdgeInsets.all(4), + decoration: BoxDecoration( + color: Color(0xffb23838), + borderRadius: BorderRadius.only( + topLeft: + Radius.circular(6)), + ), + child: Texts( + model.searchList[index] + .rxMessage != + null + ? model.searchList[index] + .rxMessage + : "", + color: Colors.white, + regular: true, + fontSize: 10, + fontWeight: FontWeight.w400, + ), + ), + ], + ), + Container( + margin: EdgeInsets.symmetric( + horizontal: 6, + vertical: 0, + ), + child: Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + Texts( + model.searchList[index].name, + regular: true, + fontSize: 12, + fontWeight: FontWeight.w400, + ), + Padding( + padding: const EdgeInsets.only( + top: 4, bottom: 4), + child: Texts( + "SAR ${model.searchList[index].price}", + bold: true, + fontSize: 14, + ), + ), + Row( + children: [ + StarRating( + totalAverage: model + .searchList[ + index] + .approvedRatingSum > + 0 + ? (model + .searchList[ + index] + .approvedRatingSum + .toDouble() / + model + .searchList[ + index] + .approvedRatingSum + .toDouble()) + .toDouble() + : 0, + forceStars: true), + Texts( + "(${model.searchList[index].approvedTotalReviews})", + regular: true, + fontSize: 10, + fontWeight: FontWeight.w400, + ) + ], + ), + ], + ), + ), + ], + ), + ), + ); + }, + ), + ) + : Texts(msg), + ), + ) + ], + ), + ), + ), + ), + ); + } + + searchMedicine(PharmacyCategoriseViewModel model, BuildContext context) { + Utils.hideKeyboard(context); + if (_formKey.currentState.validate()) + model.searchProducts(productName: textController.text); + } +} diff --git a/lib/pages/sub_categorise_page.dart b/lib/pages/sub_categorise_page.dart new file mode 100644 index 00000000..45c9fd6c --- /dev/null +++ b/lib/pages/sub_categorise_page.dart @@ -0,0 +1,944 @@ +import 'package:diplomaticquarterapp/core/viewModels/pharmacy_categorise_view_model.dart'; +import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; +import 'package:diplomaticquarterapp/widgets/buttons/button.dart'; +import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; +import 'package:diplomaticquarterapp/widgets/others/StarRating.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_scaffold_pharmacy_widget.dart'; +import 'package:diplomaticquarterapp/widgets/others/network_base_view.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +import 'base/base_view.dart'; +import 'final_products_page.dart'; + +class SubCategorisePage extends StatefulWidget { + String id; + String title; + String parentId; + + SubCategorisePage({this.id, this.parentId, this.title}); + @override + _SubCategorisePageState createState() => + _SubCategorisePageState(id: id, title: title, parentId: parentId); +} + +class _SubCategorisePageState extends State { + bool checkedBrands = false; + bool checkedCategorise = false; + String id; + String title; + String parentId; + _SubCategorisePageState({this.title, this.parentId, this.id}); + String categoriseName = "Personal Care"; + bool styleOne = true; + bool styleTwo = false; + Icon styleIcon = Icon( + Icons.widgets_sharp, + color: Colors.blue, + size: 29.0, + ); + @override + Widget build(BuildContext context) { + return BaseView( + onModelReady: (model) => model.getSubCategorise(i: id), + builder: (BuildContext context, PharmacyCategoriseViewModel model, + Widget child) => + PharmacyAppScaffold( + appBarTitle: title, + isBottomBar: false, + isShowAppBar: true, + backgroundColor: Colors.white, + isShowDecPage: false, + baseViewModel: model, + body: SingleChildScrollView( + child: Container( + height: MediaQuery.of(context).size.height * 5.97, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + child: Image.network( + parentId == '1' + ? 'https://uat.hmgwebservices.com/epharmacy/content/images/thumbs/0089188_personal-care_2.png' + : parentId == '2' + ? 'https://uat.hmgwebservices.com/epharmacy/content/images/thumbs/0089189_skin-care_2.png' + : parentId == '3' + ? 'https://uat.hmgwebservices.com/epharmacy/content/images/thumbs/0089190_health-care_2.png' + : parentId == '4' + ? 'https://uat.hmgwebservices.com/epharmacy/content/images/thumbs/0089191_sexual-health_2.png' + : parentId == '5' + ? 'https://uat.hmgwebservices.com/epharmacy/content/images/thumbs/0089192_beauty_2.png' + : parentId == '6' + ? 'https://uat.hmgwebservices.com/epharmacy/content/images/thumbs/0089193_baby-child_2.png' + : parentId == '7' + ? 'https://uat.hmgwebservices.com/epharmacy/content/images/thumbs/0089194_vitamins-supplements_2.png' + : parentId == '8' + ? 'https://uat.hmgwebservices.com/epharmacy/content/images/thumbs/0089195_diet-nutrition_2.png' + : parentId == '9' + ? 'https://uat.hmgwebservices.com/epharmacy/content/images/thumbs/0089196_household_2.png' + : parentId == + '10' + ? 'https://uat.hmgwebservices.com/epharmacy/content/images/thumbs/0089197_home-care-appliances_2.png' + : '', + fit: BoxFit.fill, + height: 160.0, + width: double.infinity), + ), + if (model.subCategorise.length > 8) + Column( + children: [ + InkWell( + child: Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Padding( + padding: EdgeInsets.all(10.0), + child: Container( + child: Texts('View All Categories'), + ), + ), + Icon(Icons.arrow_forward) + ], + ), + onTap: () { + showModalBottomSheet( + isScrollControlled: true, + context: context, + builder: (BuildContext context) { + return Container( + height: + MediaQuery.of(context).size.height * + 0.89, + color: Colors.white, + child: Center( + child: ListView.builder( + scrollDirection: Axis.vertical, + itemCount: + model.subCategorise.length, + itemBuilder: (BuildContext context, + int index) { + return Container( + child: Padding( + padding: EdgeInsets.all(8.0), + child: InkWell( + child: Column( + crossAxisAlignment: + CrossAxisAlignment + .start, + children: [ + Texts(model + .subCategorise[ + index] + .name), + Divider( + thickness: 0.6, + color: Colors.black12, + ) + ], + ), + onTap: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => + FinalProductsPage( + id: model + .subCategorise[ + index] + .id, + ), + ), + ); + }, + ), + ), + ); + }), + ), + ); + }, + ); + }, + ), + Divider( + thickness: 1.0, + color: Colors.grey.shade400, + ), + ], + ), + +//Expanded widget heree if nassery + Padding( + padding: EdgeInsets.only(top: 35.0), + child: Container( + height: MediaQuery.of(context).size.height * 0.2, + child: Center( + child: ListView.builder( + scrollDirection: Axis.horizontal, + itemCount: model.subCategorise.length, + itemBuilder: (BuildContext context, int index) { + return Padding( + padding: + EdgeInsets.symmetric(horizontal: 8.0), + child: InkWell( + child: Column( + crossAxisAlignment: + CrossAxisAlignment.center, + children: [ + Padding( + padding: EdgeInsets.symmetric( + horizontal: 13.0), + child: Container( + height: 60.0, + width: 65.0, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: Colors.orange.shade200 + .withOpacity(0.45), + ), + child: Center( + child: Icon( + Icons.apps_sharp, + size: 32.0, + ), + ), + ), + ), + Container( + width: MediaQuery.of(context) + .size + .width * + 0.17, + height: MediaQuery.of(context) + .size + .height * + 0.10, + child: Center( + child: Texts( + model.subCategorise[index].name, + fontSize: 14, + fontWeight: FontWeight.w600, + maxLines: 2, + ), + ), + ), + ], + ), + onTap: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => + FinalProductsPage( + id: model.subCategorise[index].id, + ), + ), + ); + }, + ), + ); + }), + ), + ), + ), + + Divider( + thickness: 1.0, + color: Colors.grey.shade400, + ), + Padding( + padding: EdgeInsets.symmetric(horizontal: 8.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + InkWell( + child: Row( + children: [ + Icon(Icons.wrap_text), + SizedBox( + width: 10.0, + ), + Texts( + 'Refine', + fontWeight: FontWeight.w600, + ), + ], + ), + onTap: () { + showModalBottomSheet( + isScrollControlled: true, + context: context, + builder: (BuildContext context) { + return DraggableScrollableSheet( + initialChildSize: 0.95, + maxChildSize: 0.95, + minChildSize: 0.9, + builder: (BuildContext context, + ScrollController scrollController) { + return SingleChildScrollView( + controller: scrollController, + child: Container( + height: MediaQuery.of(context) + .size + .height * + 1.95, + child: Column( + children: [ + Padding( + padding: + EdgeInsets.all(8.0), + child: Row( + children: [ + Icon( + Icons.wrap_text, + ), + SizedBox( + width: 10.0, + ), + Texts( + 'Refine', + fontWeight: + FontWeight.w600, + ), + SizedBox( + width: 250.0, + ), + InkWell( + child: Texts( + 'Close', + color: Colors.red, + fontWeight: + FontWeight.w600, + fontSize: 15.0, + ), + onTap: () { + Navigator.pop( + context); + }, + ), + ], + ), + ), + Divider( + thickness: 1.0, + color: Colors.black12, + ), + Column( + children: [ + ExpansionTile( + title: + Texts('Categorise'), + children: [ + Container( + height: 350, + child: ListView + .builder( + controller: + scrollController, + scrollDirection: + Axis + .vertical, + shrinkWrap: + true, + itemCount: model + .categoriseParent + .length, + itemBuilder: + (BuildContext + context, + int index) { + return CheckboxListTile( + tristate: + true, + title: Texts(model + .categoriseParent[index] + .name), + controlAffinity: + ListTileControlAffinity.leading, + value: + checkedCategorise, + onChanged: + (bool + value) { + setState( + () { + checkedCategorise = + value; + }); + }, + ); + }), + ) + ], + ), + Divider( + thickness: 1.0, + color: Colors.black12, + ), + ExpansionTile( + title: Texts('Brands'), + children: [ + Container( + height: 350, + child: ListView + .builder( + scrollDirection: + Axis + .vertical, + shrinkWrap: + true, + itemCount: model + .brandsList + .length, + itemBuilder: + (BuildContext + context, + int index) { + return CheckboxListTile( + tristate: + true, + title: Texts(model + .brandsList[index] + .name), + controlAffinity: + ListTileControlAffinity.leading, + value: + checkedBrands, + onChanged: + (bool + value) { + setState( + () { + checkedBrands = + value; + }); + }, + autofocus: + true, + ); + }), + ) + ], + ), + Divider( + thickness: 1.0, + color: Colors.black12, + ), + ExpansionTile( + title: Texts('Price'), + children: [ + Container( + color: Color( + 0xffEEEEEE), + child: Row( + mainAxisAlignment: + MainAxisAlignment + .spaceAround, + children: [ + Column( + mainAxisAlignment: + MainAxisAlignment + .start, + children: [ + Texts( + 'Min'), + Container( + color: Colors + .white, + width: + 200, + height: + 40, + child: + TextFormField( + decoration: + InputDecoration( + border: + OutlineInputBorder(), + ), + ), + ), + ], + ), + Column( + mainAxisAlignment: + MainAxisAlignment + .start, + children: [ + Texts( + 'Max'), + Container( + color: Colors + .white, + width: + 200, + height: + 40, + child: + TextFormField( + decoration: + InputDecoration( + border: + OutlineInputBorder(), + ), + ), + ), + ], + ), + ], + ), + ) + ], + ), + Divider( + thickness: 1.0, + color: Colors.black12, + ), + SizedBox( + height: MediaQuery.of( + context) + .size + .height * + 0.4, + ), + Padding( + padding: + EdgeInsets.all(8.0), + child: Row( + mainAxisAlignment: + MainAxisAlignment + .spaceEvenly, + children: [ + Container( + width: 100, + child: Button( + label: 'Reset', + backgroundColor: + Colors.red, + ), + ), + SizedBox( + width: 30, + ), + Container( + width: 200, + child: Button( + label: 'Apply', + backgroundColor: + Colors + .green, + ), + ), + ], + ), + ), + ], + ), + ], + ), + ), + ); + }); + }, + ); + }, + ), + Row( + children: [ + Container( + height: 44.0, + child: VerticalDivider( + color: Colors.black45, + thickness: 1.0, + //width: 0.3, + // indent: 0.0, + ), + ), + Padding( + padding: EdgeInsets.all(8.0), + child: InkWell( + child: styleIcon, + onTap: () { + setState(() { + if (styleOne == true) { + styleOne = false; + styleTwo = true; + styleIcon = Icon( + Icons.auto_awesome_mosaic, + color: Colors.blue, + size: 29.0, + ); + } else { + styleOne = true; + styleTwo = false; + styleIcon = Icon( + Icons.widgets_sharp, + color: Colors.blue, + size: 29.0, + ); + } + }); + }, + ), + ), + ], + ), + ], + ), + ), + Divider( + thickness: 1.0, + color: Colors.grey.shade400, + ), + styleOne == true + ? Container( + height: MediaQuery.of(context).size.height * 3.85, + child: GridView.builder( + physics: NeverScrollableScrollPhysics(), + gridDelegate: + SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 2, + crossAxisSpacing: 0.5, + mainAxisSpacing: 2.0, + childAspectRatio: 1.0, + ), + itemCount: model.subProducts.length, + itemBuilder: (BuildContext context, int index) { + return NetworkBaseView( + baseViewModel: model, + child: Card( + color: model.subProducts[index] + .discountName != + null + ? Color(0xffFFFF00) + : Colors.white, + elevation: 0, + shape: Border( + right: BorderSide( + color: Colors.grey.shade300, + width: 1, + ), + left: BorderSide( + color: Colors.grey.shade300, + width: 1, + ), + bottom: BorderSide( + color: Colors.grey.shade300, + width: 1, + ), + top: BorderSide( + color: Colors.grey.shade300, + width: 1, + ), + ), + margin: EdgeInsets.symmetric( + horizontal: 8, + vertical: 4, + ), + child: Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.only( + topLeft: Radius.circular(110.0), + ), + color: Colors.white, + ), + padding: EdgeInsets.symmetric( + horizontal: 0), + width: MediaQuery.of(context) + .size + .width / + 3, + child: Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + Stack( + children: [ + Container( + margin: EdgeInsets.fromLTRB( + 0, 16, 0, 0), + alignment: Alignment.center, + child: Image.network( + model.subProducts[index] + .images.isNotEmpty + ? model + .subProducts[ + index] + .images[0] + .thumb + : 'https://upload.wikimedia.org/wikipedia/commons/thumb/6/6c/No_image_3x4.svg/1200px-No_image_3x4.svg.png', + fit: BoxFit.cover, + height: 80, + ), + ), + Container( + width: model + .subProducts[ + index] + .rxMessage != + null + ? MediaQuery.of(context) + .size + .width / + 5 + : 0, + padding: EdgeInsets.all(4), + decoration: BoxDecoration( + color: Color(0xffb23838), + borderRadius: + BorderRadius.only( + topLeft: Radius + .circular(6)), + ), + child: Texts( + model.subProducts[index] + .rxMessage != + null + ? model + .subProducts[ + index] + .rxMessage + : "", + color: Colors.white, + regular: true, + fontSize: 10, + fontWeight: + FontWeight.w400, + ), + ), + ], + ), + Container( + margin: EdgeInsets.symmetric( + horizontal: 6, + vertical: 0, + ), + child: Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + Texts( + model.subProducts[index] + .name, + regular: true, + fontSize: 12, + fontWeight: + FontWeight.w400, + ), + Padding( + padding: + const EdgeInsets.only( + top: 4, + bottom: 4), + child: Texts( + "SAR ${model.subProducts[index].price}", + bold: true, + fontSize: 14, + ), + ), + Row( + children: [ + StarRating( + totalAverage: model + .subProducts[ + index] + .approvedRatingSum > + 0 + ? (model.subProducts[index].approvedRatingSum + .toDouble() / + model + .subProducts[index] + .approvedRatingSum + .toDouble()) + .toDouble() + : 0, + forceStars: true), + Texts( + "(${model.subProducts[index].approvedTotalReviews})", + regular: true, + fontSize: 10, + fontWeight: + FontWeight.w400, + ) + ], + ), + ], + ), + ), + ], + ), + ), + )); + }, + ), + ) + : Container( + height: MediaQuery.of(context).size.height * 5.0, + child: ListView.builder( + physics: NeverScrollableScrollPhysics(), + itemCount: model.subProducts.length, + itemBuilder: + (BuildContext context, int index) { + return Card( + child: Row( + children: [ + Stack( + children: [ + Column( + children: [ + Container( + decoration: BoxDecoration(), + child: Padding( + padding: EdgeInsets.only( + left: 9.0, + top: 8.0, + right: 10.0, + ), + ), + ), + Container( + margin: EdgeInsets.fromLTRB( + 0, 0, 0, 0), + alignment: Alignment.center, + child: Image.network( + model.subProducts[index] + .images.isNotEmpty + ? model + .subProducts[ + index] + .images[0] + .thumb + : 'https://upload.wikimedia.org/wikipedia/commons/thumb/6/6c/No_image_3x4.svg/1200px-No_image_3x4.svg.png', + fit: BoxFit.contain, + height: 80, + ), + ), + ], + ), + Column( + children: [ + Container( + width: model + .subProducts[ + index] + .rxMessage != + null + ? MediaQuery.of(context) + .size + .width / + 5 + : 0, + padding: EdgeInsets.all(4), + decoration: BoxDecoration( + color: Color(0xffb23838), + borderRadius: + BorderRadius.only( + topLeft: Radius + .circular(6)), + ), + child: Texts( + model.subProducts[index] + .rxMessage != + null + ? model + .subProducts[ + index] + .rxMessage + : "", + color: Colors.white, + regular: true, + fontSize: 10, + fontWeight: + FontWeight.w400, + ), + ), + ], + ), + ], + ), + Container( + height: 100.0, + margin: EdgeInsets.symmetric( + horizontal: 6, + vertical: 0, + ), + child: Column( + mainAxisAlignment: + MainAxisAlignment.spaceAround, + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + SizedBox( + height: 4.0, + ), + Container( + height: 35.0, + width: 250.0, + child: Texts( + model.subProducts[index] + .name, + regular: true, + fontSize: 13.2, + fontWeight: FontWeight.w500, + maxLines: 2, + ), + ), + SizedBox( + height: 8.0, + ), + Padding( + padding: + const EdgeInsets.only( + top: 4, bottom: 4), + child: Texts( + "SAR ${model.subProducts[index].price}", + bold: true, + fontSize: 14, + ), + ), + Row( + children: [ + StarRating( + totalAverage: model + .subProducts[ + index] + .approvedRatingSum > + 0 + ? (model + .subProducts[ + index] + .approvedRatingSum + .toDouble() / + model + .parentProducts[ + index] + .approvedRatingSum + .toDouble()) + .toDouble() + : 0, + forceStars: true), + Texts( + "(${model.subProducts[index].approvedTotalReviews})", + regular: true, + fontSize: 10, + fontWeight: + FontWeight.w400, + ) + ], + ), + ], + ), + ), + ], + ), + ); + }), + ) + ], + ), + ), + ), + )); + } +} diff --git a/lib/uitl/date_uitl.dart b/lib/uitl/date_uitl.dart index 79932c1c..460a4066 100644 --- a/lib/uitl/date_uitl.dart +++ b/lib/uitl/date_uitl.dart @@ -357,6 +357,11 @@ class DateUtil { return ""; } + static String getFormattedDate(DateTime dateTime, String formattedString){ + return DateFormat(formattedString) + .format(dateTime); + } + static convertISODateToJsonDate(String isoDate) { return "/Date(" + DateFormat('mm-dd-yyy') diff --git a/lib/uitl/translations_delegate_base.dart b/lib/uitl/translations_delegate_base.dart index 45afc898..63cf8a44 100644 --- a/lib/uitl/translations_delegate_base.dart +++ b/lib/uitl/translations_delegate_base.dart @@ -218,6 +218,8 @@ class TranslationBase { String get upcomingPaymentPending => localizedValues['upcoming-payment-pending'][locale.languageCode]; + String get upcomingConfirmMore => + localizedValues['book-success-confirm-more-24-1-2'][locale.languageCode]; String get upcomingPaymentNow => localizedValues['upcoming-payment-now'][locale.languageCode]; @@ -747,9 +749,13 @@ class TranslationBase { String get loginRegister => localizedValues['LoginRegister'][locale.languageCode]; String get orderLog => localizedValues['OrderLog'][locale.languageCode]; - String get infoLab => localizedValues['info-lab'][locale.languageCode]; - String get infoRadiology => - localizedValues['info-radiology'][locale.languageCode]; + // String get infoLab => localizedValues['info-lab'][locale.languageCode]; + // String get infoRadiology => + + String get orderNumber => localizedValues['orderNumber'][locale.languageCode]; + String get orderDate => localizedValues['orderDate'][locale.languageCode]; + String get itemsNo => localizedValues['itemsNo'][locale.languageCode]; + String get noOrder => localizedValues['noOrder'][locale.languageCode]; String get review => localizedValues['review'][locale.languageCode]; String get deliveredOrder => localizedValues['deliveredOrder'][locale.languageCode]; String get pendingOrder => localizedValues['pendingOrder'][locale.languageCode]; @@ -910,7 +916,6 @@ class TranslationBase { localizedValues['selectClinic'][locale.languageCode]; String get orderStatus => localizedValues['orderStatus'][locale.languageCode]; - String get cancelOrder => localizedValues['CancelOrder'][locale.languageCode]; String get findUs => localizedValues['FindUs'][locale.languageCode]; String get feedback => localizedValues['Feedback'][locale.languageCode]; String get liveChat => localizedValues['LiveChat'][locale.languageCode]; @@ -1010,7 +1015,6 @@ class TranslationBase { localizedValues['info-ambulance'][locale.languageCode]; String get transportHeading => localizedValues['RRT-transport-heading'][locale.languageCode]; - String get sar => localizedValues['sar'][locale.languageCode]; String get directionHeading => localizedValues['RRT-direction-heading'][locale.languageCode]; String get toHospital => localizedValues['to-hospital'][locale.languageCode]; @@ -1093,7 +1097,6 @@ class TranslationBase { String get requested => localizedValues['requested'][locale.languageCode]; String get ready => localizedValues['ready'][locale.languageCode]; String get completed => localizedValues['completed'][locale.languageCode]; - String get cancelled => localizedValues['cancelled'][locale.languageCode]; String get requestMedicalReport => localizedValues['request-medical-report'][locale.languageCode]; String get insurCards => localizedValues['insur-cards'][locale.languageCode]; @@ -1200,13 +1203,48 @@ class TranslationBase { String get topBrands => localizedValues['topBrands'][locale.languageCode]; String get notifyMe => localizedValues['notifyMe'][locale.languageCode]; String get specification => localizedValues['specification'][locale.languageCode]; - String get details => localizedValues['details'][locale.languageCode]; String get availability => localizedValues['availability'][locale.languageCode]; String get quantitySize => localizedValues['quantitySize'][locale.languageCode]; String get addToCart => localizedValues['addToCart'][locale.languageCode]; String get buyNow => localizedValues['buyNow'][locale.languageCode]; String get quantityShortcut => localizedValues['quantityShortcut'][locale.languageCode]; + String get updatedEmail => + localizedValues['updated-email'][locale.languageCode]; + String get viewListChildren => + localizedValues['view-list-children'][locale.languageCode]; + String get addChild => localizedValues['add-child'][locale.languageCode]; + String get childName => localizedValues['child-name'][locale.languageCode]; + String get childDob => localizedValues['childDob'][locale.languageCode]; + String get deletedChildMes => + localizedValues['deleted-child-mes'][locale.languageCode]; + String get visit => localizedValues['visit'][locale.languageCode]; + String get descriptionVaccination => + localizedValues['description-vaccination'][locale.languageCode]; + String get dueDate => localizedValues['due-date'][locale.languageCode]; + String get validEmail => localizedValues['valid-email'][locale.languageCode]; + String get confirmSend => + localizedValues['confirm-send'][locale.languageCode]; + String get emailSuccess => + localizedValues['email-success'][locale.languageCode]; + String get deletedChild => + localizedValues['deleted-child'][locale.languageCode]; + String get addInstructions => + localizedValues['add-instructions'][locale.languageCode]; + String get addedChild => localizedValues['added-child'][locale.languageCode]; + String get appUpdate => localizedValues['appUpdate'][locale.languageCode]; + String get ereferralSaveSuccess => + localizedValues['ereferralSaveSuccess'][locale.languageCode]; + String get year => localizedValues['Year'][locale.languageCode]; + String get month => localizedValues['Month'][locale.languageCode]; + String get point => localizedValues['point'][locale.languageCode]; + String get riyal => localizedValues['riyal'][locale.languageCode]; + String get termOfService => + localizedValues['termOfService'][locale.languageCode]; + String get shoppingCart => + localizedValues['shoppingCart'][locale.languageCode]; + + } class TranslationBaseDelegate extends LocalizationsDelegate { diff --git a/lib/widgets/Loader/gif_loader_container.dart b/lib/widgets/Loader/gif_loader_container.dart index 06c151c9..b7a20339 100644 --- a/lib/widgets/Loader/gif_loader_container.dart +++ b/lib/widgets/Loader/gif_loader_container.dart @@ -36,7 +36,7 @@ class _GifLoaderContainerState extends State child: GifImage( controller: controller1, image: AssetImage( - "assets/images/progress-loading.gif"), //NetworkImage("http://img.mp.itc.cn/upload/20161107/5cad975eee9e4b45ae9d3c1238ccf91e.jpg"), + "assets/images/progress-loading-red.gif"), //NetworkImage("http://img.mp.itc.cn/upload/20161107/5cad975eee9e4b45ae9d3c1238ccf91e.jpg"), ), )); } diff --git a/lib/widgets/dialogs/radio-group-dialog.dart b/lib/widgets/dialogs/radio-group-dialog.dart new file mode 100644 index 00000000..5eff11bd --- /dev/null +++ b/lib/widgets/dialogs/radio-group-dialog.dart @@ -0,0 +1,101 @@ +import 'package:diplomaticquarterapp/models/id-name-pair.dart'; +import 'package:flutter/material.dart'; + +// AppToast.showErrorToast(message: "Please select Time Slot to continue"); + +class RadioGroupDialog extends StatefulWidget { + + final BuildContext context; + final title; + final List list; + final okText; + final cancelText; + final Function(IdNamePair) okFunction; + final Function cancelFunction; + IdNamePair selectedValue; + + RadioGroupDialog( + {@required this.context, + @required this.title, + @required this.list, + @required this.okText, + @required this.cancelText, + @required this.okFunction, + @required this.cancelFunction}); + + + @override + RadioGroupState createState() => RadioGroupState(); +} + +class RadioGroupState extends State { + + @override + void initState() { + super.initState(); + widget.selectedValue = widget.selectedValue ?? widget.list[0]; + } + + @override + Widget build(BuildContext context) { + return showAlertDialog(context); + } + + showAlertDialog(BuildContext context) { + // set up the buttons + Widget cancelButton = FlatButton( + child: Text(this.widget.cancelText), + onPressed: () { + Navigator.of(context).pop(); + }); + Widget continueButton = + FlatButton(child: Text(this.widget.okText), onPressed: () { + this.widget.okFunction(widget.selectedValue); + Navigator.of(context).pop(); + }); + + // set up the AlertDialog + AlertDialog alert = AlertDialog( + title: Text(widget.title), + content: createDialogGroup(), + actions: [ + cancelButton, + continueButton, + ], + ); + return alert; + } + + static closeAlertDialog(BuildContext context) { + Navigator.of(context).pop(); + } + + Widget createDialogGroup(){ + return Container( + height: MediaQuery.of(context).size.height * 0.3, + child: SingleChildScrollView( + child: Column( + children: [ + Container( + child: Column( + children: + widget.list.map((data) => RadioListTile( + title: Text("${data.name}"), + groupValue: widget.selectedValue.id, + value: data.id, + onChanged: (val) { + setState(() { + widget.selectedValue = data ; + }); + }, + )).toList(), + ), + ), + + ], + ), + ), + ); + } + +} diff --git a/lib/widgets/others/app_scaffold_pharmacy_widget.dart b/lib/widgets/others/app_scaffold_pharmacy_widget.dart new file mode 100644 index 00000000..e92ff17a --- /dev/null +++ b/lib/widgets/others/app_scaffold_pharmacy_widget.dart @@ -0,0 +1,114 @@ +import 'package:diplomaticquarterapp/config/config.dart'; +import 'package:diplomaticquarterapp/core/service/AuthenticatedUserObject.dart'; +import 'package:diplomaticquarterapp/core/viewModels/base_view_model.dart'; +import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; +import 'package:diplomaticquarterapp/pages/landing/landing_page.dart'; +import 'package:diplomaticquarterapp/routes.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:diplomaticquarterapp/widgets/others/bottom_bar.dart'; +import 'package:diplomaticquarterapp/widgets/progress_indicator/app_loader_widget.dart'; +import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; +import 'package:diplomaticquarterapp/widgets/robo-search/robosearch.dart'; +import 'package:diplomaticquarterapp/widgets/robo-search/search.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:font_awesome_flutter/font_awesome_flutter.dart'; +import 'package:provider/provider.dart'; + +import '../../locator.dart'; +import 'floating_button_search.dart'; +import '../progress_indicator/app_loader_widget.dart'; +import 'arrow_back.dart'; +import 'network_base_view.dart'; +import 'not_auh_page.dart'; + +class PharmacyAppScaffold extends StatelessWidget { + final String appBarTitle; + final Widget body; + final Widget bottomSheet; + final bool isLoading; + final bool isShowAppBar; + final bool hasAppBarParam; + final BaseViewModel baseViewModel; + final bool isBottomBar; + final Widget floatingActionButton; + final String title; + final String description; + final bool isShowDecPage; + final Color backgroundColor; + + AuthenticatedUserObject authenticatedUserObject = + locator(); + + PharmacyAppScaffold( + {@required this.body, + this.appBarTitle = '', + this.isLoading = false, + this.isShowAppBar = false, + this.hasAppBarParam, + this.bottomSheet, + this.baseViewModel, + this.floatingActionButton, + this.title, + this.description, + this.isShowDecPage = true, + this.isBottomBar, + this.backgroundColor}); + + @override + Widget build(BuildContext context) { + AppGlobal.context = context; + + return Scaffold( + backgroundColor: + backgroundColor ?? Theme.of(context).scaffoldBackgroundColor, + appBar: isShowAppBar + ? AppBar( + elevation: 0, + backgroundColor: Color(0xff5AB145), + textTheme: TextTheme( + headline6: + TextStyle(color: Colors.white, fontWeight: FontWeight.bold), + ), + title: Text(authenticatedUserObject.isLogin + ? appBarTitle.toUpperCase() + : TranslationBase.of(context).serviceInformationTitle), + leading: Builder( + builder: (BuildContext context) { + return ArrowBack(); + }, + ), + centerTitle: true, + actions: [], + ) + : null, + body: (!authenticatedUserObject.isLogin && isShowDecPage) + ? NotAutPage( + title: appBarTitle, + description: description, + ) + : baseViewModel != null + ? NetworkBaseView( + child: buildBodyWidget(), + baseViewModel: baseViewModel, + ) + : buildBodyWidget(), + bottomSheet: bottomSheet, + floatingActionButton: floatingActionButton ?? floatingActionButton, + // bottomNavigationBar: + // this.isBottomBar == true ? BottomBarSearch() : SizedBox() + // floatingActionButton: FloatingSearchButton(), + ); + } + + buildAppLoaderWidget(bool isLoading) { + return isLoading ? AppLoaderWidget() : Container(); + } + + buildBodyWidget() { + // return body; //Stack(children: [body, buildAppLoaderWidget(isLoading)]); + return Stack(children: [ + body, /*FloatingSearchButton()*/ + ]); + } +} diff --git a/lib/widgets/others/app_scaffold_widget.dart b/lib/widgets/others/app_scaffold_widget.dart index 05b9946b..2e831963 100644 --- a/lib/widgets/others/app_scaffold_widget.dart +++ b/lib/widgets/others/app_scaffold_widget.dart @@ -80,27 +80,18 @@ class AppScaffold extends StatelessWidget { AppGlobal.context = context; PreferredSizeWidget appBar; - if (this.appBarWidget == null) { - PreferredSizeWidget appBarWidget = AppBarWidget( + + return Scaffold( + backgroundColor: + backgroundColor ?? Theme.of(context).scaffoldBackgroundColor, + appBar: isShowAppBar? AppBarWidget( appBarTitle, appBarIcons, isShowAppBar, isPharmacy: isPharmacy, isShowDecPage: isShowDecPage, image: image, - ); - appBar = preferredSize == 0 - ? appBarWidget - : PreferredSize( - child: appBarWidget, - preferredSize: Size.fromHeight(preferredSize)); - } else { - appBar = this.appBarWidget; - } - return Scaffold( - backgroundColor: - backgroundColor ?? Theme.of(context).scaffoldBackgroundColor, - appBar: appBar, + ):null, body: (!Provider.of(context, listen: false).isLogin && isShowDecPage) ? NotAutPage( @@ -155,6 +146,7 @@ class AppBarWidget extends StatelessWidget with PreferredSizeWidget { } Widget buildAppBar(BuildContext context) { + ProjectViewModel projectViewModel = Provider.of(context); return isShowAppBar ? AppBar( elevation: 0, @@ -164,13 +156,15 @@ class AppBarWidget extends StatelessWidget with PreferredSizeWidget { headline6: TextStyle(color: Colors.white, fontWeight: FontWeight.bold), ), - title: Texts( - authenticatedUserObject.isLogin || !isShowDecPage - ? appBarTitle.toUpperCase() - : TranslationBase.of(context).serviceInformationTitle, - color: Colors.white, - bold: true, - ), + title: Text( + authenticatedUserObject.isLogin || !isShowDecPage + ? appBarTitle.toUpperCase() + : TranslationBase.of(context).serviceInformationTitle, + style: TextStyle( + fontWeight: FontWeight.bold, + color: Colors.white, + fontFamily: + projectViewModel.isArabic ? 'Cairo' : 'WorkSans')), leading: Builder( builder: (BuildContext context) { return ArrowBack(); @@ -187,25 +181,7 @@ class AppBarWidget extends StatelessWidget with PreferredSizeWidget { .popUntil(ModalRoute.withName('/')); }) : Container(), - image != null - ? InkWell( - onTap: () => Navigator.push( - context, - FadePage( - page: InsuranceUpdate(), - ), - ), - child: Padding( - padding: const EdgeInsets.all(8.0), - child: Image.asset( - image, - height: SizeConfig.heightMultiplier * 5, - width: SizeConfig.heightMultiplier * 5, - color: Colors.white, - ), - ), - ) - : IconButton( + IconButton( icon: Icon(FontAwesomeIcons.home), color: Colors.white, onPressed: () { diff --git a/lib/widgets/others/points-expandable-notifier.dart b/lib/widgets/others/points-expandable-notifier.dart new file mode 100644 index 00000000..5f969765 --- /dev/null +++ b/lib/widgets/others/points-expandable-notifier.dart @@ -0,0 +1,77 @@ +import 'package:expandable/expandable.dart'; +import 'package:flutter/material.dart'; + +class PointsExpandableNotifier extends StatefulWidget { + final Widget headerWidget; + final Widget bodyWidget; + final Widget collapsed; + final bool isExpand; + bool expandFlag = false; + var controller = new ExpandableController(); + + PointsExpandableNotifier( + {this.headerWidget, this.bodyWidget, this.collapsed, this.isExpand}); + + @override + _PointsExpandableNotifierState createState() => + _PointsExpandableNotifierState(); +} + +class _PointsExpandableNotifierState extends State { + @override + Widget build(BuildContext context) { + setState(() { + if (widget.isExpand == true) { + widget.expandFlag = widget.isExpand; + widget.controller.expanded = true; + } + }); + + return ExpandableNotifier( + child: Padding( + padding: const EdgeInsets.only(left: 0, right: 0), + child: Column( + children: [ + SizedBox( + child: widget.headerWidget, + ), + ScrollOnExpand( + scrollOnExpand: true, + scrollOnCollapse: false, + child: ExpandablePanel( + theme: const ExpandableThemeData( + headerAlignment: ExpandablePanelHeaderAlignment.center, + tapBodyToCollapse: true, + ), + // header: widget.headerWidget, + /* + // setState(() { + // widget.expandFlag = !widget.expandFlag; + // if (widget.expandFlag == true) { + // widget.controller.expanded = true; + // } else { + // widget.controller.expanded = false; + // } + // }); + */ + collapsed: Container(), + expanded: widget.bodyWidget, + builder: (_, collapsed, expanded) { + return Padding( + padding: EdgeInsets.only(left: 0, right: 0, bottom: 0), + child: Expandable( + controller: widget.controller, + collapsed: collapsed, + expanded: expanded, + theme: const ExpandableThemeData(crossFadePoint: 0), + ), + ); + }, + ), + ), + ], + ), + ), + ); + } +} diff --git a/lib/widgets/pharmacy/bottom_nav_pharmacy_bar.dart b/lib/widgets/pharmacy/bottom_nav_pharmacy_bar.dart new file mode 100644 index 00000000..d9717c38 --- /dev/null +++ b/lib/widgets/pharmacy/bottom_nav_pharmacy_bar.dart @@ -0,0 +1,108 @@ +import 'package:diplomaticquarterapp/pages/landing/home_page.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:eva_icons_flutter/eva_icons_flutter.dart'; +import 'package:flutter/material.dart'; + +import 'bottom_nav_pharmacy_home_item.dart'; +import 'bottom_nav_pharmacy_item.dart'; + +class BottomNavPharmacyBar extends StatefulWidget { + final ValueChanged changeIndex; + final int index; + BottomNavPharmacyBar({Key key, this.changeIndex, this.index}) + : super(key: key); + + @override + _BottomNavPharmacyBarState createState() => _BottomNavPharmacyBarState(); +} + +class _BottomNavPharmacyBarState extends State { + int _index = 0; + + _changeIndex(int index) { + widget.changeIndex(index); + } + + @override + Widget build(BuildContext context) { + return BottomAppBar( + elevation: 4, + shape: CircularNotchedRectangle(), + color: Colors.white, + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 18), + child: Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + BottomNavHomeItem( + icon: EvaIcons.image, + activeIcon: EvaIcons.image, + changeIndex: _changeIndex, + index: widget.index, + currentIndex: 0, + ), + + Container( + height: 65.0, + child: Center( + child: VerticalDivider( + color: Colors.grey, + thickness: 0.5, + width: 0.3, + indent: 25.5, + ), + ), + ), + + BottomNavPharmacyItem( + icon: EvaIcons.list, + activeIcon: EvaIcons.list, + changeIndex: _changeIndex, + index: widget.index, + currentIndex: 1, + title: TranslationBase.of(context).categorise, + ), +// Expanded( +// child: SizedBox( +// height: 50, +// child: Column( +// mainAxisSize: MainAxisSize.min, +// mainAxisAlignment: MainAxisAlignment.center, +// children: [ +// SizedBox(height: 22), +// ], +// ), +// ), +// ), + + // Added Calendar Icon to access book appointment flow + BottomNavPharmacyItem( + icon: EvaIcons.heart, + activeIcon: EvaIcons.heart, + changeIndex: _changeIndex, + index: widget.index, + currentIndex: 2, + title: TranslationBase.of(context).wishList), + + BottomNavPharmacyItem( + icon: EvaIcons.person, + activeIcon: EvaIcons.person, + changeIndex: _changeIndex, + index: widget.index, + currentIndex: 3, + title: TranslationBase.of(context).myAccount, + ), + BottomNavPharmacyItem( + icon: EvaIcons.shoppingCart, + activeIcon: EvaIcons.shoppingCart, + changeIndex: _changeIndex, + index: widget.index, + currentIndex: 4, + title: TranslationBase.of(context).cart) + ], + ), + ), + ); + } +} diff --git a/lib/widgets/pharmacy/bottom_nav_pharmacy_home_item.dart b/lib/widgets/pharmacy/bottom_nav_pharmacy_home_item.dart new file mode 100644 index 00000000..c5c3519b --- /dev/null +++ b/lib/widgets/pharmacy/bottom_nav_pharmacy_home_item.dart @@ -0,0 +1,74 @@ +import 'package:diplomaticquarterapp/pages/landing/home_page.dart'; +import 'package:diplomaticquarterapp/pages/landing/landing_page.dart'; +import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; +import 'package:flutter/material.dart'; + +class BottomNavHomeItem extends StatelessWidget { + final IconData icon; + final Image image; + + final ValueChanged changeIndex; + final int index; + final int currentIndex; + final Function onTap; + final IconData activeIcon; + + BottomNavHomeItem( + {this.icon, + this.changeIndex, + this.index, + this.currentIndex, + this.activeIcon, + this.onTap, + this.image}); + + @override + Widget build(BuildContext context) { + return Expanded( + child: SizedBox( + // height: 72.0, + child: Material( + type: MaterialType.transparency, + child: InkWell( + highlightColor: Colors.transparent, + splashColor: Colors.transparent, + onTap: () => { + Navigator.push( + context, + MaterialPageRoute(builder: (context) => LandingPage()), + ), + }, + child: Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + SizedBox( + height: 15, + ), + currentIndex == index + ? Divider( + // color: Color(0xff5AB145), + thickness: 0.5, + ) + : Divider( + thickness: 0, + ), + Container( + child: Image.asset( + 'assets/images/habib-logo.png', + height: 35.0, + ), + ), + SizedBox( + height: 11, + ), + + // Added TextAlign Property + ], + ), + ), + ), + ), + ); + } +} diff --git a/lib/widgets/pharmacy/bottom_nav_pharmacy_item.dart b/lib/widgets/pharmacy/bottom_nav_pharmacy_item.dart new file mode 100644 index 00000000..9d46e2eb --- /dev/null +++ b/lib/widgets/pharmacy/bottom_nav_pharmacy_item.dart @@ -0,0 +1,76 @@ +import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; +import 'package:flutter/material.dart'; + +class BottomNavPharmacyItem extends StatelessWidget { + final String title; + final IconData icon; + + final ValueChanged changeIndex; + final int index; + final int currentIndex; + final Function onTap; + + final IconData activeIcon; + BottomNavPharmacyItem( + {this.icon, + this.changeIndex, + this.index, + this.currentIndex, + this.activeIcon, + this.title, + this.onTap}); + + @override + Widget build(BuildContext context) { + return Expanded( + child: SizedBox( + // height: 72.0, + child: Material( + type: MaterialType.transparency, + child: InkWell( + highlightColor: Colors.transparent, + splashColor: Colors.transparent, + onTap: () => changeIndex(currentIndex), + child: Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + SizedBox( + height: 15, + ), + currentIndex == index + ? Divider( + color: Color(0xff5AB145), + thickness: 3.5, + ) + : Divider( + thickness: 0, + ), + Container( + child: Icon(currentIndex == index ? activeIcon : icon, + color: currentIndex == index + ? Theme.of(context).primaryColor + : Theme.of(context).primaryColor, + size: 22.0), + ), + SizedBox( + height: 11, + ), + + // Added TextAlign Property + Texts( + title, + textAlign: TextAlign.center, + color: currentIndex == index + ? Theme.of(context).primaryColor + : Theme.of(context).primaryColor, + fontSize: 11, + ), + ], + ), + ), + ), + ), + ); + } +} diff --git a/lib/widgets/pharmacy/drug_item.dart b/lib/widgets/pharmacy/drug_item.dart index d1e98ecf..b50f825a 100644 --- a/lib/widgets/pharmacy/drug_item.dart +++ b/lib/widgets/pharmacy/drug_item.dart @@ -38,23 +38,28 @@ class _MedicineItemWidgetState extends State { children: [ if (widget.url != null) Container( - + height: 39.0, + width: 39.0, child: ClipRRect( borderRadius: BorderRadius.all(Radius.circular(7)), child: Image.memory( dataFromBase64String(widget.url), - height: SizeConfig.imageSizeMultiplier * 19, - width: SizeConfig.imageSizeMultiplier * 18, + height: SizeConfig.imageSizeMultiplier * 11, + width: SizeConfig.imageSizeMultiplier * 11, fit: BoxFit.cover, ), ), ), - SizedBox(width: 10,), Expanded( child: Center( - child: Texts( - widget.label, - fontSize: 13, + child: Padding( + padding: EdgeInsets.all(2.5), + child: Align( + alignment: Alignment.centerLeft, + child: Texts( + widget.label, + ), + ), ), ), ) diff --git a/pubspec.yaml b/pubspec.yaml index e91a09af..785e831d 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -183,6 +183,7 @@ flutter: # assets: assets: - assets/images/ + - assets/images/pharmacy/ - assets/images/medical/ - assets/images/new-design/ - assets/images/login/ @@ -194,6 +195,8 @@ flutter: - assets/tracker/ - assets/images/AlHabibMedicalService/ - assets/images/pharmacy_module/ + - assets/images/pharmacy_module/payment/ + - assets/images/pharmacy_module/lakum/ fonts: