267d292a90
- 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>
106 lines
3.1 KiB
Rust
106 lines
3.1 KiB
Rust
//! Yeni hane için örnek alt kategoriler, ödeme türleri ve varsayılan varlıklar
|
||
//! (DATA_MODEL.md §3.5, §3.6, §3.12).
|
||
|
||
use mongodb::bson::{Document, Uuid};
|
||
|
||
use crate::models::common::new_meta;
|
||
|
||
/// (grup, ad, emoji)
|
||
const CATEGORIES: &[(&str, &str, &str)] = &[
|
||
("needs", "Market", "🛒"),
|
||
("needs", "Kira", "🏠"),
|
||
("needs", "Faturalar", "💡"),
|
||
("needs", "Ulaşım", "🚌"),
|
||
("wants", "Dışarıda yemek", "🍽️"),
|
||
("wants", "Giyim", "👕"),
|
||
("wants", "Eğlence", "🎉"),
|
||
("culture", "Kitap", "📖"),
|
||
("culture", "Eğitim", "🎓"),
|
||
("culture", "Sinema/Konser", "🎬"),
|
||
("unexpected", "Sağlık", "💊"),
|
||
("unexpected", "Tamir", "🔧"),
|
||
("unexpected", "Hediye", "🎁"),
|
||
];
|
||
|
||
/// (ad, emoji)
|
||
const PAYMENT_METHODS: &[(&str, &str)] = &[
|
||
("Nakit", "💵"),
|
||
("Kredi Kartı", "💳"),
|
||
("Banka Kartı", "🏧"),
|
||
("Havale/EFT", "🔁"),
|
||
];
|
||
|
||
/// (tür, kod, ad, birim) — kurlar Faz 8 Adım 2'de bu kodlarla eşleşir
|
||
const ASSETS: &[(&str, &str, &str, &str)] = &[
|
||
("cash", "TRY", "Türk Lirası", "₺"),
|
||
("gold", "XAU_GRAM", "Gram Altın", "gr"),
|
||
("gold", "XAU_CEYREK", "Çeyrek Altın", "adet"),
|
||
("gold", "XAU_YARIM", "Yarım Altın", "adet"),
|
||
("gold", "XAU_TAM", "Tam Altın", "adet"),
|
||
("gold", "XAU_ONS", "Ons Altın", "ons"),
|
||
("fx", "USD", "ABD Doları", "$"),
|
||
("fx", "EUR", "Euro", "€"),
|
||
];
|
||
|
||
pub fn assets(household_id: Uuid) -> Vec<Document> {
|
||
ASSETS
|
||
.iter()
|
||
.enumerate()
|
||
.map(|(i, (kind, code, name, unit))| {
|
||
let mut d = new_meta(household_id);
|
||
d.insert("kind", *kind);
|
||
d.insert("code", *code);
|
||
d.insert("name", *name);
|
||
d.insert("unit_label", *unit);
|
||
d.insert("sort_order", (i as i32 + 1) * 10);
|
||
d.insert("is_active", true);
|
||
d
|
||
})
|
||
.collect()
|
||
}
|
||
|
||
pub fn categories(household_id: Uuid) -> Vec<Document> {
|
||
CATEGORIES
|
||
.iter()
|
||
.enumerate()
|
||
.map(|(i, (group, name, emoji))| {
|
||
let mut d = new_meta(household_id);
|
||
d.insert("group", *group);
|
||
d.insert("name", *name);
|
||
d.insert("emoji", *emoji);
|
||
d.insert("sort_order", (i as i32 + 1) * 10);
|
||
d.insert("is_active", true);
|
||
d
|
||
})
|
||
.collect()
|
||
}
|
||
|
||
pub fn payment_methods(household_id: Uuid) -> Vec<Document> {
|
||
PAYMENT_METHODS
|
||
.iter()
|
||
.enumerate()
|
||
.map(|(i, (name, emoji))| {
|
||
let mut d = new_meta(household_id);
|
||
d.insert("name", *name);
|
||
d.insert("emoji", *emoji);
|
||
d.insert("sort_order", (i as i32 + 1) * 10);
|
||
d.insert("is_active", true);
|
||
d
|
||
})
|
||
.collect()
|
||
}
|
||
|
||
#[cfg(test)]
|
||
mod tests {
|
||
use super::*;
|
||
use crate::models::common::new_id;
|
||
|
||
#[test]
|
||
fn every_group_has_categories() {
|
||
let docs = categories(new_id());
|
||
for g in ["needs", "wants", "culture", "unexpected"] {
|
||
assert!(docs.iter().any(|d| d.get_str("group").unwrap() == g));
|
||
}
|
||
}
|
||
}
|