package jp.or.jaf.syg.feature.jafrsho99.jafrsho99130
import jp.or.jaf.syg.core.common.base.JafViewModel
import jp.or.jaf.syg.core.common.event.JafAction
import jp.or.jaf.syg.core.common.event.JafEvent
import jp.or.jaf.syg.core.common.ext.utils.DateUtils
import jp.or.jaf.syg.domain.message.Message
import jp.or.jaf.syg.feature.jafrsho99.jafrsho99010.Jafrsho99010Routes
import jp.or.jaf.syg.feature.jafrsho99.jafrsho99050.JAFRSHO99050Model
import jp.or.jaf.syg.feature.jafrsho99.jafrsho99130.mappers.createInitialUiStateData
import jp.or.jaf.syg.feature.jafrsho99.jafrsho99130.mappers.generateCalendarData
import jp.or.jaf.syg.feature.jafrsho99.jafrsho99130.mappers.generateSelectDayList
import jp.or.jaf.syg.feature.jafrsho99.jafrsho99130.mappers.generateSelectMonthList
import java.io.Serializable
import javax.inject.Inject
/**
* 【機能ID: JAFRSHO99】業務共通機能
* 【画面ID: JAFRSHO99130】カレンダーポップアップ
*
* カレンダーポップアップのViewModel実装
* 年月日入力時に使用するポップアップである。
*/
class JAFRSHO99130ViewModel @Inject constructor() :
JafViewModel<JAFRSHO99130UiStateData>() {
/**
* システムイベント処理
* JafUiStateHostが自動的に呼び出すイベント処理
*/
private var monthSelectResult: Pair<Any, Any>? = null
private var daySelectResult: Pair<Any, Any>? = null
override fun onEvent(event: JafEvent) {
when (event) {
JafEvent.Companion.Initialize -> {
// パラメータなしの場合はデフォルト初期化
launchReplaceContent {
onPopupDisplay("カレンダー", null, InputControlType.NO_SEIGEN)
}
}
is JafEvent.Companion.InitializeWithParameters<*> -> {
val params = event.params as? CalendarPopupParams
launchReplaceContent {
onPopupDisplay(
params?.itemName ?: "カレンダー",
params?.date,
params?.inputControlType ?: InputControlType.NO_SEIGEN
)
}
}
}
}
/**
* Actionハンドリング
* 各ActionIDは処理仕様のEYY形式と対応
*/
override fun onAction(action: JafAction) {
when (action) {
is JAFRSHO99130Action.OnMonthSelect -> onMonthSelect()
is JAFRSHO99130Action.OnDaySelect -> onDaySelect()
is JAFRSHO99130Action.OnMonthScrollLeft -> onMonthScrollLeft()
is JAFRSHO99130Action.OnMonthScrollRight -> onMonthScrollRight()
is JAFRSHO99130Action.OnCalendarInput -> onCalendarInput(action.selectedDay)
is JAFRSHO99130Action.OnClear -> onClear()
is JAFRSHO99130Action.OnConfirm -> onConfirm()
is JAFRSHO99130Action.OnClose -> onClose()
is JAFRSHO99130Action.OnWindowClose -> onWindowClose()
}
}
/**
* 【処理仕様: JAFRSHO99130E001】画面表示
* カレンダーポップアップを作成する。
*/
private fun onPopupDisplay(
itemName: String,
date: String?,
inputControlType: Int
): JAFRSHO99130UiStateData {
return createInitialUiStateData(itemName, date, inputControlType)
}
/**
* 【処理仕様: JAFRSHO99130E002】月-選択
* 選択する候補月をプルダウン形式で表示する。
*/
private fun onMonthSelect() {
val currentData = getCurrentData() ?: return
val currentDay = currentData.selectedDay
val selectMonthList = generateSelectMonthList(
currentDay,currentData.yearMonth.substring(0,4).toInt())
val monthParamList = selectMonthList.map { month ->
Pair(first = "${month}月", second = month)
}
// 選択月リストの設定
val defaultSelectedMonth = if (currentData.selectedMonth.isNotEmpty()) {
Pair(
first = "${currentData.selectedMonth}月",
second = currentData.selectedMonth
)
} else {
null
}
val params = JAFRSHO99050Model(
listNameParam = monthParamList,
listCountParam = monthParamList.size,
listBoxSelectParam = defaultSelectedMonth,
onConfirmCallBack = { result ->
monthSelectResult = result
val selectedMonth = result.second.toString()
val currentYear = currentData.yearMonth.substring(0, 4)
val targetDay = if (currentData.selectedDay.isNotEmpty()) {
val maxDayOfNewMonth = generateSelectDayList(
month = selectedMonth.padStart(2, '0'),
year = currentYear,
).size
val currentDayInt = currentData.selectedDay.toInt()
if (currentDayInt > maxDayOfNewMonth) maxDayOfNewMonth else currentDayInt
} else {
1
}
val newYearMonth = "${currentYear}${selectedMonth.padStart(2, '0')}"
val newCalendarData = generateCalendarData(newYearMonth, targetDay)
updateSuccess { data ->
data.copy(
yearMonth = newYearMonth,
selectedMonth = selectedMonth.padStart(2, '0'),
selectedDay = targetDay.toString(),
calendarData = newCalendarData,
isMonthScrollLeftEnabled = newYearMonth != "190001",
isMonthScrollRightEnabled = newYearMonth != "209912"
)
}
}
)
navigate(
route = Jafrsho99010Routes.LIST_SELECT,
params = params as Serializable
)
}
/**
* 【処理仕様: JAFRSHO99130E003】日-選択
* 選択する候補日をプルダウン形式で表示する。
*/
private fun onDaySelect() {
val currentData = getCurrentData() ?: return
val currentYear = currentData.yearMonth.substring(0, 4)
val currentMonth = currentData.yearMonth.substring(4, 6)
val selectDayList = generateSelectDayList(currentMonth, currentYear)
val dayParamList = selectDayList.map { day ->
Pair(first = "${day}日", second = day)
}
// 選択日リストを設定
val defaultSelectedDay = if (currentData.selectedDay.isNotEmpty()) {
Pair(
first = "${currentData.selectedDay}日",
second = currentData.selectedDay
)
} else {
null
}
val params = JAFRSHO99050Model(
listNameParam = dayParamList,
listCountParam = dayParamList.size,
listBoxSelectParam = defaultSelectedDay,
onConfirmCallBack = { result ->
daySelectResult = result
val selectedDay = result.second.toString()
val newCalendarData = generateCalendarData(
yearMonth = currentData.yearMonth,
selectedDay = selectedDay.toInt()
)
updateSuccess { data ->
data.copy(
selectedDay = selectedDay,
calendarData = newCalendarData
)
}
}
)
navigate(
route = Jafrsho99010Routes.LIST_SELECT,
params = params as Serializable
)
}
/**
* 【処理仕様: JAFRSHO99130E004】月スクロール左-押下
* 月を1つ前に移動する。(例:202505⇒202504)
*/
private fun onMonthScrollLeft() {
val currentData = getCurrentData() ?: return
val currentMonth = currentData.yearMonth.substring(4, 6).toInt()
val currentYear = currentData.yearMonth.substring(0, 4).toInt()
val dayTmp = currentData.selectedDay
val (newYear, newMonth) = if (currentMonth == 1) {
Pair(currentYear - 1, 12)
} else {
Pair(currentYear, currentMonth - 1)
}
val newYearMonth = "$newYear${newMonth.toString().padStart(2, '0')}"
val targetDay = if (dayTmp.isNotEmpty()) {
val maxDayOfMonth =
generateSelectDayList(newMonth.toString().padStart(2, '0'), newYear.toString()).size
if (dayTmp.toInt() > maxDayOfMonth) maxDayOfMonth else dayTmp.toInt()
} else {
1
}
// カレンダー入力領域リフレッシュ
val newCalendarData = generateCalendarData(newYearMonth, targetDay)
updateSuccess { data ->
data.copy(
yearMonth = newYearMonth,
selectedMonth = newMonth.toString().padStart(2, '0'),
selectedDay = targetDay.toString(),
calendarData = newCalendarData,
isMonthScrollLeftEnabled = newYearMonth != "190001",
isMonthScrollRightEnabled = newYearMonth != "209912"
)
}
}
/**
* 【処理仕様: JAFRSHO99130E005】月スクロール右-押下
* 月を1つ次に移動する。(例:202505⇒202506)
*/
private fun onMonthScrollRight() {
val currentData = getCurrentData() ?: return
val currentMonth = currentData.yearMonth.substring(4, 6).toInt()
val currentYear = currentData.yearMonth.substring(0, 4).toInt()
val dayTmp = currentData.selectedDay
val (newYear, newMonth) = if (currentMonth == 12) {
Pair(currentYear + 1, 1)
} else {
Pair(currentYear, currentMonth + 1)
}
val newYearMonth = "$newYear${newMonth.toString().padStart(2, '0')}"
val targetDay = if (dayTmp.isNotEmpty()) {
val maxDayOfMonth =
generateSelectDayList(newMonth.toString().padStart(2, '0'), newYear.toString()).size
if (dayTmp.toInt() > maxDayOfMonth) maxDayOfMonth else dayTmp.toInt()
} else {
1
}
val newCalendarData = generateCalendarData(newYearMonth, targetDay)
updateSuccess { data ->
data.copy(
yearMonth = newYearMonth,
selectedMonth = newMonth.toString().padStart(2, '0'),
selectedDay = targetDay.toString(),
calendarData = newCalendarData,
isMonthScrollLeftEnabled = newYearMonth != "190001",
isMonthScrollRightEnabled = newYearMonth != "209912"
)
}
}
/**
* 【処理仕様: JAFRSHO99130E006】カレンダー入力領域-押下
* カレンダー表示領域での日付選択処理
*/
private fun onCalendarInput(selectedDay: Int) {
val currentData = getCurrentData() ?: return
val currentSelectedDay = currentData.selectedDay.toIntOrNull() ?: 0
// 同じ日が選択された場合は処理終了
if (selectedDay == currentSelectedDay) {
return
}
// 項目定義を設定
val monthTmp = currentData.yearMonth.substring(4, 6)
// 日にち強調表示設定
val newCalendarData = generateCalendarData(currentData.yearMonth, selectedDay)
updateSuccess { data ->
data.copy(
selectedDay = selectedDay.toString(),
selectedMonth = monthTmp.padStart(2, '0'),
calendarData = newCalendarData
)
}
}
/**
* 【処理仕様: JAFRSHO99130E007】クリア-押下
* 入力された日付をクリアする
*/
private fun onClear() {
val today = DateUtils.getCurrentFormatString(DateUtils.TYPE_5)
val yearMonth = today.substring(0, 6)
val selectedMonth = today.substring(4, 6).toInt().toString()
val selectedDay = today.substring(6, 8).toInt()
val newCalendarData = generateCalendarData(yearMonth, selectedDay)
updateSuccess { data ->
data.copy(
yearMonth = yearMonth,
selectedMonth = selectedMonth.padStart(2, '0'),
selectedDay = selectedDay.toString(),
calendarData = newCalendarData,
isMonthScrollLeftEnabled = yearMonth != "190001",
isMonthScrollRightEnabled = yearMonth != "209912"
)
}
}
/**
* 【処理仕様: JAFRSHO99130E008】確定-押下
* 選択された日付を確定して呼び出し元に返却
*/
private fun onConfirm() {
val currentData = getCurrentData() ?: return
if (currentData.selectedMonth.isNotEmpty()
||currentData.selectedDay.isNotEmpty()) {
val year = currentData.yearMonth.substring(0, 4)
val month = currentData.selectedMonth.padStart(2, '0')
val day = currentData.selectedDay.padStart(2, '0')
val dateTmp = "$year/$month/$day"
onConfirmCallback(dateTmp)
}else{
showMessage(
Message.JAFRSHO99010IC00230.id,
listOf("")
)
}
navigateBack()
}
/**
* コールバックメソッド
*/
fun onConfirmCallback(dateTmp: String) = Unit
/**
* 【処理仕様: JAFRSHO99130E009】閉じる-押下
* ポップアップを閉じる
*/
private fun onClose() {
navigateBack()
}
/**
* 【処理仕様: JAFRSHO99130E010】×(閉じる)-押下
* ウィンドウの×ボタンでポップアップを閉じる
*/
private fun onWindowClose() {
navigateBack()
}
}
/**
* カレンダーポップアップの初期パラメータ
*/
data class CalendarPopupParams(
/** 項目名 */
val itemName: String,
/** 年月日 */
val date: String?,
/** 入力制御種別 */
val inputControlType: Int
)
在onConfirm方法中加一个check
IF (inputControlType(入力制御種別) == FUTURE_SEIGEN)
❘
❘ IF (dateTmp(年月日) > (LocalDate.now().format(DateTimeFormatter.BASIC_ISO_DATE)))
❘ ❘
❘ ❘ 業務共通部品(メッセージダイアログ)を呼び出し、エラーメッセージ「未来日の入力はできません。」を表示する。
❘ ❘ 呼び出し関数名 【画面表示】メッセージダイアログ
❘ ❘ 処理ID JAFRSHO99020
❘ ❘ 引数 メッセージID "JAFRSHO99010EC00161"
❘ ❘ メッセージパラメータ なし
❘ ❘ 戻り値 なし
❘ ❘
❘ ❘ 「OK」ボタンを押下すると、処理を終了する。
❘ ❘
❘ END IF
❘
ELSE IF (inputControlType(入力制御種別) ==PAST_SEIGEN)
❘
❘ IF (dateTmp(年月日) < (LocalDate.now().format(DateTimeFormatter.BASIC_ISO_DATE)))
❘ ❘
❘ ❘ 業務共通部品(メッセージダイアログ)を呼び出し、エラーメッセージ「過去日の入力はできません。」を表示する。
❘ ❘ 呼び出し関数名 【画面表示】メッセージダイアログ
❘ ❘ 処理ID JAFRSHO99020
❘ ❘ 引数 メッセージID "JAFRSHO99010EC00098"
❘ ❘ メッセージパラメータ なし
❘ ❘ 戻り値 なし
❘ ❘
❘ ❘ 「OK」ボタンを押下すると、処理を終了する。
❘ ❘
❘ END IF
❘
END IF