From symbai-core
Adaugă produse noi sau importă un meniu întreg — complet și corect, tip de produs, TVA, unități, rețete, taguri de rutare, alergeni, categorii. Folosește la „adaugă produsul X la N lei", „pune Y în meniu", „fă o rețetă pentru Z", „importă meniul de pe site/PDF/Excel", „introdu produsele", „pune-le pe categorii", „taguri pentru imprimante/KDS".
How this skill is triggered — by the user, by Claude, or both
Slash command
/symbai-core:adauga-produs-retetaThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Citește întâi `knowledge/produse-meniu-retete.md` (termenii: produs ≠ articol de meniu ≠ rețetă) și secțiunea „⚠ De știut la scrieri prin MCP" din `knowledge/tools-mcp.md`.
Citește întâi knowledge/produse-meniu-retete.md (termenii: produs ≠ articol de meniu ≠ rețetă) și secțiunea „⚠ De știut la scrieri prin MCP" din knowledge/tools-mcp.md.
Două moduri de lucru:
Regula de bază peste tot: nu inventa NIMIC — nici prețuri, nici gramaje, nici alergeni. Ce lipsește se întreabă sau se lasă gol.
https://smart-menu-...firebasedatabase.app/restaurant-menus/{slug}.json → categorii → produse, cu name/price/description/weight/allergens/imageUrl per produs). Dacă nu găsești API-ul, cere userului un export sau screenshot-uri — nu ghici conținutul./menu/import-pdf (extrage produse + prețuri + poze + design) și /ai-bulk-import (Excel cu mapare AI) fac importul direct în aplicație.list_brands + list_locations + list_menus — brandul și meniul țintă. Dacă creezi meniu nou cu create_menu: se naște draft — activează-l cu update_menu(status: "active").list_product_types(brandId) — tipurile de produs REALE ale clientului (poate avea tipuri custom; folosește-le pe ale lui).list_tag_summary + list_tags — vezi ce taguri există și câte produse are fiecare (ex. „BAR" 115 produse, „BUCATARIE" 113). Tagurile existente au deja reguli de rutare către imprimante/KDS — refolosește-le întocmai (același nume, nu variante noi). Cu SQL read activ, verifică ce taguri au rute: SELECT t.name, r.printer_id, r.screen_ids FROM tag_routing_rules r JOIN tags t ON t.id=r.tag_id WHERE r.active.list_menu_categories(brandId) — structura categoriilor (e ierarhică).search_products_db pe 2-3 băuturi cheie (ex. „vodka", „cola") + get_warehouse_products_summary pe gestiunea barului — vezi dacă clientul ține băuturile ca marfă la bucată sau ca materie primă la litru cu rețete de porționare (40 ml). Introdu produsele noi ÎN ACELAȘI stil.search_products_db pe fiecare nume nou înainte de creare. create_product face dedupe doar pe nume EXACT — „Coca Cola" vs „Coca-Cola" creează dublură.Arborele de decizie (confirmat de clasificatorul oficial Symbai):
| Clientul vinde… | Tip | Unitate | Rețetă |
|---|---|---|---|
| Băutură îmbuteliată/doză, țigări, snacks, vândute ca atare | merchandise (marfă) | buc | NU — consum direct 1:1 din stoc |
| Shot/pahar turnat din sticlă (Vodka 40ml, vin la pahar) | produsul vândut: merchandise, buc, CU rețetă | — | 0.04 l (sau 40 ml) din sticla-sursă |
| Sticla-sursă a porțiilor | raw_material (doar pt. porții/cocktailuri) sau merchandise (dacă se vinde și întreagă) | l (litri!) | NU; nu intră în meniu dacă nu se vinde întreagă |
| Cocktail, cafea, limonadă (≥2 ingrediente) | finished_good | buc/porție | DA |
| Preparat de bucătărie | finished_good | buc/porție | DA |
| Sos/semipreparat de casă refolosit în rețete | wip (semipreparat) | kg/l | DA |
| Ingredient cumpărat | raw_material | unitatea de achiziție (kg/l/buc) | NU |
| Meniu de eveniment la preț fix, fără rețetă cunoscută | masa_servita — NU e în enum-ul create_product; se setează din UI/tipuri | — | NU (cost ulterior prin fișă de consum) |
vat explicit la creare (default-ul e 21). Nu ești sigur → întreabă.finished_good fără rețetă E o problemă — nu scade stoc și rămâne necostat în P&L.Construiește tabelul complet ÎNAINTE de orice scriere și arată-l userului: nume | tip | UM | TVA | categorie | preț | tag rutare | rețetă (da/nu) | gramaj | descriere | poză. Confirmă numărul de produse. Abia după aprobare scrii.
bulk_create_products cu type + unit + vat + warehouseId), apoi produsele vândute.create_product / create_menu / add_menu_item / create_tag / create_allergen întorc entitatea EXISTENTĂ dacă numele/perechea există — parametrii tăi NU se aplică pe ea. Citește răspunsul, nu doar status-ul.description din create_product NU se salvează (limitare cunoscută a handler-ului) — descrierile merg la Faza 6 (manual).retete): create_recipe cu productId EXPLICIT mereu (fără el → match PARȚIAL pe nume sau auto-creează un produs nou greșit). add_recipe_ingredients cu productId, nu productName (typo la nume → auto-creează un raw_material dublură). Înainte de fiecare ingredient verifică products.unit al lui — cantitatea rețetei trebuie în aceeași familie de unități. yield gol = 1; „50 porții" = 50.add_menu_item(menuId, productId, price, name, sortOrder) — trimite MEREU și name (numele afișat): fără el item-ul se numește literal „Item". Prețul de vânzare se setează DOAR aici, niciodată pe produs.bulk_assign_tag cu entityIds sau filtre (categoryName face match pe subtree + fără diacritice). Tag NOU = bonuri pierdute: un tag creat de tine NU rutează nicăieri până nu există regula în aplicație — produsele lui generează bonuri „unrouted" care nu se printează și nu apar pe niciun ecran, FĂRĂ eroare. Dacă chiar e nevoie de tag nou: create_tag + spune-i userului EXPLICIT să creeze regula în Setări → Imprimante (rutare taguri) și verifică apoi.set_product_allergens(productId, allergenIds) — ⚠ ÎNLOCUIEȘTE tot setul, citește întâi ce are produsul. Dacă lista de alergeni e goală, cere userului să ruleze seed-ul UE din pagina Alergeni. Produsele cu rețetă moștenesc automat alergenii ingredientelor — setează manual doar ce nu vine din rețetă.auto_assign_vat_batch (cu onlyMissing) + verificare prin citire.set_initial_stock (creează document de ajustare + mișcări reale).auto_create_menu_from_products pe un tenant viu (bagă TOATE produsele nemeniuite cu preț 0 într-un meniu activ); la bulk_update_menu_item_prices dă MEREU brandId (altfel face match pe nume în tot sistemul); NU schimba warehouseId pe produse cu stoc „din curățenie" (declanșează transfer contabil automat).list_menu_items(menuId) — numărul și prețurile vs sursă.list_untagged_products — niciun produs nou fără tag de rutare.analyze_recipes(brandId) — rețete incomplete / ingrediente lipsă.analyze_food_costs sau generate_report(food_cost) — un cost absurd (150%+) = aproape sigur unitate greșită în rețetă.get_recipe_details pe 2-3 rețete noi — productId legat corect (list_recipes NU arată productId).Prin conexiune NU se pot seta azi: categoriile de meniu (nici creare, nici asignare pe item), descrierea, gramajul, pozele. Nu te chinui și nu promite — livrează userului pachetul de lucru manual:
/menu/pricing/bulk-photos) — drag & drop multe poze, AI le potrivește automat cu produsele. browse_brand_media îți arată ce poze există deja în biblioteca brandului.trimite_ticket_symbai (tip „sugestie", cu dedupeKey) — echipa Symbai le prioritizează pe baza ticketelor.receptionPrice la marfă = preț de raft (se completează automat din primul preț de meniu), NU cost — nu-l „repara" pentru food cost.npx claudepluginhub sinesteziadrimo/symbaimemory --plugin symbai-coreGuides creation, editing, and verification of skills for AI coding agents using test-driven development with subagent scenarios. Use when authoring or debugging skills.