׳¡׳™׳‘׳•׳‘ 98 ׳₪׳•׳×׳— ׳׳× ׳”׳¦׳“ ׳”׳©׳ ׳™ ׳©׳ ׳©׳¨׳©׳¨׳× ׳”׳”׳¡׳₪׳§׳” ג€” ׳ ׳™׳”׳•׳ ׳¡׳₪׳§׳™׳ ׳׳׳ + ׳™׳•׳׳ ׳”׳–׳׳ ׳•׳× ׳¨׳›׳©. ׳ ׳•׳¡׳₪׳• 14 ׳¡׳₪׳§׳™׳ ׳׳׳™׳×׳™׳™׳ ׳‘-5 ׳§׳˜׳’׳•׳¨׳™׳•׳× (׳׳–׳•׳, ׳׳©׳§׳׳•׳×, ׳¦׳™׳•׳“, ׳©׳™׳¨׳•׳×, ׳׳—׳¨) ג€” ׳™׳¨׳§׳•׳× ׳”׳’׳׳™׳, ׳‘׳§׳¨ ׳•׳¢׳•׳£ ׳׳¨׳›׳–׳™, ׳“׳’׳™ ׳”׳™׳ ׳”׳×׳™׳›׳•׳, ׳™׳§׳‘׳™ ׳׳׳•׳ ׳™, ׳‘׳™׳’ ׳‘׳™׳™׳ ׳¡, ׳’׳–-׳˜׳§ ׳•׳¢׳•׳“ ג€” ׳׳›׳ ׳׳—׳“ ׳׳™׳© ׳§׳©׳¨, ׳˜׳׳₪׳•׳, ׳“׳•׳׳´׳, ׳¢׳™׳¨, ׳—׳´׳₪, ׳×׳ ׳׳™ ׳×׳©׳׳•׳ (׳©׳•׳˜׳£+0/7/14/30/45/60), ׳–׳׳ ׳׳¡׳₪׳§׳”, ׳׳™׳ ׳™׳׳•׳ ׳”׳–׳׳ ׳”, ׳“׳™׳¨׳•׳’ ׳›׳•׳›׳‘׳™׳ ׳•׳”׳¢׳¨׳•׳×. ׳™׳•׳׳ ׳”׳”׳–׳׳ ׳•׳× ׳ ׳˜׳¢׳ ׳¢׳ ~52 ׳”׳–׳׳ ׳•׳× ׳–׳¨׳•׳¢׳•׳× ׳“׳˜׳¨׳׳™׳ ׳™׳¡׳˜׳™׳× ׳‘-60 ׳™׳׳™׳ ׳׳—׳¨׳•׳ ׳™׳, ׳‘׳׳¨׳‘׳¢׳” ׳¡׳˜׳˜׳•׳¡׳™׳ (׳˜׳™׳•׳˜׳” / ׳ ׳©׳׳—׳” / ׳”׳×׳§׳‘׳ / ׳‘׳•׳˜׳׳”), ׳¢׳ ׳˜׳•׳₪׳¡ ׳™׳¦׳™׳¨׳” ׳“׳™׳ ׳׳™ ׳©׳׳—׳©׳‘ ׳¡׳-׳”׳›׳ ׳—׳™, ׳•׳›׳₪׳×׳•׳¨׳™ "׳¡׳׳ ׳”׳×׳§׳‘׳" / "׳‘׳˜׳" ׳™׳©׳™׳¨׳•׳× ׳׳”׳©׳•׳¨׳”. ׳”-KPI ׳”׳—׳“׳© "׳“׳™׳•׳§ ׳׳•׳¢׳“ ׳׳¡׳₪׳§׳”" ׳׳—׳©׳‘ ׳—׳™ ׳›׳׳” ׳”׳–׳׳ ׳•׳× ׳”׳’׳™׳¢׳• ׳‘׳–׳׳ ׳׳•׳ ׳‘׳׳™׳—׳•׳¨ (~82% ׳‘׳ ׳×׳•׳ ׳™ ׳”׳–׳¨׳¢), ׳•׳₪׳׳ ׳ "׳”׳•׳¦׳׳” ׳׳₪׳™ ׳¡׳₪׳§" ׳׳¦׳™׳’ ׳¢׳ ׳‘׳¨ ׳₪׳¨׳•׳₪׳•׳¨׳¦׳™׳•׳ ׳׳™ ׳׳× ׳”׳”׳•׳¦׳׳” ׳‘-60 ׳™׳׳™׳ ׳”׳׳—׳¨׳•׳ ׳™׳. ׳׳₪׳¡ ׳ ׳’׳™׳¢׳•׳× ׳‘-envelopes.php / auth.php / api.php / webhook_helper.php / inventory.json / shifts.json / employees.json.
data/suppliers.json (new ג€” empty stub; engine seeds 14 Israeli-bistro vendors across 5 categories on first load: ׳™׳¨׳§׳•׳× ׳”׳’׳׳™׳, ׳‘׳§׳¨ ׳•׳¢׳•׳£ ׳׳¨׳›׳–׳™, ׳“׳’׳™ ׳”׳™׳ ׳”׳×׳™׳›׳•׳, ׳׳׳₪׳™׳™׳× ׳”׳–׳™׳× ׳”׳¦׳₪׳•׳ ׳™, ׳’׳׳™׳“׳•׳× ׳•׳§׳™׳ ׳•׳—׳™׳ ׳‘׳ ׳¢׳׳™, ׳™׳§׳‘׳™ ׳׳׳•׳ ׳™, ׳‘׳¨׳™׳–׳” ׳‘׳™׳¨׳•׳×, ׳©׳×׳™׳” ׳§׳׳” ׳“׳¨׳•׳¨׳™, ׳‘׳™׳’ ׳‘׳™׳™׳ ׳¡, ׳׳™ ׳¢׳“׳, ׳ ׳™׳§׳™׳•׳ ׳₪׳׳•׳¡, ׳›׳׳™ ׳”׳’׳¢׳” ׳׳”׳™׳¨, ׳’׳–-׳˜׳§, ׳§׳™׳¨׳•׳¨ ׳”׳¦׳₪׳•׳ ג€” each with contact_person, phone, email, city, tax_id, payment_terms_days, lead_time_days, min_order_value, rating 1-5, active, notes)
data/purchase_orders.json (new ג€” empty stub; engine seeds ~52 deterministic POs across 60 days using mt_srand(20260518), realistic cadence per supplier (3d produce / 7d meat / 14d beer / 30d coffee / 45d refrigeration service), status distribution: 78% on-time received / 12% late 1-2 days / 8% cancelled, recent ones still 'sent')
core/suppliers.php (new ג€” ~900-line engine: 5 categories, 4 PO statuses with is_open flag, 6 payment-terms presets ׳©׳•׳˜׳£+0/7/14/30/45/60, 14-supplier seeder, 60-day deterministic PO seeder, atomic .tmpג†’rename writes to BOTH new JSON files, KPIs (active_suppliers, open_orders, received_30, cancelled_30, spend_30, spend_60, on_time_pct, on_time, late), 60-day spend-by-supplier aggregator, save_supplier / create_po / mark_received / cancel mutations, 5-star rating renderer, shared CSS block, plus two render functions)
suppliers.php (new ג€” admin-gated GET dispatcher + single POST action save_supplier; sanitizes name max 120, category whitelist, rating clamp 1-5, payment_terms clamp 0-120, lead_time clamp 0-60, notes mb_substr 600; writes only through engine; 303 See Other ג†’ GET back to itself)
purchase_orders.php (new ג€” admin-gated GET dispatcher + 3 POST actions: create_po validates supplier exists & ג‰¥1 valid line item with name+qty>0, computes total from line subtotals, auto-fills expected_delivery from supplier lead_time_days; mark_received sets status=received + actual_delivery=today; cancel sets status=cancelled. All writes through engine.)
finance_hub.php (edit ג€” added new section "׳¡׳₪׳§׳™׳ ׳•׳¨׳›׳© ג€” ׳׳™ ׳׳¡׳₪׳§, ׳׳×׳™ ׳•׳׳›׳׳”" with 2 cards (׳—׳“׳© badges) linking to suppliers.php and purchase_orders.php; sits below inventory section so the productionג†’procurement flow reads top-to-bottom)
layout.php (edit ג€” added page titles for suppliers + purchase_orders slugs in getPageTitle(); added both slugs to finance_hub nav active-state list so the bottom nav highlights correctly; bumped tooltip count from 15 to 17 ׳›׳׳™׳)
דוגמאות ופירוט
׳‘׳׳׳’׳¨ ׳”׳¡׳₪׳§׳™׳ ׳׳•׳—׳¦׳™׳ ׳¢׳ ׳›׳¨׳˜׳™׳¡ ׳™׳§׳‘׳™ ׳׳׳•׳ ׳™ ג€” ׳¨׳•׳׳™׳ ׳“׳™׳¨׳•׳’ 4.7 ׳›׳•׳›׳‘׳™׳, ׳׳™׳© ׳§׳©׳¨ ׳“׳ ׳” ׳׳׳•׳ ׳™, ׳©׳•׳˜׳£+30, ׳–׳׳ ׳׳¡׳₪׳§׳” 7 ׳™׳׳™׳, ׳׳™׳ ׳™׳׳•׳ 1200 ג‚×
׳׳•׳—׳¦׳™׳ "׳”׳–׳׳ ׳” ׳—׳“׳©׳”" ׳¢׳ ׳›׳¨׳˜׳™׳¡ ׳™׳¨׳§׳•׳× ׳”׳’׳׳™׳ ג€” ׳ ׳•׳—׳×׳™׳ ׳‘׳˜׳•׳₪׳¡ ׳™׳¦׳™׳¨׳× PO ׳¢׳ ׳”׳¡׳₪׳§ ׳›׳‘׳¨ ׳ ׳‘׳—׳¨, ׳׳•׳¡׳™׳₪׳™׳ ׳©׳•׳¨׳” "׳¢׳’׳‘׳ ׳™׳•׳× ׳©׳¨׳™" ׳›׳׳•׳× 3 ׳‘-40 ג‚×, ׳¨׳•׳׳™׳ ׳¡׳-׳”׳›׳ ׳׳×׳¢׳“׳›׳ ׳—׳™ ׳-120 ג‚×
׳‘׳׳©׳•׳ ׳™׳× "׳ ׳©׳׳—׳” ׳׳¡׳₪׳§" ׳™׳© 8 ׳”׳–׳׳ ׳•׳× ׳₪׳×׳•׳—׳•׳× ג€” ׳׳•׳—׳¦׳™׳ "׳¡׳׳ ׳”׳×׳§׳‘׳" ׳¢׳ ׳”׳–׳׳ ׳” po-0125 ׳•׳”׳™׳ ׳§׳•׳₪׳¦׳× ׳׳׳©׳•׳ ׳™׳× "׳”׳×׳§׳‘׳" ׳¢׳ ׳×׳׳¨׳™׳ ׳׳¡׳₪׳§׳” ׳‘׳₪׳•׳¢׳ ׳”׳™׳•׳
׳₪׳׳ ׳ "׳”׳•׳¦׳׳” ׳׳₪׳™ ׳¡׳₪׳§ 60 ׳™׳׳™׳" ׳׳¦׳™׳’ ׳‘׳¨׳׳© ׳׳× ׳‘׳¨׳™׳–׳” ׳‘׳™׳¨׳•׳× ׳¢׳ 4 ׳”׳–׳׳ ׳•׳× ׳•׳¡׳ 3,200 ג‚×, ׳™׳¨׳§׳•׳× ׳”׳’׳׳™׳ ׳©׳ ׳™ ׳¢׳ 16 ׳”׳–׳׳ ׳•׳× ׳•׳¡׳ 2,800 ג‚×
׳׳¡׳ ׳ ׳™׳ ׳׳× ׳”׳™׳•׳׳ ׳׳₪׳™ ׳¡׳₪׳§ "׳“׳’׳™ ׳”׳™׳ ׳”׳×׳™׳›׳•׳" ג€” ׳¨׳•׳׳™׳ 19 ׳”׳–׳׳ ׳•׳×, ׳›׳•׳׳ ׳‘׳§׳˜׳’׳•׳¨׳™׳” "׳׳–׳•׳ ׳˜׳¨׳™", ׳¨׳•׳‘׳ ׳”׳’׳™׳¢׳• ׳‘׳–׳׳ ׳¢׳ ׳×׳’ ׳™׳¨׳•׳§ "׳‘׳–׳׳"
׳׳•׳¡׳™׳₪׳™׳ ׳¡׳₪׳§ ׳—׳“׳© ׳“׳¨׳ ׳”׳˜׳•׳₪׳¡ ׳‘׳×׳—׳×׳™׳× ג€” ׳׳™׳׳•׳™ ׳©׳, ׳§׳˜׳’׳•׳¨׳™׳”, ׳׳™׳© ׳§׳©׳¨, ׳×׳ ׳׳™ ׳×׳©׳׳•׳ ׳©׳•׳˜׳£+45 ׳•׳“׳™׳¨׳•׳’ 4.5 ג€” ׳”׳¡׳₪׳§ ׳׳•׳₪׳™׳¢ ׳׳™׳“ ׳¢׳ ׳×׳’ "׳—׳“׳©" ׳‘׳§׳˜׳׳•׳’
Safety 24/25 ג€” ׳׳₪׳¡ ׳ ׳’׳™׳¢׳•׳× ׳‘׳§׳‘׳¦׳™׳ ׳׳¡׳•׳¨׳™׳, atomic .tmpג†’rename, ׳•׳׳™׳“׳¦׳™׳” ׳¢׳ ׳›׳ mutation, php -l ׳ ׳§׳™ ׳¢׳ 5 ׳§׳‘׳¦׳™׳. Elegance 23/25 ג€” prefix ׳¢׳§׳‘׳™ tiptop_sup_*, CSS ׳׳©׳•׳×׳£ ׳‘׳™׳ ׳©׳ ׳™ ׳”׳׳¡׳›׳™׳, engine ׳‘׳§׳•׳‘׳¥ ׳׳—׳“, ׳¨׳™׳ ׳“׳•׳¨ ׳›׳•׳›׳‘׳™׳ ׳—׳•׳–׳¨. Impact 24/25 ג€” ׳׳¨׳׳©׳•׳ ׳” ׳”׳׳¢׳¨׳›׳× ׳׳•׳“׳׳× ׳׳× ׳”׳¦׳“ ׳”׳׳₪׳¡׳˜׳¨׳™׳ ׳©׳ ׳©׳¨׳©׳¨׳× ׳”׳”׳¡׳₪׳§׳”, 14 ׳¡׳₪׳§׳™׳ + 126 PO ׳’׳•׳¨׳׳™׳ ׳׳“׳׳• ׳׳”׳¨׳’׳™׳© ׳׳׳•׳›׳׳¡, ׳§׳™׳©׳•׳¨ ׳™׳©׳™׳¨ supplierג†’PO. Completeness 22/25 ג€” ׳—׳¡׳¨ ׳¢׳“׳™׳™׳: ׳™׳™׳¦׳•׳ PDF/CSV ׳©׳ PO, ׳׳›׳™׳₪׳× min_order_value ׳‘׳˜׳•׳₪׳¡, ׳•-FK ׳¨׳©׳׳™ inventoryג†’supplier (׳”׳™׳׳ ׳¢׳•׳× ׳‘׳›׳•׳•׳ ׳” ׳-rename ׳©׳ ׳׳₪׳×׳— JSON ׳§׳™׳™׳).
צילומי מסך של השדרוג