feat(reports): cari, birikim, alışveriş, birim fiyat ve fire rapor servisleri

- mağaza adı eşleşmesi ve aylık birim fiyat özeti (saf, birim testli)
- tamamlanan listelerin plan/gerçekleşen özeti, mağaza bazlı harcama
- ürün tipi fiyat geçmişi yükleyicisi; fire oranı ve tahmini maliyet; testler

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-11-07 00:53:02 +03:00
parent d9a22551e1
commit 8623c5a02e
7 changed files with 920 additions and 4 deletions
+160
View File
@@ -1900,6 +1900,26 @@ export const tr = {
title: "Bütçe ve gerçekleşen",
description: "Kategori bazında limit ve harcama, son 6 ayın karşılaştırması.",
},
contacts: {
title: "Cari ve aynî borçlar",
description: "Kim kime ne kadar borçlu; açık altın/döviz borç ve alacakları.",
},
assets: {
title: "Birikim kâr/zarar",
description: "Varlık başına maliyet, değer ve kâr/zarar; dönem özeti.",
},
shopping: {
title: "Alışveriş",
description: "Liste ve gerçekleşen karşılaştırması, mağaza bazlı harcama.",
},
unitPrice: {
title: "Birim fiyat geçmişi",
description: "Ürün tipi başına aylık en düşük ve ortalama birim fiyat.",
},
waste: {
title: "Fire / zarar",
description: "Fire miktarı, alıma oranı, nedenleri ve tahmini maliyet.",
},
},
},
categories: {
@@ -1969,12 +1989,128 @@ export const tr = {
noLimit: "Bütçe yok",
covered: "üst kategoride",
},
periods: { 3: "Son 3 ay", 6: "Son 6 ay", 12: "Son 12 ay" } as Record<number, string>,
periodLabel: "Dönem",
rangeText: (from: string, to: string) => `${from} – ${to}`,
contacts: {
title: "Cari ve aynî borçlar",
description:
"Kim kime ne kadar borçlu; açık altın/döviz borç ve alacakları güncel değeriyle.",
owesMe: "Bana borçlu",
iOwe: "Ben borçluyum",
contact: "Cari",
balance: "Bakiye",
direction: "Yön",
due: "Vade",
noContacts: "Bakiyesi olan cari yok.",
inKindTitle: "Açık aynî borç ve alacaklar",
csvContacts: "Cariler CSV",
csvInKind: "Aynî CSV",
inKindHint: "Kalan miktarın güncel fiyatla TL karşılığı (alacak alış, borç satış fiyatıyla).",
remaining: "Kalan",
value: "Güncel değer",
since: "Tarih",
noInKind: "Açık aynî kayıt yok.",
receivable: "Alacak",
debt: "Borç",
unpriced: (n: number) => `${n} kaydın fiyatı yok; toplama katılmadı.`,
dueStates: { overdue: "Vadesi geçti", upcoming: "Vadesi yaklaşıyor", none: "" } as Record<
string,
string
>,
},
assets: {
title: "Birikim kâr/zarar",
description:
"Varlık başına maliyet, güncel değer (alış fiyatı) ve kâr/zarar; seçilen dönemin özeti.",
ranges: { "3": "Son 3 ay", "6": "Son 6 ay", "12": "Son 12 ay", tum: "Tümü" } as Record<
string,
string
>,
asset: "Varlık",
quantity: "Miktar",
cost: "Maliyet",
value: "Güncel değer",
unrealized: "Gerçekleşmemiş K/Z",
realized: "Gerçekleşen K/Z",
noPrice: "Fiyat yok",
periodTitle: "Dönem özeti",
startValue: "Dönem başı değer",
invested: "Yatırılan",
proceeds: "Satıştan alınan",
endValue: "Dönem sonu değer",
profit: "Dönem kârı",
excluded: (n: number) => `${n} varlığın fiyatı olmadığı için dönem toplamına katılmadı.`,
empty: "Varlık yok.",
total: "Toplam",
},
shopping: {
title: "Alışveriş raporu",
description: "Tamamlanan listelerde plan ve gerçekleşen; mağaza bazlı harcama.",
listsTitle: "Liste ve gerçekleşen",
listsEmpty: "Bu dönemde tamamlanan alışveriş yok.",
list: "Liste",
date: "Tarih",
planned: "Planlanan",
actual: "Gerçekleşen",
diff: "Fark",
counts: (same: number, sub: number, skipped: number, extra: number) =>
`${same} aynı · ${sub} muadil · ${skipped} alınmadı · ${extra} ekstra`,
storesTitle: "Mağaza bazlı harcama",
storesHint: "Alıcısı mağaza adıyla başlayan gerçekleşmiş giderler (şubeler birlikte).",
store: "Mağaza",
amount: "Tutar",
count: "İşlem",
share: "Oran",
fromLists: "Listelerden",
storesEmpty: "Bu dönemde mağaza adıyla eşleşen gider yok.",
total: "Toplam",
csvLists: "Listeler CSV",
csvStores: "Mağazalar CSV",
},
unitPrice: {
title: "Birim fiyat geçmişi",
description: "Ürün tipi başına son 12 bütçe ayında en düşük ve ortalama birim fiyat.",
type: "Ürün tipi",
noTypes: "Henüz fiyat kaydı yok.",
min: "En düşük",
avg: "Ortalama",
month: "Ay",
count: "Kayıt",
chartLabel: (name: string) => `${name}: aylık en düşük ve ortalama birim fiyat`,
storesTitle: "Mağazalarda dönemin en düşük birim fiyatı",
store: "Mağaza",
last: "Son kayıt",
records: (n: number) => `${n} kayıt`,
},
waste: {
title: "Fire / zarar",
description: "Ürün tipi başına fire miktarı, alıma oranı, nedenleri ve tahmini maliyeti.",
total: "Tahmini toplam maliyet",
product: "Ürün tipi",
wasted: "Fire",
purchased: "Alım",
ratio: "Fire / alım",
cost: "Tahmini maliyet",
reasonsTitle: "Nedenler",
count: (n: number) => `${n} kayıt`,
empty: "Bu dönemde fire kaydı yok.",
unpriced: (n: number) => `${n} ürün tipinin fiyatı yok; maliyete katılmadı.`,
costHint: "Fire miktarı × ürün tipinin son bilinen birim fiyatı.",
},
csvFiles: {
categories: (month: string) => `butcem-kategori-dagilimi-${month}.csv`,
trend: (date: string) => `butcem-aylik-trend-${date}.csv`,
people: (month: string) => `butcem-kisi-bazli-${month}.csv`,
accounts: (month: string) => `butcem-hesap-bazli-${month}.csv`,
budget: (month: string) => `butcem-butce-gerceklesen-${month}.csv`,
contacts: (date: string) => `butcem-cari-${date}.csv`,
inKind: (date: string) => `butcem-ayni-${date}.csv`,
assets: (date: string) => `butcem-birikim-${date}.csv`,
lists: (date: string) => `butcem-alisveris-listeleri-${date}.csv`,
stores: (date: string) => `butcem-magaza-harcama-${date}.csv`,
unitPrice: (name: string, date: string) => `butcem-birim-fiyat-${name}-${date}.csv`,
waste: (date: string) => `butcem-fire-${date}.csv`,
},
csvHeaders: {
categories: [
@@ -1998,6 +2134,30 @@ export const tr = {
"İşlem sayısı",
],
budget: ["Kategori", "Limit", "Gerçekleşen", "Kalan", "Kullanım (%)"],
contacts: ["Cari", "Bakiye (+ bana borçlu, − ben borçluyum)", "Vade"],
inKind: ["Cari", "Yön", "Kalan", "Güncel değer", "Tarih"],
assets: [
"Varlık",
"Miktar",
"Maliyet",
"Güncel değer",
"Gerçekleşmemiş K/Z",
"Gerçekleşen K/Z",
],
lists: [
"Tarih",
"Liste",
"Planlanan",
"Gerçekleşen",
"Fark",
"Aynı",
"Muadil",
"Alınmadı",
"Ekstra",
],
stores: ["Mağaza", "Tutar", "İşlem", "Oran (%)", "Listelerden"],
unitPrice: ["Ay", "En düşük birim fiyat", "Ortalama birim fiyat", "Kayıt"],
waste: ["Ürün tipi", "Birim", "Fire", "Alım", "Fire / alım (%)", "Tahmini maliyet"],
},
},
dashboard: {