diff --git a/lib/function/device_checkout_ledger_controller.dart b/lib/function/device_checkout_ledger_controller.dart index 9ba4d34..4831e2c 100644 --- a/lib/function/device_checkout_ledger_controller.dart +++ b/lib/function/device_checkout_ledger_controller.dart @@ -96,24 +96,37 @@ class DeviceCheckoutLedgerController extends ChangeNotifier { }); } + /// ๐Ÿ™Œ [์ „์ฒด ํ•™์ƒ ํ—ˆ์šฉ] ๋Œ€์ƒ์ด ๋  ์š”์ฒญ id ๋ชฉ๋ก (๋Œ€๊ธฐ ์ค‘์ด๋ฉด์„œ ์žฅ์‹œ๊ฐ„ ์š”์ฒญ์€ ์•„๋‹Œ ๊ฒƒ๋งŒ). + /// ํ™•์ธ ๋‹ค์ด์–ผ๋กœ๊ทธ์—์„œ ๋ช‡ ๊ฑด์ด ์Šน์ธ๋˜๊ณ  ๋ช‡ ๊ฑด์ด ์ œ์™ธ๋˜๋Š”์ง€ ๋ฏธ๋ฆฌ ๋ณด์—ฌ์ฃผ๋Š” ๋ฐ ์“ด๋‹ค. + List get autoApprovableIds => _requests + .where((r) => r['status'] == 'PENDING' && !isLongRequest(r)) + .map((r) => r['id'] as int) + .toList(); + // ๐Ÿ™Œ [์ „์ฒด ํ•™์ƒ ํ—ˆ์šฉ] ๋Œ€๊ธฐ ์ค‘์ธ ์š”์ฒญ์„ ํ•œ ๋ช…์”ฉ ๋ˆ„๋ฅด๊ธฐ ๊ท€์ฐฎ์„ ๋•Œ, ํ•œ ๋ฒˆ์— ์ „๋ถ€ ์Šน์ธํ•œ๋‹ค. - // ์„œ๋ฒ„์— ์ผ๊ด„ ์Šน์ธ API๊ฐ€ ๋”ฐ๋กœ ์—†์–ด์„œ, ๋Œ€๊ธฐ ์ค‘์ธ ์š”์ฒญ๋งˆ๋‹ค ์Šน์ธ ์š”์ฒญ์„ ์ˆœ์„œ๋Œ€๋กœ ๋ณด๋‚ธ๋‹ค. + // ๋‹จ, 1์‹œ๊ฐ„ 59๋ถ„ ๋„˜๋Š” ์žฅ์‹œ๊ฐ„ ์š”์ฒญ์€ ์ž๋™์œผ๋กœ ์ œ์™ธํ•˜๊ณ  ๋Œ€๊ธฐ์ค‘ ์ƒํƒœ๋กœ ๋‚จ๊ฒจ์„œ, + // "๋งŽ์€ ์‹œ๊ฐ„์š”์ฒญ ํ•™์ƒ" ๋ชฉ๋ก์—์„œ ๋”ฐ๋กœ ๊ฒ€ํ† /์Šน์ธํ•˜๊ฒŒ ํ•œ๋‹ค. + // ์„œ๋ฒ„์— ์ผ๊ด„ ์Šน์ธ API๊ฐ€ ๋”ฐ๋กœ ์—†์–ด์„œ, ๋Œ€์ƒ ์š”์ฒญ๋งˆ๋‹ค ์Šน์ธ ์š”์ฒญ์„ ์ˆœ์„œ๋Œ€๋กœ ๋ณด๋‚ธ๋‹ค. Future<(bool success, String message)> approveAllPending({ required String teacherId, required String teacherName, }) async { - final pendingIds = _requests - .where((r) => r['status'] == 'PENDING') - .map((r) => r['id'] as int) - .toList(); - if (pendingIds.isEmpty) { - return (true, '์Šน์ธ ๋Œ€๊ธฐ ์ค‘์ธ ์š”์ฒญ์ด ์—†์Šต๋‹ˆ๋‹ค.'); + final targetIds = autoApprovableIds; + final excludedCount = longPendingRequests.length; + + if (targetIds.isEmpty) { + return ( + true, + excludedCount > 0 + ? '์žฅ์‹œ๊ฐ„ ์š”์ฒญ $excludedCount๊ฑด์„ ์ œ์™ธํ•˜๋ฉด ์Šน์ธํ•  ๋Œ€๊ธฐ ์š”์ฒญ์ด ์—†์Šต๋‹ˆ๋‹ค.' + : '์Šน์ธ ๋Œ€๊ธฐ ์ค‘์ธ ์š”์ฒญ์ด ์—†์Šต๋‹ˆ๋‹ค.', + ); } _isWorking = true; _safeNotify(); int successCount = 0; - for (final id in pendingIds) { + for (final id in targetIds) { try { final response = await http.post( Uri.parse('$baseUrl/api/device-checkout/approve'), @@ -136,10 +149,13 @@ class DeviceCheckoutLedgerController extends ChangeNotifier { _isWorking = false; _safeNotify(); - final allOk = successCount == pendingIds.length; + final allOk = successCount == targetIds.length; + final excludedNote = excludedCount > 0 + ? ' (์žฅ์‹œ๊ฐ„ ์š”์ฒญ $excludedCount๊ฑด์€ ์ œ์™ธ - ๋Œ€๊ธฐ์ค‘์œผ๋กœ ๋‚จ์Œ)' + : ''; return ( allOk, - '${pendingIds.length}๊ฑด ์ค‘ $successCount๊ฑด ์Šน์ธ ์™„๋ฃŒ${allOk ? '' : ' (์ผ๋ถ€ ์‹คํŒจ)'}', + '${targetIds.length}๊ฑด ์ค‘ $successCount๊ฑด ์Šน์ธ ์™„๋ฃŒ${allOk ? '' : ' (์ผ๋ถ€ ์‹คํŒจ)'}$excludedNote', ); } diff --git a/lib/ui/device_checkout_ledger_page.dart b/lib/ui/device_checkout_ledger_page.dart index bcce350..bd89284 100644 --- a/lib/ui/device_checkout_ledger_page.dart +++ b/lib/ui/device_checkout_ledger_page.dart @@ -50,6 +50,7 @@ class _DeviceCheckoutLedgerPageState extends State { } // ๐Ÿ™Œ [์ „์ฒด ํ•™์ƒ ํ—ˆ์šฉ] ํ•œ ๋ช…์”ฉ ๋ˆ„๋ฅด๊ธฐ ๊ท€์ฐฎ์„ ๋•Œ, ๋Œ€๊ธฐ ์ค‘์ธ ์š”์ฒญ์„ ํ•œ ๋ฒˆ์— ์ „๋ถ€ ์Šน์ธํ•œ๋‹ค. + // 1์‹œ๊ฐ„ 59๋ถ„ ๋„˜๋Š” ์žฅ์‹œ๊ฐ„ ์š”์ฒญ์€ ์ž๋™์œผ๋กœ ์ œ์™ธ๋˜์–ด ๋Œ€๊ธฐ์ค‘์œผ๋กœ ๋‚จ๋Š”๋‹ค - ๋”ฐ๋กœ ๊ฒ€ํ† ๊ฐ€ ํ•„์š”ํ•ด์„œ. void _showApproveAllConfirmDialog() { final pendingCount = _controller.requests .where((r) => r['status'] == 'PENDING') @@ -58,11 +59,18 @@ class _DeviceCheckoutLedgerPageState extends State { AppNotice.show(context, '์Šน์ธ ๋Œ€๊ธฐ ์ค‘์ธ ์š”์ฒญ์ด ์—†์Šต๋‹ˆ๋‹ค.'); return; } + final approvableCount = _controller.autoApprovableIds.length; + final excludedCount = pendingCount - approvableCount; showDialog( context: context, builder: (dialogContext) => AlertDialog( title: const Text('์ „์ฒด ํ•™์ƒ ํ—ˆ์šฉ'), - content: Text('๋Œ€๊ธฐ ์ค‘์ธ ์š”์ฒญ $pendingCount๊ฑด์„ ํ•œ ๋ฒˆ์— ์ „๋ถ€ ์Šน์ธํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?'), + content: Text( + excludedCount > 0 + ? '๋Œ€๊ธฐ ์ค‘์ธ ์š”์ฒญ $pendingCount๊ฑด ์ค‘ $approvableCount๊ฑด์„ ์Šน์ธํ•ฉ๋‹ˆ๋‹ค.\n' + '์žฅ์‹œ๊ฐ„(1์‹œ๊ฐ„ 59๋ถ„ ์ด์ƒ) ์š”์ฒญ $excludedCount๊ฑด์€ ์ œ์™ธ๋˜์–ด "๋งŽ์€ ์‹œ๊ฐ„์š”์ฒญ ํ•™์ƒ"์—์„œ ๋”ฐ๋กœ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.' + : '๋Œ€๊ธฐ ์ค‘์ธ ์š”์ฒญ $pendingCount๊ฑด์„ ํ•œ ๋ฒˆ์— ์ „๋ถ€ ์Šน์ธํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?', + ), actions: [ TextButton( onPressed: () => Navigator.pop(dialogContext),