İçeriğe geç
academia.sh

Ders 17 / 21

Etiketleme ve Maliyet Dağıtımı

Sahiplik bilgisi faturanın dışından gelir ve tam gelmez: 148 kaynaklı kurgu envanterde görünen etiket kapsamı %77,7 iken geçerli kapsam %75,0'tir, aylık 4.214,3 kurgu birimin %25,1'i hiçbir kurala girmeden atanamaz kalır. Paylaşılan 1.584,9 birim üç kuralla bölüştürüldüğünde aynı ekibin faturası %8,7 ile %18,6 arasında oynar. Etiket zorunluluğu atanamayan payı sıfırlar ama 37 kaynağı reddeder ve 511,9 birimlik 14 meşru işi durdurur; etiketler ay sonunda %95,9 kapsama çıksa bile o ayın 568,6 birimi (%13,5) geriye dönük düzelmez.

İçindekiler

Önceki ders faturanın on dört ayrım verdiğini, ağın ise doksan birim ayırmayı gerektirdiğini ölçtü. Aradaki boşluk faturadan kapanmaz; sahiplik bilgisi başka bir yerden gelmek zorundadır. Bulut tarafında o yer kaynağın kendisidir: kaynağa bir etiket takılır ve maliyet o etiketten dağıtılır.

Bu dersin sorusu dağıtımın nasıl yapılacağı değil, nerede tutmadığıdır. Ekip bazlı muhasebe ve bölüştürülemeyen kalem M22/K08’de ölçüldü; burada ölçülen şey onun girdisi olan etikettir.

Etiketli Kaynak Envanteri

Örnek kurgu bölgesel ölçüm ağıdır: beş ekip, üç ortam, kiralanmış makine, ağ, depo, işlev ve kenar katmanı. Kaynaklar, etiketler ve tutarlar kurgudur; para birimi de kurgudur ve br diye anılır, gerçek bir fiyat listesine karşılık gelmez.

BM7: envanterde 148 kaynak vardır; sekiz tür, üçü birden çok ekip tarafından kullanılır ve paylasilan etiketi taşır. BM8: bir kaynakta sahip etiketinin olup olmaması onun nasıl oluşturulduğuna bağlıdır; dört oluşturma yolu vardır. BM9: yanlış yazılmış sahip etiketi kapsam raporunda etiketli görünür ama ekip listesinde karşılığı yoktur; dağıtımda geçersizdir. BM10: paylaşılan kaynağın gerçek sürücüsü bilinmez — bu derste karşılaştırılacak bir gerçek pay yoktur, ölçülen şey sapma değil, kurala göre oynamadır. BM11: bir kaynağa en çok on etiket anahtarı takılabilir; ağ yedi anahtar kullanır. BM12: etiket bir günde tamamlanır; o günden önce kesilmiş fatura satırları etiketsizdir ve düzelmez.

Envanter süreç içi bir modeldir ve bir üreteçten türer; tohum görünürdür.

// maliyet/envanter.mjs — etiketli kaynak envanteri modeli: gercek bir envanter yok. Kaynaklar
// bir uretecle turetilir, tohum gorunurdur ve koşum tekrarlanabilir. Para birimi kurgudur ve
// `br` diye anilir. Etiketin *olup olmamasi* kaynagin nasil olusturuldugu ile belirlenir;
// yanlis yazilmis etiket ayri bir durumdur: kapsam raporunda etiketli, dagitimda gecersiz.

export const TOHUM = 6108;
export const ADET = 148;
export const EKIP = ["sayac-okuma", "dogrulama", "faturalama", "saha", "raporlama"];
export const ORTAM = ["uretim", "hazirlik", "gelistirme"];
export const ETIKET_SINIRI = 10;                       // kaynak basina en cok etiket anahtari
export const KULLANILAN_ANAHTAR =
  ["sahip", "ortam", "hizmet", "surum", "gecici", "sorumlu", "maliyet-merkezi"];

