diff --git a/asset/image/icon/payment/ic_kakaopay.svg b/asset/image/icon/payment/ic_kakaopay.svg
new file mode 100644
index 00000000..adb456b5
--- /dev/null
+++ b/asset/image/icon/payment/ic_kakaopay.svg
@@ -0,0 +1,44 @@
+
+
+
diff --git a/asset/image/icon/payment/ic_kakaopay_radio.svg b/asset/image/icon/payment/ic_kakaopay_radio.svg
deleted file mode 100644
index f42a7493..00000000
--- a/asset/image/icon/payment/ic_kakaopay_radio.svg
+++ /dev/null
@@ -1,9 +0,0 @@
-
diff --git a/lib/model/card_info/card_info.dart b/lib/model/card_info/card_info.dart
new file mode 100644
index 00000000..8c8bdeac
--- /dev/null
+++ b/lib/model/card_info/card_info.dart
@@ -0,0 +1,16 @@
+import 'package:freezed_annotation/freezed_annotation.dart';
+
+part 'card_info.freezed.dart';
+part 'card_info.g.dart';
+
+@freezed
+class CardInfo with _$CardInfo {
+ const factory CardInfo({
+ required int id,
+ required String cardCode,
+ required String? cardName,
+ required String cardNo,
+ required String cardAbleStatus,
+ }) = _CardInfo;
+ factory CardInfo.fromJson(Map json) => _$CardInfoFromJson(json);
+}
\ No newline at end of file
diff --git a/lib/model/card_info/card_info.freezed.dart b/lib/model/card_info/card_info.freezed.dart
new file mode 100644
index 00000000..7e018080
--- /dev/null
+++ b/lib/model/card_info/card_info.freezed.dart
@@ -0,0 +1,238 @@
+// coverage:ignore-file
+// GENERATED CODE - DO NOT MODIFY BY HAND
+// ignore_for_file: type=lint
+// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark
+
+part of 'card_info.dart';
+
+// **************************************************************************
+// FreezedGenerator
+// **************************************************************************
+
+T _$identity(T value) => value;
+
+final _privateConstructorUsedError = UnsupportedError(
+ 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#custom-getters-and-methods');
+
+CardInfo _$CardInfoFromJson(Map json) {
+ return _CardInfo.fromJson(json);
+}
+
+/// @nodoc
+mixin _$CardInfo {
+ int get id => throw _privateConstructorUsedError;
+ String get cardCode => throw _privateConstructorUsedError;
+ String? get cardName => throw _privateConstructorUsedError;
+ String get cardNo => throw _privateConstructorUsedError;
+ String get cardAbleStatus => throw _privateConstructorUsedError;
+
+ Map toJson() => throw _privateConstructorUsedError;
+ @JsonKey(ignore: true)
+ $CardInfoCopyWith get copyWith =>
+ throw _privateConstructorUsedError;
+}
+
+/// @nodoc
+abstract class $CardInfoCopyWith<$Res> {
+ factory $CardInfoCopyWith(CardInfo value, $Res Function(CardInfo) then) =
+ _$CardInfoCopyWithImpl<$Res, CardInfo>;
+ @useResult
+ $Res call(
+ {int id,
+ String cardCode,
+ String? cardName,
+ String cardNo,
+ String cardAbleStatus});
+}
+
+/// @nodoc
+class _$CardInfoCopyWithImpl<$Res, $Val extends CardInfo>
+ implements $CardInfoCopyWith<$Res> {
+ _$CardInfoCopyWithImpl(this._value, this._then);
+
+ // ignore: unused_field
+ final $Val _value;
+ // ignore: unused_field
+ final $Res Function($Val) _then;
+
+ @pragma('vm:prefer-inline')
+ @override
+ $Res call({
+ Object? id = null,
+ Object? cardCode = null,
+ Object? cardName = freezed,
+ Object? cardNo = null,
+ Object? cardAbleStatus = null,
+ }) {
+ return _then(_value.copyWith(
+ id: null == id
+ ? _value.id
+ : id // ignore: cast_nullable_to_non_nullable
+ as int,
+ cardCode: null == cardCode
+ ? _value.cardCode
+ : cardCode // ignore: cast_nullable_to_non_nullable
+ as String,
+ cardName: freezed == cardName
+ ? _value.cardName
+ : cardName // ignore: cast_nullable_to_non_nullable
+ as String?,
+ cardNo: null == cardNo
+ ? _value.cardNo
+ : cardNo // ignore: cast_nullable_to_non_nullable
+ as String,
+ cardAbleStatus: null == cardAbleStatus
+ ? _value.cardAbleStatus
+ : cardAbleStatus // ignore: cast_nullable_to_non_nullable
+ as String,
+ ) as $Val);
+ }
+}
+
+/// @nodoc
+abstract class _$$CardInfoImplCopyWith<$Res>
+ implements $CardInfoCopyWith<$Res> {
+ factory _$$CardInfoImplCopyWith(
+ _$CardInfoImpl value, $Res Function(_$CardInfoImpl) then) =
+ __$$CardInfoImplCopyWithImpl<$Res>;
+ @override
+ @useResult
+ $Res call(
+ {int id,
+ String cardCode,
+ String? cardName,
+ String cardNo,
+ String cardAbleStatus});
+}
+
+/// @nodoc
+class __$$CardInfoImplCopyWithImpl<$Res>
+ extends _$CardInfoCopyWithImpl<$Res, _$CardInfoImpl>
+ implements _$$CardInfoImplCopyWith<$Res> {
+ __$$CardInfoImplCopyWithImpl(
+ _$CardInfoImpl _value, $Res Function(_$CardInfoImpl) _then)
+ : super(_value, _then);
+
+ @pragma('vm:prefer-inline')
+ @override
+ $Res call({
+ Object? id = null,
+ Object? cardCode = null,
+ Object? cardName = freezed,
+ Object? cardNo = null,
+ Object? cardAbleStatus = null,
+ }) {
+ return _then(_$CardInfoImpl(
+ id: null == id
+ ? _value.id
+ : id // ignore: cast_nullable_to_non_nullable
+ as int,
+ cardCode: null == cardCode
+ ? _value.cardCode
+ : cardCode // ignore: cast_nullable_to_non_nullable
+ as String,
+ cardName: freezed == cardName
+ ? _value.cardName
+ : cardName // ignore: cast_nullable_to_non_nullable
+ as String?,
+ cardNo: null == cardNo
+ ? _value.cardNo
+ : cardNo // ignore: cast_nullable_to_non_nullable
+ as String,
+ cardAbleStatus: null == cardAbleStatus
+ ? _value.cardAbleStatus
+ : cardAbleStatus // ignore: cast_nullable_to_non_nullable
+ as String,
+ ));
+ }
+}
+
+/// @nodoc
+@JsonSerializable()
+class _$CardInfoImpl implements _CardInfo {
+ const _$CardInfoImpl(
+ {required this.id,
+ required this.cardCode,
+ required this.cardName,
+ required this.cardNo,
+ required this.cardAbleStatus});
+
+ factory _$CardInfoImpl.fromJson(Map json) =>
+ _$$CardInfoImplFromJson(json);
+
+ @override
+ final int id;
+ @override
+ final String cardCode;
+ @override
+ final String? cardName;
+ @override
+ final String cardNo;
+ @override
+ final String cardAbleStatus;
+
+ @override
+ String toString() {
+ return 'CardInfo(id: $id, cardCode: $cardCode, cardName: $cardName, cardNo: $cardNo, cardAbleStatus: $cardAbleStatus)';
+ }
+
+ @override
+ bool operator ==(dynamic other) {
+ return identical(this, other) ||
+ (other.runtimeType == runtimeType &&
+ other is _$CardInfoImpl &&
+ (identical(other.id, id) || other.id == id) &&
+ (identical(other.cardCode, cardCode) ||
+ other.cardCode == cardCode) &&
+ (identical(other.cardName, cardName) ||
+ other.cardName == cardName) &&
+ (identical(other.cardNo, cardNo) || other.cardNo == cardNo) &&
+ (identical(other.cardAbleStatus, cardAbleStatus) ||
+ other.cardAbleStatus == cardAbleStatus));
+ }
+
+ @JsonKey(ignore: true)
+ @override
+ int get hashCode =>
+ Object.hash(runtimeType, id, cardCode, cardName, cardNo, cardAbleStatus);
+
+ @JsonKey(ignore: true)
+ @override
+ @pragma('vm:prefer-inline')
+ _$$CardInfoImplCopyWith<_$CardInfoImpl> get copyWith =>
+ __$$CardInfoImplCopyWithImpl<_$CardInfoImpl>(this, _$identity);
+
+ @override
+ Map toJson() {
+ return _$$CardInfoImplToJson(
+ this,
+ );
+ }
+}
+
+abstract class _CardInfo implements CardInfo {
+ const factory _CardInfo(
+ {required final int id,
+ required final String cardCode,
+ required final String? cardName,
+ required final String cardNo,
+ required final String cardAbleStatus}) = _$CardInfoImpl;
+
+ factory _CardInfo.fromJson(Map json) =
+ _$CardInfoImpl.fromJson;
+
+ @override
+ int get id;
+ @override
+ String get cardCode;
+ @override
+ String? get cardName;
+ @override
+ String get cardNo;
+ @override
+ String get cardAbleStatus;
+ @override
+ @JsonKey(ignore: true)
+ _$$CardInfoImplCopyWith<_$CardInfoImpl> get copyWith =>
+ throw _privateConstructorUsedError;
+}
diff --git a/lib/model/card_info/card_info.g.dart b/lib/model/card_info/card_info.g.dart
new file mode 100644
index 00000000..62bb830d
--- /dev/null
+++ b/lib/model/card_info/card_info.g.dart
@@ -0,0 +1,25 @@
+// GENERATED CODE - DO NOT MODIFY BY HAND
+
+part of 'card_info.dart';
+
+// **************************************************************************
+// JsonSerializableGenerator
+// **************************************************************************
+
+_$CardInfoImpl _$$CardInfoImplFromJson(Map json) =>
+ _$CardInfoImpl(
+ id: json['id'] as int,
+ cardCode: json['cardCode'] as String,
+ cardName: json['cardName'] as String?,
+ cardNo: json['cardNo'] as String,
+ cardAbleStatus: json['cardAbleStatus'] as String,
+ );
+
+Map _$$CardInfoImplToJson(_$CardInfoImpl instance) =>
+ {
+ 'id': instance.id,
+ 'cardCode': instance.cardCode,
+ 'cardName': instance.cardName,
+ 'cardNo': instance.cardNo,
+ 'cardAbleStatus': instance.cardAbleStatus,
+ };
diff --git a/lib/modules/payment/controller/payment_controller.dart b/lib/modules/payment/controller/payment_controller.dart
index 1065db3b..df97a752 100644
--- a/lib/modules/payment/controller/payment_controller.dart
+++ b/lib/modules/payment/controller/payment_controller.dart
@@ -1,6 +1,7 @@
import 'package:flutter/cupertino.dart';
import 'package:get/get.dart';
import 'package:get_storage/get_storage.dart';
+import 'package:match/model/card_info/card_info.dart';
import 'package:match/model/match_history/match_history.dart';
import 'package:match/modules/project/controller/project_controller.dart';
import 'package:match/provider/api/order_api.dart';
@@ -23,6 +24,11 @@ class PaymentController extends GetxController {
//TODO) 후원자 정보
Rx donator = tmpDonator.obs;
+ //TODO) 카드 정보
+ RxList cardInfoList = [].obs;
+ RxList cardCodeList = [tmpCardInfo.cardCode].obs;
+ RxList cardNumList = [tmpCardInfo.cardNo].obs;
+ RxList cardIdList = [tmpCardInfo.id].obs;
//TODO) 기부금 정보
final RxBool isPayAble = false.obs; //금액, 날짜 선택 모두 했는지
@@ -38,6 +44,7 @@ class PaymentController extends GetxController {
}
}
+
//TODO) 결제 정보
/// 동의항목
var selectedItems = [].obs;
@@ -46,7 +53,10 @@ class PaymentController extends GetxController {
void selectCard(int index) {
selectedCardIndex.value = index;
}
+ /// 결제할 카드 & 프로젝트 정보
+ RxInt cardId = 1.obs;
+ //TODO) 카드 신규 등록
/// 카드 번호
Rx cardNumTextController = TextEditingController().obs;
/// 유효기간
@@ -62,6 +72,11 @@ class PaymentController extends GetxController {
void onInit() async {
super.onInit();
payList.assignAll(await PaymentApi.getPaymentDetail(regularPayId: id));
+ cardInfoList.assignAll(await OrderApi.getCardList());
+ cardCodeList.assignAll(cardInfoList.map((card) => card.cardCode.toString()).toList());
+ cardNumList.assignAll(cardInfoList.map((card) => card.cardNo).toList());
+ cardIdList.assignAll(cardInfoList.map((card) => card.id).toList());
+
donateState.value = _projectController.projectDetail.value.regularStatus;
}
}
diff --git a/lib/modules/payment/view/payment_card_info_view.dart b/lib/modules/payment/view/payment_card_info_view.dart
index 7c413a98..de527008 100644
--- a/lib/modules/payment/view/payment_card_info_view.dart
+++ b/lib/modules/payment/view/payment_card_info_view.dart
@@ -1,8 +1,15 @@
+import 'dart:ffi';
+
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:flutter_svg/flutter_svg.dart';
+import 'package:fluttertoast/fluttertoast.dart';
import 'package:get/get.dart';
+import 'package:get_storage/get_storage.dart';
+import 'package:match/model/card_info/card_info.dart';
+import 'package:match/modules/payment/view/payment_method_info_view.dart';
import 'package:match/modules/payment/widget/select_pay_method_widget.dart';
+import 'package:match/provider/api/order_api.dart';
import 'package:match/util/components/gloabl_text_field.dart';
import 'package:match/util/components/global_app_bar.dart';
import 'package:match/util/components/global_button.dart';
@@ -30,11 +37,13 @@ class PaymentRegisterCardInfoScreen extends GetView {
['기타','ic_card_etc.svg',''], //나머지 모든 카드 '' 이면 전부 기타카드
];
- final String cardNum = '';
- final String cardExp = '';
- final String cardCvc = '';
- final String cardUserBirth = '';
- final String cardPw = '';
+ String cardNum = '';
+ String cardExp = '';
+ String cardCvc = '';
+ String cardUserBirth = '';
+ String cardPw = '';
+ String cardExpYear = '';
+ String cardExpMonth = '';
PaymentRegisterCardInfoScreen({Key? key, required this.selectedCardName}) : super(key: key);
@@ -140,7 +149,8 @@ class PaymentRegisterCardInfoScreen extends GetView {
CommonInputField.cardNum(
textController : controller.cardNumTextController.value,
onChange: (value) async {
- print(">>> 입력한 카드번호: $value");
+ cardNum = value;
+ print(">>> 입력한 카드번호: $cardNum");
}),
SizedBox(height: 37.h),
@@ -159,7 +169,12 @@ class PaymentRegisterCardInfoScreen extends GetView {
child: CommonInputField.cardExp(
textController : controller.cardExpTextController.value,
onChange: (value) async {
+ cardExp = value;
+ cardExpYear = value.substring(2,4);
+ cardExpMonth = value.substring(0,2);
print(">>> 입력한 유효기간: $value");
+ print(">>> 입력한 유효기간 year: ${cardExpYear}");
+ print(">>> 입력한 유효기간 month: ${cardExpMonth}");
}),
),
],
@@ -186,7 +201,8 @@ class PaymentRegisterCardInfoScreen extends GetView {
child: CommonInputField.cardCvc(
textController : controller.cardCVCTextController.value,
onChange: (value) async {
- print(">>> 입력한 CVC: $value");
+ cardCvc = value;
+ print(">>> 입력한 CVC: $cardCvc");
}),
),
],
@@ -218,7 +234,8 @@ class PaymentRegisterCardInfoScreen extends GetView {
child: CommonInputField.cardUserBirth(
textController : controller.cardUserBirthTextController.value,
onChange: (value) async {
- print(">>> 입력한 생년월일: $value");
+ cardUserBirth = value;
+ print(">>> 입력한 생년월일: $cardUserBirth");
}),
),
],
@@ -245,7 +262,8 @@ class PaymentRegisterCardInfoScreen extends GetView {
child: CommonInputField.cardPw(
textController : controller.cardPWTextController.value,
onChange: (value) async {
- print(">>> 입력한 카드 비밀번호: $value");
+ cardPw = value;
+ print(">>> 입력한 카드 비밀번호: $cardPw");
}),
),
],
@@ -255,8 +273,6 @@ class PaymentRegisterCardInfoScreen extends GetView {
SizedBox(height: 35.h),
-
-
],
),
],
@@ -281,9 +297,34 @@ class PaymentRegisterCardInfoScreen extends GetView {
child: Padding(
padding: EdgeInsets.only(left: 6.w, right: 20),
child: CommonButton.login(
- text: "다음",
+ text: "등록",
onTap: () async {
- Get.back();
+ if (cardNum != "" && cardExpYear != "" && cardExpMonth != "" && cardUserBirth != "" && cardPw != ""){
+ var result = await OrderApi.setCard(
+ cardNo: cardNum,
+ expYear: cardExpYear,
+ expMonth: cardExpMonth,
+ idNo: cardUserBirth,
+ cardPw: cardPw);
+ if(result) {
+ // PaymentController 인스턴스를 가져옴
+ final PaymentController paymentController = Get.find();
+
+ // 새로운 카드 정보를 가져와서 cardInfoList를 업데이트함
+ List newCardInfoList = await OrderApi.getCardList();
+ paymentController.cardInfoList.assignAll(newCardInfoList);
+ paymentController.cardCodeList.assignAll(
+ newCardInfoList.map((card) => card.cardCode.toString()).toList()
+ );
+ paymentController.cardNumList.assignAll(
+ newCardInfoList.map((card) => card.cardNo).toList()
+ );
+
+ Get.to(PaymentMethodScreen());
+ }
+ } else {
+ Fluttertoast.showToast(msg: "입력값 중 빈 값이 있습니다. 입력 정보를 다시 확인해주세요.");
+ }
},
),
),
diff --git a/lib/modules/payment/view/payment_done_view.dart b/lib/modules/payment/view/payment_done_view.dart
index 65b59548..4abb418a 100644
--- a/lib/modules/payment/view/payment_done_view.dart
+++ b/lib/modules/payment/view/payment_done_view.dart
@@ -7,6 +7,7 @@ import 'package:intl/intl.dart';
import 'package:match/model/enum/regular_status.dart';
import 'package:match/modules/payment/view/payment_donation_info_view.dart';
import 'package:match/modules/project/controller/project_controller.dart';
+import 'package:match/provider/routes/routes.dart';
import 'package:match/provider/service/auth_service.dart';
import 'package:match/util/components/global_app_bar.dart';
import 'package:match/util/components/global_button.dart';
@@ -194,7 +195,7 @@ class PaymentDoneScreen extends GetView {
child: CommonButton.login(
text: "확인",
onTap: () async {
- Get.back();
+ Get.offAllNamed(Routes.main);
},
),
),
diff --git a/lib/modules/payment/view/payment_method_info_view.dart b/lib/modules/payment/view/payment_method_info_view.dart
index 0771a7e5..341a1261 100644
--- a/lib/modules/payment/view/payment_method_info_view.dart
+++ b/lib/modules/payment/view/payment_method_info_view.dart
@@ -2,10 +2,12 @@ import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:get/get.dart';
+import 'package:get_storage/get_storage.dart';
import 'package:intl/intl.dart';
import 'package:match/modules/payment/view/payment_done_view.dart';
import 'package:match/modules/payment/widget/select_pay_method_widget.dart';
import 'package:match/modules/project/controller/project_controller.dart';
+import 'package:match/provider/api/order_api.dart';
import 'package:match/util/components/global_app_bar.dart';
import 'package:match/util/components/global_button.dart';
import 'package:match/util/components/global_checkbox.dart';
@@ -172,7 +174,19 @@ class _PaymentScreenState extends State with WidgetsBinding
? CommonButton.login(
text: "확인",
onTap: () async {
- Get.to(PaymentDoneScreen());
+ if(state == 'REGULAR') {
+ var result = await OrderApi.postPay(
+ cardId: controller.cardId.value,
+ projectId: _projectController.projectId,
+ amount: controller.selectedDate.value,
+ payDate: controller.selectedAmount.value);
+ if (result){
+ Get.to(PaymentDoneScreen());
+ }
+ }
+ else{
+ Get.back(); ///단기결제(2차)
+ }
},
)
: CommonButton.loginDis(
diff --git a/lib/modules/payment/widget/card_slider_widget.dart b/lib/modules/payment/widget/card_slider_widget.dart
index cd4f6a94..32a3e193 100644
--- a/lib/modules/payment/widget/card_slider_widget.dart
+++ b/lib/modules/payment/widget/card_slider_widget.dart
@@ -3,7 +3,11 @@ import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:carousel_slider/carousel_slider.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
+import 'package:get_storage/get_storage.dart';
+import 'package:match/model/card_info/card_info.dart';
+import 'package:match/modules/payment/controller/payment_controller.dart';
import 'package:match/modules/payment/view/payment_select_card_view.dart';
+import 'package:match/modules/project/controller/project_controller.dart';
import 'package:match/util/const/global_variable.dart';
import 'package:match/util/const/style/global_color.dart';
import 'package:match/util/const/style/global_text_styles.dart';
@@ -15,6 +19,7 @@ class CardSlider extends StatefulWidget {
}
class _CardSliderState extends State {
+ final PaymentController _paymentController = Get.find();
final List> cardBankList = [
['하나','ic_card_hana.svg','374'],
@@ -28,46 +33,6 @@ class _CardSliderState extends State {
['우리','ic_card_woori.svg','041'],
['기타','ic_card_etc.svg',''], //나머지 모든 카드 '' 이면 전부 기타카드
];
- //TODO) 카드정보
- final List