dimesum

Ana sayfa / Blog / Para

Para

Masrafı düzenlemek bölüşümü neden yeniden belirtmeli

· 7 dakika okuma ·

Bir düzenlemenin varsayılanları para hatası olduğundan Dimesum, eski bir düzenlemeyi birleştirmek yerine reddeden base_version ile birlikte participants ve split_type alanlarını her masraf düzenlemesinde zorunlu kılar

Bir yazım hatasını düzeltmek kimin borçlu olduğunu değiştirmemeli. Dimesum'da ortak bir masrafı düzenlemek bölüşümün tamamını yeniden belirtir. participants ve split_type her PATCH isteğinde zorunludur ve ikisinden birini atlayan bir düzenleme, varsayılan doldurmak yerine 400 döner. Oluşturma varsayılanları mevcut tüm üyeler ve eşit bölüşümdür; bir düzenlemede bunlar para hatasıdır.

İki hata durumu bunu somutlaştırır. Ağustos'ta katılan bir ev arkadaşı Temmuz'un yemeğine dahil edilir, çünkü "mevcut tüm üyeler" masraf yazıldığında değil düzenleme geldiğinde değerlendirilir. Bilinçli bir 70/30 kira bölüşümü 50/50'ye düzleşir, çünkü eksik bir split_type EQUAL anlamına gelir. Her iki hata da bir hata vermez ve ikisi de gerçek para taşır.

Duruş

Bir düzenlemenin varsayılanları para hatasıdır. Oluşturma zamanı varsayılanı, yazarın şu anda baktığı grup hakkında tahmin yürütür. Bir düzenleme daha sonra, değişmiş bir gruba karşı gelir ve aynı tahmin sessizce insanların borcunu yeniden yazar.

Oluşturma varsayılanları eski bir masrafı değil yeni bir masrafı tanımlar

Oluşturma zamanında varsayılanlar dürüsttür. Yazar gruba olduğu haliyle bakar ve herkes arasında eşit bölüşüm yaygın durumdur, bu yüzden Dimesum ikisini de doldurur. Masraf yalnızca sonuçlarını değil girdilerini saklar: splits.percent_bp, splits.weight ve splits.exact_minor kullanıcının yazdığını tutar, böylece sonraki bir düzenleme onu yeniden açabilir.

Bir düzenleme farklı bir eylemdir. Aynı masraf haftalar sonra, yeni bir ev arkadaşı katıldıktan ya da bir hayalet üye sahiplenildikten sonra düzeltilebilir. Üyelik hareketli bir hedeftir, bölüşüm değildir. Oluşturma varsayılanlarını yeniden kullanmak, eski masrafın zaten yanıtladığı bir soruyu bugünkü gruba sorar.

Aynı düzenlemenin iki sürümü: devralınan varsayılanlar her payı değiştirir, yeniden belirtilen bir bölüşüm ise yalnızca açıklamayı değiştirir DÜZENLEME OLUŞTURMA VARSAYILANLARINI DEVRALIR DÜZENLEME BÖLÜŞÜMÜ YENİDEN BELİRTİR Kira, 20.000 lira, Temmuz Kira, 20.000 lira, Temmuz v1 Asha %70, 14.000 Bhavna %30, 6.000 v1 Asha %70, 14.000 Bhavna %30, 6.000 Chetan Ağustos'ta eve katılır. Chetan Ağustos'ta eve katılır. PATCH yazım hatasını düzeltir, bölüşüm göndermez. PATCH yazım hatasını düzeltir, bölüşümü gönderir: participants: Asha, Bhavna split_type: PERCENT 7000 / 3000 v2 Asha 6.666,67 Bhavna 6.666,67 Chetan 6.666,66 v2 Asha %70, 14.000 Bhavna %30, 6.000 Chetan hiç yaşamadığı bir ay için borçlanır. Yalnızca açıklama değişti.
Aynı tek karakterlik düzenleme, iki kez. Oluşturma varsayılanlarını devralmak 20.000 lirayı üçe böler ve bir ay sonra katılan bir üyeyi borçlandırır; bölüşümü yeniden belirtmek her payı olduğu gibi bırakır.

Tahmin etmeyi reddetmek burada yeni değildir. Çok ödemeli bir masraf ödeyenlerini de yeniden belirtmelidir. soleStoredPayer saklanan ödeyeni yalnızca masrafın tam olarak bir ödeyeni olduğunda yeniden kullanır, böylece iki ödeyen hakkında sessiz kalan bir düzenleme yeniden atanmak yerine reddedilir. Ödeyenler hakkında hiçbir şey söylemeyen bir düzenleme, düzenlemeyi yapan kişiyi değil masrafın kendi ödeyenini korur.

API bölüşümünü yeniden belirtmeyen bir düzenlemeyi reddeder

Ağ geçidi denetimi herhangi bir para hesaplanmadan önce çalışır. participants boş olduğunda veya split_type boş olduğunda, istek invalid_expense koduyla ve "an edit must restate the split: participants and split_type are required" mesajıyla 400 döner. Masraf hizmeti kuralı validateAmend içinde yineler, böylece hizmete başka bir yoldan ulaşan bir çağıran aynı reddi karşılar.