// tur adi, aylik br alt-ust, paylasilan mi (birden cok ekip kullanir)
export const TUR = [
  ["kiralanmis makine", 18, 96, false], ["blok depo", 4, 34, false],
  ["nesne deposu", 6, 52, false], ["islev", 1, 12, false],
  ["kenar dugumu", 3, 21, false], ["ag gecidi", 12, 40, true],
  ["ortak veri yolu", 20, 64, true], ["izleme toplayici", 9, 30, true],
];

// olusturma yolu: ad, pay, sahip etiketi olma olasiligi, etiketin dogru yazilma olasiligi
export const YOL = [
  ["sablon", 0.40, 1.00, 1.00], ["otomatik olcekleme", 0.26, 0.71, 0.94],
  ["elle", 0.22, 0.55, 0.78], ["eski gecis", 0.12, 0.08, 0.60],
];

const sec = (tablo, u) => { let a = 0; for (const s of tablo) { a += s[1]; if (u < a) return s; }
  return tablo[tablo.length - 1]; };

// yanlis yazim bicimleri: kapsam raporunda etiket gorunur, ekip listesinde karsiligi yok
const VARYANT = [(e) => e.toUpperCase(), (e) => e.replace(/-/g, ""), (e) => e + "-ekibi"];

export const envanter = () => {
  let s = TOHUM >>> 0;
  const r = () => { s = (Math.imul(s, 1664525) + 1013904223) >>> 0; return s / 4294967296; };
  const liste = [];
  for (let i = 0; i < ADET; i++) {
    const [tad, alt, ust, pay] = TUR[Math.floor(r() * TUR.length)];
    const [yad, , pVar, pDogru] = sec(YOL, r());
    const ortam = ORTAM[Math.floor(r() * ORTAM.length)];
    const br = Math.round((alt + r() * (ust - alt)) * 10) / 10;
    const ekip = EKIP[Math.floor(r() * EKIP.length)];
    let sahip = null, gecerli = false;
    if (pay) { sahip = "paylasilan"; gecerli = true; }
    else if (r() < pVar) {
      if (r() < pDogru) { sahip = ekip; gecerli = true; }
      else sahip = VARYANT[Math.floor(r() * VARYANT.length)](ekip);
    }
    const gun = 1 + Math.floor(r() * 34);               // etiketin tamamlandigi gun; >30 hic
    const acil = yad === "elle" && r() < 0.18;          // acil onarim isi
    liste.push({ id: i, tur: tad, paylasilan: pay, yol: yad, ortam, br, sahip, gecerli,
      duzeltmeGunu: sahip && gecerli ? 0 : gun, acil });
  }
  return liste;
};

export const topla = (v) => v.reduce((a, b) => a + b, 0);
export const brToplam = (v) => topla(v.map((k) => k.br));
// maliyet/dagit.mjs — etiket kapsami, maliyetin ekiplere dagitimi (uc kural), etiket
// zorunlulugunun reddettigi kaynaklar ve etiketin geriye islememesi. Sayilar envanter
// modelinden turer; olculen sey etiketin dogrulugu degil, *dagitimin tutmadigi yerdir*.
import { envanter, EKIP, TUR, YOL, ETIKET_SINIRI, KULLANILAN_ANAHTAR, TOHUM,
  topla, brToplam } from "./envanter.mjs";

const yaz = (g, ...s) => console.log(s.map((v, i) =>
  (g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i]))).join(""));
const t0 = process.hrtime.bigint();

const K = envanter(), T = brToplam(K), pay = (x) => `%${(100 * x / T).toFixed(1)}`;
console.log(`tohum ${TOHUM}: ${K.length} kaynak, aylik ${T.toFixed(1)} br (kurgu para birimi)`);

console.log("\n1. etiket kapsami: olusturma yoluna gore");
const A = [-20, 8, 10, 10, 10, 11, 9];
yaz(A, "olusturma yolu", "kaynak", "etiketli", "gecerli", "gecersiz", "etiketsiz", "br payi");
for (const [ad] of YOL) {
  const g = K.filter((k) => k.yol === ad), e = g.filter((k) => k.sahip);
  yaz(A, ad, g.length, e.length, g.filter((k) => k.gecerli).length,
    e.filter((k) => !k.gecerli).length, g.filter((k) => !k.sahip).length,
    pay(brToplam(g)));
}
const etiketli = K.filter((k) => k.sahip), gecerli = K.filter((k) => k.gecerli);
const gecersiz = K.filter((k) => k.sahip && !k.gecerli), bos = K.filter((k) => !k.sahip);
yaz(A, "toplam", K.length, etiketli.length, gecerli.length, gecersiz.length, bos.length, "%100");
console.log(`  gorunen kapsam %${(100 * etiketli.length / K.length).toFixed(1)}, ` +
  `gecerli kapsam %${(100 * gecerli.length / K.length).toFixed(1)}`);
