Selaa lähdekoodia

2024-12-02 新增 / 修改

新增:
1. 团组经理主管 - 出入境费用明细 - 团组 / 费用总览
2. 团组经理主管 - 出入境费用明细 - 境内费用详细
3. 团组经理主管 - 出入境费用明细 - 国际旅费合计

修改:
1. UI bug修改
2. 部分UI逻辑修改
zhaiy 7 kuukautta sitten
vanhempi
commit
c288508327
45 muutettua tiedostoa jossa 2792 lisäystä ja 26 poistoa
  1. 8 1
      app/src/main/AndroidManifest.xml
  2. 5 1
      app/src/main/java/com/pan_american/android/OASystem.kt
  3. 5 0
      app/src/main/java/com/pan_american/android/base/BaseFragment.kt
  4. 32 0
      app/src/main/java/com/pan_american/android/data/model/group_management/entry_and_exit_fee_detail/entity/EntryAndExitDetailTotal.kt
  5. 5 0
      app/src/main/java/com/pan_american/android/data/model/group_management/entry_and_exit_fee_detail/network/EntryAndExitDetailRequest.kt
  6. 34 0
      app/src/main/java/com/pan_american/android/data/model/group_management/entry_and_exit_fee_detail/network/EntryAndExitDetailResponse.kt
  7. 5 0
      app/src/main/java/com/pan_american/android/data/model/group_management/entry_and_exit_fee_detail/network/EntryAndExitGroupListRequest.kt
  8. 6 0
      app/src/main/java/com/pan_american/android/data/model/group_management/entry_and_exit_fee_detail/network/EntryAndExitGroupListResponse.kt
  9. 3 0
      app/src/main/java/com/pan_american/android/data/model/group_management/entry_and_exit_fee_detail/network/EntryAndExitPaymentTypeRequest.kt
  10. 3 0
      app/src/main/java/com/pan_american/android/data/model/group_management/entry_and_exit_fee_detail/network/EntryAndExitTipsRequest.kt
  11. 14 0
      app/src/main/java/com/pan_american/android/data/model/group_management/entry_and_exit_fee_detail/network/InBoardDetailResponse.kt
  12. 17 0
      app/src/main/java/com/pan_american/android/data/model/group_management/entry_and_exit_fee_detail/network/InternationalTravelPaymentDetailResponse.kt
  13. 8 0
      app/src/main/java/com/pan_american/android/data/model/group_management/entry_and_exit_fee_detail/network/InternationalTravelTipsResponse.kt
  14. 8 0
      app/src/main/java/com/pan_american/android/data/model/group_management/entry_and_exit_fee_detail/network/NewestVisaPaymentResponse.kt
  15. 18 0
      app/src/main/java/com/pan_american/android/data/model/group_management/entry_and_exit_fee_detail/network/UpdateInBoardPaymentRequest.kt
  16. 8 0
      app/src/main/java/com/pan_american/android/data/model/group_management/entry_and_exit_fee_detail/network/UpdateInBoardPaymentResponse.kt
  17. 21 0
      app/src/main/java/com/pan_american/android/data/model/group_management/entry_and_exit_fee_detail/network/UpdateInternationalTravelRequest.kt
  18. 15 0
      app/src/main/java/com/pan_american/android/data/model/group_management/entry_and_exit_fee_detail/network/UpdateInternationalTravelResponse.kt
  19. 62 0
      app/src/main/java/com/pan_american/android/data/network/APIService.kt
  20. 1 2
      app/src/main/java/com/pan_american/android/ui/customer_resource/company_customer/AddNewCustomerActivity.kt
  21. 2 2
      app/src/main/java/com/pan_american/android/ui/document/DocumentFragment.kt
  22. 0 6
      app/src/main/java/com/pan_american/android/ui/financial_module/collection_bill/CollectionBillPaymentListActivity.kt
  23. 0 3
      app/src/main/java/com/pan_american/android/ui/financial_module/payment_refund/AddPaymentRefundActivity.kt
  24. 2 2
      app/src/main/java/com/pan_american/android/ui/group_airplane_ticket/airplane_payment_insert/AirplaneTicketListFragment.kt
  25. 79 0
      app/src/main/java/com/pan_american/android/ui/group_management/entry_and_exit_fee_detail/EntryAndExitDetailActivity.kt
  26. 189 0
      app/src/main/java/com/pan_american/android/ui/group_management/entry_and_exit_fee_detail/EntryAndExitFeeGroupListActivity.kt
  27. 231 0
      app/src/main/java/com/pan_american/android/ui/group_management/entry_and_exit_fee_detail/EntryAndExitFeeTotalFragment.kt
  28. 15 0
      app/src/main/java/com/pan_american/android/ui/group_management/entry_and_exit_fee_detail/EntryAndExitPaymentListFragment.kt
  29. 207 0
      app/src/main/java/com/pan_american/android/ui/group_management/entry_and_exit_fee_detail/InBoardFeeFragment.kt
  30. 256 0
      app/src/main/java/com/pan_american/android/ui/group_management/entry_and_exit_fee_detail/InternationalTravelFeeFragment.kt
  31. 16 0
      app/src/main/java/com/pan_american/android/ui/group_management/entry_and_exit_fee_detail/OtherPaymentFragment.kt
  32. 0 3
      app/src/main/java/com/pan_american/android/ui/group_management/group_info/GroupCustomerListFragment.kt
  33. 0 5
      app/src/main/java/com/pan_american/android/ui/personnel_module/materials_operate/MaterialHistoryListFragment.kt
  34. 16 0
      app/src/main/java/com/pan_american/android/ui/workspace/WorkspaceFragment.kt
  35. 20 0
      app/src/main/res/layout/activity_entry_and_exit_detail.xml
  36. 36 0
      app/src/main/res/layout/activity_entry_and_exit_group_list.xml
  37. 637 0
      app/src/main/res/layout/fragment_entry_and_exit_fee_total.xml
  38. 13 0
      app/src/main/res/layout/fragment_entry_and_exit_payment_list.xml
  39. 392 0
      app/src/main/res/layout/fragment_in_board_fee.xml
  40. 303 0
      app/src/main/res/layout/fragment_international_travel_fee.xml
  41. 13 0
      app/src/main/res/layout/fragment_other_payment.xml
  42. 35 1
      app/src/main/res/layout/fragment_workspace.xml
  43. BIN
      app/src/main/res/mipmap-xxhdpi/icon_entry_and_exit_fee_detail.png
  44. BIN
      app/src/main/res/mipmap-xxhdpi/icon_forward.png
  45. 52 0
      app/src/main/res/values/strings.xml

+ 8 - 1
app/src/main/AndroidManifest.xml

@@ -35,10 +35,17 @@
         android:supportsRtl="true"
         android:theme="@style/AppTheme"
         tools:targetApi="31">
+        <activity
+            android:name=".ui.group_management.entry_and_exit_fee_detail.EntryAndExitDetailActivity"
+            android:exported="false" />
+        <activity
+            android:name=".ui.group_management.entry_and_exit_fee_detail.EntryAndExitFeeGroupListActivity"
+            android:exported="false"
+            android:launchMode="singleTop" />
         <activity
             android:name=".ui.financial_module.collection_bill.AddCollectionBillPaymentActivity"
             android:exported="false"
-            android:launchMode="singleTop"/>
+            android:launchMode="singleTop" />
         <activity
             android:name=".ui.financial_module.collection_bill.CollectionBillPaymentListActivity"
             android:exported="false"

+ 5 - 1
app/src/main/java/com/pan_american/android/OASystem.kt

@@ -7,6 +7,7 @@ import com.pan_american.android.data.model.common.entity.Selector
 import com.pan_american.android.data.model.common.entity.SiftListItem
 import com.pan_american.android.data.model.customer_resource.market_sales_revenue.entity.YearQuarterlyData
 import com.pan_american.android.data.model.group_hotel.hotel_predetermine.entity.UpdateHotelPredetermine
+import com.pan_american.android.data.model.group_management.entry_and_exit_fee_detail.network.EntryAndExitDetailResponse
 import com.pan_american.android.data.model.group_management.group_info.entity.GroupCustomerInfo
 import com.pan_american.android.data.model.group_management.group_info.network.GroupOperationRequest
 import com.pan_american.android.data.model.login.entity.Authority
