# Wenglor Ürün Kazıma ve Excel Üretme Yönergesi

## Amaç

Wenglor ürünlerini, teknik özelliklerini ve kategori bağımsız tamamlayıcı ürün ilişkilerini tek bir Excel dosyasında üret.

Bir ürünün tamamlayıcı ürünü başka bir kategoride olabilir. Bu nedenle tamamlayıcı ürünleri ana ürünün içine gömülü basit aksesuar metni olarak kaydetme. Her tamamlayıcı ürünü ayrı bir ürün satırı olarak kazı ve ürünler arasındaki bağlantıyı `RELATED_PRODUCTS_JSON` alanında tut.

## Tarama stratejisi

1. Başlangıç kategori ve ürün adreslerini bir kuyruğa ekle.
2. Her ürün sayfasını yalnızca bir kez işle.
3. Ürün kodunu birincil benzersiz anahtar olarak kullan.
4. Ürün sayfasındaki tüm tamamlayıcı ürün sekmelerini aç/incele:
   - Yedek parçalar
   - Montaj teknolojisi
   - Bağlantı teknolojisi
   - Yazılım
   - Tamamlayıcı ürünler
5. Her sekmedeki bütün sayfaları/pagination sonuçlarını işle; yalnızca ilk görünen kartları alma.
6. Bulunan her tamamlayıcı ürün adresini tarama kuyruğuna ekle. Hedef ürün başka kategoride olsa da kazı.
7. Aynı ürünü ürün kodu veya canonical URL ile tekilleştir.
8. Bir ilişkiyi ters yönde tahmin etme. Yalnızca kaynak sayfada açıkça gösterilen yönü kaydet.
9. Tüm ürünler tamamlandıktan sonra Excel'i üret. Böylece ilişki verilen hedef ürünler de workbook içinde ayrı satır olur.
10. Siteyi zorlamamak için istekler arasında makul gecikme, sınırlı eşzamanlılık ve retry/backoff kullan.

## Excel kolonları

Her ürün satırında mevcut kolonları koru:

```text
LINK
BRAND
TYPE
SERIES
NAME
NAME_SUBTITLE
DESCRIPTION
HIGHLIGHT
CATEGORY
DOCUMENTS
IMAGE
TECH_DATA_JSON
ACCESSORY_JSON
RELATED_PRODUCTS_JSON
CAD_LINKS
```

`NAME`, üreticinin ürün kodu olmalıdır. Örnek: `MLAS112`, `BFF-SET-39`, `ZNNC002`.

`ACCESSORY_JSON` eski, bağımsız ürün olmayan aksesuar verileri için korunabilir. Ürün sayfasına sahip olan tamamlayıcı öğeleri burada tutma; `RELATED_PRODUCTS_JSON` kullan.

## Teknik özellik formatı

`TECH_DATA_JSON` yalnızca geçerli JSON dizisi olmalıdır:

```json
[
  {
    "Parameter": "Dimensions",
    "Value": ["46x35 mm"]
  },
  {
    "Parameter": "Operating Voltage",
    "Value": ["18 V", "24 V", "30 V"]
  }
]
```

Kurallar:

- Alan adı `Parameter` olmalı.
- Değer alanı tekil `Value` olmalı.
- `Value` her zaman string dizisi olmalı.
- Teknik veri yoksa `[]` yaz.
- Açıklama, Markdown kod bloğu, `NaN`, `undefined`, yorum veya sondaki virgül ekleme.

## Tamamlayıcı ürün ilişki formatı

`RELATED_PRODUCTS_JSON` yalnızca geçerli JSON dizisi olmalıdır:

```json
[
  {
    "Group": "mounting-technology",
    "GroupLabel": "Montaj teknolojisi",
    "ProductCode": "BFF-SET-39",
    "ProductUrl": "https://www.wenglor.com/tr/.../p/BFF-SET-39",
    "Order": 0
  },
  {
    "Group": "software",
    "GroupLabel": "Yazılım",
    "ProductCode": "DNNF022",
    "ProductUrl": "https://www.wenglor.com/tr/.../p/DNNF022",
    "Order": 1
  }
]
```

Bilinen grup eşlemeleri:

| Wenglor sekmesi | Group | GroupLabel |
|---|---|---|
| Yedek parçalar | `spare-parts` | `Yedek parçalar` |
| Montaj teknolojisi | `mounting-technology` | `Montaj teknolojisi` |
| Bağlantı teknolojisi | `connection-technology` | `Bağlantı teknolojisi` |
| Yazılım | `software` | `Yazılım` |
| Tamamlayıcı ürünler | `complementary-products` | `Tamamlayıcı ürünler` |

Kurallar:

- `ProductCode` zorunludur ve hedef ürünün gerçek üretici kodudur.
- `ProductUrl` mümkünse canonical ürün adresidir.
- `Order`, ürünün ilgili sekmede görünen sırasıdır ve sıfırdan başlar.
- Aynı kaynak ürün, grup ve hedef ürün kombinasyonunu tekrar yazma.
- İlişki yoksa `[]` yaz.
- Kategori bilgisini ilişki nesnesine koyma. Hedef ürün kendi Excel satırında kendi `CATEGORY` değerini taşır.
- Hedef ürün farklı kategorideyse kategori yolunu değiştirme veya ana ürünün kategorisine taşıma.

## Örnek: MLAS112

MLAS112 sayfasında `ZNNC002` açıkça tamamlayıcı ürün olarak veriliyorsa ilişki şöyle yazılır:

```json
[
  {
    "Group": "complementary-products",
    "GroupLabel": "Tamamlayıcı ürünler",
    "ProductCode": "ZNNC002",
    "ProductUrl": "HEDEF_URUNUN_CANONICAL_URL_ADRESI",
    "Order": 0
  }
]
```

`ZNNC002` ayrıca workbook içinde kendi `NAME`, `CATEGORY`, `IMAGE`, `TECH_DATA_JSON` ve diğer alanlarıyla bağımsız bir ürün satırı olmalıdır.

## Teslim öncesi otomatik doğrulamalar

1. Her `TECH_DATA_JSON`, `JSON.parse` ile hatasız açılmalı.
2. Her `RELATED_PRODUCTS_JSON`, `JSON.parse` ile hatasız açılmalı.
3. Her ilişkinin `ProductCode`, `Group`, `GroupLabel`, `ProductUrl` ve sayısal `Order` alanı bulunmalı.
4. İlişkili her `ProductCode` için workbook içinde mümkünse bir `NAME` satırı bulunmalı.
5. Eksik hedef ürünler ayrı hata raporunda URL ve hata nedeniyle listelenmeli.
6. Ürün kodları büyük/küçük harf farkı gözetmeden tekil olmalı.
7. Aynı ürün farklı kategorilerden keşfedilse bile tek ürün satırı üretilmeli.
8. Hücrelere Python/JavaScript nesnesi görünümü değil, standart çift tırnaklı JSON yazılmalı.
9. Boş JSON alanları boş hücre değil `[]` olmalı.
10. Excel ile birlikte şu özeti üret:
    - Toplam ürün sayısı
    - Toplam ilişki sayısı
    - Grup başına ilişki sayısı
    - Kazılamayan ürün sayısı ve URL listesi
    - JSON doğrulama hata sayısı