console.log(`  gecersiz etiket ${gecersiz.length} kaynak ${brToplam(gecersiz).toFixed(1)} br ` +
  `(${pay(brToplam(gecersiz))}): kapsam raporunda etiketli gorunur`);
console.log(`  etiket anahtari siniri ${ETIKET_SINIRI}, kullanilan ` +
  `${KULLANILAN_ANAHTAR.length}, kalan ${ETIKET_SINIRI - KULLANILAN_ANAHTAR.length}`);

console.log("\n2. dagitim: dogrudan atanan, paylasilan, atanamayan");
const dogrudan = K.filter((k) => k.gecerli && k.sahip !== "paylasilan");
const paylasilan = K.filter((k) => k.sahip === "paylasilan");
const atanamayan = K.filter((k) => !k.gecerli);
const D = brToplam(dogrudan), P = brToplam(paylasilan), X = brToplam(atanamayan);
const B = [-14, 9, 11, 9];
yaz(B, "kume", "kaynak", "aylik br", "pay");
yaz(B, "dogrudan", dogrudan.length, D.toFixed(1), pay(D));
yaz(B, "paylasilan", paylasilan.length, P.toFixed(1), pay(P));
yaz(B, "atanamayan", atanamayan.length, X.toFixed(1), pay(X));
const ekipBr = EKIP.map((e) => brToplam(dogrudan.filter((k) => k.sahip === e)));
const ekipAdet = EKIP.map((e) => dogrudan.filter((k) => k.sahip === e).length);
const oran = (v) => { const t = topla(v); return v.map((x) => x / t); };
const KURAL = { esit: EKIP.map(() => 1 / EKIP.length), maliyet: oran(ekipBr),
  "kaynak sayisi": oran(ekipAdet) };
console.log(`  paylasilan ${P.toFixed(1)} br bir kurala gore bolusur;`);
console.log(`  atanamayan ${X.toFixed(1)} br (${pay(X)}) hicbir kurala girmez`);

console.log("\n3. uc bolusturme kurali: ayni ekibin faturasi kurala gore ne kadar oynuyor");
const C = [-14, ...EKIP.map(() => 13)];
yaz(C, "kural", ...EKIP);
const sonuc = {};
for (const [ad, p] of Object.entries(KURAL))
  sonuc[ad] = EKIP.map((_, i) => ekipBr[i] + P * p[i]);
yaz(C, "dogrudan", ...ekipBr.map((x) => x.toFixed(1)));
for (const [ad, v] of Object.entries(sonuc)) yaz(C, ad, ...v.map((x) => x.toFixed(1)));
const oynama = EKIP.map((_, i) => {
  const v = Object.values(sonuc).map((s) => s[i]);
  return [Math.min(...v), Math.max(...v)];
});
yaz(C, "en genis fark", ...oynama.map(([a, b]) => (b - a).toFixed(1)));
yaz(C, "faturaya gore", ...oynama.map(([a, b]) => `%${(100 * (b - a) / a).toFixed(1)}`));
const en = oynama.map(([a, b]) => (b - a) / a);
const i0 = en.indexOf(Math.max(...en));
console.log(`  karsilastirilacak bir gercek pay yok: olculen sapma degil, kurala gore oynama`);
console.log(`  en cok oynayan ${EKIP[i0]}: %${(100 * en[i0]).toFixed(1)}; ` +
  `atanamayan ${pay(X)} her uc kuralda da faturada yok`);

