WebBlocks Appointments

Gereksinimleri

Belgelenmiş paket sürümü: 0.12.2. WebBlocks CMS ^1.73.0; PHP >=8.3.

A WebBlocks CMS, ziyaretçileri üçüncü taraf bir planlama hizmetine bağlamak yerine bir sitenin kendi etki alanında rezervasyon almasına olanak tanıyan eklenti.

Kurulumu

Yapıyı oluşturun ve ardından normal ZIP yükleme akışını kullanarak CMS yöneticisindeki System → Plugins aracılığıyla yükleyin.

composer plugin:build

Yapı ve onun SHA-256'sı, build/ altındadır. Eklenti kurulumu devre dışı; eklentiyi inceledikten sonra eklenti detay ekranından açıkça etkinleştirin.

Sözleşmeleri

Eklentinin sahip olduğu her şey, CMS eklenti paketi kuralı kurallarına göre tanıtıcısına göre ad alanına sahiptir:

handle              webblocks-appointments
settings namespace  webblocks_appointments
database prefix     webblocks_appointments_
admin routes        /webadmin/plugins/webblocks-appointments
public routes       /plugins/webblocks-appointments
route names         webblocks.plugins.webblocks_appointments.*
permissions         webblocks-appointments.view, .manage, .settings

Rezervasyon formu

ARandevu Formu bloğunu bir sayfaya ekleyin. Bir hizmetin veya günün seçilmesi, tam sayfayı yeniden yüklemeden uygun saatleri getirir. JavaScript devre dışı bırakıldığında, sunucu tarafından oluşturulan GET formu kullanılabilir durumda kalır. Her rezervasyon, müsaitlik durumunu yeniden kontrol eden sunucuya gönderilir.

Başlık, giriş ve gönderim etiketi, blok yerleşimine göre çevrilebilir. Yalnızca bloğun kopyası blok başınadır. Hizmetler, personel ve açılış saatleri site genelindedir, çünkü bunların blok başına kopyalanması, iki rezervasyon sayfasının açılış saatleri konusunda sessizce anlaşmazlığa düşmesine neden olur.

İşaretlemede görünmediğinden bilmeye değer iki koruma:

  • Gönderilen slotlar yeniden türetilir, güvenilmez. Rezervasyonu yapan kişi anlaşmazlıkları uygular ancak neyin teklif edilmesi gerektiğine karar veren kuralları uygulamaz (açılış saatleri, teslim süresi, ufuk). Yeniden kontrol olmadan, hazırlanmış bir gönderi kapalı bir Pazar günü saat 03:00'e rezervasyon yapabilir, çünkü bununla ilgili hiçbir şey mevcut bir randevuyla çakışmaz.
  • source_url yalnızca aynı site yolu olarak kabul edilir. Mutlak bir URL, formu açık bir yönlendirme haline getirir.

Bildirimler

Bir rezervasyon gerçekleştiğinde, işletme bir duyuru alır ve ziyaretçi randevuyu .ics eki olarak taşıyan bir onay alır; bu da randevuyu hesap olmadan, OAuth olmadan ve harici hizmet olmadan kendi takvimine yerleştirir. İş kopyası müşteriyi yanıtlanacak kişi olarak ayarlar, böylece bir rezervasyon yanıtlanarak yanıtlanabilir; Ziyaretçiyi oraya yerleştirmek SPF'yi başarısız kıldığından, Kimden adresi yapılandırılmış gönderen olarak kalır.

Bilinmeye değer üç kural:

  • Bildirim rezervasyon tamamlandıktan sonra gerçekleşir, asla işlem içinde olmaz.Fırlayan bir atış, ziyaretçiye kendisine ait olduğu söylenen bir slotu geri almamalıdır.
  • İki taraf bağımsız olarak denenir ve kaydedilir.Yanlış yazılan bir iş alıcısı, ziyaretçinin onayını engellememelidir ve birleştirilmiş bir durum, yönetici ekranının tam olarak bir operatörün dürüst olması için ihtiyaç duyduğu durumda olmasını sağlayacaktır.
  • sentnakliyenin onu kabul ettiği anlamına gelir, geldiği anlamına gelmez.log,arrayVenullpostacılar şu şekilde rapor edilir:yapılandırılmamışgönderildiği gibi değil, çünkü bunların gönderildiğini bildirmek operatörün göremediği bir yalandır.

Saklanan arıza ayrıntıları temizlendi: bağlantı dizeleri ve etiketli sırlar düzeltildi ve operatörlere görüntülendiğinden ve bir ham SMTP istisnası rutin olarak kimlik bilgilerini taşıdığından mesaj kapatıldı.

İş alıcısı, eklenti ayarından, ardından sitenin iletişim adresinden ve ardından yapılandırılan gönderenden çözüm üretir.

Hatırlatıcılar

Hatırlatıcılar bir kuyrukla değil, Artisan komutuyla gönderilir — CMS çekirdeği sıraya alınmış işler göndermez ve kuyruk bağımlılığının getirilmesi, bu eklentinin hiçbir işi olmayan temel bir karardır. Ana bilgisayarın cron'una ekleyin:

php artisan webblocks-appointments:dispatch-reminders