@@ -264,7 +265,7 @@ class OASystem : Application() {
         const val CAR_RESOURCE = 111
 
         //团组经理主管,出入境费用明细
-        const val ENTER_AND_LEAVE_PAYMENT_DETAIL = 118
+        const val ENTRY_AND_EXIT_FEE_DETAIL = 118
 
         // 机场三字码
         const val THREE_CODE_RESOURCE = 120
@@ -358,6 +359,9 @@ class OASystem : Application() {
 
         //activity / fragment是否需要刷新
         var needRefresh = false
+
+        //三公费用 返回体
+        var entryAndExitDetailResponse = EntryAndExitDetailResponse()
     }
 
     override fun onCreate() {

+ 5 - 0
app/src/main/java/com/pan_american/android/base/BaseFragment.kt

@@ -51,6 +51,11 @@ abstract class BaseFragment<T: ViewBinding>: Fragment() {
         savedInstanceState: Bundle?
     ): View? {
         _binding = getViewBinding(inflater, container, savedInstanceState)
+
+        binding.root.isFocusable = true
+
+        binding.root.isClickable = true
+
         return binding.root
     }
 

+ 32 - 0
app/src/main/java/com/pan_american/android/data/model/group_management/entry_and_exit_fee_detail/entity/EntryAndExitDetailTotal.kt

@@ -0,0 +1,32 @@
+package com.pan_american.android.data.model.group_management.entry_and_exit_fee_detail.entity
+
+class EntryAndExitDetailTotal {
+    var choiceOne = 0
+    var choiceOneTotalCost = 0.0
+
+    var choiceTwoJJ = 0
+    var outsideJJPay = 0.0
+    var choiceTwoGW = 0
+    var outsideGWPay = 0.0
+    var choiceTwoTD = 0
+    var outsideTDPay = 0.0
+
+    var choiceThree = 0
+    var choiceThreeTotalCost = 0.0
+
+    var choiceFour = 0
+    var choiceFourTotalCost = 0.0
+
+    var choiceFive = 0
+    var choiceFiveTotalCost = 0.0
+
+    var choiceSix = 0
+    var choiceSixTotalCost = 0.0
+
+    var otherExpenses_Checked = 0
+    var otherExpensesTotalCost = 0.0
+
+    var touristClassTotalCost = 0.0
+    var businessClassTotalCost = 0.0
+    var firstClassTotalCost = 0.0
+}

+ 5 - 0
app/src/main/java/com/pan_american/android/data/model/group_management/entry_and_exit_fee_detail/network/EntryAndExitDetailRequest.kt

@@ -0,0 +1,5 @@
+package com.pan_american.android.data.model.group_management.entry_and_exit_fee_detail.network
+
+import com.pan_american.android.base.BaseRequest
+
+data class EntryAndExitDetailRequest(val diId: Int = 0): BaseRequest()

+ 34 - 0
app/src/main/java/com/pan_american/android/data/model/group_management/entry_and_exit_fee_detail/network/EntryAndExitDetailResponse.kt

@@ -0,0 +1,34 @@
+package com.pan_american.android.data.model.group_management.entry_and_exit_fee_detail.network
+
+import com.pan_american.android.data.model.common.entity.Selector
+
+data class EntryAndExitDetailResponse (val id: Int = 0, val diId: Int = 0, val currencys:ArrayList<Selector> = arrayListOf()){
+    var choiceOne = 0
+    var choiceOneTotalCost = 0.0
+
+    var choiceTwoJJ = 0
+    var outsideJJPay = 0.0
+    var choiceTwoGW = 0
+    var outsideGWPay = 0.0
+    var choiceTwoTD = 0
+    var outsideTDPay = 0.0
+
+    var choiceThree = 0
+    var choiceThreeTotalCost = 0.0
+
+    var choiceFour = 0
+    var choiceFourTotalCost = 0.0
+
+    var choiceFive = 0
+    var choiceFiveTotalCost = 0.0
+
+    var choiceSix = 0
+    var choiceSixTotalCost = 0.0
+
+    var otherExpenses_Checked = 0
+    var otherExpensesTotalCost = 0.0
+
+    var economyTotalPayment = 0.0
+    var bussinessTotalPayment = 0.0
+    var firstClassTotalPayment = 0.0
+}

+ 5 - 0
app/src/main/java/com/pan_american/android/data/model/group_management/entry_and_exit_fee_detail/network/EntryAndExitGroupListRequest.kt

@@ -0,0 +1,5 @@
+package com.pan_american.android.data.model.group_management.entry_and_exit_fee_detail.network
+
+import com.pan_american.android.base.BaseRequest
+
+data class EntryAndExitGroupListRequest(var groupName: String = ""): BaseRequest()

+ 6 - 0
app/src/main/java/com/pan_american/android/data/model/group_management/entry_and_exit_fee_detail/network/EntryAndExitGroupListResponse.kt

@@ -0,0 +1,6 @@
+package com.pan_american.android.data.model.group_management.entry_and_exit_fee_detail.network
+
+import com.pan_american.android.base.BaseResponse
+import com.pan_american.android.data.model.common.entity.Selector
+
+data class EntryAndExitGroupListResponse(val data: ArrayList<Selector>): BaseResponse()

+ 3 - 0
app/src/main/java/com/pan_american/android/data/model/group_management/entry_and_exit_fee_detail/network/EntryAndExitPaymentTypeRequest.kt

@@ -0,0 +1,3 @@
+package com.pan_american.android.data.model.group_management.entry_and_exit_fee_detail.network
+
+data class EntryAndExitPaymentTypeRequest(val portType: Int = 2, val diId: Int, val subType: Int)

+ 3 - 0
app/src/main/java/com/pan_american/android/data/model/group_management/entry_and_exit_fee_detail/network/EntryAndExitTipsRequest.kt

@@ -0,0 +1,3 @@
+package com.pan_american.android.data.model.group_management.entry_and_exit_fee_detail.network
+
+data class EntryAndExitTipsRequest(val portType: Int = 2, val groupId: Int, val tipsType: Int)

+ 14 - 0
app/src/main/java/com/pan_american/android/data/model/group_management/entry_and_exit_fee_detail/network/InBoardDetailResponse.kt

@@ -0,0 +1,14 @@
+package com.pan_american.android.data.model.group_management.entry_and_exit_fee_detail.network
+
+data class InBoardDetailResponse(
+    val id : Int,
+    val choiceOne: Int,
+    val choiceOneTotalCost: Double,
+    val visa:Double,
+    val visaRemark: String,
+    val yiMiao: Double,
+    val heSuan: Double,
+    val service: Double,
+    val ticket: Double,
+    val safe: Double
+)

+ 17 - 0
app/src/main/java/com/pan_american/android/data/model/group_management/entry_and_exit_fee_detail/network/InternationalTravelPaymentDetailResponse.kt

@@ -0,0 +1,17 @@
+package com.pan_american.android.data.model.group_management.entry_and_exit_fee_detail.network
+
+import com.pan_american.android.base.BaseResponse
+
+class InternationalTravelPaymentDetailResponse(val data: Data) : BaseResponse() {
+
+    inner class Data(
+        val id: Int,
+        val choiceTwoJJ: Int,
+        val choiceTwoGW: Int,
+        val choiceTwoTD: Int,
+        val airJJ: Double,
+        val airGW: Double,
+        val airTD: Double,
+        val cityTranffic: Double
+    )
+}

+ 8 - 0
app/src/main/java/com/pan_american/android/data/model/group_management/entry_and_exit_fee_detail/network/InternationalTravelTipsResponse.kt

@@ -0,0 +1,8 @@
+package com.pan_american.android.data.model.group_management.entry_and_exit_fee_detail.network
+
+import com.pan_american.android.base.BaseResponse
+
+data class InternationalTravelTipsResponse(val data: Data): BaseResponse() {
+
+    inner class Data (val jjcCurrentRate: Double, val gwcCurrentRate: Double, val remark: String)
+}

+ 8 - 0
app/src/main/java/com/pan_american/android/data/model/group_management/entry_and_exit_fee_detail/network/NewestVisaPaymentResponse.kt

@@ -0,0 +1,8 @@
+package com.pan_american.android.data.model.group_management.entry_and_exit_fee_detail.network
+
+import com.pan_american.android.base.BaseResponse
+
+class NewestVisaPaymentResponse(val data: Data): BaseResponse() {
+
+    inner class Data (val feeTotal: Double, val remark: String)
+}

+ 18 - 0
app/src/main/java/com/pan_american/android/data/model/group_management/entry_and_exit_fee_detail/network/UpdateInBoardPaymentRequest.kt

@@ -0,0 +1,18 @@
+package com.pan_american.android.data.model.group_management.entry_and_exit_fee_detail.network
+
+import com.pan_american.android.OASystem
+
+data class UpdateInBoardPaymentRequest (
+    val portType: Int = 2,
+    val id: Int,
+    val diId: Int,
+    val currUserId: Int = OASystem.userInfo.userId,
+    val choiceOne: Int,
+    val visa: Double,
+    val visaRemark: String,
+    val yiMiao: Double,
+    val heSuan: Double,
+    val service: Double,
+    val ticket: Double,
+    val safe: Double
+)

+ 8 - 0
app/src/main/java/com/pan_american/android/data/model/group_management/entry_and_exit_fee_detail/network/UpdateInBoardPaymentResponse.kt

@@ -0,0 +1,8 @@
+package com.pan_american.android.data.model.group_management.entry_and_exit_fee_detail.network
+
+import com.pan_american.android.base.BaseResponse
+
+data class UpdateInBoardPaymentResponse(val data: Data): BaseResponse() {
+
+    inner class Data (val itemTotal: Double)
+}

+ 21 - 0
app/src/main/java/com/pan_american/android/data/model/group_management/entry_and_exit_fee_detail/network/UpdateInternationalTravelRequest.kt

@@ -0,0 +1,21 @@
+package com.pan_american.android.data.model.group_management.entry_and_exit_fee_detail.network
+
+import com.pan_american.android.OASystem
+
+data class UpdateInternationalTravelRequest(
+    val portType: Int = 2,
+    val id: Int,
+    val diId: Int,
+    val currUserId: Int = OASystem.userInfo.userId,
+    val choiceTwoJJ: Int,
+    val choiceTwoGW: Int,
+    val choiceTwoTD: Int,
+    val airJJ: Double,
+    val airGW: Double,
+    val airTD: Double,
+    val cityTranffic: Double
+) {
+    val outsideJJPay = airJJ + cityTranffic
+    val outsideGWPay = airGW + cityTranffic
+    val outsideTDPay = airTD + cityTranffic
+}

+ 15 - 0
app/src/main/java/com/pan_american/android/data/model/group_management/entry_and_exit_fee_detail/network/UpdateInternationalTravelResponse.kt

@@ -0,0 +1,15 @@
+package com.pan_american.android.data.model.group_management.entry_and_exit_fee_detail.network
+
+import com.pan_american.android.base.BaseResponse
+
+data class UpdateInternationalTravelResponse(val data: Data) : BaseResponse() {
+
+    inner class Data(
+        val choiceTwoJJ: Int,
+        val jjcItemTotal: Double,
+        val choiceTwoGW: Int,
+        val gwcItemTotal: Double,
+        val choiceTwoTD: Int,
+        val tdcItemTotal: Double
+    )
+}

+ 62 - 0
app/src/main/java/com/pan_american/android/data/network/APIService.kt

@@ -150,6 +150,20 @@ import com.pan_american.android.data.model.group_invite_official.official_visits
 import com.pan_american.android.data.model.group_invite_official.official_visits.network.UpdateOfficialVisitCheckCommitRequest
 import com.pan_american.android.data.model.group_invite_official.official_visits.network.UpdateOfficialVisitRequest
 import com.pan_american.android.data.model.group_invite_official.official_visits.network.UpdateOfficialVisitResponse
+import com.pan_american.android.data.model.group_management.entry_and_exit_fee_detail.network.EntryAndExitDetailRequest
+import com.pan_american.android.data.model.group_management.entry_and_exit_fee_detail.network.EntryAndExitDetailResponse
+import com.pan_american.android.data.model.group_management.entry_and_exit_fee_detail.network.EntryAndExitGroupListRequest
+import com.pan_american.android.data.model.group_management.entry_and_exit_fee_detail.network.EntryAndExitGroupListResponse
+import com.pan_american.android.data.model.group_management.entry_and_exit_fee_detail.network.EntryAndExitPaymentTypeRequest
+import com.pan_american.android.data.model.group_management.entry_and_exit_fee_detail.network.EntryAndExitTipsRequest
+import com.pan_american.android.data.model.group_management.entry_and_exit_fee_detail.network.InBoardDetailResponse
+import com.pan_american.android.data.model.group_management.entry_and_exit_fee_detail.network.InternationalTravelPaymentDetailResponse
+import com.pan_american.android.data.model.group_management.entry_and_exit_fee_detail.network.InternationalTravelTipsResponse
+import com.pan_american.android.data.model.group_management.entry_and_exit_fee_detail.network.NewestVisaPaymentResponse
+import com.pan_american.android.data.model.group_management.entry_and_exit_fee_detail.network.UpdateInBoardPaymentRequest
+import com.pan_american.android.data.model.group_management.entry_and_exit_fee_detail.network.UpdateInBoardPaymentResponse
+import com.pan_american.android.data.model.group_management.entry_and_exit_fee_detail.network.UpdateInternationalTravelRequest
+import com.pan_american.android.data.model.group_management.entry_and_exit_fee_detail.network.UpdateInternationalTravelResponse
 import com.pan_american.android.data.model.group_management.group_info.network.GetSellCodeResponse
 import com.pan_american.android.data.model.group_management.group_info.network.GroupCustomerListRequest
 import com.pan_american.android.data.model.group_management.group_info.network.GroupCustomerListResponse
@@ -1236,4 +1250,52 @@ interface APIService {
      */
     @POST("/api/Financial/PostReceivablesSingleSave")
     fun updateCollectionBillPayment(@Body updateCollectionBillRequest: UpdateCollectionBillRequest): Call<BaseResponse>
+
+    /**
+     * 出入境费用明细,基础数据源
+     */
+    @POST("/api/Groups/EnterExitCostMobileGroupData")
+    fun getEntryAndExitGroupList(@Body entryAndExitGroupListRequest: EntryAndExitGroupListRequest): Call<EntryAndExitGroupListResponse>
+
+    /**
+     * 出入境费用明细,团组三公详细
+     */
+    @POST("/api/Groups/EnterExitCostMobileParentInfo")
+    fun getEntryAndExitPaymentDetail(@Body entryAndExitDetailRequest: EntryAndExitDetailRequest): Call<EntryAndExitDetailResponse>
+
+    /**
+     * 出入境费用明细,获取境内费用详细
+     */
+    @POST("/api/Groups/EnterExitCostMobileSubInfo")
+    fun getInBoardPaymentDetail(@Body entryAndExitPaymentTypeRequest: EntryAndExitPaymentTypeRequest): Call<InBoardDetailResponse>
+
+    /**
+     * 出入境费用明细,获取最新签证费用
+     */
+    @POST("/api/Groups/EnterExitCostMobileFeeTips")
+    fun getNewestVisaPayment(@Body entryAndExitTipsRequest: EntryAndExitTipsRequest): Call<NewestVisaPaymentResponse>
+
+    /**
+     * 出入境费用明细,境内费用更新
+     */
+    @POST("/api/Groups/EnterExitCostMobileOpStep1")
+    fun updateInBoardPayment(@Body updateInBoardPaymentRequest: UpdateInBoardPaymentRequest): Call<UpdateInBoardPaymentResponse>
+
+    /**
+     * 出入境费用明细,获取国际旅费详细
+     */
+    @POST("/api/Groups/EnterExitCostMobileSubInfo")
+    fun getInternationalTravelFeeDetail(@Body entryAndExitPaymentTypeRequest: EntryAndExitPaymentTypeRequest): Call<InternationalTravelPaymentDetailResponse>
+
+    /**
+     * 出入境费用明细,获取国际旅费tips
+     */
+    @POST("/api/Groups/EnterExitCostMobileFeeTips")
+    fun getInternationalTravelTips(@Body entryAndExitTipsRequest: EntryAndExitTipsRequest): Call<InternationalTravelTipsResponse>
+
+    /**
+     * 出入境费用明细,更新国际旅费
+     */
+    @POST("/api/Groups/EnterExitCostMobileOpStep2")
+    fun updateInternationalTravelPayment(@Body updateInternationalTravelRequest: UpdateInternationalTravelRequest): Call<UpdateInternationalTravelResponse>
 }

+ 1 - 2
app/src/main/java/com/pan_american/android/ui/customer_resource/company_customer/AddNewCustomerActivity.kt

@@ -255,7 +255,7 @@ class AddNewCustomerActivity : BaseActivity<ActivityAddNewCustomerBinding>() {
                         itemView.findViewById<TextView>(R.id.selector_item_name).apply {
                             text = data.name
 
-                            if (marketCustomer.weight.toInt() == data.id) {
+                            if (marketCustomer.weight == data.name) {
                                 setTextColor(ResourcesCompat.getColor(resources, R.color.text_color_blue, null))
                             } else {
                                 setTextColor(ResourcesCompat.getColor(resources, R.color.text_color, null))
@@ -330,7 +330,6 @@ class AddNewCustomerActivity : BaseActivity<ActivityAddNewCustomerBinding>() {
     }
 
     private fun initMarketCustomerInfo() {
-
         apiService.getMarketCustomerDetailById(MarketCustomerDetailRequest(id))
             .enqueue(object : Callback<MarketCustomerDetailResponse> {
                 override fun onResponse(

+ 2 - 2
app/src/main/java/com/pan_american/android/ui/document/DocumentFragment.kt

@@ -123,8 +123,8 @@ class DocumentFragment : BaseFragment<FragmentDocumentBinding>(), OnClickListene
                     }
                 }
 
-                OASystem.ENTER_AND_LEAVE_PAYMENT_DETAIL -> {
-                    if (OASystem.authorization(OASystem.ENTER_AND_LEAVE_PAYMENT_DETAIL, OASystem.DOWNLOAD)) {
+                OASystem.ENTRY_AND_EXIT_FEE_DETAIL -> {
+                    if (OASystem.authorization(OASystem.ENTRY_AND_EXIT_FEE_DETAIL, OASystem.DOWNLOAD)) {
                         if (binding.groupManager.visibility == View.GONE) {
                             binding.groupManager.visibility = View.VISIBLE
                         }

+ 0 - 6
app/src/main/java/com/pan_american/android/ui/financial_module/collection_bill/CollectionBillPaymentListActivity.kt

@@ -3,11 +3,9 @@ package com.pan_american.android.ui.financial_module.collection_bill
 import android.content.Intent
 import android.net.Uri
 import android.os.Bundle
-import android.util.Log
 import android.view.View
 import android.widget.TextView
 import androidx.recyclerview.widget.LinearLayoutManager
-import com.google.gson.Gson
 import com.pan_american.android.OASystem
 import com.pan_american.android.R
 import com.pan_american.android.base.BaseActivity
@@ -325,9 +323,6 @@ class CollectionBillPaymentListActivity : BaseActivity<ActivityCollectionBillPay
     }
 
     private fun fileDownLoad(groupId: Int, type: Int, typeName: String) {
-
-        Log.e("request", Gson().toJson(CollectionBillFileDownloadRequest(groupId, type)))
-
         apiService.collectionBillFileDownload(CollectionBillFileDownloadRequest(groupId, type)).enqueue(object : Callback<CollectionBillFileDownloadResponse> {
             override fun onResponse(
                 call: Call<CollectionBillFileDownloadResponse>,
@@ -359,7 +354,6 @@ class CollectionBillPaymentListActivity : BaseActivity<ActivityCollectionBillPay
             }
 
             override fun onFailure(p0: Call<CollectionBillFileDownloadResponse>, p1: Throwable) {
-                Log.e("error", p1.stackTraceToString())
                 showErrorInfo(R.string.interface_request_error)
             }
         })

+ 0 - 3
app/src/main/java/com/pan_american/android/ui/financial_module/payment_refund/AddPaymentRefundActivity.kt

@@ -1,10 +1,8 @@
 package com.pan_american.android.ui.financial_module.payment_refund
 
 import android.os.Bundle
-import android.util.Log
 import android.widget.TextView
 import androidx.core.content.res.ResourcesCompat
-import com.google.gson.Gson
 import com.pan_american.android.OASystem
 import com.pan_american.android.R
 import com.pan_american.android.base.BaseActivity
@@ -384,7 +382,6 @@ class AddPaymentRefundActivity : BaseActivity<ActivityAddPaymentRefundBinding>()
     }
 
     private fun updatePaymentRefund() {
-        Log.e("request", Gson().toJson(updatePaymentRefundRequest))
         apiService.updatePaymentRefundDetail(updatePaymentRefundRequest).enqueue(object : Callback<BaseResponse> {
             override fun onResponse(call: Call<BaseResponse>, response: Response<BaseResponse>) {
                 val updateResponse = response.body()

+ 2 - 2
app/src/main/java/com/pan_american/android/ui/group_airplane_ticket/airplane_payment_insert/AirplaneTicketListFragment.kt

@@ -69,6 +69,8 @@ class AirplaneTicketListFragment : BaseFragment<FragmentAirplaneTicketListBindin
 
         getGroupCurrency()
 
+        initViews()
+
         initEvents()
     }
 
@@ -154,8 +156,6 @@ class AirplaneTicketListFragment : BaseFragment<FragmentAirplaneTicketListBindin
                                 OASystem.currency.add(item)
                             }
 
-                            initViews()
-
                         } else {
                             showMessage(currencyResponse.msg)
                         }

+ 79 - 0
app/src/main/java/com/pan_american/android/ui/group_management/entry_and_exit_fee_detail/EntryAndExitDetailActivity.kt

@@ -0,0 +1,79 @@
+package com.pan_american.android.ui.group_management.entry_and_exit_fee_detail
+
+import android.os.Bundle
+import android.util.Log
+import com.google.gson.Gson
+import com.pan_american.android.OASystem
+import com.pan_american.android.R
+import com.pan_american.android.base.BaseActivity
+import com.pan_american.android.data.model.group_management.entry_and_exit_fee_detail.network.EntryAndExitDetailRequest
+import com.pan_american.android.data.model.group_management.entry_and_exit_fee_detail.network.EntryAndExitDetailResponse
+import com.pan_american.android.data.network.APIService
+import com.pan_american.android.data.network.ServiceCreator
+import com.pan_american.android.databinding.ActivityEntryAndExitDetailBinding
+import com.pan_american.android.databinding.LayoutTitleBinding
+import retrofit2.Call
+import retrofit2.Callback
+import retrofit2.Response
+
+class EntryAndExitDetailActivity : BaseActivity<ActivityEntryAndExitDetailBinding>() {
+
+    private var groupId = 0
+
+    private lateinit var titleBinding: LayoutTitleBinding
+
+    private val apiService = ServiceCreator.create<APIService>()
+
+    override fun getViewBinding() = ActivityEntryAndExitDetailBinding.inflate(layoutInflater)
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+
+        intent.apply {
+            groupId = getIntExtra("groupId", 0)
+        }
+
+        initTitle()
+
+        getTotalPaymentInfo()
+    }
+
+    override fun initTitle() {
+        titleBinding = LayoutTitleBinding.bind(binding.root).apply {
+            titleText.text = resources.getString(R.string.entry_and_exit_fee_detail)
+
+            backButton.setOnClickListener {
+                back()
+            }
+        }
+    }
+
+    override fun initViews() {
+        supportFragmentManager.beginTransaction().addToBackStack(null)
+            .add(binding.entryAndExitDetailContainer.id, EntryAndExitFeeTotalFragment()).commit()
+    }
+
+    private fun getTotalPaymentInfo() {
+        apiService.getEntryAndExitPaymentDetail(EntryAndExitDetailRequest(groupId)).enqueue(object : Callback<EntryAndExitDetailResponse> {
+            override fun onResponse(
+                call: Call<EntryAndExitDetailResponse>,
+                response: Response<EntryAndExitDetailResponse>
+            ) {
+                val detailResponse = response.body()
+
+                if (detailResponse != null) {
+
+                    Log.e("response", Gson().toJson(detailResponse))
+
+                    OASystem.entryAndExitDetailResponse = detailResponse
+
+                    initViews()
+                }
+            }
+
+            override fun onFailure(p0: Call<EntryAndExitDetailResponse>, p1: Throwable) {
+                showErrorInfo(R.string.entry_and_exit_detail_total_get_error)
+            }
+        })
+    }
+}

+ 189 - 0
app/src/main/java/com/pan_american/android/ui/group_management/entry_and_exit_fee_detail/EntryAndExitFeeGroupListActivity.kt

@@ -0,0 +1,189 @@
+package com.pan_american.android.ui.group_management.entry_and_exit_fee_detail
+
+import android.content.Intent
+import android.os.Bundle
+import android.view.View
+import android.widget.TextView
+import androidx.core.widget.addTextChangedListener
+import androidx.recyclerview.widget.LinearLayoutManager
+import com.pan_american.android.OASystem
+import com.pan_american.android.R
+import com.pan_american.android.base.BaseActivity
+import com.pan_american.android.base.ListAdapter
+import com.pan_american.android.data.model.common.entity.Selector
+import com.pan_american.android.data.model.group_management.entry_and_exit_fee_detail.network.EntryAndExitGroupListRequest
+import com.pan_american.android.data.model.group_management.entry_and_exit_fee_detail.network.EntryAndExitGroupListResponse
+import com.pan_american.android.data.network.APIService
+import com.pan_american.android.data.network.ServiceCreator
+import com.pan_american.android.databinding.ActivityEntryAndExitGroupListBinding
+import com.pan_american.android.databinding.LayoutTitleBinding
+import com.scwang.smart.refresh.footer.ClassicsFooter
+import com.scwang.smart.refresh.header.ClassicsHeader
+import com.scwang.smart.refresh.layout.api.RefreshLayout
+import com.scwang.smart.refresh.layout.listener.OnRefreshLoadMoreListener
+import retrofit2.Call
+import retrofit2.Callback
+import retrofit2.Response
+
+class EntryAndExitFeeGroupListActivity : BaseActivity<ActivityEntryAndExitGroupListBinding>() {
+
+    private lateinit var titleBinding: LayoutTitleBinding
+
+    private val entryAndExitGroupListRequest = EntryAndExitGroupListRequest().apply {
+        pageIndex = 1
+        pageSize = 20
+    }
+
+    private val apiService = ServiceCreator.create<APIService>()
+
+    private val groupNameList = ArrayList<Selector>()
+
+    private var totalPage = 0
+
+    override fun getViewBinding() = ActivityEntryAndExitGroupListBinding.inflate(layoutInflater)
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+
+        initTitle()
+
+        initViews()
+    }
+
+    override fun initTitle() {
+        titleBinding = LayoutTitleBinding.bind(binding.root).apply {
+            titleText.text = resources.getString(R.string.entry_and_exit_fee_detail)
+
+            searchView.visibility = View.VISIBLE
+
+            searchText.addTextChangedListener {
+                entryAndExitGroupListRequest.apply {
+                    pageIndex = 1
+                    groupName = searchText.text.toString()
+                }
+
+                binding.groupInfoList.adapter!!.notifyItemRangeRemoved(0, groupNameList.size)
+                groupNameList.clear()
+                getGroupList(2)
+            }
+
+            backButton.setOnClickListener {
+                back()
+            }
+        }
+    }
+
+    override fun initViews() {
+        binding.groupInfoContainer.setRefreshHeader(ClassicsHeader(OASystem.context))
+        binding.groupInfoContainer.setRefreshFooter(ClassicsFooter(OASystem.context))
+
+        getGroupList(1)
+    }
+
+    private fun getGroupList(type: Int) {
+        apiService.getEntryAndExitGroupList(entryAndExitGroupListRequest).enqueue(object :
+            Callback<EntryAndExitGroupListResponse> {
+            override fun onResponse(
+                call: Call<EntryAndExitGroupListResponse>,
+                response: Response<EntryAndExitGroupListResponse>
+            ) {
+                val listResponse = response.body()
+
+                if (listResponse != null) {
+                    if (listResponse.code == 200) {
+                        if (listResponse.data.size == 0) {
+                            showMessage(resources.getString(R.string.no_data))
+                        } else {
+
+                            for (item in listResponse.data) {
+                                groupNameList.add(item)
+                            }
+
+                            when(type) {
+
+                                1 -> {
+                                    totalPage = getTotalPage(listResponse.count)
+                                    binding.groupInfoContainer.setEnableLoadMore(totalPage > entryAndExitGroupListRequest.pageIndex)
+                                    initList()
+                                }
+
+                                2 -> {
+                                    binding.groupInfoContainer.finishRefresh()
+                                    totalPage = getTotalPage(listResponse.count)
+                                    binding.groupInfoContainer.setEnableLoadMore(entryAndExitGroupListRequest.pageIndex < totalPage)
+                                    initList()
+                                }
+
+                                3 -> {
+                                    binding.groupInfoContainer.finishLoadMore()
+                                    binding.groupInfoContainer.setEnableLoadMore(entryAndExitGroupListRequest.pageIndex < totalPage)
+                                    binding.groupInfoList.adapter!!.notifyItemInserted(groupNameList.size)
+                                }
+                            }
+                        }
+
+                    } else {
+                        showMessage(listResponse.msg)
+                    }
+                }
+            }
+
+            override fun onFailure(p0: Call<EntryAndExitGroupListResponse>, p1: Throwable) {
+                showErrorInfo(R.string.group_list_get_failed)
+            }
+        })
+    }
+
+    private fun getTotalPage(count: Int): Int {
+        var totalPage = count / 20
+        if (count % 20 != 0) {
+            totalPage++
+        }
+
+        return totalPage
+    }
+
+    private fun initList() {
+        if (groupNameList.size == 0) {
+            return
+        }
+
+        val layoutManager = LinearLayoutManager(OASystem.context)
+        binding.groupInfoList.layoutManager = layoutManager
+
+        val adapter = ListAdapter.Builder<Selector>().apply {
+            setData(groupNameList)
+            setLayoutId(R.layout.item_group_name_list)
+            addBindView { itemView, data ->
+                itemView.findViewById<TextView>(R.id.selector_item_name).text = data.groupName
+            }
+        }.create()
+
+        binding.groupInfoList.adapter = adapter
+
+        adapter.onRecyclerViewItemClick = object : ListAdapter.OnRecyclerViewItemClick<Selector> {
+            override fun onItemClick(position: Int) {
+                val intent = Intent(OASystem.context, EntryAndExitDetailActivity::class.java).apply {
+                    putExtra("groupId", groupNameList[position].id)
+                }
+                startActivity(intent)
+            }
+        }
+
+        binding.groupInfoContainer.setOnRefreshLoadMoreListener(object : OnRefreshLoadMoreListener {
+            override fun onRefresh(refreshLayout: RefreshLayout) {
+                entryAndExitGroupListRequest.pageIndex = 1
+                binding.groupInfoList.adapter!!.notifyItemRangeRemoved(0, groupNameList.size)
+                groupNameList.clear()
+                getGroupList(2)
+            }
+
+            override fun onLoadMore(refreshLayout: RefreshLayout) {
+                if (entryAndExitGroupListRequest.pageIndex < totalPage) {
+                    entryAndExitGroupListRequest.pageIndex += 1
+                    getGroupList(3)
+                }
+            }
+        })
+    }
+}

+ 231 - 0
app/src/main/java/com/pan_american/android/ui/group_management/entry_and_exit_fee_detail/EntryAndExitFeeTotalFragment.kt

@@ -0,0 +1,231 @@
+package com.pan_american.android.ui.group_management.entry_and_exit_fee_detail
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.ViewGroup
+import com.pan_american.android.OASystem
+import com.pan_american.android.R
+import com.pan_american.android.base.BaseFragment
+import com.pan_american.android.data.network.APIService
+import com.pan_american.android.data.network.ServiceCreator
+import com.pan_american.android.databinding.FragmentEntryAndExitFeeTotalBinding
+
+class EntryAndExitFeeTotalFragment : BaseFragment<FragmentEntryAndExitFeeTotalBinding>() {
+
+    private val apiService = ServiceCreator.create<APIService>()
+
+    override fun getViewBinding(
+        inflater: LayoutInflater,
+        container: ViewGroup?,
+        bundle: Bundle?
+    ) = FragmentEntryAndExitFeeTotalBinding.inflate(layoutInflater, container, false)
+
+    override fun onResume() {
+        super.onResume()
+
+        initViews()
+
+        initEvents()
+    }
+
+    override fun initViews() {
+        OASystem.entryAndExitDetailResponse.apply {
+            binding.checkInBoard.isChecked = choiceOne == 1
+            binding.inBoardTotal.text = String.format(resources.getString(R.string.total_per_fee_format), choiceOneTotalCost)
+
+            binding.checkEconomyClass.isChecked = choiceTwoJJ == 1
+            binding.checkBusinessClass.isChecked = choiceTwoGW == 1
+            binding.checkFirstClass.isChecked = choiceTwoTD == 1
+
+            binding.checkAccommodationFee.isChecked = choiceThree == 1
+            binding.accommodationTotal.text = String.format(resources.getString(R.string.total_per_fee_format), choiceThreeTotalCost)
+
+            binding.checkMealFee.isChecked = choiceFour == 1
+            binding.mealTotal.text = String.format(resources.getString(R.string.total_per_fee_format), choiceFourTotalCost)
+
+            binding.checkPublicAndMiscellaneous.isChecked = choiceFive == 1
+            binding.publicAndMiscellaneousTotal.text = String.format(resources.getString(R.string.total_per_fee_format), choiceFiveTotalCost)
+
+            binding.checkTraining.isChecked = choiceSix == 1
+            binding.trainingTotal.text = String.format(resources.getString(R.string.total_per_fee_format), choiceSixTotalCost)
+
+            binding.checkOther.isChecked = otherExpenses_Checked == 1
+            binding.otherTotal.text = String.format(resources.getString(R.string.total_per_fee_format), otherExpensesTotalCost)
+
+            binding.economyClass.text = String.format(resources.getString(R.string.economy_class_price), outsideJJPay)
+            binding.businessClass.text = String.format(resources.getString(R.string.business_class_price), outsideGWPay)
+            binding.firstClass.text = String.format(resources.getString(R.string.first_class_price), outsideTDPay)
+
+            OASystem.entryAndExitDetailResponse.apply {
+                economyTotalPayment = choiceOneTotalCost + outsideJJPay + choiceThreeTotalCost + choiceFourTotalCost + choiceFiveTotalCost
+                bussinessTotalPayment = choiceOneTotalCost + outsideGWPay + choiceThreeTotalCost + choiceFourTotalCost + choiceFiveTotalCost
+                firstClassTotalPayment = choiceOneTotalCost + outsideTDPay + choiceThreeTotalCost + choiceFourTotalCost + choiceFiveTotalCost
+            }
+
+            binding.economyClassTotal.text = if (choiceTwoJJ == 1) {
+                String.format(resources.getString(R.string.economy_class_price), economyTotalPayment)
+            } else {
+                String.format(resources.getString(R.string.economy_class_price), 0.0)
+            }
+            binding.businessClassTotal.text = if (choiceTwoGW == 1) {
+                String.format(resources.getString(R.string.business_class_price), bussinessTotalPayment)
+            } else {
+                String.format(resources.getString(R.string.business_class_price), 0.0)
+            }
+            binding.firstClassTotal.text = if (choiceTwoTD == 1) {
+                String.format(resources.getString(R.string.first_class_price), firstClassTotalPayment)
+            } else {
+                String.format(resources.getString(R.string.first_class_price), 0.0)
+            }
+        }
+    }
+
+    override fun initEvents() {
+        binding.inBoardFee.setOnClickListener {
+
+            val bundle = Bundle().apply {
+                putInt("groupId", OASystem.entryAndExitDetailResponse.diId)
+            }
+
+            val inBoardFeeFragment = InBoardFeeFragment().apply {
+                arguments = bundle
+            }
+
+            parentFragmentManager.beginTransaction().setCustomAnimations(
+                R.anim.slide_right_in,
+                R.anim.slide_left_out,
+                R.anim.slide_left_in,
+                R.anim.slide_right_out
+            ).addToBackStack(null)
+                .add(R.id.entry_and_exit_detail_container, inBoardFeeFragment).commit()
+        }
+
+        binding.internationalTravelFee.setOnClickListener {
+            val bundle = Bundle().apply {
+                putInt("groupId", OASystem.entryAndExitDetailResponse.diId)
+            }
+
+            val internationalTravelFeeFragment = InternationalTravelFeeFragment().apply {
+                arguments = bundle
+            }
+
+            parentFragmentManager.beginTransaction().setCustomAnimations(
+                R.anim.slide_right_in,
+                R.anim.slide_left_out,
+                R.anim.slide_left_in,
+                R.anim.slide_right_out
+            ).addToBackStack(null)
+                .add(R.id.entry_and_exit_detail_container, internationalTravelFeeFragment).commit()
+        }
+
+        binding.accommodationFee.setOnClickListener {
+            val bundle = Bundle().apply {
+                putInt("groupId", OASystem.entryAndExitDetailResponse.diId)
+                putInt("type", 3)
+            }
+
+            val paymentListFragment = EntryAndExitPaymentListFragment().apply {
+                arguments = bundle
+            }
+
+            parentFragmentManager.beginTransaction().setCustomAnimations(
+                R.anim.slide_right_in,
+                R.anim.slide_left_out,
+                R.anim.slide_left_in,
+                R.anim.slide_right_out
+            ).addToBackStack(null)
+                .add(R.id.entry_and_exit_detail_container, paymentListFragment).commit()
+        }
+
+        binding.mealFee.setOnClickListener {
+            binding.accommodationFee.setOnClickListener {
+                val bundle = Bundle().apply {
+                    putInt("groupId", OASystem.entryAndExitDetailResponse.diId)
+                    putInt("type", 4)
+                }
+
+                val paymentListFragment = EntryAndExitPaymentListFragment().apply {
+                    arguments = bundle
+                }
+
+                parentFragmentManager.beginTransaction().setCustomAnimations(
+                    R.anim.slide_right_in,
+                    R.anim.slide_left_out,
+                    R.anim.slide_left_in,
+                    R.anim.slide_right_out
+                ).addToBackStack(null)
+                    .add(R.id.entry_and_exit_detail_container, paymentListFragment).commit()
+            }
+        }
+
+        binding.publicAndMiscellaneousFee.setOnClickListener {
+            binding.accommodationFee.setOnClickListener {
+                val bundle = Bundle().apply {
+                    putInt("groupId", OASystem.entryAndExitDetailResponse.diId)
+                    putInt("type", 5)
+                }
+
+                val paymentListFragment = EntryAndExitPaymentListFragment().apply {
+                    arguments = bundle
+                }
+
+                parentFragmentManager.beginTransaction().setCustomAnimations(
+                    R.anim.slide_right_in,
+                    R.anim.slide_left_out,
+                    R.anim.slide_left_in,
+                    R.anim.slide_right_out
+                ).addToBackStack(null)
+                    .add(R.id.entry_and_exit_detail_container, paymentListFragment).commit()
+            }
+        }
+
+        binding.trainingFee.setOnClickListener {
+            binding.accommodationFee.setOnClickListener {
+                val bundle = Bundle().apply {
+                    putInt("groupId", OASystem.entryAndExitDetailResponse.diId)
+                    putInt("type", 6)
+                }
+
+                val paymentListFragment = EntryAndExitPaymentListFragment().apply {
+                    arguments = bundle
+                }
+
+                parentFragmentManager.beginTransaction().setCustomAnimations(
+                    R.anim.slide_right_in,
+                    R.anim.slide_left_out,
+                    R.anim.slide_left_in,
+                    R.anim.slide_right_out
+                ).addToBackStack(null)
+                    .add(R.id.entry_and_exit_detail_container, paymentListFragment).commit()
+            }
+        }
+
+        binding.otherFee.setOnClickListener {
+            binding.accommodationFee.setOnClickListener {
+                val bundle = Bundle().apply {
+                    putInt("groupId", OASystem.entryAndExitDetailResponse.diId)
+                }
+
+                val otherPaymentFragment = OtherPaymentFragment().apply {
+                    arguments = bundle
+                }
+
+                parentFragmentManager.beginTransaction().setCustomAnimations(
+                    R.anim.slide_right_in,
+                    R.anim.slide_left_out,
+                    R.anim.slide_left_in,
+                    R.anim.slide_right_out
+                ).addToBackStack(null)
+                    .add(R.id.entry_and_exit_detail_container, otherPaymentFragment).commit()
+            }
+        }
+
+        binding.exportToCollectionBill.setOnClickListener {
+
+        }
+
+        binding.downloadGroupMembersList.setOnClickListener {
+
+        }
+    }
+}

+ 15 - 0
app/src/main/java/com/pan_american/android/ui/group_management/entry_and_exit_fee_detail/EntryAndExitPaymentListFragment.kt

@@ -0,0 +1,15 @@
+package com.pan_american.android.ui.group_management.entry_and_exit_fee_detail
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.ViewGroup
+import com.pan_american.android.base.BaseFragment
+import com.pan_american.android.databinding.FragmentEntryAndExitPaymentListBinding
+
+class EntryAndExitPaymentListFragment : BaseFragment<FragmentEntryAndExitPaymentListBinding>() {
+    override fun getViewBinding(
+        inflater: LayoutInflater,
+        container: ViewGroup?,
+        bundle: Bundle?
+    ) = FragmentEntryAndExitPaymentListBinding.inflate(inflater, container, false)
+}

+ 207 - 0
app/src/main/java/com/pan_american/android/ui/group_management/entry_and_exit_fee_detail/InBoardFeeFragment.kt

@@ -0,0 +1,207 @@
+package com.pan_american.android.ui.group_management.entry_and_exit_fee_detail
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import com.pan_american.android.OASystem
+import com.pan_american.android.R
+import com.pan_american.android.base.BaseFragment
+import com.pan_american.android.data.model.group_management.entry_and_exit_fee_detail.network.EntryAndExitPaymentTypeRequest
+import com.pan_american.android.data.model.group_management.entry_and_exit_fee_detail.network.EntryAndExitTipsRequest
+import com.pan_american.android.data.model.group_management.entry_and_exit_fee_detail.network.InBoardDetailResponse
+import com.pan_american.android.data.model.group_management.entry_and_exit_fee_detail.network.NewestVisaPaymentResponse
+import com.pan_american.android.data.model.group_management.entry_and_exit_fee_detail.network.UpdateInBoardPaymentRequest
+import com.pan_american.android.data.model.group_management.entry_and_exit_fee_detail.network.UpdateInBoardPaymentResponse
+import com.pan_american.android.data.network.APIService
+import com.pan_american.android.data.network.ServiceCreator
+import com.pan_american.android.databinding.FragmentInBoardFeeBinding
+import com.pan_american.android.util.MoneyInputFilter
+import retrofit2.Call
+import retrofit2.Callback
+import retrofit2.Response
+
+class InBoardFeeFragment : BaseFragment<FragmentInBoardFeeBinding>() {
+
+    private var groupId = 0
+
+    private var paymentId = 0
+
+    private val apiService = ServiceCreator.create<APIService>()
+
+    override fun getViewBinding(
+        inflater: LayoutInflater,
+        container: ViewGroup?,
+        bundle: Bundle?
+    ) = FragmentInBoardFeeBinding.inflate(inflater, container, false)
+
+    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+        super.onViewCreated(view, savedInstanceState)
+
+        requireArguments().apply {
+            groupId = getInt("groupId")
+        }
+
+        initViews()
+
+        initEvents()
+    }
+
+    override fun initViews() {
+        binding.visaPrice.filters = arrayOf(MoneyInputFilter(2))
+        binding.vaccinePrice.filters = arrayOf(MoneyInputFilter(2))
+        binding.nucleicAcidTestingPrice.filters = arrayOf(MoneyInputFilter(2))
+        binding.servicePrice.filters = arrayOf(MoneyInputFilter(2))
+        binding.insurancePrice.filters = arrayOf(MoneyInputFilter(2))
+        binding.ticketPrice.filters = arrayOf(MoneyInputFilter(2))
+
+        getInBoardFeeDetail()
+    }
+
+    private fun getInBoardFeeDetail() {
+        apiService.getInBoardPaymentDetail(EntryAndExitPaymentTypeRequest(diId = groupId, subType = 1)).enqueue(object : Callback<InBoardDetailResponse> {
+            override fun onResponse(
+                call: Call<InBoardDetailResponse>,
+                response: Response<InBoardDetailResponse>
+            ) {
+
+                response.body()?.apply {
+
+                    paymentId = id
+
+                    binding.isSelected.isChecked = choiceOne == 1
+                    binding.visaPrice.setText(visa.toString())
+                    binding.visaDescription.setText(visaRemark)
+                    binding.vaccinePrice.setText(yiMiao.toString())
+                    binding.nucleicAcidTestingPrice.setText(heSuan.toString())
+                    binding.servicePrice.setText(service.toString())
+                    binding.insurancePrice.setText(safe.toString())
+                    binding.ticketPrice.setText(ticket.toString())
+                }
+            }
+
+            override fun onFailure(p0: Call<InBoardDetailResponse>, p1: Throwable) {
+                showErrorInfo(R.string.in_board_payment_detail_get_error)
+            }
+        })
+    }
+
+    override fun initEvents() {
+        binding.getNewestVisaPayment.setOnClickListener {
+            getNewestVisaPayment()
+        }
+
+        binding.commit.setOnClickListener {
+            if (binding.visaPrice.text.isBlank() || binding.visaPrice.text.endsWith('.')) {
+                showMessage(resources.getString(R.string.visa_price_input_hint))
+                return@setOnClickListener
+            }
+
+            if (binding.vaccinePrice.text.isBlank() || binding.vaccinePrice.text.endsWith('.')) {
+                showMessage(resources.getString(R.string.vaccine_price_input_hint))
+                return@setOnClickListener
+            }
+
+            if (binding.nucleicAcidTestingPrice.text.isBlank() || binding.nucleicAcidTestingPrice.text.endsWith('.')) {
+                showMessage(resources.getString(R.string.nucleic_acid_testing_payment_input_hint))
+                return@setOnClickListener
+            }
+
+            if (binding.servicePrice.text.isBlank() || binding.servicePrice.text.endsWith('.')) {
+                showMessage(resources.getString(R.string.service_price_input_hint))
+                return@setOnClickListener
+            }
+
+            if (binding.insurancePrice.text.isBlank() || binding.insurancePrice.text.endsWith('.')) {
+                showMessage(resources.getString(R.string.insurance_price_input_hint))
+                return@setOnClickListener
+            }
+
+            if (binding.ticketPrice.text.isBlank() || binding.ticketPrice.text.endsWith('.')) {
+                showMessage(resources.getString(R.string.ticket_price_input_hint))
+                return@setOnClickListener
+            }
+
+            val updateInBoardPaymentRequest = UpdateInBoardPaymentRequest(
+                id = paymentId,
+                diId = groupId,
+                choiceOne = if (binding.isSelected.isChecked) {
+                    1
+                } else {
+                    0
+                },
+                visa = binding.visaPrice.text.toString().toDouble(),
+                visaRemark = binding.visaDescription.getText(),
+                yiMiao = binding.vaccinePrice.text.toString().toDouble(),
+                heSuan = binding.nucleicAcidTestingPrice.text.toString().toDouble(),
+                service = binding.servicePrice.text.toString().toDouble(),
+                ticket = binding.ticketPrice.text.toString().toDouble(),
+                safe = binding.insurancePrice.text.toString().toDouble()
+            )
+
+            updateInBoardPayment(updateInBoardPaymentRequest)
+        }
+    }
+
+    private fun getNewestVisaPayment() {
+        apiService.getNewestVisaPayment(EntryAndExitTipsRequest(groupId = groupId, tipsType = 2)).enqueue(object : Callback<NewestVisaPaymentResponse> {
+            override fun onResponse(
+                call: Call<NewestVisaPaymentResponse>,
+                response: Response<NewestVisaPaymentResponse>
+            ) {
+                val detailResponse = response.body()
+
+                if (detailResponse != null) {
+                    if (detailResponse.code == 200) {
+
+                        detailResponse.data.apply {
+                            binding.visaPrice.setText(feeTotal.toString())
+
+                            binding.visaDescription.setText(remark)
+
+                            showMessage(resources.getString(R.string.update_success))
+                        }
+
+                    } else {
+                        showMessage(detailResponse.msg)
+                    }
+                }
+            }
+
+            override fun onFailure(p0: Call<NewestVisaPaymentResponse>, p1: Throwable) {
+                showErrorInfo(R.string.newest_visa_payment_get_error)
+            }
+        })
+    }
+
+    private fun updateInBoardPayment(updateInBoardPaymentRequest: UpdateInBoardPaymentRequest) {
+        apiService.updateInBoardPayment(updateInBoardPaymentRequest).enqueue(object : Callback<UpdateInBoardPaymentResponse> {
+            override fun onResponse(
+                call: Call<UpdateInBoardPaymentResponse>,
+                response: Response<UpdateInBoardPaymentResponse>
+            ) {
+                val updateResponse = response.body()
+
+                if (updateResponse != null) {
+                    if (updateResponse.code == 200) {
+
+                        OASystem.entryAndExitDetailResponse.choiceOneTotalCost = updateResponse.data.itemTotal
+
+                        OASystem.entryAndExitDetailResponse.choiceOne = updateInBoardPaymentRequest.choiceOne
+
+                        showMessage(resources.getString(R.string.update))
+
+                        parentFragmentManager.popBackStack()
+
+                    } else {
+                        showMessage(updateResponse.msg)
+                    }
+                }
+            }
+
+            override fun onFailure(p0: Call<UpdateInBoardPaymentResponse>, p1: Throwable) {
+                showErrorInfo(R.string.update_error)
+            }
+        })
+    }
+}

+ 256 - 0
app/src/main/java/com/pan_american/android/ui/group_management/entry_and_exit_fee_detail/InternationalTravelFeeFragment.kt

@@ -0,0 +1,256 @@
+package com.pan_american.android.ui.group_management.entry_and_exit_fee_detail
+
+import android.os.Bundle
+import android.util.Log
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import com.google.gson.Gson
+import com.pan_american.android.OASystem
+import com.pan_american.android.R
+import com.pan_american.android.base.BaseFragment
+import com.pan_american.android.data.model.group_management.entry_and_exit_fee_detail.network.EntryAndExitPaymentTypeRequest
+import com.pan_american.android.data.model.group_management.entry_and_exit_fee_detail.network.EntryAndExitTipsRequest
+import com.pan_american.android.data.model.group_management.entry_and_exit_fee_detail.network.InternationalTravelPaymentDetailResponse
+import com.pan_american.android.data.model.group_management.entry_and_exit_fee_detail.network.InternationalTravelTipsResponse
+import com.pan_american.android.data.model.group_management.entry_and_exit_fee_detail.network.UpdateInternationalTravelRequest
+import com.pan_american.android.data.model.group_management.entry_and_exit_fee_detail.network.UpdateInternationalTravelResponse
+import com.pan_american.android.data.network.APIService
+import com.pan_american.android.data.network.ServiceCreator
+import com.pan_american.android.databinding.FragmentInternationalTravelFeeBinding
+import com.pan_american.android.util.MoneyInputFilter
+import retrofit2.Call
+import retrofit2.Callback
+import retrofit2.Response
+
+class InternationalTravelFeeFragment : BaseFragment<FragmentInternationalTravelFeeBinding>() {
+
+    private var groupId = 0
+
+    private var paymentId = 0
+
+    private var economyClassTip = 0.0
+
+    private var businessClassTip = 0.0
+
+    private val apiService = ServiceCreator.create<APIService>()
+
+    override fun getViewBinding(
+        inflater: LayoutInflater,
+        container: ViewGroup?,
+        bundle: Bundle?
+    ) = FragmentInternationalTravelFeeBinding.inflate(inflater, container, false)
+
+    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+        super.onViewCreated(view, savedInstanceState)
+
+        requireArguments().apply {
+            groupId = getInt("groupId")
+        }
+
+        initViews()
+
+        initEvents()
+    }
+
+    override fun initViews() {
+
+        binding.economyClassPrice.filters = arrayOf(MoneyInputFilter(2))
+        binding.businessClassPrice.filters = arrayOf(MoneyInputFilter(2))
+        binding.firstClassPrice.filters = arrayOf(MoneyInputFilter(2))
+
+        getInternationalTravelFeeDetail()
+    }
+
+    private fun getInternationalTravelFeeDetail() {
+        apiService.getInternationalTravelFeeDetail(
+            EntryAndExitPaymentTypeRequest(
+                diId = groupId,
+                subType = 2
+            )
+        ).enqueue(object : Callback<InternationalTravelPaymentDetailResponse> {
+
+            override fun onResponse(
+                call: Call<InternationalTravelPaymentDetailResponse>,
+                response: Response<InternationalTravelPaymentDetailResponse>
+            ) {
+                val detailResponse = response.body()
+
+                if (detailResponse != null) {
+                    if (detailResponse.code == 200) {
+                        detailResponse.data.apply {
+
+                            paymentId = id
+
+                            binding.economyClassSelected.isChecked = choiceTwoJJ == 1
+                            binding.economyClassPrice.setText(airJJ.toString())
+
+                            binding.businessClassSelected.isChecked = choiceTwoGW == 1
+                            binding.businessClassPrice.setText(airGW.toString())
+
+                            binding.firstClassSelected.isChecked = choiceTwoTD == 1
+                            binding.firstClassPrice.setText(airTD.toString())
+
+                            binding.cityTrafficPayment.setText(cityTranffic.toString())
+
+                            getInternationalTravelTips()
+                        }
+                    } else {
+                        showMessage(detailResponse.msg)
+                    }
+                }
+            }
+
+            override fun onFailure(
+                p0: Call<InternationalTravelPaymentDetailResponse>,
+                p1: Throwable
+            ) {
+                showErrorInfo(R.string.international_travel_payment_get_error)
+            }
+        })
+    }
+
+    private fun getInternationalTravelTips() {
+        apiService.getInternationalTravelTips(
+            EntryAndExitTipsRequest(
+                groupId = groupId,
+                tipsType = 3
+            )
+        ).enqueue(object : Callback<InternationalTravelTipsResponse> {
+            override fun onResponse(
+                call: Call<InternationalTravelTipsResponse>,
+                response: Response<InternationalTravelTipsResponse>
+            ) {
+                val tipsResponse = response.body()
+
+                if (tipsResponse != null) {
+                    if (tipsResponse.code == 200) {
+
+                        tipsResponse.data.apply {
+                            binding.hint.text = remark
+
+                            economyClassTip = jjcCurrentRate
+                            businessClassTip = gwcCurrentRate
+
+                        }
+
+                    } else {
+                        showMessage(tipsResponse.msg)
+                    }
+                }
+            }
+
+            override fun onFailure(p0: Call<InternationalTravelTipsResponse>, p1: Throwable) {
+                showErrorInfo(R.string.international_travel_tips_get_error)
+            }
+        })
+    }
+
+    override fun initEvents() {
+
+        binding.putIn.setOnClickListener {
+            binding.economyClassPrice.setText(economyClassTip.toString())
+
+            binding.businessClassPrice.setText(businessClassTip.toString())
+        }
+
+        binding.commit.setOnClickListener {
+            if (binding.economyClassPrice.text.isBlank() || binding.economyClassPrice.text.endsWith(
+                    '.'
+                )
+            ) {
+                showMessage(resources.getString(R.string.economy_class_price_input_hint))
+                return@setOnClickListener
+            }
+
+            if (binding.businessClassPrice.text.isBlank() || binding.businessClassPrice.text.endsWith(
+                    '.'
+                )
+            ) {
+                showMessage(resources.getString(R.string.business_class_price_input_hint))
+                return@setOnClickListener
+            }
+
+            if (binding.firstClassPrice.text.isBlank() || binding.firstClassPrice.text.endsWith('.')) {
+                showMessage(resources.getString(R.string.first_class_price_input_hint))
+                return@setOnClickListener
+            }
+
+            if (binding.cityTrafficPayment.text.isBlank() || binding.cityTrafficPayment.text.endsWith(
+                    '.'
+                )
+            ) {
+                showMessage(resources.getString(R.string.city_traffic_payment_input_hint))
+                return@setOnClickListener
+            }
+
+            val updateInternationalTravelRequest = UpdateInternationalTravelRequest(
+                id = paymentId,
+                diId = groupId,
+                choiceTwoJJ = if (binding.economyClassSelected.isChecked) {
+                    1
+                } else {
+                    0
+                },
+                choiceTwoGW = if (binding.businessClassSelected.isChecked) {
+                    1
+                } else {
+                    0
+                },
+                choiceTwoTD = if (binding.firstClassSelected.isChecked) {
+                    1
+                } else {
+                    0
+                },
+                airJJ = binding.economyClassPrice.text.toString().toDouble(),
+                airGW = binding.businessClassPrice.text.toString().toDouble(),
+                airTD = binding.firstClassPrice.text.toString().toDouble(),
+                cityTranffic = binding.cityTrafficPayment.text.toString().toDouble()
+            )
+
+            updateInternationalTravel(updateInternationalTravelRequest)
+        }
+
+    }
+
+    private fun updateInternationalTravel(updateInternationalTravelRequest: UpdateInternationalTravelRequest) {
+
+        Log.e("request", Gson().toJson(updateInternationalTravelRequest))
+
+        apiService.updateInternationalTravelPayment(updateInternationalTravelRequest)
+            .enqueue(object : Callback<UpdateInternationalTravelResponse> {
+                override fun onResponse(
+                    call: Call<UpdateInternationalTravelResponse>,
+                    response: Response<UpdateInternationalTravelResponse>
+                ) {
+                    val updateResponse = response.body()
+
+                    if (updateResponse != null) {
+                        if (updateResponse.code == 200) {
+
+                            showMessage(resources.getString(R.string.update_success))
+
+                            OASystem.entryAndExitDetailResponse.apply {
+                                choiceTwoJJ = updateResponse.data.choiceTwoJJ
+                                choiceTwoGW = updateResponse.data.choiceTwoGW
+                                choiceTwoTD = updateResponse.data.choiceTwoTD
+
+                                outsideJJPay = updateResponse.data.jjcItemTotal
+                                outsideGWPay = updateResponse.data.gwcItemTotal
+                                outsideTDPay = updateResponse.data.tdcItemTotal
+                            }
+
+                            parentFragmentManager.popBackStack()
+
+                        } else {
+                            showMessage(updateResponse.msg)
+                        }
+                    }
+                }
+
+                override fun onFailure(p0: Call<UpdateInternationalTravelResponse>, p1: Throwable) {
+                    showErrorInfo(R.string.update_error)
+                }
+            })
+    }
+}

+ 16 - 0
app/src/main/java/com/pan_american/android/ui/group_management/entry_and_exit_fee_detail/OtherPaymentFragment.kt

@@ -0,0 +1,16 @@
+package com.pan_american.android.ui.group_management.entry_and_exit_fee_detail
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.ViewGroup
+import com.pan_american.android.base.BaseFragment
+import com.pan_american.android.databinding.FragmentOtherPaymentBinding
+
+
+class OtherPaymentFragment : BaseFragment<FragmentOtherPaymentBinding>() {
+    override fun getViewBinding(
+        inflater: LayoutInflater,
+        container: ViewGroup?,
+        bundle: Bundle?
+    ) = FragmentOtherPaymentBinding.inflate(inflater, container, false)
+}

+ 0 - 3
app/src/main/java/com/pan_american/android/ui/group_management/group_info/GroupCustomerListFragment.kt

@@ -1,7 +1,6 @@
 package com.pan_american.android.ui.group_management.group_info
 
 import android.os.Bundle
-import android.util.Log
 import android.view.LayoutInflater
 import android.view.View
 import android.view.ViewGroup
@@ -122,8 +121,6 @@ class GroupCustomerListFragment : BaseFragment<FragmentGroupCustomerListBinding>
                 }
             }
 
-            Log.e("count", "$realNum, ${OASystem.groupOperationRequest.visitPNumber}")
-
             if (OASystem.groupOperationRequest.visitPNumber < realNum) {
                 showMessage(resources.getString(R.string.visit_member_over_hint))
                 return@setOnClickListener

+ 0 - 5
app/src/main/java/com/pan_american/android/ui/personnel_module/materials_operate/MaterialHistoryListFragment.kt

@@ -2,7 +2,6 @@ package com.pan_american.android.ui.personnel_module.materials_operate
 
 import android.graphics.Color
 import android.os.Bundle
-import android.util.Log
 import android.view.Gravity
 import android.view.LayoutInflater
 import android.view.View
@@ -11,7 +10,6 @@ import android.widget.ImageView
 import android.widget.PopupWindow
 import android.widget.TextView
 import androidx.recyclerview.widget.LinearLayoutManager
-import com.google.gson.Gson
 import com.pan_american.android.OASystem
 import com.pan_american.android.R
 import com.pan_american.android.base.BaseFragment
@@ -77,9 +75,6 @@ class MaterialHistoryListFragment : BaseFragment<FragmentMaterialHistoryListBind
     }
 
     private fun initMaterialHistoryList(type: Int) {
-
-        Log.e("request", Gson().toJson(materialHistoryListRequest))
-
         apiService.getMaterialHistoryList(materialHistoryListRequest).enqueue(object : Callback<MaterialHistoryListResponse> {
             override fun onResponse(
                 call: Call<MaterialHistoryListResponse>,

+ 16 - 0
app/src/main/java/com/pan_american/android/ui/workspace/WorkspaceFragment.kt

@@ -32,6 +32,7 @@ import com.pan_american.android.ui.group_hotel.hotel_predetermine.HotelPredeterm
 import com.pan_american.android.ui.group_invite_official.invite_data.InviteDataActivity
 import com.pan_american.android.ui.group_invite_official.invite_official_payment_insert.InviteOfficialPaymentInsertActivity
 import com.pan_american.android.ui.group_invite_official.official_visits.InviteVisitsActivity
+import com.pan_american.android.ui.group_management.entry_and_exit_fee_detail.EntryAndExitFeeGroupListActivity
 import com.pan_american.android.ui.group_management.group_info.GroupInfoActivity
 import com.pan_american.android.ui.group_op.ground_convey_payment_insert.GroundConveyPaymentInsertActivity
 import com.pan_american.android.ui.group_visa.insurance_payment_insert.InsurancePaymentInsertActivity
@@ -247,6 +248,16 @@ class WorkspaceFragment : BaseFragment<FragmentWorkspaceBinding>(), OnClickListe
                     }
                 }
 
+                OASystem.ENTRY_AND_EXIT_FEE_DETAIL -> {
+                    if (OASystem.authorization(OASystem.ENTRY_AND_EXIT_FEE_DETAIL, OASystem.VIEW)) {
+                        if (binding.groupManager.visibility == View.GONE) {
+                            binding.groupManager.visibility = View.VISIBLE
+                        }
+                        binding.entryAndExitFeeDetail.visibility = View.VISIBLE
+                        binding.entryAndExitFeeDetail.setOnClickListener(this)
+                    }
+                }
+
                 //团组签证
                 OASystem.VISA_PAYMENT_INSERT -> {
                     if (OASystem.authorization(OASystem.VISA_PAYMENT_INSERT, OASystem.VIEW)) {
@@ -435,6 +446,11 @@ class WorkspaceFragment : BaseFragment<FragmentWorkspaceBinding>(), OnClickListe
                 startActivity(intent)
             }
 
+            binding.entryAndExitFeeDetail.id -> {
+                val intent = Intent(OASystem.context, EntryAndExitFeeGroupListActivity::class.java)
+                startActivity(intent)
+            }
+
             binding.visaPaymentInsert.id -> {
                 val intent = Intent(OASystem.context, VisaPaymentInsertActivity::class.java)
                 startActivity(intent)

+ 20 - 0
app/src/main/res/layout/activity_entry_and_exit_detail.xml

@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical">
+
+    <include
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        layout="@layout/layout_title" />
+
+    <androidx.fragment.app.FragmentContainerView
+        android:id="@+id/entry_and_exit_detail_container"
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        android:layout_weight="1"
+        tools:layout="@layout/fragment_entry_and_exit_fee_total" />
+
+</LinearLayout>

+ 36 - 0
app/src/main/res/layout/activity_entry_and_exit_group_list.xml

@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical">
+
+    <include
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        layout="@layout/layout_title" />
+
+    <com.scwang.smart.refresh.layout.SmartRefreshLayout
+        android:id="@+id/group_info_container"
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        android:layout_margin="@dimen/common_padding"
+        android:layout_weight="1"
+        app:srlEnablePreviewInEditMode="true">
+
+        <com.scwang.smart.refresh.header.ClassicsHeader
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content" />
+
+        <androidx.recyclerview.widget.RecyclerView
+            android:id="@+id/group_info_list"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:overScrollMode="never" />
+
+        <com.scwang.smart.refresh.footer.ClassicsFooter
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content" />
+    </com.scwang.smart.refresh.layout.SmartRefreshLayout>
+
+</LinearLayout>

+ 637 - 0
app/src/main/res/layout/fragment_entry_and_exit_fee_total.xml

@@ -0,0 +1,637 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="@color/background_color"
+    android:orientation="vertical">
+
+    <ScrollView
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        android:layout_weight="1"
+        android:scrollbars="none"
+        tools:ignore="UselessParent">
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="vertical">
+
+            <LinearLayout
+                android:id="@+id/in_board_fee"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:background="@color/white"
+                android:orientation="horizontal"
+                tools:ignore="UselessLeaf">
+
+                <CheckBox
+                    android:id="@+id/check_in_board"
+                    android:layout_width="50dp"
+                    android:layout_height="50dp"
+                    android:layout_gravity="center"
+                    android:background="@null"
+                    android:clickable="false"
+                    android:focusable="false"
+                    android:theme="@style/CheckBoxTheme" />
+
+                <LinearLayout
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_margin="@dimen/common_padding"
+                    android:layout_weight="1"
+                    android:orientation="vertical">
+
+                    <TextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:text="@string/domestic_expenses"
+                        android:textSize="@dimen/text_size_large"
+                        android:textStyle="bold" />
+
+                    <TextView
+                        android:id="@+id/in_board_total"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginTop="@dimen/common_padding"
+                        android:textSize="@dimen/text_size_small"
+                        android:textStyle="bold" />
+
+                </LinearLayout>
+
+                <ImageView
+                    android:layout_width="@dimen/common_padding_heavy"
+                    android:layout_height="@dimen/common_padding_heavy"
+                    android:layout_gravity="center"
+                    android:layout_margin="@dimen/common_padding"
+                    android:src="@mipmap/icon_forward"
+                    tools:ignore="contentDescription" />
+
+            </LinearLayout>
+
+            <View
+                android:layout_width="match_parent"
+                android:layout_height="@dimen/line"
+                android:background="@color/line_color" />
+
+            <LinearLayout
+                android:id="@+id/international_travel_fee"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:background="@color/white"
+                android:orientation="horizontal"
+                tools:ignore="UselessLeaf">
+
+                <CheckBox
+                    android:layout_width="50dp"
+                    android:layout_height="50dp"
+                    android:layout_gravity="center"
+                    android:theme="@style/CheckBoxTheme"
+                    android:visibility="invisible" />
+
+                <LinearLayout
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_margin="@dimen/common_padding"
+                    android:layout_weight="1"
+                    android:orientation="vertical">
+
+                    <TextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:text="@string/total_international_travel_expenses"
+                        android:textSize="@dimen/text_size_large"
+                        android:textStyle="bold" />
+
+                    <LinearLayout
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:layout_marginTop="@dimen/common_padding_small"
+                        android:baselineAligned="false"
+                        android:orientation="horizontal">
+
+                        <LinearLayout
+                            android:layout_width="0dp"
+                            android:layout_height="wrap_content"
+                            android:layout_weight="1"
+                            android:orientation="horizontal">
+
+                            <CheckBox
+                                android:id="@+id/check_economy_class"
+                                android:layout_width="30dp"
+                                android:layout_height="30dp"
+                                android:layout_gravity="center"
+                                android:background="@null"
+                                android:clickable="false"
+                                android:focusable="false"
+                                android:theme="@style/CheckBoxTheme" />
+
+                            <TextView
+                                android:layout_width="wrap_content"
+                                android:layout_height="match_parent"
+                                android:gravity="center"
+                                android:text="@string/economy_class" />
+
+                        </LinearLayout>
+
+                        <LinearLayout
+                            android:layout_width="0dp"
+                            android:layout_height="wrap_content"
+                            android:layout_weight="1"
+                            android:orientation="horizontal">
+
+                            <CheckBox
+                                android:id="@+id/check_business_class"
+                                android:layout_width="30dp"
+                                android:layout_height="30dp"
+                                android:layout_gravity="center"
+                                android:background="@null"
+                                android:clickable="false"
+                                android:focusable="false"
+                                android:theme="@style/CheckBoxTheme" />
+
+                            <TextView
+                                android:layout_width="wrap_content"
+                                android:layout_height="match_parent"
+                                android:gravity="center"
+                                android:text="@string/business_class" />
+
+                        </LinearLayout>
+
+                        <LinearLayout
+                            android:layout_width="0dp"
+                            android:layout_height="wrap_content"
+                            android:layout_weight="1"
+                            android:orientation="horizontal">
+
+                            <CheckBox
+                                android:id="@+id/check_first_class"
+                                android:layout_width="30dp"
+                                android:layout_height="30dp"
+                                android:layout_gravity="center"
+                                android:background="@null"
+                                android:clickable="false"
+                                android:focusable="false"
+                                android:theme="@style/CheckBoxTheme" />
+
+                            <TextView
+                                android:layout_width="wrap_content"
+                                android:layout_height="match_parent"
+                                android:gravity="center"
+                                android:text="@string/first_class" />
+
+                        </LinearLayout>
+
+                    </LinearLayout>
+
+                </LinearLayout>
+
+                <ImageView
+                    android:layout_width="@dimen/common_padding_heavy"
+                    android:layout_height="@dimen/common_padding_heavy"
+                    android:layout_gravity="center"
+                    android:layout_margin="@dimen/common_padding"
+                    android:src="@mipmap/icon_forward"
+                    tools:ignore="contentDescription" />
+
+            </LinearLayout>
+
+            <View
+                android:layout_width="match_parent"
+                android:layout_height="@dimen/line"
+                android:background="@color/line_color" />
+
+            <LinearLayout
+                android:id="@+id/accommodation_fee"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:background="@color/white"
+                android:orientation="horizontal"
+                tools:ignore="UselessLeaf">
+
+                <CheckBox
+                    android:id="@+id/check_accommodation_fee"
+                    android:layout_width="50dp"
+                    android:layout_height="50dp"
+                    android:layout_gravity="center"
+                    android:background="@null"
+                    android:clickable="false"
+                    android:focusable="false"
+                    android:theme="@style/CheckBoxTheme" />
+
+                <LinearLayout
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_margin="@dimen/common_padding"
+                    android:layout_weight="1"
+                    android:orientation="vertical">
+
+                    <TextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:text="@string/accommodation_fee"
+                        android:textSize="@dimen/text_size_large"
+                        android:textStyle="bold" />
+
+                    <TextView
+                        android:id="@+id/accommodation_total"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginTop="@dimen/common_padding"
+                        android:textSize="@dimen/text_size_small"
+                        android:textStyle="bold" />
+
+                </LinearLayout>
+
+                <ImageView
+                    android:layout_width="@dimen/common_padding_heavy"
+                    android:layout_height="@dimen/common_padding_heavy"
+                    android:layout_gravity="center"
+                    android:layout_margin="@dimen/common_padding"
+                    android:src="@mipmap/icon_forward"
+                    tools:ignore="contentDescription" />
+
+            </LinearLayout>
+
+            <View
+                android:layout_width="match_parent"
+                android:layout_height="@dimen/line"
+                android:background="@color/line_color" />
+
+            <LinearLayout
+                android:id="@+id/meal_fee"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:background="@color/white"
+                android:orientation="horizontal"
+                tools:ignore="UselessLeaf">
+
+                <CheckBox
+                    android:id="@+id/check_meal_fee"
+                    android:layout_width="50dp"
+                    android:layout_height="50dp"
+                    android:layout_gravity="center"
+                    android:background="@null"
+                    android:clickable="false"
+                    android:focusable="false"
+                    android:theme="@style/CheckBoxTheme" />
+
+                <LinearLayout
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_margin="@dimen/common_padding"
+                    android:layout_weight="1"
+                    android:orientation="vertical">
+
+                    <TextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:text="@string/meal_expenses"
+                        android:textSize="@dimen/text_size_large"
+                        android:textStyle="bold" />
+
+                    <TextView
+                        android:id="@+id/meal_total"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginTop="@dimen/common_padding"
+                        android:textSize="@dimen/text_size_small"
+                        android:textStyle="bold" />
+
+                </LinearLayout>
+
+                <ImageView
+                    android:layout_width="@dimen/common_padding_heavy"
+                    android:layout_height="@dimen/common_padding_heavy"
+                    android:layout_gravity="center"
+                    android:layout_margin="@dimen/common_padding"
+                    android:src="@mipmap/icon_forward"
+                    tools:ignore="contentDescription" />
+
+            </LinearLayout>
+
+            <View
+                android:layout_width="match_parent"
+                android:layout_height="@dimen/line"
+                android:background="@color/line_color" />
+
+            <LinearLayout
+                android:id="@+id/public_and_miscellaneous_fee"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:background="@color/white"
+                android:orientation="horizontal"
+                tools:ignore="UselessLeaf">
+
+                <CheckBox
+                    android:id="@+id/check_public_and_miscellaneous"
+                    android:layout_width="50dp"
+                    android:layout_height="50dp"
+                    android:layout_gravity="center"
+                    android:background="@null"
+                    android:clickable="false"
+                    android:focusable="false"
+                    android:theme="@style/CheckBoxTheme" />
+
+                <LinearLayout
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_margin="@dimen/common_padding"
+                    android:layout_weight="1"
+                    android:orientation="vertical">
+
+                    <TextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:text="@string/public_and_miscellaneous_expenses"
+                        android:textSize="@dimen/text_size_large"
+                        android:textStyle="bold" />
+
+                    <TextView
+                        android:id="@+id/public_and_miscellaneous_total"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginTop="@dimen/common_padding"
+                        android:textSize="@dimen/text_size_small"
+                        android:textStyle="bold" />
+
+                </LinearLayout>
+
+                <ImageView
+                    android:layout_width="@dimen/common_padding_heavy"
+                    android:layout_height="@dimen/common_padding_heavy"
+                    android:layout_gravity="center"
+                    android:layout_margin="@dimen/common_padding"
+                    android:src="@mipmap/icon_forward"
+                    tools:ignore="contentDescription" />
+
+            </LinearLayout>
+
+            <View
+                android:layout_width="match_parent"
+                android:layout_height="@dimen/line"
+                android:background="@color/line_color" />
+
+            <LinearLayout
+                android:id="@+id/training_fee"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:background="@color/white"
+                android:orientation="horizontal"
+                tools:ignore="UselessLeaf">
+
+                <CheckBox
+                    android:id="@+id/check_training"
+                    android:layout_width="50dp"
+                    android:layout_height="50dp"
+                    android:layout_gravity="center"
+                    android:background="@null"
+                    android:clickable="false"
+                    android:focusable="false"
+                    android:theme="@style/CheckBoxTheme" />
+
+                <LinearLayout
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_margin="@dimen/common_padding"
+                    android:layout_weight="1"
+                    android:orientation="vertical">
+
+                    <TextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:text="@string/training_fee"
+                        android:textSize="@dimen/text_size_large"
+                        android:textStyle="bold" />
+
+                    <TextView
+                        android:id="@+id/training_total"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginTop="@dimen/common_padding"
+                        android:textSize="@dimen/text_size_small"
+                        android:textStyle="bold" />
+
+                </LinearLayout>
+
+                <ImageView
+                    android:layout_width="@dimen/common_padding_heavy"
+                    android:layout_height="@dimen/common_padding_heavy"
+                    android:layout_gravity="center"
+                    android:layout_margin="@dimen/common_padding"
+                    android:src="@mipmap/icon_forward"
+                    tools:ignore="contentDescription" />
+
+            </LinearLayout>
+
+            <View
+                android:layout_width="match_parent"
+                android:layout_height="@dimen/line"
+                android:background="@color/line_color" />
+
+            <LinearLayout
+                android:id="@+id/other_fee"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:background="@color/white"
+                android:orientation="horizontal"
+                tools:ignore="UselessLeaf">
+
+                <CheckBox
+                    android:id="@+id/check_other"
+                    android:layout_width="50dp"
+                    android:layout_height="50dp"
+                    android:layout_gravity="center"
+                    android:background="@null"
+                    android:clickable="false"
+                    android:focusable="false"
+                    android:theme="@style/CheckBoxTheme" />
+
+                <LinearLayout
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_margin="@dimen/common_padding"
+                    android:layout_weight="1"
+                    android:orientation="vertical">
+
+                    <TextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:text="@string/other_fee"
+                        android:textSize="@dimen/text_size_large"
+                        android:textStyle="bold" />
+
+                    <TextView
+                        android:id="@+id/other_total"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginTop="@dimen/common_padding"
+                        android:textSize="@dimen/text_size_small"
+                        android:textStyle="bold" />
+
+                </LinearLayout>
+
+                <ImageView
+                    android:layout_width="@dimen/common_padding_heavy"
+                    android:layout_height="@dimen/common_padding_heavy"
+                    android:layout_gravity="center"
+                    android:layout_margin="@dimen/common_padding"
+                    android:src="@mipmap/icon_forward"
+                    tools:ignore="contentDescription" />
+
+            </LinearLayout>
+
+            <View
+                android:layout_width="match_parent"
+                android:layout_height="@dimen/line"
+                android:background="@color/line_color" />
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="@dimen/common_padding"
+                android:background="@color/white"
+                android:baselineAligned="false"
+                android:orientation="horizontal"
+                tools:ignore="UselessLeaf">
+
+                <LinearLayout
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_margin="@dimen/common_padding"
+                    android:layout_weight="1"
+                    android:orientation="vertical">
+
+                    <TextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:text="@string/airplane_price_detail"
+                        android:textSize="@dimen/text_size_large"
+                        android:textStyle="bold" />
+
+                    <TextView
+                        android:id="@+id/economy_class"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginTop="@dimen/common_padding"
+                        android:textSize="@dimen/text_size_small"
+                        android:textStyle="bold" />
+
+                    <TextView
+                        android:id="@+id/business_class"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginTop="@dimen/common_padding"
+                        android:textSize="@dimen/text_size_small"
+                        android:textStyle="bold" />
+
+                    <TextView
+                        android:id="@+id/first_class"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginTop="@dimen/common_padding"
+                        android:textSize="@dimen/text_size_small"
+                        android:textStyle="bold" />
+
+                </LinearLayout>
+
+            </LinearLayout>
+
+            <View
+                android:layout_width="match_parent"
+                android:layout_height="@dimen/line"
+                android:background="@color/line_color" />
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="@dimen/common_padding"
+                android:background="@color/white"
+                android:baselineAligned="false"
+                android:orientation="horizontal"
+                tools:ignore="UselessLeaf">
+
+                <LinearLayout
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_margin="@dimen/common_padding"
+                    android:layout_weight="1"
+                    android:orientation="vertical">
+
+                    <TextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:text="@string/payment_total"
+                        android:textSize="@dimen/text_size_large"
+                        android:textStyle="bold" />
+
+                    <TextView
+                        android:id="@+id/economy_class_total"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginTop="@dimen/common_padding"
+                        android:textSize="@dimen/text_size_small"
+                        android:textStyle="bold" />
+
+                    <TextView
+                        android:id="@+id/business_class_total"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginTop="@dimen/common_padding"
+                        android:textSize="@dimen/text_size_small"
+                        android:textStyle="bold" />
+
+                    <TextView
+                        android:id="@+id/first_class_total"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginTop="@dimen/common_padding"
+                        android:textSize="@dimen/text_size_small"
+                        android:textStyle="bold" />
+
+                </LinearLayout>
+
+            </LinearLayout>
+
+            <View
+                android:layout_width="match_parent"
+                android:layout_height="@dimen/line"
+                android:background="@color/line_color" />
+
+        </LinearLayout>
+
+    </ScrollView>
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:orientation="horizontal">
+
+        <TextView
+            android:id="@+id/export_to_collection_bill"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:layout_margin="@dimen/common_padding"
+            android:layout_weight="1"
+            android:background="@drawable/shape_corner_solid_blue"
+            android:gravity="center"
+            android:padding="@dimen/common_padding"
+            android:text="@string/export_to_collection_bill"
+            android:textColor="@color/white" />
+
+        <TextView
+            android:id="@+id/download_group_members_list"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:layout_margin="@dimen/common_padding"
+            android:layout_weight="1"
+            android:background="@drawable/shape_corner_solid_blue"
+            android:gravity="center"
+            android:padding="@dimen/common_padding"
+            android:text="@string/download_group_members_list"
+            android:textColor="@color/white" />
+
+    </LinearLayout>
+
+</LinearLayout>

+ 13 - 0
app/src/main/res/layout/fragment_entry_and_exit_payment_list.xml

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    tools:context=".ui.group_management.entry_and_exit_fee_detail.EntryAndExitPaymentListFragment">
+
+    <TextView
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:text="@string/hello_blank_fragment" />
+
+</FrameLayout>

+ 392 - 0
app/src/main/res/layout/fragment_in_board_fee.xml

@@ -0,0 +1,392 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="@color/white"
+    android:orientation="vertical">
+
+    <ScrollView
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        android:layout_weight="1"
+        android:scrollbars="none"
+        tools:ignore="UselessParent">
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="vertical">
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="@dimen/common_padding"
+                android:orientation="horizontal"
+                tools:ignore="UselessParent">
+
+                <CheckBox
+                    android:id="@+id/is_selected"
+                    android:layout_width="50dp"
+                    android:layout_height="50dp"
+                    android:layout_gravity="center"
+                    android:theme="@style/CheckBoxTheme" />
+
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_gravity="center"
+                    android:padding="@dimen/common_padding_small"
+                    android:text="@string/domestic_expenses"
+                    android:textSize="@dimen/text_size_large"
+                    android:textStyle="bold" />
+
+            </LinearLayout>
+
+            <View
+                android:layout_width="match_parent"
+                android:layout_height="@dimen/line"
+                android:layout_marginTop="@dimen/common_padding_small"
+                android:layout_marginBottom="@dimen/common_padding"
+                android:background="@color/line_color" />
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_margin="@dimen/common_padding"
+                android:orientation="horizontal">
+
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_gravity="center"
+                    android:text="@string/visa_payment"
+                    android:textSize="@dimen/text_size_medium" />
+
+                <EditText
+                    android:id="@+id/visa_price"
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_marginStart="@dimen/common_padding"
+                    android:layout_marginEnd="@dimen/common_padding"
+                    android:layout_weight="1"
+                    android:background="@color/white"
+                    android:gravity="end"
+                    android:hint="@string/please_input"
+                    android:importantForAutofill="no"
+                    android:inputType="numberDecimal"
+                    android:textColor="@color/text_color"
+                    android:textColorHint="@color/hint_text_color"
+                    android:textSize="@dimen/text_size_medium" />
+
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_gravity="center"
+                    android:text="@string/price_per_person_format"
+                    android:textSize="@dimen/text_size_medium" />
+
+            </LinearLayout>
+
+            <View
+                android:layout_width="match_parent"
+                android:layout_height="@dimen/line"
+                android:layout_marginTop="@dimen/common_padding_huge"
+                android:layout_marginBottom="@dimen/common_padding"
+                android:background="@color/line_color" />
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_margin="@dimen/common_padding"
+                android:orientation="vertical">
+
+                <LinearLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_marginBottom="@dimen/common_padding"
+                    android:orientation="horizontal">
+
+                    <TextView
+                        android:layout_width="0dp"
+                        android:layout_height="wrap_content"
+                        android:layout_weight="1"
+                        android:layout_gravity="center"
+                        android:text="@string/visa_description"
+                        android:textSize="@dimen/text_size_medium" />
+
+                    <TextView
+                        android:id="@+id/get_newest_visa_payment"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:background="@drawable/shape_corner_solid_blue"
+                        android:padding="@dimen/common_padding_small"
+                        android:text="@string/get_newest_visa_payment"
+                        android:textColor="@color/white"
+                        android:textSize="@dimen/text_size_small" />
+
+                </LinearLayout>
+
+                <com.pan_american.android.util.ScrollEditText
+                    android:id="@+id/visa_description"
+                    android:layout_width="match_parent"
+                    android:layout_height="100dp"
+                    android:background="@drawable/shape_large_edit_text_background"
+                    android:gravity="start" />
+            </LinearLayout>
+
+            <View
+                android:layout_width="match_parent"
+                android:layout_height="@dimen/line"
+                android:layout_marginTop="@dimen/common_padding_huge"
+                android:layout_marginBottom="@dimen/common_padding"
+                android:background="@color/line_color" />
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_margin="@dimen/common_padding"
+                android:orientation="horizontal">
+
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_gravity="center"
+                    android:text="@string/vaccine_payment"
+                    android:textSize="@dimen/text_size_medium" />
+
+                <EditText
+                    android:id="@+id/vaccine_price"
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_marginStart="@dimen/common_padding"
+                    android:layout_marginEnd="@dimen/common_padding"
+                    android:layout_weight="1"
+                    android:background="@color/white"
+                    android:gravity="end"
+                    android:hint="@string/please_input"
+                    android:importantForAutofill="no"
+                    android:inputType="numberDecimal"
+                    android:textColor="@color/text_color"
+                    android:textColorHint="@color/hint_text_color"
+                    android:textSize="@dimen/text_size_medium" />
+
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_gravity="center"
+                    android:text="@string/price_per_person_format"
+                    android:textSize="@dimen/text_size_medium" />
+
+            </LinearLayout>
+
+            <View
+                android:layout_width="match_parent"
+                android:layout_height="@dimen/line"
+                android:layout_marginTop="@dimen/common_padding_huge"
+                android:layout_marginBottom="@dimen/common_padding"
+                android:background="@color/line_color" />
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_margin="@dimen/common_padding"
+                android:orientation="horizontal">
+
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_gravity="center"
+                    android:text="@string/nucleic_acid_testing_payment"
+                    android:textSize="@dimen/text_size_medium" />
+
+                <EditText
+                    android:id="@+id/nucleic_acid_testing_price"
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_marginStart="@dimen/common_padding"
+                    android:layout_marginEnd="@dimen/common_padding"
+                    android:layout_weight="1"
+                    android:background="@color/white"
+                    android:gravity="end"
+                    android:hint="@string/please_input"
+                    android:importantForAutofill="no"
+                    android:inputType="numberDecimal"
+                    android:textColor="@color/text_color"
+                    android:textColorHint="@color/hint_text_color"
+                    android:textSize="@dimen/text_size_medium" />
+
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_gravity="center"
+                    android:text="@string/price_per_person_format"
+                    android:textSize="@dimen/text_size_medium" />
+
+            </LinearLayout>
+
+            <View
+                android:layout_width="match_parent"
+                android:layout_height="@dimen/line"
+                android:layout_marginTop="@dimen/common_padding_huge"
+                android:layout_marginBottom="@dimen/common_padding"
+                android:background="@color/line_color" />
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_margin="@dimen/common_padding"
+                android:orientation="horizontal">
+
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_gravity="center"
+                    android:text="@string/service_payment"
+                    android:textSize="@dimen/text_size_medium" />
+
+                <EditText
+                    android:id="@+id/service_price"
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_marginStart="@dimen/common_padding"
+                    android:layout_marginEnd="@dimen/common_padding"
+                    android:layout_weight="1"
+                    android:background="@color/white"
+                    android:gravity="end"
+                    android:hint="@string/please_input"
+                    android:importantForAutofill="no"
+                    android:inputType="numberDecimal"
+                    android:textColor="@color/text_color"
+                    android:textColorHint="@color/hint_text_color"
+                    android:textSize="@dimen/text_size_medium" />
+
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_gravity="center"
+                    android:text="@string/price_per_person_format"
+                    android:textSize="@dimen/text_size_medium" />
+
+            </LinearLayout>
+
+            <View
+                android:layout_width="match_parent"
+                android:layout_height="@dimen/line"
+                android:layout_marginTop="@dimen/common_padding_huge"
+                android:layout_marginBottom="@dimen/common_padding"
+                android:background="@color/line_color" />
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_margin="@dimen/common_padding"
+                android:orientation="horizontal">
+
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_gravity="center"
+                    android:text="@string/insurance_payment"
+                    android:textSize="@dimen/text_size_medium" />
+
+                <EditText
+                    android:id="@+id/insurance_price"
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_marginStart="@dimen/common_padding"
+                    android:layout_marginEnd="@dimen/common_padding"
+                    android:layout_weight="1"
+                    android:background="@color/white"
+                    android:gravity="end"
+                    android:hint="@string/please_input"
+                    android:importantForAutofill="no"
+                    android:inputType="numberDecimal"
+                    android:textColor="@color/text_color"
+                    android:textColorHint="@color/hint_text_color"
+                    android:textSize="@dimen/text_size_medium" />
+
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_gravity="center"
+                    android:text="@string/price_per_person_format"
+                    android:textSize="@dimen/text_size_medium" />
+
+            </LinearLayout>
+
+            <View
+                android:layout_width="match_parent"
+                android:layout_height="@dimen/line"
+                android:layout_marginTop="@dimen/common_padding_huge"
+                android:layout_marginBottom="@dimen/common_padding"
+                android:background="@color/line_color" />
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_margin="@dimen/common_padding"
+                android:orientation="horizontal">
+
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_gravity="center"
+                    android:text="@string/ticket_payment"
+                    android:textSize="@dimen/text_size_medium" />
+
+                <EditText
+                    android:id="@+id/ticket_price"
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_marginStart="@dimen/common_padding"
+                    android:layout_marginEnd="@dimen/common_padding"
+                    android:layout_weight="1"
+                    android:background="@color/white"
+                    android:gravity="end"
+                    android:hint="@string/please_input"
+                    android:importantForAutofill="no"
+                    android:inputType="numberDecimal"
+                    android:textColor="@color/text_color"
+                    android:textColorHint="@color/hint_text_color"
+                    android:textSize="@dimen/text_size_medium" />
+
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_gravity="center"
+                    android:text="@string/price_per_person_format"
+                    android:textSize="@dimen/text_size_medium" />
+
+            </LinearLayout>
+
+            <View
+                android:layout_width="match_parent"
+                android:layout_height="@dimen/line"
+                android:layout_marginTop="@dimen/common_padding_huge"
+                android:layout_marginBottom="@dimen/common_padding"
+                android:background="@color/line_color" />
+
+        </LinearLayout>
+    </ScrollView>
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="@dimen/button_height"
+        android:layout_margin="@dimen/common_padding_large"
+        android:background="@drawable/shape_corner_solid_blue"
+        android:orientation="horizontal">
+
+        <TextView
+            android:id="@+id/commit"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:gravity="center"
+            android:text="@string/update"
+            android:textColor="@color/white"
+            android:textSize="@dimen/text_size_large"
+            android:textStyle="bold" />
+
+    </LinearLayout>
+
+</LinearLayout>

+ 303 - 0
app/src/main/res/layout/fragment_international_travel_fee.xml

@@ -0,0 +1,303 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="@color/white"
+    android:orientation="vertical">
+
+    <ScrollView
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        android:layout_weight="1"
+        android:scrollbars="none"
+        tools:ignore="UselessParent">
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:background="@color/white"
+            android:orientation="vertical">
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="@dimen/common_padding"
+                android:orientation="horizontal"
+                tools:ignore="UselessParent">
+
+                <TextView
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_gravity="center"
+                    android:layout_marginStart="@dimen/common_padding_large"
+                    android:layout_weight="1"
+                    android:padding="@dimen/common_padding_small"
+                    android:text="@string/total_international_travel_expenses"
+                    android:textSize="@dimen/text_size_large"
+                    android:textStyle="bold" />
+            </LinearLayout>
+
+            <View
+                android:layout_width="match_parent"
+                android:layout_height="@dimen/line"
+                android:layout_marginTop="@dimen/common_padding_small"
+                android:layout_marginBottom="@dimen/common_padding"
+                android:background="@color/line_color" />
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_margin="@dimen/common_padding"
+                android:orientation="horizontal">
+
+                <CheckBox
+                    android:id="@+id/economy_class_selected"
+                    android:layout_width="50dp"
+                    android:layout_height="50dp"
+                    android:layout_gravity="center"
+                    android:theme="@style/CheckBoxTheme" />
+
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_gravity="center"
+                    android:text="@string/economy_class"
+                    android:textSize="@dimen/text_size_medium" />
+
+                <EditText
+                    android:id="@+id/economy_class_price"
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_gravity="center"
+                    android:layout_marginStart="@dimen/common_padding"
+                    android:layout_marginEnd="@dimen/common_padding"
+                    android:layout_weight="1"
+                    android:background="@color/white"
+                    android:gravity="end"
+                    android:hint="@string/please_input"
+                    android:importantForAutofill="no"
+                    android:inputType="numberDecimal"
+                    android:textColor="@color/text_color"
+                    android:textColorHint="@color/hint_text_color"
+                    android:textSize="@dimen/text_size_medium" />
+
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_gravity="center"
+                    android:text="@string/price_per_person_format"
+                    android:textSize="@dimen/text_size_medium" />
+
+            </LinearLayout>
+
+            <View
+                android:layout_width="match_parent"
+                android:layout_height="@dimen/line"
+                android:layout_marginTop="@dimen/common_padding_huge"
+                android:layout_marginBottom="@dimen/common_padding"
+                android:background="@color/line_color" />
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_margin="@dimen/common_padding"
+                android:orientation="horizontal">
+
+                <CheckBox
+                    android:id="@+id/business_class_selected"
+                    android:layout_width="50dp"
+                    android:layout_height="50dp"
+                    android:layout_gravity="center"
+                    android:theme="@style/CheckBoxTheme" />
+
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_gravity="center"
+                    android:text="@string/business_class"
+                    android:textSize="@dimen/text_size_medium" />
+
+                <EditText
+                    android:id="@+id/business_class_price"
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_gravity="center"
+                    android:layout_marginStart="@dimen/common_padding"
+                    android:layout_marginEnd="@dimen/common_padding"
+                    android:layout_weight="1"
+                    android:background="@color/white"
+                    android:gravity="end"
+                    android:hint="@string/please_input"
+                    android:importantForAutofill="no"
+                    android:inputType="numberDecimal"
+                    android:textColor="@color/text_color"
+                    android:textColorHint="@color/hint_text_color"
+                    android:textSize="@dimen/text_size_medium" />
+
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_gravity="center"
+                    android:text="@string/price_per_person_format"
+                    android:textSize="@dimen/text_size_medium" />
+
+            </LinearLayout>
+
+            <View
+                android:layout_width="match_parent"
+                android:layout_height="@dimen/line"
+                android:layout_marginTop="@dimen/common_padding_huge"
+                android:layout_marginBottom="@dimen/common_padding"
+                android:background="@color/line_color" />
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_margin="@dimen/common_padding"
+                android:orientation="horizontal">
+
+                <CheckBox
+                    android:id="@+id/first_class_selected"
+                    android:layout_width="50dp"
+                    android:layout_height="50dp"
+                    android:layout_gravity="center"
+                    android:theme="@style/CheckBoxTheme" />
+
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_gravity="center"
+                    android:text="@string/first_class"
+                    android:textSize="@dimen/text_size_medium" />
+
+                <EditText
+                    android:id="@+id/first_class_price"
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_gravity="center"
+                    android:layout_marginStart="@dimen/common_padding"
+                    android:layout_marginEnd="@dimen/common_padding"
+                    android:layout_weight="1"
+                    android:background="@color/white"
+                    android:gravity="end"
+                    android:hint="@string/please_input"
+                    android:importantForAutofill="no"
+                    android:inputType="numberDecimal"
+                    android:textColor="@color/text_color"
+                    android:textColorHint="@color/hint_text_color"
+                    android:textSize="@dimen/text_size_medium" />
+
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_gravity="center"
+                    android:text="@string/price_per_person_format"
+                    android:textSize="@dimen/text_size_medium" />
+
+            </LinearLayout>
+
+            <View
+                android:layout_width="match_parent"
+                android:layout_height="@dimen/line"
+                android:layout_marginTop="@dimen/common_padding_huge"
+                android:layout_marginBottom="@dimen/common_padding"
+                android:background="@color/line_color" />
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_margin="@dimen/common_padding"
+                android:orientation="horizontal">
+
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_gravity="center"
+                    android:text="@string/city_traffic_payment"
+                    android:textSize="@dimen/text_size_medium" />
+
+                <EditText
+                    android:id="@+id/city_traffic_payment"
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_marginStart="@dimen/common_padding"
+                    android:layout_marginEnd="@dimen/common_padding"
+                    android:layout_weight="1"
+                    android:background="@color/white"
+                    android:gravity="end"
+                    android:hint="@string/please_input"
+                    android:importantForAutofill="no"
+                    android:inputType="numberDecimal"
+                    android:textColor="@color/text_color"
+                    android:textColorHint="@color/hint_text_color"
+                    android:textSize="@dimen/text_size_medium" />
+
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_gravity="center"
+                    android:text="@string/price_per_person_format"
+                    android:textSize="@dimen/text_size_medium" />
+
+            </LinearLayout>
+
+            <View
+                android:layout_width="match_parent"
+                android:layout_height="@dimen/line"
+                android:layout_marginTop="@dimen/common_padding_huge"
+                android:layout_marginBottom="@dimen/common_padding"
+                android:background="@color/line_color" />
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_margin="@dimen/common_padding"
+                android:orientation="horizontal">
+
+                <TextView
+                    android:id="@+id/hint"
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_gravity="center"
+                    android:layout_marginEnd="@dimen/common_padding"
+                    android:layout_weight="1"
+                    android:textColor="@color/color_caution"
+                    android:textSize="@dimen/text_size_small" />
+
+                <TextView
+                    android:id="@+id/put_in"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_gravity="center"
+                    android:layout_marginEnd="@dimen/common_padding"
+                    android:background="@drawable/shape_corner_solid_blue"
+                    android:padding="@dimen/common_padding"
+                    android:text="@string/put_in"
+                    android:textColor="@color/white"
+                    android:textSize="@dimen/text_size_small" />
+
+            </LinearLayout>
+        </LinearLayout>
+    </ScrollView>
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="@dimen/button_height"
+        android:layout_margin="@dimen/common_padding_large"
+        android:background="@drawable/shape_corner_solid_blue"
+        android:orientation="horizontal">
+
+        <TextView
+            android:id="@+id/commit"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:gravity="center"
+            android:text="@string/update"
+            android:textColor="@color/white"
+            android:textSize="@dimen/text_size_large"
+            android:textStyle="bold" />
+
+    </LinearLayout>
+
+</LinearLayout>

+ 13 - 0
app/src/main/res/layout/fragment_other_payment.xml

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    tools:context=".ui.group_management.entry_and_exit_fee_detail.OtherPaymentFragment">
+
+    <TextView
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:text="@string/hello_blank_fragment" />
+
+</FrameLayout>

+ 35 - 1
app/src/main/res/layout/fragment_workspace.xml

@@ -693,7 +693,8 @@
                 android:layout_height="wrap_content"
                 android:background="@color/white"
                 android:orientation="vertical"
-                android:visibility="gone">
+                android:visibility="gone"
+                tools:ignore="TooManyViews">
 
                 <View
                     android:layout_width="match_parent"
@@ -862,6 +863,33 @@
                             android:textSize="@dimen/text_size_medium"
                             app:drawableStartCompat="@mipmap/icon_group_information" />
 
+                        <View
+                            android:layout_width="match_parent"
+                            android:layout_height="1dp"
+                            android:layout_marginStart="35dp"
+                            android:background="@color/line_color" />
+
+                    </LinearLayout>
+
+                    <LinearLayout
+                        android:id="@+id/entry_and_exit_fee_detail"
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:orientation="vertical"
+                        android:visibility="gone">
+
+                        <TextView
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:drawablePadding="@dimen/common_padding"
+                            android:gravity="center_vertical"
+                            android:paddingTop="@dimen/common_padding"
+                            android:paddingBottom="@dimen/common_padding"
+                            android:text="@string/entry_and_exit_fee_detail"
+                            android:textColor="@color/text_color"
+                            android:textSize="@dimen/text_size_medium"
+                            app:drawableStartCompat="@mipmap/icon_entry_and_exit_fee_detail" />
+
                     </LinearLayout>
 
                 </LinearLayout>
@@ -922,6 +950,12 @@
                             android:textSize="@dimen/text_size_medium"
                             app:drawableStartCompat="@mipmap/icon_visa_payment_insert" />
 
+                        <View
+                            android:layout_width="match_parent"
+                            android:layout_height="1dp"
+                            android:layout_marginStart="35dp"
+                            android:background="@color/line_color" />
+
                     </LinearLayout>
 
                     <LinearLayout

BIN
app/src/main/res/mipmap-xxhdpi/icon_entry_and_exit_fee_detail.png


BIN
app/src/main/res/mipmap-xxhdpi/icon_forward.png


+ 52 - 0
app/src/main/res/values/strings.xml

@@ -135,6 +135,10 @@
     <string name="paid">已付款</string>
     <string name="not_pay">未付款</string>
 
+    <string name="economy_class">经济舱</string>
+    <string name="business_class">商务舱</string>
+    <string name="first_class">头等舱</string>
+
     <!-- AlertDialog通用文本 -->
     <string name="alert">警告</string>
     <string name="delete_alert_text">确认要删除:%s ?</string>
@@ -1293,6 +1297,54 @@
     <string name="export_collection_bill_beijing">收款账单 (北京)</string>
     <string name="remittance_bill">汇款账单</string>
 
+    <!-- 三公费用 -->
+    <string name="entry_and_exit_fee_detail">出入境费用明细</string>
+    <string name="domestic_expenses">一. 境内费用 (其他费用)</string>
+    <string name="total_international_travel_expenses">二. 国际旅费合计</string>
+    <string name="accommodation_fee">三. 住宿费</string>
+    <string name="meal_expenses">四. 伙食费</string>
+    <string name="public_and_miscellaneous_expenses">五. 公杂费</string>
+    <string name="training_fee">六. 培训费</string>
+    <string name="other_fee">七. 其他</string>
+    <string name="total_per_fee_format">合计: %.2f 元/人</string>
+    <string name="export_to_collection_bill">导出到收款账单</string>
+    <string name="download_group_members_list">下载团组成员名单</string>
+    <string name="airplane_price_detail">机票价格详细</string>
+    <string name="economy_class_price">经济舱: %.2f 元 / 人</string>
+    <string name="business_class_price">公务舱: %.2f 元 / 人</string>
+    <string name="first_class_price">头等舱: %.2f 元 / 人</string>
+
+    <string name="visa_payment">签证费</string>
+    <string name="vaccine_payment">疫苗费</string>
+    <string name="nucleic_acid_testing_payment">核酸检测费</string>
+    <string name="service_payment">服务费</string>
+    <string name="ticket_payment">参展门票费用</string>
+    <string name="visa_payment_description">签证费用描述</string>
+    <string name="get_newest_visa_payment">获取最新签证费用</string>
+    <string name="price_per_person_format">元 / 人</string>
+
+    <string name="show_currency">查看汇率</string>
+    <string name="city_traffic_payment">城市区间交通费</string>
+
+    <string name="visa_price_input_hint">请输入正确的签证费用</string>
+    <string name="vaccine_price_input_hint">请输入正确的疫苗费用</string>
+    <string name="nucleic_acid_testing_payment_input_hint">请输入正确的核酸检测费用</string>
+    <string name="service_price_input_hint">请输入正确的服务费用</string>
+    <string name="insurance_price_input_hint">请输入正确的保险费用</string>
+    <string name="ticket_price_input_hint">请输入正确的参展门票费用</string>
+
+    <string name="put_in">填入</string>
+    <string name="economy_class_price_input_hint">请输入正确的经济舱价格</string>
+    <string name="business_class_price_input_hint">请输入正确的公务舱价格</string>
+    <string name="first_class_price_input_hint">请输入正确的头等舱价格</string>
+    <string name="city_traffic_payment_input_hint">请输入正确的城市间交通费用</string>
+
+    <string name="entry_and_exit_detail_total_get_error">出入境费用总览获取失败</string>
+    <string name="in_board_payment_detail_get_error">境内费用详情获取失败</string>
+    <string name="newest_visa_payment_get_error">获取最新签证费用失败</string>
+    <string name="international_travel_payment_get_error">国际旅费详情获取失败</string>
+    <string name="international_travel_tips_get_error">国际旅费Tips获取失败</string>
+
     <!-- TODO: Remove or change this placeholder text -->
     <string name="hello_blank_fragment">Hello blank fragment</string>