console.log("\n4. etiket zorunlulugu: kac kaynak reddedilir, kaci mesru is");
const red = K.filter((k) => !k.gecerli);
const E = [-20, 9, 11, 12, 11];
yaz(E, "olusturma yolu", "reddedilen", "aylik br", "mesru is", "duran br");
let mesruAdet = 0, mesruBr = 0;
for (const [ad] of YOL) {
  const g = red.filter((k) => k.yol === ad);
  const m = g.filter((k) => k.yol === "otomatik olcekleme" || k.acil);
  mesruAdet += m.length; mesruBr += brToplam(m);
  yaz(E, ad, g.length, brToplam(g).toFixed(1), m.length, brToplam(m).toFixed(1));
}
yaz(E, "toplam", red.length, brToplam(red).toFixed(1), mesruAdet, mesruBr.toFixed(1));
console.log(`  ${red.length} kaynak reddedilir (%${(100 * red.length / K.length).toFixed(1)}); ` +
  `bunun ${mesruAdet} tanesi kapasite ya da acil onarim isidir`);
console.log(`  zorunluluk atanamayan ${pay(X)} payi sifirlar, karsiliginda ` +
  `${mesruBr.toFixed(1)} br degerinde ${mesruAdet} is durur`);

console.log("\n5. etiket sonradan eklenince: gecmis fatura duzelmiyor");
const GUN = 30, KILOMETRE = [1, 5, 10, 15, 20, 25, 30];
const F = [6, 14, 9, 16, 16];
yaz(F, "gun", "etiketlenmis", "kapsam", "atanan br/gun", "birikmis kayip");
const gunlukKayip = (g) => brToplam(K.filter((k) => !k.gecerli && k.duzeltmeGunu > g)) / GUN;
let birikim = 0;
for (let g = 1; g <= GUN; g++) {
  birikim += gunlukKayip(g);
  if (!KILOMETRE.includes(g)) continue;
  const kapali = K.filter((k) => k.gecerli || k.duzeltmeGunu <= g);
  yaz(F, g, kapali.length, `%${(100 * kapali.length / K.length).toFixed(1)}`,
    (brToplam(kapali) / GUN).toFixed(2), birikim.toFixed(1));
}
const hic = K.filter((k) => !k.gecerli && k.duzeltmeGunu > GUN);
console.log(`  ay sonu kapsami %${(100 * (K.length - hic.length) / K.length).toFixed(1)}, ` +
  `ama ayin atanamayan payi ${birikim.toFixed(1)} br (%${(100 * birikim / T).toFixed(1)})`);
console.log(`  ${hic.length} kaynak hic etiketlenmez: ${brToplam(hic).toFixed(1)} br/ay ` +
  `her ay yeniden atanamaz`);

const ms = Number(process.hrtime.bigint() - t0) / 1e6;   // ham olcum basilmaz, bant denetlenir
console.log(`\nbes tablo 2000 ms bandinda: ${ms < 2000 ? "evet" : "hayir"}`);
tohum 6108: 148 kaynak, aylik 4214.3 br (kurgu para birimi)

1. etiket kapsami: olusturma yoluna gore
olusturma yolu        kaynak  etiketli   gecerli  gecersiz  etiketsiz  br payi
sablon                    58        58        58         0          0    %40.8
otomatik olcekleme        40        31        29         2          9    %30.6
elle                      27        16        14         2         11    %14.5
eski gecis                23        10        10         0         13    %14.1
toplam                   148       115       111         4         33     %100
  gorunen kapsam %77.7, gecerli kapsam %75.0
  gecersiz etiket 4 kaynak 123.6 br (%2.9): kapsam raporunda etiketli gorunur
  etiket anahtari siniri 10, kullanilan 7, kalan 3

2. dagitim: dogrudan atanan, paylasilan, atanamayan
kume             kaynak   aylik br      pay
dogrudan             58     1572.2    %37.3
paylasilan           53     1584.9    %37.6
atanamayan           37     1057.2    %25.1
  paylasilan 1584.9 br bir kurala gore bolusur;
  atanamayan 1057.2 br (%25.1) hicbir kurala girmez

