Reprezentarea unei baterii externe (sursă de energie portabilă).
id (UUID) unicUn Powerbank este o subcategorie a ChargedDevice cu class = .powerbank.
| Proprietate | Tip | Descriere | Observaţii |
|---|---|---|---|
id |
UUID | Identificator unic | Generat la criere |
name |
String | Nume (ex: "Anker 10000mAh") | Ales de utilizator |
macAddress |
String | Adresa BT | Pentru identificare unică |
capacity |
Int | Capacitate în mAh | Trebuie să fie > 0 |
dischargeSessions |
[DischargeSession] | Sesiunile de descărcare | Cronologice |
totalEnergyDelivered |
Double | Total Wh furnizat | Calculat din sesiuni |
createdAt |
Date | Data creării | Immutable |
lastDischargedAt |
Date? | Data ultimei sesiuni | Nullable |
// Gestionare sesiuni
func startDischargeSession(meter: Meter) -> DischargeSession
// MUST: sessionID = UUID()
// MUST: startTime = now()
// MUST: retur DischargeSession cu status "active"
// SHOULD: capacity nu scade (immutable)
func recordDischargePoint(_ measurement: Measurement, in session: DischargeSession)
// Înregistrează o măsurătoare de descărcare
// MUST: measurement.timestamp > session.startTime
// MUST: nu merge dacă sesiunea e completată
func endDischargeSession(_ session: DischargeSession)
// MUST: endTime = now()
// MUST: calculează energie furnizată = ∑(V * A * Δt)
// MUST: marchez sesiunea ca "completed"
func recalculateTotalEnergy()
// Recalculează totalul de Wh furnizat
// SHOULD: se apelează după merge
// Duplicate handling
func mergeWith(_ other: Powerbank)
// MUST: combină toate sesiunile din ambele PB-uri
// MUST: elimină duplicate-urile de sesiuni
// MUST: recalculează totalul
// SHOULD: logs operaţia
// MUST: marchez celalalt Powerbank ca "merged"
// Naming
func rename(to newName: String)
// MUST: actualizează name property
// MUST: persistă în Core Data
Se declanşează când: 1. Două Powerbanks cu același MAC address 2. Două Powerbanks cu sesiuni suprapuse pe aceeași perioadă
Rezoluţie: - MUST: Sesiunea cu mai multe măsurători = "winner" - MUST: Energiile sunt adunate (∑) - MUST: Sesiunile sunt deduplicate după sessionID - SHOULD: Old Powerbank e marcat ca "merged" - MAY: Notifică utilizator
// Sesiuni
test_startSessionCreatesValidRecord()
test_endSessionCalculatesEnergy()
test_activeSessions_OnlyOne()
// Măsurători
test_recordPointFailsIfSessionEnded()
test_measurementOrdering()
// Merge
test_mergeDetectsDuplicates()
test_mergeKeepsMoreCompleteData()
test_mergeRecalculatesTotalEnergy()
test_mergeMarksOldAsMerged()
// Naming
test_renameUpdatesPersistence()
// Validare
test_capacityMustBePositive()
test_energyCannotBeNegative()
Meter: pentru măsurătoriChargeInsightsStore: persistență sesiuniCloudKitSync: replicare iCloudChargedDevice: Powerbank e subcategorieDocumentaţie asoc: - Powerbank Category - Charge Session Integrity - Status: Adăugat recent (commit: 0772cad) - Merge class+template: plan în progress, schema v20