Ana içeriğe geç

Rentiva v4.35.0 — Bayi Rapor & İtiraz Sistemi

· 5 dakikalık okuma
MaxHandMade
Maintainer

Bayi → admin yönlü raporlar için paylaşılan altyapı v4.35.0 ile geliyor. Beş bağlam, tek custom tablo, tek paylaşılan modal, tek admin "Bayi Raporları" sayfası. Ayrıca çekme/durdurma sebebi yakalama akışı: bayi araç çekerken sebebini açıklarsa, ceza admin incelemesine kadar askıya alınır — kabul ederse bayi puanını korur, reddederse ceza geriye dönük uygulanır.

Neden

v4.35.0 öncesi bayilerin admin'e yapılandırılmış geri dönüş yolu yoktu. Rezervasyon sorunları (no-show müşteri, hasar), otomatik ceza tetikleyen araç işlemleri, haksız bulduğu puan düşüşleri — hepsi e-posta veya Slack'e gidiyordu, platform dışında. Pazaryeri tek yönlü bir geri bildirim döngüsüne sahipti.

v4.35.0 döngüyü tek bir paylaşılan altyapı parçasıyla kapatıyor. Aynı modal, tablo ve admin sayfası beş bağlamı da yönetiyor. Sadece tetikleme noktası ve çözümleme yan etkileri değişiyor.

Beş bağlam

BağlamNe zamanTetiklemeÇözümleme yan etkisi
bookingMüşteri sorunu (no-show, hasar, anlaşmazlık)Bayi rezervasyon kartında "Sorun Bildir" (buton v4.26.5'ten beri var, JS şimdi bağlandı)Yok — bilgilendirme
vehicleDurdurulmuş/çekilmiş araç işlemine itirazListings sayfasında "İtiraz Et" (sadece paused/withdrawn durumlarda)Yok — admin yönlendirmesi
vehicle_actionÇekme/durdurma sırasında sebep yakalamaBayi Çek veya Durdur tıkladığında modal otomatik açılırReddet → ertelenmiş ceza uygulanır; çöz → bayi puanı korunur
penaltyHalihazırda uygulanmış cezaya itirazPuan geçmişindeki her ceza satırında "İtiraz" butonu(v4.36.0+ — ledger compensating entry helper)
general"Yöneticiye Yaz" — direkt admin hattıHer bayi panel sayfasının altbilgisinde linkYok

Not 2 augment — çekme sebebi yakalama

v4.35.0 öncesinde araç çekmek demek bir confirm() dialog ("Emin misiniz? Ceza uygulanabilir.") ve anında puan düşüşü + ledger debiti demekti. Aracın neden ayrılmak zorunda olduğunu platforma anlatmanın bir yolu yoktu.

Şimdi lifecycle JS sebebi düzgün bir modalda yakalıyor ve mhm_vehicle_lifecycle_withdraw AJAX çağrısının yanında POST ediyor. AJAX handler Manager'ı çağırmadan önce vehicle_action raporu oluşturuyor. Manager içinde yeni filtre — mhm_rentiva_before_apply_penalty — ateşleniyor:

$apply_penalty = (bool) apply_filters(
'mhm_rentiva_before_apply_penalty',
true,
$vehicle_id,
$vendor_id,
'withdrawal',
$penalty
);

if ($apply_penalty) {
ReliabilityScoreCalculator::update($vendor_id, 'withdraw', $vehicle_id);
}

Aynı filtre PenaltyRecorder::record_penalty()'ü de sarmalıyor, böylece ledger debiti puan ile aynı adımda kalıyor. PenaltySuspensionHook::maybe_suspend(), bayi + araç çifti için açık vehicle_action raporu varsa false döndürüyor.

Durum ve yan etkiler ayrıştırılmış: araç hâlâ withdrawn'a geçer (post status, lifecycle meta, cooldown tarihi — hepsi set edilir), ama puan ve ledger duraklar. Admin raporu çözümlediğinde:

  • Resolved (bayi kazandı) — no-op. Puan ve ledger hiç değişmedi. Bayi sıfır puan ve sıfır TL kaybetti.
  • RejectedVendorReportService::apply_deferred_penalty() çağrısı ReliabilityScoreCalculator::update()'i tetikler (geri çekilme zaten state'te olduğu için puan düşer) ve PenaltyRecorder::record_penalty()'ü yeniden çalıştırır (ledger debiti yazılır). Ceza geriye dönük uygulanır.

