feat: include calendar last modified timestamp

This commit is contained in:
2026-09-06 16:39:53 +03:00
parent 87cbab934b
commit b5548008b6
3 changed files with 7 additions and 1 deletions
+5
View File
@@ -1271,6 +1271,11 @@ Taslak türü seçicisine erişilebilir ad eklendi. Üretim derlemesi geçti. Ö
- Açıklamadaki “otomatik güncellenmez” ifadesi, kaynak sürümü ve resmi doğrulama gereğini belirten güncelleme yönlendirmesiyle değiştirildi. ICS’nin kendisi hâlâ resmi takvim servisine otomatik gönderim yapmaz. - Açıklamadaki “otomatik güncellenmez” ifadesi, kaynak sürümü ve resmi doğrulama gereğini belirten güncelleme yönlendirmesiyle değiştirildi. ICS’nin kendisi hâlâ resmi takvim servisine otomatik gönderim yapmaz.
- Regresyon testi UID sürekliliğini ve 3→4 sürüm artışını doğruluyor. 278 test ve build başarılı. Google/Outlook gerçek test takvimlerine aktarım henüz yapılmadı; genel plan açık. - Regresyon testi UID sürekliliğini ve 3→4 sürüm artışını doğruluyor. 278 test ve build başarılı. Google/Outlook gerçek test takvimlerine aktarım henüz yapılmadı; genel plan açık.
### 2026-09-06 — ICS son değişiklik zamanı
- ICS olayına `LAST-MODIFIED` alanı eklendi. `DTSTAMP`, `LAST-MODIFIED` ve `SEQUENCE` aynı kaynak üretim anı/sürümüyle birlikte yazılıyor; takvim istemcileri değişiklik zamanını ve sürüm ilerlemesini ayırt edebiliyor.
- Tarih değişimi ve UID sürekliliği testine son değişiklik zamanı kontrolü eklendi. 283 test ve build başarılı. Gerçek Google/Outlook senkronizasyonu hâlâ yapılmadı; genel plan açık.
### 2026-09-06 — Kayıtlı filtre formu ön doldurma ### 2026-09-06 — Kayıtlı filtre formu ön doldurma
- Kayıtlı filtre oluşturma formu artık mevcut anahtar kelime, kurum adı, İKN, şehir, bölge, alım türü, kurum tipi ve ilk sektör ölçütünü başlangıç değeri olarak gösteriyor. Kullanıcı aynı aramayı tekrar elle kurmadan ad verip kaydedebiliyor. - Kayıtlı filtre oluşturma formu artık mevcut anahtar kelime, kurum adı, İKN, şehir, bölge, alım türü, kurum tipi ve ilk sektör ölçütünü başlangıç değeri olarak gösteriyor. Kullanıcı aynı aramayı tekrar elle kurmadan ad verip kaydedebiliyor.
+1 -1
View File
@@ -32,7 +32,7 @@ export function createTenderICS(t, now = new Date()) {
const rawSequence=Number(t.icsSequence ?? t.documentVersion ?? 0); const rawSequence=Number(t.icsSequence ?? t.documentVersion ?? 0);
const sequence=Number.isSafeInteger(rawSequence)&&rawSequence>=0 ? rawSequence : 0; const sequence=Number.isSafeInteger(rawSequence)&&rawSequence>=0 ? rawSequence : 0;
return ['BEGIN:VCALENDAR','VERSION:2.0','PRODID:-//Ihaleist//Tender Calendar//TR','CALSCALE:GREGORIAN', return ['BEGIN:VCALENDAR','VERSION:2.0','PRODID:-//Ihaleist//Tender Calendar//TR','CALSCALE:GREGORIAN',
'BEGIN:VEVENT',`UID:${uid}@ihaleist.com`,`DTSTAMP:${stamp(now)}`, 'BEGIN:VEVENT',`UID:${uid}@ihaleist.com`,`DTSTAMP:${stamp(now)}`,`LAST-MODIFIED:${stamp(now)}`,
`SEQUENCE:${sequence}`,`DTSTART:${stamp(start)}`,'TRANSP:TRANSPARENT', `SEQUENCE:${sequence}`,`DTSTART:${stamp(start)}`,'TRANSP:TRANSPARENT',
`SUMMARY:${escapeICS('İhale son teklif: '+t.baslik)}`, `SUMMARY:${escapeICS('İhale son teklif: '+t.baslik)}`,
`DESCRIPTION:${escapeICS('İKN: '+t.ikn+' — '+t.kurum+'\nKaynak sürümünü ve ihale tarihini resmi kaynaktan doğrulayın; zeyilname veya tarih değişikliğinde aynı UID ve artan sürümle takvimi güncelleyin.')}`, `DESCRIPTION:${escapeICS('İKN: '+t.ikn+' — '+t.kurum+'\nKaynak sürümünü ve ihale tarihini resmi kaynaktan doğrulayın; zeyilname veya tarih değişikliğinde aynı UID ve artan sürümle takvimi güncelleyin.')}`,
+1
View File
@@ -64,6 +64,7 @@ test('ICS exposes a stable event version for calendar updates',()=>{
const first=createTenderICS({...t,documentVersion:3},new Date('2026-09-01T00:00:00Z')); const first=createTenderICS({...t,documentVersion:3},new Date('2026-09-01T00:00:00Z'));
const changed=createTenderICS({...t,tarih:'12.09.2026',saat:'14:30',documentVersion:4},new Date('2026-09-02T00:00:00Z')); const changed=createTenderICS({...t,tarih:'12.09.2026',saat:'14:30',documentVersion:4},new Date('2026-09-02T00:00:00Z'));
assert.match(first,/SEQUENCE:3/); assert.match(changed,/SEQUENCE:4/); assert.match(first,/SEQUENCE:3/); assert.match(changed,/SEQUENCE:4/);
assert.match(changed,/LAST-MODIFIED:20260902T000000Z/);
assert.equal(first.match(/UID:[^\r\n]+/)[0],changed.match(/UID:[^\r\n]+/)[0]); assert.equal(first.match(/UID:[^\r\n]+/)[0],changed.match(/UID:[^\r\n]+/)[0]);
assert.match(changed,/art%C4%B1?an|artan sürüm|artan/); assert.match(changed,/art%C4%B1?an|artan sürüm|artan/);
}); });