POST ve PATCH /v1/groups/{id}/expenses üzerinde bir oluşturmanın gönderdiği ile bir düzenlemenin yeniden belirtmesi gerekenin karşılaştırması.
AlanOluşturmadaDüzenlemedeVarsayılanın bedeli ne olurdu
participantsİsteğe bağlı. Mevcut tüm üyelere varsayılanlanırZorunluSonradan katılan bir üye eski bir masrafa katılır
split_typeİsteğe bağlı. EQUAL'a varsayılanlanırZorunluBir 70/30 bölüşümü 50/50'ye düzleşir
payersİsteğe bağlı. Yazara varsayılanlanırAtlanması masrafın tek ödeyenini korur; iki ödeyen yeniden belirtilmelidirDüzenleyen ödeyen olur, kimin kime borçlu olduğunu tersine çevirir
base_versionGönderilmezZorunlu ve mevcut sürüme eşit olmalıEski bir düzenleme, yazarının hiç okumadığı bir değişikliğin üzerine yazar
revision_idİstemci UUIDv7, idempotency anahtarıAynı, sürüm başına bir taneYeniden denenen bir düzenleme gruba iki kez yükler
currencyMasraf başına belirtilirEşleşmeli; değişiklik reddedilirBir bakiye satırı üye başına tek para birimi tutar

Para birimi aynı ret ailesine aittir. Bir düzenleme bir masrafın para birimini değiştiremez, çünkü bir bakiye satırı üye başına tek para birimi tutar. Yazma tarafı değişikliği reddeder ve yalnızca ekleme yapılan defter böyle bir değişiklik ona ulaşırsa onu park eder. Kapıda reddetmek iki yarının uyuşmazlığa düşmesini önler.

Eski bir düzenleme yazarı için reddedilir, asla birleştirilmez

base_version sözleşmenin diğer yarısıdır. Her PATCH yazarının okuduğu sürümü taşır ve checkTransition onu işlemin az önce kilitlediği satırla karşılaştırır. Eşitse, düzenleme sürüm artı bir olarak uygulanır. Farklıysa, çağıran stale_version koduyla HTTP 409 alır.

Birleştirmek cazip alternatiftir ve yanlıştır. Bir masrafa yapılan iki düzenleme, faturanın ne anlama geldiğine dair iki eksiksiz ifadedir. Onları birleştirmek, kimsenin yazmadığı üçüncü bir ifade üretir ve payları hiçbir yazar tanımaz. Reddetme, çatışmayı çözebilecek tek kişiye geri verir.

İki yazar sürüm 3'ü okur; ilk düzenleme sürüm 4'ü yükler ve ikincisi 409 stale_version ile reddedilir masraf, sürüm 3 Yazar A PATCH base_version: 3 200 OK, sürüm 4 Yazar B PATCH base_version: 3 409 stale_version Defter, tek işlem: EXPENSE_REVERSAL of v3 EXPENSE v4 Yazar B sürüm 4'ü yeniden okur, değişikliği yeniden uygular, gönderir base_version: 4
Bir masrafta iyimser eşzamanlılık. Kaybeden düzenleme, üzerine yeniden kurulması gereken sürümle birlikte yazarına geri verilir. Kazanan düzenleme deftere bir güncelleme olarak değil, bir tersine çevirme artı bir yeniden yükleme olarak ulaşır.

İdempotency ve eşzamanlılık bilinçli olarak ayrı tutulur. Revizyon eklemesi sürüm denetiminden önce çalışır, çünkü yeniden denenen bir düzenleme başta okuduğu temel sürümü taşır ve bu artık eskimiştir. Bir yeniden oynatma çatışma olarak değil yeniden oynatma olarak okunmalıdır, bu yüzden önce revision_id yanıtlar ve saklanan sonucu döner.

Yanıt bir sonraki düzenlemenin ihtiyaç duyduğunu zaten taşır

Bir PATCH'te daha fazla alan istemek, ancak bir istemci onları ucuza alabiliyorsa adildir. Her masraf yanıtı version taşır, böylece bir masrafı az önce yazan bir istemci onu ikinci bir okuma olmadan düzenleyebilir. Oluşturma yanıtı, değişiklik yanıtı ve her liste satırı aynı alanı taşır.

Masrafı az önce yazmayan istemci için GET /v1/groups/{id}/expenses/{id} sürümü, hesaplanan payları ve onların arkasındaki girdileri döner. Girdiler bir PATCH'in kabul ettiği aynı adlar altında geri gelir: participants, split_type, percents, weights, shares, items, pools. Bir istemci tek bir biçim okur ve düzenlemelerle geri gönderir, tek bir fatura için iki sözcük dağarcığı arasında çeviri yapmak yerine.

GET yanıtı ve PATCH isteği aynı alan adlarını kullanır, version base_version olarak yeniden adlandırılır GET DÖNER PATCH KABUL EDER version base_version participants participants split_type split_type percents, weights, shares percents, weights, shares items, pools items, pools yeniden adlandırıldı
Tek sözcük dağarcığı, iki yön. Gidiş dönüşte yalnızca version alanı ad değiştirir, böylece bir düzenleme istemcisi okuduğu ile yazdığı arasında hiçbir çeviri katmanı tutmaz.

