feat(birikim): varlıklar ve alım/satım kayıtları (ortalama maliyet)
- Varsayılan varlıklar (TL, altınlar, USD, EUR) + migration v2 ile eski hanelere ekleme - Döviz ekleme, varlık adı/aktifliği - Alım/satım ekle, düzenle, sil; eldekinden fazla satış (geriye tarihli dahil) engellenir - Ağırlıklı ortalama maliyet ve gerçekleşen kâr/zarar (hesaplanır, saklanmaz) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -24,11 +24,18 @@ struct Migration {
|
||||
}
|
||||
|
||||
/// Sıralı migration listesi. Sürümler 1'den başlar ve atlamadan artar.
|
||||
const MIGRATIONS: &[Migration] = &[Migration {
|
||||
version: 1,
|
||||
name: "initial",
|
||||
run: |db| Box::pin(m001_initial(db)),
|
||||
}];
|
||||
const MIGRATIONS: &[Migration] = &[
|
||||
Migration {
|
||||
version: 1,
|
||||
name: "initial",
|
||||
run: |db| Box::pin(m001_initial(db)),
|
||||
},
|
||||
Migration {
|
||||
version: 2,
|
||||
name: "default_assets",
|
||||
run: |db| Box::pin(m002_default_assets(db)),
|
||||
},
|
||||
];
|
||||
|
||||
/// Uygulanmamış migration'ları sırayla çalıştırır.
|
||||
pub async fn run(db: &Database) -> Result<()> {
|
||||
@@ -66,6 +73,36 @@ async fn m001_initial(db: &Database) -> Result<()> {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// v2: Faz 8'den önce açılmış hanelere varsayılan varlıklar (TL, altınlar, USD, EUR).
|
||||
/// Varlığı olan haneye dokunmaz → tekrar çalışsa da çift kayıt olmaz.
|
||||
async fn m002_default_assets(db: &Database) -> Result<()> {
|
||||
#[derive(serde::Deserialize)]
|
||||
struct Household {
|
||||
#[serde(rename = "_id")]
|
||||
id: mongodb::bson::Uuid,
|
||||
}
|
||||
let assets = db.collection::<Document>(col::ASSETS);
|
||||
let mut cursor = db
|
||||
.collection::<Household>(col::HOUSEHOLDS)
|
||||
.find(doc! { "deleted_at": null })
|
||||
.projection(doc! { "_id": 1 })
|
||||
.await?;
|
||||
while cursor.advance().await? {
|
||||
let hid = cursor.deserialize_current()?.id;
|
||||
if assets
|
||||
.find_one(doc! { "household_id": hid })
|
||||
.await?
|
||||
.is_none()
|
||||
{
|
||||
assets
|
||||
.insert_many(crate::services::seed::assets(hid))
|
||||
.await?;
|
||||
tracing::info!("Varsayılan varlıklar eklendi: hane {hid}");
|
||||
}
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
Reference in New Issue
Block a user