Tek paragrafta mimari

VendorReportRepository DB katmanı (yeni wp_mhm_rentiva_vendor_reports custom table'da CRUD; per-request has_open_report_for() cache'i sayesinde dual filter hook tek DB sorgusu maliyeti). VendorReportService iş katmanı (doğrulama, FSM, yan etkiler, e-posta için hook ateşleme). VendorReportAjaxHandler transport katmanı. PenaltySuspensionHook mevcut ceza hattıyla köprü. VendorReportsAdminPage admin UI. VendorReportAssets her bayi sayfasında paylaşılan modalı + JS'i enqueue ediyor. Birden fazla katmana dokunan tek şey filter hook — bu da kasıtlı: hook, vendor-report alt sistemi ile lifecycle alt sistemi arasındaki dikiş.

Plan-vs-codebase uzlaşması

Orijinal plan 2026-04-15'te yazıldı ve kod tabanı hakkında dokuz şey varsaydı; hepsi yanlış çıktı. Implementasyon öncesi kapsamlı audit hepsini yakaladı:

  1. src/Admin/Penalty/ dizini — yok; penalty kodu src/Admin/Vehicle/'da.
  2. PenaltyService::cancel() / apply_pending() — böyle bir sınıf yok. Tasarımdan çıkarıldı; servis katmanı ReliabilityScoreCalculator ve PenaltyRecorder'ı doğrudan çağırıyor.
  3. mhm_rentiva_before_apply_penalty filtresi — yoktu. Bu sürümle tanıtıldı.
  4. penalty_record_id BIGINT — penaltyler anonim UUID'li ledger satırları. Schema VARCHAR(64) context_id'e değişti.
  5. Puan düşüşü hook ile askıya alınabilir — aslında herhangi bir hook ateşlenmeden önce senkron. Filtre, puan güncellemesini inline sarmalı.
  6. Migration dosyası 0042_create_vendor_reports.php — sequential numaralama konvansiyonu yok. VendorReportsMigration olarak yeniden adlandırıldı, CURRENT_VERSION bump sonrası DatabaseMigrator::run_migrations()'a kaydedildi.
  7. "Sorun Bildir" butonu vendor-bookings.php'ye eklenmeli — v4.26.5'ten beri mevcut. Build sıralaması basitleştirildi.
  8. "Report Issue" string'i .po'ya eklenmeli — zaten çevrili. Liste kısaltıldı.
  9. Mode gate'ten bahsedilmiyor — Mode::canUseVendorMarketplace() tüm yeni admin sayfalarda, AJAX handler'larda, e-posta kayıtlarında ve asset enqueue'larda gerekli.

Implementasyon başlamadan önce kullanıcı açıkça "Vendor ile ilgili tüm dosyaları detaylı incele. Eksik, gözden kaçan bir şey olmasın" istedi. Bu dürtü bunları yüzeye çıkardı. Aylar önce yazılmış plan dosyaları otoriter değildir; kod tabanıdır.

Testler

  • PHPUnit: 840 → 864 (+24 — Repository 10, Service 8, PenaltySuspensionHook 6)
  • PHPCS: 0 hata
  • Runtime smoke test: admin "Bayi Raporları" sayfası render oluyor, tüm durum + bağlam filtreleri TR'de, boş durum doğru gösteriliyor, plugin aktive edildiğinde tam migration DatabaseMigrator üzerinden uygulandı.

Uyumluluk

  • Lisans-server güncellemesi yok.
  • Geriye uyumlu: reason POST parametresi olmadan gelen lifecycle AJAX gönderimleri v4.34.x ile birebir aynı davranıyor (rapor oluşmaz, normal ceza uygulanır). Eski bayiler bozulmaz.
  • Dev sitelerinin Pro gate'i aşması için wp-config.php'ye define('MHM_RENTIVA_DEV_PRO', true); eklemesi gerek.

Sırada ne var

Roadmap transfer dalgası ile devam ediyor: v4.36.0 bağlam-farkındalı eklentiler (mevcut vehicle_addon CPT'sine addon_context taxonomy genişletmesi), v4.37.0 transfer lokasyonları için harita görünümü. Sonra bayi dalgası başlıyor — bayi dizini sayfası (v4.38.0) ve uzun süredir ertelenen Phase 5 bayi profil sayfası (v4.39.0).

GitHub release