Her birkaç dakikada bir uygundur. Her randevu tam olarak bir kez değerlendirilir: sonuç ne olursa olsun kaydedilir, böylece vadesi geçmiş bir ödeme olmadığında bir çalıştırmanın hiçbir maliyeti olmaz ve her onay işaretinde ulaşılamayan bir adres yeniden denenmez. --dry-run nelerin çıkacağını bildirir. Potansiyel müşteri site başınadır ve sıfır anahtarları hatırlatmaları kapalıdır.

Ziyaretçi iptali

Onay ve hatırlatma e-postalarında iptal bağlantısı bulunur. Hesap yok ve oturum açma yok; randevunun cancel_token'si, genel kullanıcı sistemi olmayan bir CMS'de uygulanabilir tek tasarım olan kimlik bilgisidir.

Bunun güvenli ve dürüst olmasını sağlayan üç kural vardır:

  • GET yalnızca bir onay sayfası gösterir; DELETE iptal eder. E-posta istemcileri, bağlantı tarayıcıları ve kurumsal güvenlik sistemleri e-postadaki bağlantıları kullanıcı isteği olmadan açabilir. GET ile iptal etmek, rezervasyonların spam filtreleri tarafından iptal edilmesine yol açardı.
  • Bilinmeyen bir belirteç ile bulunamayan bir randevu aynı görünür. Bunları ayırt etmek, belirteç tahminlerinin doğruluğunu sınamayı mümkün kılardı.
  • Başlamış bir randevu burada iptal edilemez. Buna izin vermek, gelinmemiş bir randevuyu sonradan iptal edilmiş gibi kaydetmek olurdu.

Ziyaretçi iptal ettiğinde işletmeye bilgi verilir ve cancelled_by bu kişinin operatör değil ziyaretçi olduğunu kaydeder. Bu bildirim başarısız olursa ziyaretçi bunu asla görmez; iptal işlemi zaten gerçekleştirilmiştir ve sonuç, operatör için hâlâ kaydedilmektedir.

Zaman ve doğruluk

Randevu anları UTC'de saklanır. Açılış saatleri ve bunların tarihli istisnaları, yerel duvar saati olarak saklanır, çünkü "09:00'da açıyoruz", yaz saati uygulaması geçişinin her iki tarafında da 09:00 anlamına gelmelidir. Sitenin saati Site::resolvedTimezone()'den geliyor, asla config('app.timezone')'den gelmiyor.

Slot oluşturucu, yerel duvar saati saatine göre hareket eder, böylece slotlar ziyaretçinin beklediği işaretlere ulaşır. Bunu iki geçiş durumu takip ediyor ve her ikisi de kasıtlı:

  • İleri yay. Boşluk içindeki duvar saati süreleri mevcut değildir ve sunulmamaktadır.
  • Geriye düşme. Tekrarlanan saatte duvar saati süreleri iki kez mevcuttur; jeneratör daha önceki anı seçer. PHP'nin kendi varsayılanı daha sonraki olanıdır; dolayısıyla bu, devralınan davranış yerine açık bir seçimdir.

Çift ayırma üç şekilde önlenir: Kilitleme çakışması okumasına sahip bir işlem (gerçek koruma ve arabellekleri ve farklı süreleri anlayan tek kişi), iptal edilen bir yuvanın yeniden rezerve edilmesine hala izin veren bir veritabanı geri durdurma işlevi gören benzersiz bir (resource_id, slot_lock) dizini ve ortaya çıkan bütünlük ihlalinin, bir yanıt yerine kullanılamayan bir yuva yanıtına çevrilmesi. 500.

Operatör ekranları

Appointments, durum değişiklikleri ve manuel girişle birlikte sitenin kendi saatinde her seferinde bir günü gösterir. Services, Staff & Rooms ve Opening Hours nelerin ne zaman rezerve edilebileceğini tanımlar. Appointment settings rezervasyon kurallarını içerir ve bunlar site başına — tek kurulumda iki sitenin teslim süresi veya onay modu konusunda anlaşması gerekmez.

A hizmeti veya kaynağı silinmek yerine devre dışı bırakılır, böylece geçmiş rezervasyonlar geçmişlerini korur ve buna karşı yeni rezervasyon yapılamaz. Manuel giriş, genel formla aynı rezervasyon cihazından geçer, bu nedenle çift rezervasyon yapamaz; ancak, çalışma saatleri dışında rezervasyon yapan bir operatörün bir kuraldan kaçmak değil, bir karar vermesi nedeniyle, müsaitlik yeniden kontrolünü kasıtlı olarak atlar.

API ve durum kontrolleri

Taşıyıcı belirteç API'si, /webadmin/api/plugins/webblocks-appointments kapsamında hizmetleri, personeli ve odaları, haftalık kullanılabilirliği, tarihli istisnaları, ayarları ve salt okunur randevuları gösterir. CMS API keşfi ve OpenAPI şeması aracılığıyla etkinleştirilmiş uç noktaları ve gerekli yetenekleri keşfedin.

Plugin Health, veritabanı kurulumunu, aktif hizmetleri ve kaynakları, hizmet atamalarını, açılış saatlerini, bildirim alıcılarını, giden posta ve hatırlatma planlamasını kontrol eder.