3. uc bolusturme kurali: ayni ekibin faturasi kurala gore ne kadar oynuyor
kural           sayac-okuma    dogrulama   faturalama         saha    raporlama
dogrudan              286.6        250.3        267.8        309.8        457.7
esit                  603.6        567.3        584.8        626.8        774.7
maliyet               575.5        502.6        537.8        622.1        919.1
kaynak sayisi         641.8        550.9        568.4        555.7        840.3
en genis fark          66.3         64.7         47.0         71.0        144.4
faturaya gore         %11.5        %12.9         %8.7        %12.8        %18.6
  karsilastirilacak bir gercek pay yok: olculen sapma degil, kurala gore oynama
  en cok oynayan raporlama: %18.6; atanamayan %25.1 her uc kuralda da faturada yok

4. etiket zorunlulugu: kac kaynak reddedilir, kaci mesru is
olusturma yolu      reddedilen   aylik br    mesru is   duran br
sablon                      0        0.0           0        0.0
otomatik olcekleme         11      444.3          11      444.3
elle                       13      222.8           3       67.6
eski gecis                 13      390.1           0        0.0
toplam                     37     1057.2          14      511.9
  37 kaynak reddedilir (%25.0); bunun 14 tanesi kapasite ya da acil onarim isidir
  zorunluluk atanamayan %25.1 payi sifirlar, karsiliginda 511.9 br degerinde 14 is durur

5. etiket sonradan eklenince: gecmis fatura duzelmiyor
   gun  etiketlenmis   kapsam   atanan br/gun  birikmis kayip
     1           112    %75.7          106.85            33.6
     5           115    %77.7          108.90           161.3
    10           119    %80.4          112.15           306.2
    15           123    %83.1          115.44           434.3
    20           133    %89.9          129.34           513.4
    25           139    %93.9          136.04           552.4
    30           142    %95.9          137.50           568.6
  ay sonu kapsami %95.9, ama ayin atanamayan payi 568.6 br (%13.5)
  6 kaynak hic etiketlenmez: 89.3 br/ay her ay yeniden atanamaz

bes tablo 2000 ms bandinda: evet

Sayılar ölçüm sınıfındadır; girdileri yukarıdaki varsayımlardır.

Kapsam Tek Sayı Değil

Birinci tablo etiket kapsamını oluşturma yoluna göre ayırır ve iki farklı sayı üretir. Görünen kapsam %77,7: 148 kaynağın 115’inde bir sahip etiketi vardır. Geçerli kapsam %75,0: bunların dördünde etiket değeri hiçbir ekibe karşılık gelmez. Dört kaynak, 123,6 birim, faturanın %2,9’u — kapsam raporunda sorunsuz görünür ve dağıtımda kaybolur.

Kapsamın nereden geldiği yolun kendisinde yazılıdır. Şablondan oluşan 58 kaynağın tamamı doğru etiketlidir; etiketi yazan insan değil, şablondur. Eski geçişten gelen 23 kaynağın 13’ünde hiç etiket yoktur, elle oluşturulan 27 kaynakta hem eksik etiket (11) hem yanlış yazım (2) görülür. Otomatik ölçeklemeden gelen 40 kaynağın dokuzunda etiket yoktur: kaynağı devralmayan ölçekleme etiketi de devralmaz.

Sınır da sayılır: kaynak başına on etiket anahtarı takılabilir, ağ yedi kullanır, kalan üçtür; yeni bir ayrım eklemek bu üç yuvadan birini harcar.

Üç Kural, Üç Farklı Fatura

İkinci tablo dağıtımı üçe böler: doğrudan atanan 1.572,2 birim (%37,3), paylaşılan 1.584,9 birim (%37,6) ve atanamayan 1.057,2 birim (%25,1). Atanamayan pay bir bölüştürme sorunu değildir; girdi eksiktir ve hiçbir kural onu kabul etmez.

Üçüncü tablo paylaşılanı üç kuralla böler: eşit pay, doğrudan atanan maliyet oranı ve kaynak sayısı oranı. Üçü de yalnız etiketten okunur. M22/K08’den farklı olarak burada bir gerçek pay yoktur; ölçülen şey sapma değil, aynı ekibin faturasının kurala göre oynamasıdır.

