diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
index 78567db..52fe383 100644
--- a/android/app/src/main/AndroidManifest.xml
+++ b/android/app/src/main/AndroidManifest.xml
@@ -30,8 +30,33 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/lib/Utils/Common/MainController.dart b/lib/Utils/Common/MainController.dart
index 8dfdb71..1e0f997 100644
--- a/lib/Utils/Common/MainController.dart
+++ b/lib/Utils/Common/MainController.dart
@@ -10,7 +10,7 @@ class MainController extends GetxController {
var currentTab = [
const HomeScreen(),
const ShortTrade(),
- const Holdings(),
+ const Portfolio(),
].obs;
void updateTab(int index) {
diff --git a/lib/Utils/api_urls.dart b/lib/Utils/api_urls.dart
index c5ee233..4c6f38b 100644
--- a/lib/Utils/api_urls.dart
+++ b/lib/Utils/api_urls.dart
@@ -1,4 +1,8 @@
class ApiUrls {
+// PIE BASE URL FOR SMALL CASE --> NEED TO BE UPDATED
+
+ static const String pieBase = "https://app.piadvisors.in/";
+
//Base URL
static const base = "http://192.168.50.117/Trader_circuit/api/";
@@ -13,4 +17,9 @@ class ApiUrls {
//FAQ API
static String faqApi = "${base}getFaq";
+
+ //RISK PROFILE API
+ static String getRiskProfileQuestionAnswerApi = "${base}riskProfileQueAns";
+ static String addRiskProfileQuestionAnswerApi =
+ "${base}getRiskProfileQuestionAnswerApi";
}
diff --git a/lib/data/network/network_api_services.dart b/lib/data/network/network_api_services.dart
index 1427fdd..fc04396 100644
--- a/lib/data/network/network_api_services.dart
+++ b/lib/data/network/network_api_services.dart
@@ -13,7 +13,7 @@ class NetworkApiServices extends BaseApiServices {
Dio dio = Dio();
@override
- Future getApi(String url) async {
+ Future getApi(String url, {bool isAuth = false}) async {
if (kDebugMode) {
print("api url is >>> $url");
}
@@ -22,14 +22,10 @@ class NetworkApiServices extends BaseApiServices {
String? token = prefs.getString('token').toString();
log(token);
try {
- response = await dio.get(
- url,
- // options: Options(headers: {
- // 'authorization': "Bearer $token",
-
- // // "device-id": deviceId
- // })
- );
+ response = await dio.get(url,
+ options: Options(headers: {
+ isAuth ? 'authorization' : "Bearer $token": "",
+ }));
if (response.statusCode == 200) {
return ResponseData(
@@ -58,7 +54,7 @@ class NetworkApiServices extends BaseApiServices {
}
@override
- Future postApi(data, String url) async {
+ Future postApi(data, String url, {bool isAuth = false}) async {
if (kDebugMode) {
print("data >>> $data");
print("api url is >>> $url");
@@ -70,17 +66,9 @@ class NetworkApiServices extends BaseApiServices {
try {
response = await dio.post(url,
data: data,
- options: (token == null || token == "")
- ? Options(
- headers: {
- "Authorization":
- "Basic KzIkcVBiSlIzNncmaGUoalMmV0R6ZkpqdEVoSlVLVXA6dCRCZHEmSnQmc3Y0eUdqY0VVcTg5aEVZZHVSalhIMnU=",
- },
- )
- : Options(headers: {
- "Authorization": "Bearer $token",
- //'access-token': token,
- }));
+ options: Options(headers: {
+ isAuth ? 'authorization' : "Bearer $token": "",
+ }));
} on Exception catch (e) {
if (e is DioException) {
log(e.response.toString());
diff --git a/lib/main.dart b/lib/main.dart
index 85af04a..3f67750 100644
--- a/lib/main.dart
+++ b/lib/main.dart
@@ -7,6 +7,7 @@ import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:traderscircuit/firebase_options.dart';
+import 'package:scgateway_flutter_plugin/scgateway_flutter_plugin.dart';
import 'package:traderscircuit/resources/routes/route_name.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:traderscircuit/resources/routes/routes.dart';
@@ -28,6 +29,14 @@ Future main() async {
// GlobalVariables globalVariables = GlobalVariables();
//token = prefs.getString('token');
// OnBoard = prefs.getBool("OnBoard");
+
+ //smallcase
+ ScgatewayFlutterPlugin.setConfigEnvironment(
+ GatewayEnvironment.PRODUCTION,
+ 'pi-advisors',
+ false,
+ [],
+ );
SystemChrome.setPreferredOrientations([
DeviceOrientation.portraitUp,
]).then((value) => runApp(const MyApp()));
diff --git a/lib/model/SmallCaseModel/broker_account_model.dart b/lib/model/SmallCaseModel/broker_account_model.dart
new file mode 100644
index 0000000..16b1a4e
--- /dev/null
+++ b/lib/model/SmallCaseModel/broker_account_model.dart
@@ -0,0 +1,34 @@
+class BrokerAccountModel {
+ final String? id;
+ final String? userId;
+ final String? brokerName;
+ final String? authToken;
+ final String? txnId;
+
+ const BrokerAccountModel({
+ required this.id,
+ required this.userId,
+ required this.brokerName,
+ required this.authToken,
+ required this.txnId,
+ });
+
+ factory BrokerAccountModel.fromJson(Map json) {
+ return BrokerAccountModel(
+ id: json['id'].toString(),
+ userId: json['user_id'].toString(),
+ brokerName: json['broker_name'] as String?,
+ authToken: json['auth_token'] as String?,
+ txnId: json['transaction_id'] as String?,
+ );
+ }
+
+ Map toJson() {
+ final Map data = {};
+ data['user_id'] = userId;
+ data['broker_name'] = brokerName;
+ data['auth_token'] = authToken;
+ data['transaction_id'] = txnId;
+ return data;
+ }
+}
diff --git a/lib/view/MainScreen/Portfolio/PortfolioEmpty.dart b/lib/view/MainScreen/Portfolio/PortfolioEmpty.dart
index 72244f6..cff2cdd 100644
--- a/lib/view/MainScreen/Portfolio/PortfolioEmpty.dart
+++ b/lib/view/MainScreen/Portfolio/PortfolioEmpty.dart
@@ -1,14 +1,23 @@
+import 'dart:async';
+import 'dart:convert';
+
+import 'package:async/async.dart';
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import 'package:lottie/lottie.dart';
+import 'package:scgateway_flutter_plugin/scgateway_flutter_plugin.dart';
import 'package:traderscircuit/Utils/Common/CommonBottomNavigation.dart';
import 'package:traderscircuit/Utils/Common/commonBotton.dart';
import 'package:traderscircuit/Utils/text.dart';
import 'package:traderscircuit/view/MainScreen/MainScreen.dart';
+import 'package:traderscircuit/view/MainScreen/Portfolio/Holdings.dart';
import 'package:traderscircuit/view/Sidemenu/Sidemenu.dart';
import 'package:traderscircuit/view/onBoarding/splashScreen1.dart';
+import '../../../model/SmallCaseModel/broker_account_model.dart';
+import '../../../view_model/SmallCaseApi/smallcase_api_methods.dart';
+
class Portfolio extends StatefulWidget {
const Portfolio({super.key});
@@ -20,13 +29,238 @@ class _PortfolioState extends State {
GlobalKey _scaffoldKey1 = GlobalKey();
List containerTexts = ["Swing Trade", "Multibagger", "Options"];
final selectedIndex = 0.obs;
+
+ FutureGroup fetchUserIdAndBrokerAccounts = FutureGroup();
+ List myBrokerAccounts = [];
+ @override
+ void initState() {
+ // fetchUserIdAndBrokerAccounts.add(getUserId()); // TODO Need to add userid here
+ fetchUserIdAndBrokerAccounts.add(fetchBrokerAccounts());
+ fetchUserIdAndBrokerAccounts.close();
+ // fetchUserIdAndBrokerAccounts.future.then((value) {
+ // int userId = value[0];
+ // List brokerAccounts = value[1];
+ // try {
+ // myBrokerAccounts.addAll(brokerAccounts
+ // .where((element) => element.userId == userId.toString()));
+ // } catch (e) {}
+ // debugPrint("myBrokerAccounts.length ${myBrokerAccounts.length}");
+ // debugPrint("BrokerAccounts.length ${brokerAccounts.length}");
+ // if (myBrokerAccounts.isEmpty) {
+ // setState(() {
+ // body = Center(
+ // child: Column(
+ // mainAxisSize: MainAxisSize.min,
+ // children: [
+ // const Text("You need to add broker account"),
+ // const Text("to fetch holdings"),
+ // const SizedBox(height: 6),
+ // OutlinedButton(
+ // onPressed: () {
+ // //Get.off(Broker());
+ // Get.to(() => Broker());
+ // },
+ // child: const Text("Brokerage Account"),
+ // )
+ // ],
+ // ));
+ // });
+ // } else {
+ // setBodyToBrokers();
+ // }
+ // });
+
+ super.initState();
+ }
+
+ // void setBodyToBrokers() {
+ // setState(() {
+ // body = Padding(
+ // padding: const EdgeInsets.only(top: 28, left: 28, right: 28),
+ // child: Column(mainAxisSize: MainAxisSize.min, children: [
+ // const Text("Please select your broker account"),
+ // const SizedBox(height: 8),
+ // Expanded(
+ // child: ListView.builder(
+ // itemCount: myBrokerAccounts.length,
+ // itemBuilder: (context, index) {
+ // return OutlinedButton(
+ // onPressed: () {
+ // setState(() {
+ // body = const Center(child: CircularProgressIndicator());
+ // });
+ // fetchHoldingsImportTxnId(
+ // myBrokerAccounts.elementAt(index).authToken!)
+ // .then((txnIdResponse) {
+ // if (txnIdResponse.statusCode == 200) {
+ // debugPrint('SESSION STARTED');
+ // debugPrint(
+ // 'AUTH TOKEN: ${myBrokerAccounts.elementAt(index).authToken!}');
+ // fetchHoldingsImportTxnId(
+ // myBrokerAccounts.elementAt(index).authToken!)
+ // .then((txnRes) {
+ // String txnId =
+ // jsonDecode(txnRes.body)['data']['transactionId'];
+ // debugPrint('TXN ID $txnId');
+ // ScgatewayFlutterPlugin.triggerGatewayTransaction(
+ // txnId)
+ // .then(
+ // (txnRes) {
+ // debugPrint('TXN RES $txnRes');
+ // if (txnRes != null) {
+ // fetchHoldings(
+ // //holdingsAuthToken
+ // myBrokerAccounts
+ // .elementAt(index)
+ // .authToken!)
+ // .then(
+ // (holdings) {
+ // setState(() {
+ // // body = netWorthPage(holdings);
+ // });
+ // },
+ // );
+ // }
+ // },
+ // );
+ // });
+ // } else {
+ // debugPrint('SESSION EXPIRED');
+ // onTxnTimeout();
+ // }
+ // });
+ // },
+ // child: Text(myBrokerAccounts.elementAt(index).brokerName!),
+ // );
+ // },
+ // ),
+ // )
+ // ]),
+ // );
+ // });
+ // }
+
+ // void onTxnTimeout() {
+ // bool showDialogContent = true;
+ // bool replaceDialogContentWithLoader = false;
+ // showDialog(
+ // barrierDismissible: false,
+ // context: context,
+ // builder: (context) => AlertDialog(content: StatefulBuilder(
+ // builder: (context, setDialogState) {
+ // return Column(
+ // mainAxisSize: MainAxisSize.min,
+ // children: [
+ // Visibility(
+ // visible: showDialogContent,
+ // child: Column(
+ // mainAxisSize: MainAxisSize.min,
+ // crossAxisAlignment: CrossAxisAlignment.start,
+ // children: [
+ // const Text("Transaction Timeout",
+ // style: TextStyle(
+ // fontWeight: FontWeight.bold,
+ // fontSize: 18,
+ // )),
+ // const SizedBox(height: 18),
+ // const Text("You need to login again to continue"),
+ // const SizedBox(height: 18),
+ // Row(
+ // mainAxisAlignment: MainAxisAlignment.end,
+ // children: [
+ // OutlinedButton(
+ // onPressed: () {
+ // setBodyToBrokers();
+ // Get.back();
+ // },
+ // child: const Text("Cancel"),
+ // ),
+ // const SizedBox(width: 12),
+ // ElevatedButton(
+ // onPressed: () {
+ // setDialogState(() {
+ // showDialogContent = false;
+ // replaceDialogContentWithLoader = true;
+ // });
+ // //login again
+ // fetchAuthToken().then((fetchedAuthToken) {
+ // debugPrint(
+ // "fetchedAuthToken $fetchedAuthToken");
+ // fetchBrokerConnectTxnId(
+ // authToken: fetchedAuthToken)
+ // .then(
+ // (txnId) =>
+ // ScgatewayFlutterPlugin.initGateway(
+ // fetchedAuthToken)
+ // .then(
+ // (value) => ScgatewayFlutterPlugin
+ // .triggerGatewayTransaction(
+ // txnId,
+ // ).then(
+ // (loginRes) {
+ // if (loginRes != null) {
+ // var data =
+ // jsonDecode(loginRes)['data'];
+ // if (data != null) {
+ // String authToken = jsonDecode(
+ // data)['smallcaseAuthToken'];
+ // String brokerName =
+ // jsonDecode(data)['broker'];
+ // String txnId = jsonDecode(
+ // data)['transactionId'];
+ // getUserId().then((userId) {
+ // postBrokerAccount(
+ // userId: userId!
+ // .toString(),
+ // brokerName:
+ // brokerName,
+ // authToken: authToken,
+ // txnId: txnId)
+ // .then((isPosted) {
+ // if (isPosted) {
+ // // Get.back();
+ // // setBodyToBrokers();
+ // Get.off(Holdings());
+ // }
+ // });
+ // });
+ // }
+ // }
+ // },
+ // ),
+ // ),
+ // );
+ // });
+ // },
+ // child: const Text("Login Again"),
+ // ),
+ // ],
+ // )
+ // ],
+ // ),
+ // ),
+ // Visibility(
+ // visible: replaceDialogContentWithLoader,
+ // child: const Padding(
+ // padding: EdgeInsets.symmetric(vertical: 28.0),
+ // child: Center(
+ // child: CircularProgressIndicator(),
+ // ),
+ // ),
+ // )
+ // ],
+ // );
+ // },
+ // )));
+ // }
+
@override
Widget build(BuildContext context) {
return Scaffold(
key: _scaffoldKey1,
backgroundColor: Colors.black,
drawerEnableOpenDragGesture: false,
- drawer: Container(child: SideMenu()),
+ drawer: Container(child: const SideMenu()),
extendBody: true,
appBar: AppBar(
scrolledUnderElevation: 0.0,
@@ -49,12 +283,13 @@ class _PortfolioState extends State {
),
body: Stack(
children: [
- CommonBlurLeft(),
- CommonBlurRight(),
+ const CommonBlurLeft(),
+ const CommonBlurRight(),
Stack(
children: [
Padding(
- padding: EdgeInsets.symmetric(horizontal: 16, vertical: 16),
+ padding:
+ const EdgeInsets.symmetric(horizontal: 16, vertical: 16),
child: Column(
children: [
Row(
@@ -75,15 +310,73 @@ class _PortfolioState extends State {
fontWeight: FontWeight.w400,
),
),
- Spacer(),
+ const Spacer(),
LottieBuilder.asset(
"assets/images/empty.json",
width: 200.w,
height: 200.h,
),
- Spacer(),
- CommonBtn(text: "Add"),
- Spacer(),
+ const Spacer(),
+ CommonBtn(
+ text: "Add",
+ onTap: () {
+ // replaceAddAccountBtnWithLoader();
+ // Timer.periodic(Duration(seconds: 8), (timer) {
+ // // replaceLoaderWithAddAccountBtn();
+ // timer.cancel();
+ // });
+ fetchAuthToken().then((fetchedAuthToken) {
+ debugPrint("fetchedAuthToken $fetchedAuthToken");
+ fetchBrokerConnectTxnId(authToken: fetchedAuthToken)
+ .then(
+ (txnId) => ScgatewayFlutterPlugin.initGateway(
+ fetchedAuthToken)
+ .then(
+ (value) => ScgatewayFlutterPlugin
+ .triggerGatewayTransaction(
+ txnId,
+ ).then(
+ (loginRes) {
+ if (loginRes != null) {
+ var data = jsonDecode(loginRes)['data'];
+ if (data != null) {
+ String authToken = jsonDecode(
+ data)['smallcaseAuthToken'];
+ String brokerName =
+ jsonDecode(data)['broker'];
+ String txnId =
+ jsonDecode(data)['transactionId'];
+ // getUserId().then((userId) {
+ postBrokerAccount(
+ userId: "12",
+ brokerName: brokerName,
+ authToken: authToken,
+ txnId: txnId)
+ .then((isPosted) {
+ // replaceLoaderWithAddAccountBtn();
+ // Navigator.pushReplacement(
+ // context,
+ // MaterialPageRoute(
+ // builder: (context) =>
+ // Broker()));
+ ScaffoldMessenger.of(context)
+ .clearSnackBars();
+ ScaffoldMessenger.of(context)
+ .showSnackBar(SnackBar(
+ content: Text(
+ 'New broker account is added')));
+ });
+ // });
+ // replaceLoaderWithAddAccountBtn();
+ }
+ }
+ },
+ ),
+ ),
+ );
+ });
+ }),
+ const Spacer(),
],
),
),
diff --git a/lib/view_model/RiskProfileApi/risk_profile_api.dart b/lib/view_model/RiskProfileApi/risk_profile_api.dart
new file mode 100644
index 0000000..fe5bcfb
--- /dev/null
+++ b/lib/view_model/RiskProfileApi/risk_profile_api.dart
@@ -0,0 +1,46 @@
+import 'dart:developer';
+
+import 'package:dio/dio.dart';
+
+import '../../Utils/api_urls.dart';
+import '../../Utils/base_manager.dart';
+import '../../data/network/network_api_services.dart';
+
+class RiskProfileApi {
+ Future> getRiskProfileData() async {
+ final response = await NetworkApiServices()
+ .getApi(ApiUrls.getRiskProfileQuestionAnswerApi, isAuth: true);
+ log(response.data.toString());
+ if (response.status == ResponseStatus.SUCCESS) {
+ Map responseData =
+ Map.from(response.data);
+ if (responseData['status'] == "success") {
+ return response;
+ } else {
+ return ResponseData(
+ responseData['message'], ResponseStatus.FAILED);
+ }
+ }
+ return response;
+ }
+
+ Future> addRiskProfileData(FormData data) async {
+ final response = await NetworkApiServices().postApi(
+ data,
+ ApiUrls.addRiskProfileQuestionAnswerApi,
+ isAuth: true,
+ );
+ log(response.data.toString());
+ if (response.status == ResponseStatus.SUCCESS) {
+ Map responseData =
+ Map.from(response.data);
+ if (responseData['status'] == "success") {
+ return response;
+ } else {
+ return ResponseData(
+ responseData['message'], ResponseStatus.FAILED);
+ }
+ }
+ return response;
+ }
+}
diff --git a/lib/view_model/SmallCaseApi/smallcase_api_methods.dart b/lib/view_model/SmallCaseApi/smallcase_api_methods.dart
new file mode 100644
index 0000000..4726b06
--- /dev/null
+++ b/lib/view_model/SmallCaseApi/smallcase_api_methods.dart
@@ -0,0 +1,137 @@
+import 'dart:convert';
+import 'package:flutter/material.dart';
+import 'package:http/http.dart' as http;
+import 'package:scgateway_flutter_plugin/scgateway_flutter_plugin.dart';
+
+import '../../Utils/api_urls.dart';
+import '../../model/SmallCaseModel/broker_account_model.dart';
+
+// void openDashboardPage(BuildContext context) {
+// Navigator.pushReplacement(
+// context, MaterialPageRoute(builder: ((context) => PortfolioMainUI())));
+// }
+
+// void openEquityPage(BuildContext context, Map holdings) {
+// Navigator.push(
+// context,
+// MaterialPageRoute(
+// builder: ((context) => Equityinner(holdings: holdings))));
+// }
+
+//broker account table
+//fetch broker accounts
+Future> fetchBrokerAccounts() async {
+ final response = await http.Client()
+ .get(Uri.parse('${ApiUrls.pieBase}api/get_broker_account_data'));
+ final parsed = jsonDecode(response.body);
+ return parsed
+ .map((json) => BrokerAccountModel.fromJson(json))
+ .toList();
+}
+
+//delete broker account
+Future deleteBrokerAccount(int id) async {
+ final response = await http.Client()
+ .get(Uri.parse('${ApiUrls.pieBase}api/delete_brokerage_account/$id'));
+ if (response.statusCode == 200) return true;
+ return false;
+}
+
+//post broker account
+Future postBrokerAccount({
+ required String userId,
+ required String brokerName,
+ required String authToken,
+ required String txnId,
+}) async {
+ var response = await http.post(
+ Uri.parse('${ApiUrls.pieBase}api/add_broker_account'),
+ body: {
+ "user_id": userId,
+ "broker_name": brokerName,
+ "auth_token": authToken,
+ "transaction_id": txnId,
+ },
+ );
+ if (response.statusCode == 200) return true;
+ return false;
+}
+
+Future fetchAuthToken() async {
+ var response = await http.get(
+ Uri.parse(
+ '${ApiUrls.pieBase}api/get_small_case_auth_token/',
+ ),
+ );
+ return jsonDecode(response.body)['data'];
+}
+
+Future fetchBrokerConnectTxnId({required String authToken}) async {
+ var response = await http.get(
+ Uri.parse(
+ '${ApiUrls.pieBase}api/get_small_case_broker_connect_transaction/$authToken',
+ ),
+ );
+ return jsonDecode(response.body)['data']['transactionId'];
+}
+
+Future fetchHoldingsImportTxnId(String authToken) async {
+ var response = await http.get(
+ Uri.parse(
+ '${ApiUrls.pieBase}api/get_small_case_holding_import_transaction_id/$authToken',
+ ),
+ );
+ return response;
+}
+
+Future