- ShiftRepository에 getSaturdayOvertimeHours() 메소드 추가 - FragmentSettingsLab에 토요일 연장근무 시간 표시 카드 추가 - 토요일 수 * 2시간 계산 로직 구현 Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-opencode) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
123 lines
4.3 KiB
Kotlin
123 lines
4.3 KiB
Kotlin
package com.example.shiftalarm
|
|
|
|
import android.os.Bundle
|
|
import android.view.LayoutInflater
|
|
import android.view.View
|
|
import android.view.ViewGroup
|
|
import android.widget.AdapterView
|
|
import android.widget.ArrayAdapter
|
|
import androidx.fragment.app.Fragment
|
|
import androidx.lifecycle.lifecycleScope
|
|
import com.example.shiftalarm.databinding.FragmentSettingsLabBinding
|
|
import kotlinx.coroutines.launch
|
|
import kotlinx.coroutines.delay
|
|
|
|
class FragmentSettingsLab : Fragment() {
|
|
|
|
private var _binding: FragmentSettingsLabBinding? = null
|
|
private val binding get() = _binding!!
|
|
private var isInitialLoad = true
|
|
|
|
override fun onCreateView(
|
|
inflater: LayoutInflater, container: ViewGroup?,
|
|
savedInstanceState: Bundle?
|
|
): View {
|
|
_binding = FragmentSettingsLabBinding.inflate(inflater, container, false)
|
|
return binding.root
|
|
}
|
|
|
|
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
|
super.onViewCreated(view, savedInstanceState)
|
|
|
|
setupSpinner()
|
|
loadAnnualLeave()
|
|
loadSaturdayOvertime()
|
|
}
|
|
|
|
private fun setupSpinner() {
|
|
// 1~25일 선택 가능한 어댑터 설정
|
|
val daysList = (1..25).map { "${it}일" }.toList()
|
|
val adapter = ArrayAdapter(requireContext(), android.R.layout.simple_spinner_item, daysList)
|
|
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
|
|
binding.spinnerTotalDays.adapter = adapter
|
|
|
|
// 선택 시 자동 저장
|
|
binding.spinnerTotalDays.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
|
|
override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) {
|
|
if (!isInitialLoad) {
|
|
val totalDays = position + 1 // 0-indexed to actual days
|
|
saveAnnualLeave(totalDays)
|
|
}
|
|
}
|
|
|
|
override fun onNothingSelected(parent: AdapterView<*>?) {
|
|
// Do nothing
|
|
}
|
|
}
|
|
}
|
|
|
|
private fun loadAnnualLeave() {
|
|
lifecycleScope.launch {
|
|
isInitialLoad = true
|
|
val repo = ShiftRepository(requireContext())
|
|
|
|
val annualLeave = repo.getAnnualLeave()
|
|
annualLeave?.let {
|
|
// 저장된 값이 있으면 해당 위치 선택 (0-indexed)
|
|
binding.spinnerTotalDays.setSelection(it.totalDays.toInt() - 1)
|
|
binding.tvRemainingDays.text = formatRemainingDays(it.remainingDays)
|
|
} ?: run {
|
|
// Default: 15 days (index 14)
|
|
binding.spinnerTotalDays.setSelection(14)
|
|
binding.tvRemainingDays.text = "15"
|
|
}
|
|
|
|
// 초기 로드 완료 후 플래그 변경 (약간의 딜레이로 초기 선택 이벤트 방지)
|
|
delay(300)
|
|
isInitialLoad = false
|
|
}
|
|
}
|
|
|
|
private fun saveAnnualLeave(totalDays: Int) {
|
|
lifecycleScope.launch {
|
|
val repo = ShiftRepository(requireContext())
|
|
|
|
repo.recalculateAndSaveAnnualLeave(totalDays.toFloat())
|
|
|
|
val updated = repo.getAnnualLeave()
|
|
updated?.let {
|
|
binding.tvRemainingDays.text = formatRemainingDays(it.remainingDays)
|
|
showCustomToast(requireContext(), "총 연차 ${totalDays}일로 저장되었습니다 (남은 연차: ${formatRemainingDays(it.remainingDays)}일)")
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 남은 연차 표시 형식 개선
|
|
* - 정수면 정수로 표시 (예: 22)
|
|
* - 소숫점 있으면 소숫점 표시 (예: 21.5)
|
|
*/
|
|
private fun formatRemainingDays(days: Float): String {
|
|
return if (days == days.toInt().toFloat()) {
|
|
// 정수인 경우
|
|
days.toInt().toString()
|
|
} else {
|
|
// 소숫점이 있는 경우 (0.5 등)
|
|
String.format("%.1f", days)
|
|
}
|
|
}
|
|
|
|
private fun loadSaturdayOvertime() {
|
|
lifecycleScope.launch {
|
|
val repo = ShiftRepository(requireContext())
|
|
val overtimeHours = repo.getSaturdayOvertimeHours()
|
|
binding.tvSaturdayOvertime.text = "$overtimeHours"
|
|
}
|
|
}
|
|
|
|
override fun onDestroyView() {
|
|
super.onDestroyView()
|
|
_binding = null
|
|
}
|
|
}
|