Bu bakışım en çok, yeniden kurulamayan bölüşümler için önemlidir. Bir PERCENT bölüşümü ya da kalem kalem bir fatura, yalnızca çözülmüş paylarından yeniden belirtilemez, çünkü yuvarlama zaten uygulanmıştır ve baz puanlar ile satır kalemleri gitmiştir. Revizyon anlık görüntüleri girdileri de taşır, böylece geçmiş sayfası herhangi bir geçmiş sürümde neyin kalemlendiğini gösterebilir.

Şimdi zorunlu, çünkü bir gereksinim sonradan eklenemez

Bir alanı ilk günden zorunlu kılmak, bugünle ilgili değil gelecekle ilgili bir karardır. Zorunlu bir alanı sonradan gevşetmek geriye dönük uyumludur: istemciler onu zaten gönderir ve sunucu onsuz gelen istekleri kabul etmeye başlar. Bir gereksinimi sonradan eklemek, eski varsayılana güvenen her istemciyi bozar.

Bu yüzden yön bir kez, erkenden seçilir. Dimesum, istemci sayısı hâlâ değiştirilebilecek kadar küçükken bir düzenlemede participants, split_type ve base_version'ı zorunlu kılar. Düzenlemeler için güvenli bir varsayılan bir gün bulunursa, alanlar isteğe bağlı olur ve halihazırda gönderilmiş hiçbir şey çalışmayı durdurmaz.

Bir düzenleme neyi ifade ettiğini yeniden belirtsin

Varsayılanlar, yazarın onayladığı grubu görebildiği oluşturmaya aittir. Bir düzenlemede aynı varsayılanlar, o zamandan beri değişmiş bir grup hakkında bir tahmindir. Sonraki adımınız: kendi okuma uç noktanızı açın ve yazma uç noktanızın kabul ettiği tam alan adları altında bölüşüm girdilerini geri verdiğini denetleyin. İkisi arasında çeviri yapmak zorunda olan bir istemci er ya da geç birini yanlış çevirir.

Sık sorulan sorular

Ortak bir masrafı düzenlemek neden participants ve split_type istiyor?

Dimesum her iki alanı da ister çünkü oluşturma varsayılanları bir düzenleme için yanlıştır. Oluşturmada Dimesum, yazarın baktığı grupla eşleşen mevcut her üyeye ve eşit bölüşüme varsayılanlanır. Bir düzenleme haftalar sonra, biri katıldıktan sonra gelebilir. O varsayılanları yeniden kullanmak yeni bir ev arkadaşını eski bir yemeğe çeker ve bilinçli bir 70/30 kira bölüşümünü hiçbir hata göstermeden 50/50'ye düzleştirir.

İki kişi aynı masrafı aynı anda düzenlerse ne olur?

İkinci düzenleme HTTP 409 ve stale_version hata koduyla reddedilir. Her PATCH, yazarının okuduğu sürümü base_version olarak taşır ve değişiklik yolu bunu kilitli satırla karşılaştırır. Bir uyumsuzluk masrafın hareket ettiği anlamına gelir, bu yüzden düzenleme yazarına şimdi görebildiği sürüme karşı yeniden uygulaması için geri döner. Hiçbir şey birleştirilmez.

Masrafı düzenlemek defter satırlarını yerinde günceller mi?

Hayır, Dimesum'da bir masrafı düzenlemek asla bir defter satırını güncellemez. Bir düzenleme tek işlemde iki kayıt yükler: eski sürümü bacak bacak sıfırlayan bir EXPENSE_REVERSAL ve ardından yeni sürüm için bir EXPENSE kaydı. UPDATE ve DELETE, defterin kendi veritabanı rolünden geri alınmıştır, böylece hatalı kod için bile bir değişiklik imkansızdır. Düzenlendi rozeti ve bir geçmiş sayfası görürsünüz.

Ortak bir masrafı düzenlemeden önce ikinci bir API çağrısı gerekir mi?

Hayır, masrafı az önce yazan bir istemci bir düzenlemenin ihtiyaç duyduğu sürümü zaten tutar. Her masraf yanıtı version taşır ve bir sonraki PATCH bunu base_version olarak gönderir. Masrafı yazmayan bir istemci GET /v1/groups/{id}/expenses/{id} çağırır ve bu, sürümü ve PATCH'in kabul ettiği aynı alan adları altındaki bölüşüm girdilerini döner.

participants ve split_type neden sonradan değil şimdi zorunlu?

Bir alanı ilk günden zorunlu kılmak geri alınabilir, sonradan eklemek ise değildir. Zorunlu bir alanı sonradan gevşetmek geriye dönük uyumludur: istemciler onu zaten gönderir ve sunucu onsuz istekleri kabul etmeye başlar. Bir gereksinimi sonradan eklemek eski varsayılana güvenen her istemciyi bozar ve bir para API'sinde bu bozulma, birinin bakiyesi yanlış olana kadar sessizdir.