===== WooCommerce =====
* https://woocommerce.github.io/woocommerce-rest-api-docs
==== Termék adatok ====
* https://woocommerce.github.io/woocommerce-rest-api-docs/#product-properties
* Woo->eVIR mező megfeleltetések: (WP/Woo -> eVIR)
* Mezők: //(default woo-ban)//
* name -> megnevezes
* slug ->
* date_created(read-only) ->
* date_modified(read-only) ->
* type -> "simple" //(simple)//
* status -> "publish" //(publish)//
* catalog_visibility -> "visible" //(visible)//
* description -> termék tulajdonságból a leírás, valamint a többi terméktulajdonság is név:érték formában, HTML formázással, valamint a cikkszám is.
* short_description -> termék tulajdonságból csak a leírás
* sku -> cikkszam
* price (Read only) -> beállított árkategória szerinti ár
* regular_price -> beállított árkategória szerinti ár
* sale_price -> beállított árkategóriához tartozó akciós árkategória szerinti ár
* on_sale(read-only)-> webshop akcios
* virtual -> termék esetén false, szolgáltatás esetén true //(false)//
* tax_status -> "taxable" //(taxable)//
* manage_stock -> webshop beállítás szerint //(false)//
* stock_quantity -> webshop beállítás szerint
* stock_status -> webshop beállítás és készlet infó szerint //(instock)//
* sold_individually -> "true" //(false)//
* weight -> cikktörzsben a bruttó súly
* dimensions -> cikktörzsben:
* length -> hosszusag
* width -> szelesseg
* height -> magassag
* upsell_ids -> a kapcsolódó termékek
* cross_sell_ids -> a helyettesítő termékek
* categories -> cikktörzsből a kategória
* tags -> termék tulajdonság, címkék (még nincs evirben, de legyen létrehozva)
* images -> termék fő kép
* attributes -> termék tulajdonságok
==== Készlet ====
* eVIR: "Nem látszik a webshopban" (hidden)
* Nincs tennivaló, az ilyen terméket nem is szinkronizáljuk
* eVIR: "Végtelen mennyiség" (vegtelen)
* manage_stock -> "false"
* stock_status -> "instock"
* eVIR: "Rendelhető" (rendelheto)
* manage_stock -> "false"
* stock_status -> "instock"
* stock_quantity -> a raktáron levő mennyiség
* backorders -> "yes"
* eVIR: "Kifutó"(kifuto)
* manage_stock -> "true"
* stock_status -> "instock" ha van raktáron. Ha nincs, akkor a termék láthatóságát kell kikapcsolni
* stock_quantity -> a raktáron levő mennyiség
* backorders -> "no"
* eVIR: "Csak készleten levő" (Csak készleten)
* manage_stock -> "true"
* stock_status -> "instock" vagy "outofstock" attól függően, hogy van-e készleten
* stock_quantity -> a raktáron levő mennyiség
* backorders -> "no"
* eVIR: "Mennyiség mutatása" (rakt_menny)
* manage_stock -> "false"
* stock_status -> "instock" vagy "outofstock" készlettől függően
* stock_quantity -> a raktáron levő mennyiség
==== Termék tulajdonságok ====
* Woo mezők:
* name -> a tulajdonság neve
* visible -> "true"
* variation -> "false"
* options -> a tulajdonság értéke
==== Termék kategóriák ====
* Woo mezők:
* id -> kötelező mező kategória termékhez rendeléséhez.
* name -> a kategória neve. (Levágja a szóközöket, ha több jön egymás után)
* slug -> a kategória neve (nincs ékezet, szóközből '-' )
* parent -> a szülő kategória
* description -> a kategória neve
* display -> "default"
Kategóriák kapcsolótáblába rendezése:
* woocommerce_product_categories:
* cikk_kategoria_id -> evir oldali id
* product_category_id -> woocommerce oldali id
* Tervezve van hogy ha tobb webshop lesz, akkor ez bovul vagy lecserelesre kerul.
==== Termék képek ====
* Nem a WooCommerce, hanem a Wordpress mediatár tartalmazza a képeket. A feltöltéséhez wordpress felhasználó szükséges.
* https://developer.wordpress.com/docs/api/
* WP mezők:
* title -> a kép neve
* description -> a kép neve
* alt_text -> a kép neve
* Woo mezők:
* id ->
* date_created ->
* src -> WP URL
* name -> megegyezik a wp.title-vel -> a kép neve, ami a cikk megnevezése
* alt -> megegyezik a wp.alt_text-el -> a cikk megnevezése
* Ugyan ide ugyan ilyen módon kell feltölteni a termékhez rendelt dokumentumokat is, csak ott értelemszerűen nem képekről van szó
----
==== Rendelés ====
**Rendelés adatok**
* Mezők: (default woo-ban)
* id -> Webshop id
* parent_id
* number -> hivatkozás
* order_key
* created_via
* version
* status
* currency -> pénznem
* date_created
* date_created_gmt -> Rendelés dátuma (rend_datum)
* date_modified
* date_modified_gmt
* discount_total -> Teljes engedmény (bruttó)
* discount_tax
* shipping_total -> Teljes szállítási költség (bruttó)
* shipping_tax
* cart_tax
* total
* total_tax
* prices_include_tax
* customer_id
* customer_ip_address
* customer_user_agent
* customer_note
* billing -> Partner elsődleges címe (ld. lentebb)
* shipping -> Partner szállítási címe (ld. lentebb)
* payment_method -> Fizetési mód
* payment_method_title
* transaction_id
* date_paid
* date_paid_gmt
* date_completed
* date_completed_gmt
* cart_hash
* meta_data:
* evir_rendeles -> Evir rendelés szám. Mi írjuk bele, rendelés sikeres letöltése után.
* //HuCommerce plugin esetén//:
* _billing_tax_number-> adószám.
* line_items
* tax_lines
* shipping_lines
* method_title->Szállítási költség megjegyzésbe rakjuk.
* fee_lines -> Extra költségek. Az extra költségnek beállított cikszámot rárakjuk a rendelésre
* total-> szolgáltatás.netto
* name-> szolgáltatás.megjegyés
* coupon_lines
* refunds
* set_paid
====Partner adatok rendelésen====
=== Billing, elsődleges cím ===
* Személy:
* first_name -> Keresztnév
* last_name -> Vezetéknév
* Cég:
* company -> Cégnév
* address_1 -> cím első sora
* address_2 -> cím második sora
* city -> Város
* state
* postcode -> Irányítószám
* country -> országkód
* email -> emailcím, csak egy van (regisztrációs adat)
* phone -> telefonszám
*HuCommerce plugin megléte esetén:
* order
* metadata
* _billing_tax_number -> adoszám
**Megjegyzés:**
- Ha van cégnév, akkor a vezeték és keresztnevet nem vesszük figyelembe, és cégként rögzítjük a partnert.
- A cím sorait egymás után fűzzük szóközzel. Max 60 karakter, ha több vágunk.
- Ha van HuCommerce plugin felrakva, ami ad adószám mezőt a címhez, akkor elsőször az alapján próbáljuk meg beazonosítani a partnert.
- Utána, vagy ha nincs adoszám mező, akkor email-cím alapján keressük meg a partnert.
- Ha nincs, akkor rögzítünk egy új partnert.
=== Shipping, szállítási cím ===
* Személy:
* first_name -> Keresztnév
* last_name -> Vezetéknév
* Cég:
* company -> Cégnév
* address_1 -> cím első sora
* address_2 -> cím második sora
* city -> Város
* state
* postcode -> Irányítószám
* country -> országkód
**Megjegyzés:**
- Csak akkor foglalkozunk a 'shipping address'-el, ha ki lett töltve rendeléskor.
- Megpróbáljuk beazonosítani a szállítási címet a partnerhez.
- Ha nincs akkor létrehozzuk, mint szállítási cím.
- Használjuk a rendeléshez, mint szállítási címként.
----
==== Adatoknak a kategorizálása ====
Az adatokat kategóriákba lehet sorolni:
* alapadatok:
* ez a cikkszám, megnevezés, áfa, tipus
* készletkezelés
* kezelés módja (manage_stock és kapcsolódó mezők)
* ár mezők:
* price mezők, on_vale
* kategória
* cikk kategóriák és a hierarchiája
* tulajdonságok
* Ami a cikk tulajdonságok, ide értendőek a descriptionok is
* A cikk egyebb adatai, ami nem alapadat, mint meret, suly, stb.
* milyen elsődleges (és majd további másodlagos) termékkategóriákba van besorolva,
* képek
* dokumentumok
Minden egyes kategóriának kell lennie:
* feltöltés
* szinkronizálás
műveleteknek, amelyeket a felületről el kell tudni érni, valamint biztosítani kell az időzített futtathatóságot. Ez egyelőre cron-ból hívott tokenes lekérés lesz, de a jövőben változik.
==== Szinkronizálás ====
A szinkronizálás célja az utolsó szinkronizálás óta változott adatok **gyors** felküldése a shopba. Ezek a műveletek akár pár percenként is lefuthatnak, ezért kritikus a leggyorsabb futásra és a legkevesebb erőforrás használatra való optimalizálás. Amennyiben a szinkronizáció nem végzett a termékekkel 1 percen belül, úgy háttérben folytatja a műveletet.
* alapadatok és árak esetében a cikk modify_date-je alapján lehet
* készlet esetén az eVIR belső auditja alapján érintett termékeknél
Előfordulhat, hogy mondjuk napi időzítéssel (de külön-külön) mehetnek a képek és dokumentumok, cikk kategóriák szinkronizálása is. Ebben az esetben nem lesz gyors, mivel csak összehasonlítás alapon lehet megcsinálni, azaz le kell tölteni a teljes listát Woo-ból, összehasonlítani az eVIR-ben levővel, és csak a változásokat feltölteni.
==== Feltöltés ====
A feltöltés célja kettős:
* A rendszer indulásakor feltölteni az eVIR-ből a webshopba az adatokat
* Az üzemeltetés során bármikor "alaphelyzetbe" hozni az adatokat, azaz a webshopban történt elállítgatásokat helyrehozni, visszaállítani abba az állapotba, amiről az eVIR tud. Feltöltés esetén NEM vizsgálunk semmit, nem függ semmitől semmi, egyszerűen fel kell tölteni az adatokat a webshopba. Ha szükséges az ütközés miatt, akkor lehet előtte törölni, vagy bármit csinálni, de akkor is feltétel nélkül az eVIR-ben levő állapotra kell beállnia minden mező minden értékének. Ez a művelet jellemzően egyszer vagy nagyon ritkán (hetente, havonta?) fog lefutni. Nem az a lényeg, hogy mennyi idő alatt fut le, hanem hogy lefusson és erről visszajelzés érkezzen.
A feltöltést jelenleg a cikkek esetében a módosítási dátum legkorábbira állítása, és egy szinkronizáció futtatásával érjük el.
==== Egyedi szinkronizálás ====
Az egyedi szinkronizálás esetében a felhasználó maga rakja össze, hogy mely adatok kerüljenek szinkronizálásra a webshopba. Ez jelenleg a cikkekre van megírva.
A ''Szinkronizálások/Szinkron beállítás'' menüpontban a''Hozzáad'' gomb megnyomásával lehet új egyedi szinrkonizálást létrehozni. A cikkhez tartozó szinkronizálható mezők fel vannak sorolva, mindegyikhez egy legördülő tartozik. Két féle mező fajta van:
* Igen/Nem: Vagyis szinkronizálni akarom a mezőt vagy sem.
* Az adott mezőhöz egy termék tulajdonság rendelhető hozzá, mely ha be van állítva a cikkhez, akkor az nem mint tulajdonság, hanem a kiválasztott mezőhöz kerül feltöltésre.
**FONTOS**:
* Ha egy tulajdonság mezőként be van állítva egy szinkronizálásban, akkor az a tulajdonság nem kerül Woocommerce attribute-ként feltöltésre semelyik másik esetben sem.
* Ha van új cikk, amely még nem szerepel a webshopban, akkor az feltöltésre kerül. A név ebben az esetben mindenképp feltöltésre kerül, bármi is legyen beállítva az egyedi szinkronizálásban.
Ezeket a szinkronizálásokat ugyan itt lehet futtatni a ''Szinkronizálások/Szinkron beállítás'' menüpont alatt, ahol az összes egyedi szinkronizálás megtalálható és látható mikor volt utoljára futtatva (note: //Ez itt téves infó. Nem az látható mikor volt utoljára futtatva, noha azt is látni kéne, hanem azt, hogy meddig jutott el a szinkron, a termék módosítási ideje)//. A ''Szinkronizálás'' gombbal az összes utolsó szinkronizálási időpont után modósult terméket szinkronizálja, míg az ''Összes termék szinkronizálása'' gomb megnyomásával beállítja ezt az időpontot a legkorábbira, és az összes cikket szinkronizálja.
\\ A ''Szerkesztés'' gombbal módosítani tudjuk a szinkronizálandó mezőket.
A ''Cikk alapértelmezett szinkronizálás'' menüpont a [[evir:rendszer:beallitasok:woocommerce|Woocommerce beállítások]]-ban beállított egyedi szinkronizálást fogja lefuttatni, a fentiek alapján leírt módon.
----
==== Több WooCommerce shop támogatása ====
Távlati terv lett volna, de akkor hozzuk előre: több webshop (benne akár több woocommerce) támogatása. Ez azt jelenti, hogy multiplicitást kell adni azoknak a mezőknek, amelyek shoponként különbözőek lehetnek:
* webshop beállítás
* webshop akciós
* webshop árkategória
* webshop raktár
* webshoponként a termék kategóriák beállítása
* webshoponként az alapadatok (URL, user, pass, stb.)
A jelenlegi beállítások akár madahatnak is a helyükön és azok dedikáltan az eVIR saját webshopjára vonatkozzanak, és ezek az extrák legyenek külön feltüntetve, külön állítgathatóan.
----
==== Összes termékkategória törlése ====
DELETE a,c FROM wp_terms AS a
LEFT JOIN wp_term_taxonomy AS c ON a.term_id = c.term_id
LEFT JOIN wp_term_relationships AS b ON b.term_taxonomy_id = c.term_taxonomy_id
WHERE c.taxonomy = 'product_cat'
==== Összes termék törlése mindenestül ====
DELETE relations.*, taxes.*, terms.*
FROM wp_term_relationships AS relations
INNER JOIN wp_term_taxonomy AS taxes
ON relations.term_taxonomy_id=taxes.term_taxonomy_id
INNER JOIN wp_terms AS terms
ON taxes.term_id=terms.term_id
WHERE object_id IN (SELECT ID FROM wp_posts WHERE post_type='product');
DELETE FROM wp_postmeta WHERE post_id IN (SELECT ID FROM wp_posts WHERE post_type = 'product');
DELETE FROM wp_posts WHERE post_type = 'product';