Files
kakeibo/backend/src/services/seed.rs
T
suphicakir 267d292a90 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>
2026-11-13 00:35:23 +03:00

106 lines
3.1 KiB
Rust
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
//! 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));
}
}
}