Raporlama en çok oynayandır: eşit payda 774,7, kaynak sayısında 840,3, maliyet oranında 919,1 birim — 144,4 birimlik fark, faturasının %18,6’sı. Faturalama en az oynar (%8,7). Ekip kendi kaynaklarında hiçbir şey değiştirmeden, yalnız merkezde bir kural değiştiği için faturasını altıda bir oynamış görebilir. Atanamayan %25,1 ise üç kuralda da görünmez; ekiplerin toplamı toplam faturayı vermez.

Zorunluluğun Durdurduğu İş

Dördüncü tablo bariz çözümü uygular: geçerli sahip etiketi olmayan kaynağın oluşturulmasına izin verilmez. Zorunluluk atanamayan %25,1’i sıfırlar, çünkü o kaynaklar hiç var olmaz.

Bedeli aynı tabloda durur. 37 kaynak reddedilir ve bunların 14’ü meşru iştir: otomatik ölçeklemenin açtığı 11 kaynak kapasite, elle açılanların üçü acil onarım işidir. Duran iş 511,9 birimdir. Otomatik ölçeklemede reddedilenlerin tamamı meşrudur — kural en çok, kimsenin klavye başında olmadığı yerde ısırır. Eski geçişten gelen 13 red (390,1 birim) hiçbir meşru işi durdurmaz: o kaynaklar zaten vardır ve zorunluluk yalnız yenilerine işler.

Etiket Geriye İşlemiyor

Beşinci tablo etiketleri ay içinde tamamlar. Kapsam 1. günde %75,7’den 30. günde %95,9’a çıkar; envanter raporu ay sonunda neredeyse temizdir. Ayın faturası temiz değildir: birikmiş atanamayan tutar 568,6 birim, ayın %13,5’i.

Nedeni tek cümledir: fatura satırları gün gün kesilir ve kesilen satırın etiket alanı bir daha değişmez. 20. günde etiketlenen kaynağın ilk on dokuz günü atanamaz kalır. Kapsam anlık, fatura süreklidir; ikisini aynı rapora koymak düzelmiş bir ay görüntüsü üretir. Altı kaynak hiç etiketlenmez: 89,3 birim her ay yeniden atanamaz.

Özet

  • 148 kaynaklı kurgu envanterde görünen kapsam %77,7, geçerli kapsam %75,0’tir; aradaki dört kaynak (123,6 birim, %2,9) raporda etiketli görünür ve dağıtımda kaybolur. Kapsam oluşturma yoluna bağlıdır: şablondan gelen 58 kaynağın tamamı doğru etiketli, eski geçişten gelen 23 kaynağın 13’ü etiketsizdir.
  • Aylık 4.214,3 birimin %37,3’ü doğrudan atanır, %37,6’sı paylaşılandır ve %25,1’i hiçbir kurala girmez; ekiplerin toplamı toplam faturayı vermez.
  • Paylaşılan pay üç kuralla bölüştürüldüğünde aynı ekibin faturası %8,7 ile %18,6 arasında oynar; raporlamanın faturası 774,7 ile 919,1 birim arasında, 144,4 birimlik bir bantta durur.
  • Etiket zorunluluğu atanamayan payı sıfırlar ama 37 kaynağı reddeder; bunun 14’ü meşru iştir ve 511,9 birimlik iş durur. Otomatik ölçeklemenin 11 reddinin tamamı kapasite işidir.
  • Etiketler ay sonunda %95,9 kapsama çıksa bile o ayın 568,6 birimi (%13,5) atanamaz kalır: kapsam anlık, fatura süreklidir.

Sonraki Adım

Kalemler ayrıldı ve bir sahiplik denemesi yapıldı; ikisi de faturanın geldikten sonra okunmasıdır. Sıradaki ders soruyu zaman eksenine taşır: bir harcama eğrisi üzerinde iki uyarı türü koşturulur, fark etme günü sayılır ve faturanın gecikmeli gelmesi bir kısıt olarak tabloya girer — uyarı geldiğinde harcamanın ne kadarı çoktan yapılmış olur.

İlerlemeni kaydetmek ve not almak için Giriş yap

Notlarım

Not almak için giriş yapmalısın.

Aramak için yazmaya başlayın.

↑↓ Esc gezin · aç · kapat