Ich möchte dem Benutzer eine reguläre Zahlungsoption hinzufügen. Wenn der Benutzer eine Zahlung in die Datenbank einfügt und die Häufigkeit auf „Täglich“ oder eine andere Option einstellt, basierend auf der Anzahl der verbleibenden Zahlungen, sollten die Daten entsprechend der ausgewählten Häufigkeit hinzugefügt werden. Danach sollten die verbleibenden Zahlungen aktualisiert werden. Wenn der Benutzer eine der täglichen Zahlungen löscht, sollte das System die Zahlung über den regulären Zahlungsplan erneut hinzufügen. 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
Ich habe versucht, die Verwendung von isProcessingPayments als Flag zu verwalten.
Versuchen Sie, den AlarmManager abzubrechen und einen neuen zu starten jedes Mal.
Ich möchte dem Benutzer eine reguläre Zahlungsoption hinzufügen. Wenn der Benutzer eine Zahlung in die Datenbank einfügt und die Häufigkeit auf „Täglich“ oder eine andere Option einstellt, basierend auf der Anzahl der verbleibenden Zahlungen, sollten die Daten entsprechend der ausgewählten Häufigkeit hinzugefügt werden. Danach sollten die verbleibenden Zahlungen aktualisiert werden. Wenn der Benutzer eine der täglichen Zahlungen löscht, sollte das System die Zahlung über den regulären Zahlungsplan erneut hinzufügen. [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]DAO[/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] [*]Ich habe versucht, die Verwendung von isProcessingPayments als Flag zu verwalten. [*]Versuchen Sie, den AlarmManager abzubrechen und einen neuen zu starten jedes Mal. [/list]
und geben Sie einen Rand der Dicke 1 in jedes Raster. Ist die einzige Möglichkeit, damit umzugehen, um die Dicke an jedem Rand des Randes anzugeben, oder gibt es eine...
Mir wurde diese Aufgabe gegeben: Der Vektor A = ist gegeben. Schreiben Sie die Funktion, die in einem Vektor B alle eindeutigen Elemente und in einem anderen Vektor C alle Werte anzeigt, die ohne...
Mir wurde diese Aufgabe gegeben: Der Vektor A = ist gegeben. Schreiben Sie die Funktion, die in einem Vektor B alle eindeutigen Elemente und in einem anderen Vektor C alle Werte anzeigt, die ohne...
Ich verwende Antlr 4 und es ist üblich, eine Klasse zu instanziieren und sie sofort als Argument des Konstruktors der nächsten Klasse zu bestehen, gemäß den Dokumenten für das Antlr 4 JavaScript...