Я хочу добавить для пользователя возможность обычной оплаты. Когда пользователь вставляет платеж в базу данных и устанавливает частоту «Ежедневно» или любой другой вариант, исходя из количества оставшихся платежей, данные должны добавляться в соответствии с выбранной периодичностью. После этого следует обновить оставшиеся платежи. Если пользователь удаляет какой-либо из ежедневных платежей, система должна добавить платеж снова через график регулярных платежей. PaymentReceiver
@Upsert
suspend fun insertOrUpdateRegularPayment(regularPayment: RegularPayment):Long
@Query("SELECT * FROM regular_payment")
suspend fun getAllRegularPayments(): List
@Query("SELECT * FROM regular_payment WHERE id = :id")
fun getRegularPaymentById(id:Long): RegularPayment?
@Query("UPDATE regular_payment SET remainingPayments = :remaining WHERE id = :id")
suspend fun updateRemainingPayments(id: Long, remaining: Int)
@Query("""
SELECT
(SELECT COUNT(*) FROM user_data WHERE regularPaymentID = :paymentId AND expenseName = :paymentName AND date = :date) AS addedCount,
(SELECT COUNT(*) FROM deleted_payment WHERE paymentId = :paymentId AND deleteDate = :date) AS deletedCount
""")
fun isPaymentProcessable(paymentId: Long, paymentName: String, date: Long): ProcessableResult
Я пытался справиться с использованием isProcessingPayments в качестве флага.
Попробуйте отменить AlarmManager и запустить новый каждый раз.
Я хочу добавить для пользователя возможность обычной оплаты. Когда пользователь вставляет платеж в базу данных и устанавливает частоту «Ежедневно» или любой другой вариант, исходя из количества оставшихся платежей, данные должны добавляться в соответствии с выбранной периодичностью. После этого следует обновить оставшиеся платежи. Если пользователь удаляет какой-либо из ежедневных платежей, система должна добавить платеж снова через график регулярных платежей. [b]PaymentReceiver[/b] [code]class PaymentReceiver : BroadcastReceiver() {
companion object { private val lastExecutionTimes = ConcurrentHashMap() }
override fun onReceive(context: Context, intent: Intent) { val title = intent.getStringExtra("TITLE") val message = intent.getStringExtra("MESSAGE") val paymentId = intent.getIntExtra("paymentId", 0) val frequency = intent.getStringExtra("FREQUENCY") ?: return val currentTime = System.currentTimeMillis()
val userViewModel = UserViewModel(Application.getContext()) val paymentManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
val soundUri = Uri.parse("android.resource://${context.packageName}/raw/notification")
val payment = runBlocking { userViewModel.getRegularPaymentById(paymentId.toLong()) }
if (payment == null) { Log.e("PaymentReceiver", "Payment not found for ID: $paymentId") return }
if (lastExecutionTimes[paymentId]?.let { currentTime - it < 5000 } == true) { Log.d("PaymentReceiver", "Duplicate execution avoided for paymentId: $paymentId") return } lastExecutionTimes[paymentId] = currentTime
val alarmManager = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager val intent = Intent(context, PaymentReceiver::class.java).apply { putExtra("paymentId", regularPayment.id.toInt()) putExtra("TITLE", "Payment Added") putExtra( "MESSAGE", "Added payment: ${regularPayment.paymentName} of ${regularPayment.amount}" ) putExtra("FREQUENCY", regularPayment.frequency) }
val pendingIntent = PendingIntent.getBroadcast( context, regularPayment.id.toInt(), intent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE )
if (regularPayment.remainingPayments addPaymentToUserData(payment) }
} } finally { isProcessingPayments = false } } }
private fun shouldAddPayment(payment: RegularPayment): Boolean { val dueDate = calculateNextDueDate(payment.startDate, payment.frequency) return payment.remainingPayments > 0 && dueDate calendar.add(Calendar.DAY_OF_YEAR, 1) "Weekly" -> calendar.add(Calendar.WEEK_OF_YEAR, 1) "Every two weeks" -> calendar.add(Calendar.WEEK_OF_YEAR, 2) "Monthly" -> calendar.add(Calendar.MONTH, 1) "Every two months" -> calendar.add(Calendar.MONTH, 2) "Every three months" -> calendar.add(Calendar.MONTH, 3) "Every four months" -> calendar.add(Calendar.MONTH, 4) "Every six months" -> calendar.add(Calendar.MONTH, 6) "Every year" -> calendar.add(Calendar.YEAR, 1) } return resetTimeToZero(calendar.timeInMillis) } [/code] [b]ДАО[/b] [code] @Upsert suspend fun insertOrUpdateRegularPayment(regularPayment: RegularPayment):Long
@Query("SELECT * FROM regular_payment") suspend fun getAllRegularPayments(): List
@Query("SELECT * FROM regular_payment WHERE id = :id") fun getRegularPaymentById(id:Long): RegularPayment?
@Query("UPDATE regular_payment SET remainingPayments = :remaining WHERE id = :id") suspend fun updateRemainingPayments(id: Long, remaining: Int)
@Query(""" SELECT (SELECT COUNT(*) FROM user_data WHERE regularPaymentID = :paymentId AND expenseName = :paymentName AND date = :date) AS addedCount, (SELECT COUNT(*) FROM deleted_payment WHERE paymentId = :paymentId AND deleteDate = :date) AS deletedCount """) fun isPaymentProcessable(paymentId: Long, paymentName: String, date: Long): ProcessableResult [/code] [list] [*]Я пытался справиться с использованием isProcessingPayments в качестве флага. [*]Попробуйте отменить AlarmManager и запустить новый каждый раз. [/list]