Rentiva v4.35.0 — Bayi Rapor & İtiraz Sistemi
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ğlam | Ne zaman | Tetikleme | Çözümleme yan etkisi |
|---|---|---|---|
booking | Müş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 |
vehicle | Durdurulmuş/çekilmiş araç işlemine itiraz | Listings sayfasında "İtiraz Et" (sadece paused/withdrawn durumlarda) | Yok — admin yönlendirmesi |
vehicle_action | Çekme/durdurma sırasında sebep yakalama | Bayi Çek veya Durdur tıkladığında modal otomatik açılır | Reddet → ertelenmiş ceza uygulanır; çöz → bayi puanı korunur |
penalty | Halihazırda uygulanmış cezaya itiraz | Puan 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 link | Yok |
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.
- Rejected —
VendorReportService::apply_deferred_penalty()çağrısıReliabilityScoreCalculator::update()'i tetikler (geri çekilme zaten state'te olduğu için puan düşer) vePenaltyRecorder::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ı:
src/Admin/Penalty/dizini — yok; penalty kodusrc/Admin/Vehicle/'da.PenaltyService::cancel()/apply_pending()— böyle bir sınıf yok. Tasarımdan çıkarıldı; servis katmanıReliabilityScoreCalculatorvePenaltyRecorder'ı doğrudan çağırıyor.mhm_rentiva_before_apply_penaltyfiltresi — yoktu. Bu sürümle tanıtıldı.penalty_record_idBIGINT — penaltyler anonim UUID'li ledger satırları. SchemaVARCHAR(64) context_id'e değişti.- Puan düşüşü hook ile askıya alınabilir — aslında herhangi bir hook ateşlenmeden önce senkron. Filtre, puan güncellemesini inline sarmalı.
- Migration dosyası
0042_create_vendor_reports.php— sequential numaralama konvansiyonu yok.VendorReportsMigrationolarak yeniden adlandırıldı,CURRENT_VERSIONbump sonrasıDatabaseMigrator::run_migrations()'a kaydedildi. - "Sorun Bildir" butonu vendor-bookings.php'ye eklenmeli — v4.26.5'ten beri mevcut. Build sıralaması basitleştirildi.
- "Report Issue" string'i .po'ya eklenmeli — zaten çevrili. Liste kısaltıldı.
- 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:
reasonPOST 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'yedefine('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).
