ZenZenOpening ERP…
ZenZen ERP

ZenZen Mart · ERP v3

{{ osTitle }}

{{ osSubtitle }}

From To
{{ webErpSyncGaps.length }} accepted Online Order(s) (Confirmed/Delivered) missing from ERP invoices (erpWebOrders)
{{ webErpSyncGaps.map(g => g.id).join(', ') }}
Auto-land (web-auto-erp-v1) inserts Confirmed/Delivered + applies stock. Alpha Import remains manual fallback — copies fields only, does NOT deduct.
OrderCustomerGovernorateChannelStatusCOD / TotalBlended marginProfit & subsidyActions
No orders match these filters
{{ o.date || o.createdAt || '' }}
{{ osOrderName(o) }}
{{ osOrderPhone(o) }}
{{ osChannelLabel(o) }} {{ Number(o.total || o.revenue || 0).toFixed(2) }}
{{ osMarginOf(o).blendedMarginPct.toFixed(1) }}%
cost {{ Number(osMarginOf(o).landedCost).toFixed(0) }} EGP
⚠️ Low Margin Basket partial cost
—
Gross {{ osEconOf(o).gross_profit_before_shipping.toFixed(0) }}
{{ osEconOf(o).true_net_profit.toFixed(2) }} EGP net
{{ osEconOf(o).net_margin_pct == null ? 'n/a' : osEconOf(o).net_margin_pct.toFixed(1) + '%' }}
subsidy {{ osEconOf(o).shipping_subsidy.toFixed(0) }} EGP
—
BOM ✓
SKU / BarcodeProductQtyStockExpiry (FEFO)MinAdjust
No SKUs match
{{ item.sku }}
{{ item.barcode || '—' }}
{{ item.nameEn }} {{ zzCategoryType(item) === 'Global_Import' ? 'Import' : 'Essential' }} Bundle ×{{ zzBundleComponents(item).length }}
{{ item.nameAr }}
{{ item.nameZh }}
{{ item.quantity || 0 }} {{ osStockLabel(item) }} {{ osExpiryChip(item).label }} {{ item.expiry_date || item.expiryDate || '—' }} {{ item.min_stock_alert || item.minStock || 5 }}
Stock audit log
{{ e.sku }} · {{ e.nameEn }} {{ e.oldQty }} → {{ e.newQty }} ({{ e.delta > 0 ? '+' : '' }}{{ e.delta }}) · {{ e.note || '—' }} · {{ e.userId }}
1 {{ osFxCurrency }} = EGP default
SKUProductTypeCost (FC)Rate → EGPLanded EGPSell EGPGross marginDriver
{{ row.sku }} {{ row.nameEn }} {{ row.categoryType === 'Global_Import' ? 'Import' : 'Essential' }}
target {{ row.targetFloor }}%+
{{ row.symbol }} {{ Number(row.costFc).toFixed(2) }} —
{{ row.currency }}
{{ Number(row.rate||0).toFixed(3) }} 1.000
stored
{{ Number(row.landed||0).toFixed(2) }} {{ Number(row.sell||0).toFixed(2) }} {{ row.margin == null ? '—' : row.margin.toFixed(1) + '%' }} Top driver
In field {{ Number(osCodTotals.pendingDelivery||0).toFixed(0) }} EGP With courier {{ Number(osCodTotals.awaiting||0).toFixed(0) }} EGP Deposited {{ Number(osCodTotals.settled||0).toFixed(0) }} EGP Outstanding {{ Number(osCodTotals.pending||0).toFixed(2) }} EGP
OrderGovernorateCourierCOD EGPCOD settlement statusReconciled
No COD shipments
{{ o.id }}
{{ osOrderName(o) }} · {{ osOrderPhone(o) }}
{{ osOrderGov(o) || '—' }} {{ o.jtCourier || o.courierName || '—' }}
{{ o.jtAwb || o.courierAwb || 'no waybill' }}
{{ Number(o.total || o.revenue || 0).toFixed(2) }} {{ osCodShortLabel(o) }}
{{ String(o.codSettledAt).slice(0,10) }}
Total Goods Revenue {{ unitEconomics.goodsRevenue.toFixed(2) }} EGP Product sales only · {{ unitEconomics.orders }} orders
Delivery Fees Collected + {{ unitEconomics.deliveryCollected.toFixed(2) }} EGP Customer shipping contribution
Courier Actual Invoices - {{ unitEconomics.courierCost.toFixed(2) }} EGP {{ unitEconomics.shippedOrders }} shipped · covers {{ unitEconomics.deliveryCoveragePct == null ? '—' : unitEconomics.deliveryCoveragePct.toFixed(0) + '%' }}
Net Shipping Subsidy Absorbed - {{ unitEconomics.shippingSubsidy.toFixed(2) }} EGP Avg {{ unitEconomics.avgSubsidyPerOrder.toFixed(2) }} EGP / shipped order
Final True Net Profit {{ unitEconomics.finalTrueNetProfit.toFixed(2) }} EGP Net {{ unitEconomics.netMarginPct == null ? '—' : unitEconomics.netMarginPct.toFixed(1) + '%' }} · after COGS, packaging, courier & ads

True net profit bridge

{{ unitEconomics.healthy }} healthy {{ unitEconomics.thin }} subsidized {{ unitEconomics.loss }} loss
⚠️ {{ unitEconomics.costAnomalyOrders }} order(s) carry a landed cost above their sell price, inflating COGS by about {{ unitEconomics.costAnomalyValue.toFixed(0) }} EGP and dragging true net profit down. This is a warehouse cost-record issue (per-carton cost stored against a per-unit price), not a pricing loss — open the order's Economics drawer to see the offending lines.
Goods rev{{ unitEconomics.goodsRevenue.toFixed(0) }}
− COGS{{ unitEconomics.totalCogs.toFixed(0) }}
− Packaging{{ unitEconomics.packagingCost.toFixed(0) }}
+ Delivery{{ unitEconomics.deliveryCollected.toFixed(0) }}
− Courier{{ unitEconomics.courierCost.toFixed(0) }}
− Ads{{ unitEconomics.adSpend.toFixed(0) }}
= True net{{ unitEconomics.finalTrueNetProfit.toFixed(0) }}

Shipping subsidy by governorate

GovernorateTierOrders Delivery collectedCourier cost Subsidy absorbedAvg / order
{{ g.gov }} {{ g.tier ? 'T' + g.tier : 'n/a' }} {{ g.orders }} {{ g.collected.toFixed(2) }} {{ g.courier.toFixed(2) }} {{ g.subsidy.toFixed(2) }} {{ (g.orders ? g.subsidy / g.orders : 0).toFixed(2) }}

Revenue by Department

☕ Cafe{{ dashboardMetrics.coffeeRev.toFixed(2) }} EGP
🛒 Mart / Groceries{{ dashboardMetrics.martRev.toFixed(2) }} EGP
📦 Wholesale{{ dashboardMetrics.wholesaleRev.toFixed(2) }} EGP

Operational Stats & CRM

Total Orders {{ dashboardMetrics.totalOrders }}
Discounts Given - {{ dashboardMetrics.totalDiscountsGiven.toFixed(2) }} EGP
Outstanding Rewards Pts {{ dashboardMetrics.totalOutstandingPoints }}

Inventory Value

{{ dashboardMetrics.inventoryValue.toFixed(2) }} EGP
Real-time valuation based on landed costs.

Revenue mix

Daily revenue

Welcome, {{ currentUser.name }}!

You are logged in with limited access. Please navigate to the appropriate sections to perform your tasks.

⚠️ Low Stock Alerts

All items are sufficiently stocked!
{{ item.nameEn }}
{{ item.sku }}
{{ item.edition }}
Qty Left{{ item.quantity }}

Transactions

No transactions yet.
{{ tx.type }} {{ tx.client }} ({{ tx.orderClient }})
{{ tx.date }} · {{ tx.itemsCount || (tx.items||[]).length }} items · {{ tx.phone }}
{{ Number(tx.total || tx.revenue || 0).toFixed(2) }} EGP
Incl. Delivery
ItemSKUQtyPriceTotal
{{ it.nameEn }} {{ it.sku }} {{ it.sellQty || it.qty || 0 }} {{ Number(it.sellPrice || it.price || 0).toFixed(2) }} {{ ((it.sellQty || it.qty || 0) * (it.sellPrice || it.price || 0)).toFixed(2) }}
No line items saved on this invoice.

No sales in the selected dates — showing all invoices. Change From/To to filter.

Item sales

Profit = invoice revenue − cost saved at checkout (product + shipping share). Not today's warehouse cost.

No item sales yet.
PhotoProductSKUQty soldRevenueCostProfitMargin
{{ it.nameEn }} {{ it.sku }} {{ it.qty }} {{ it.revenue.toFixed(0) }} {{ Number(it.cost||0).toFixed(0) }} {{ it.profit.toFixed(0) }} {{ Number(it.margin||0).toFixed(0) }}%

Customer sales

Who bought, how many invoices, revenue and profit.

No customer sales yet.
CustomerInvoicesQtyRevenueAvg invoiceProfit
{{ c.name }} {{ c.orders }} {{ c.qty }} {{ c.revenue.toFixed(0) }} {{ Number(c.avg||0).toFixed(0) }} {{ c.profit.toFixed(0) }}

Online Orders

{{ webErpSyncGaps.length }} sync gap(s) — use Alpha tools to check/import {{ webErpSyncGaps.map(g => g.id).join(', ') }}
Alpha tools

No orders found matching your criteria.
ID Phone Customer Total EGP Status Actions

Shipment — Alpha

{{ courierLinkOrder && courierLinkOrder.id }} — works after it shipped. Customer total does not change.

Edit Web Order

{{ editingWebOrder.id }} · {{ editingWebOrder.status || '' }}

Linked customerId: {{ webOrderEditForm.customerId }}

١–٢ مجاني من ٨٠٠ · ٣ من ١٣٠٠ · ٤ حد ١٨٠٠ / مجاني ٢٧٠٠ — Zones 1–2 free 800 · Z3 1300 · Z4 min 1800 / free 2700

These are our cost. The customer invoice does not change. You can edit this after the order shipped.

Already dispatched / closed — add extras as a new order.

Items · delivery fee stays {{ Number(editingWebOrder.deliveryFee||0) }} EGP

{{ webOrderEditSubtotal().toFixed(2) }} + {{ Number(editingWebOrder.deliveryFee||0).toFixed(2) }} del = {{ (webOrderEditSubtotal() + Number(editingWebOrder.deliveryFee||0) - Number(editingWebOrder.discount||0)).toFixed(2) }} EGP

{{ line.nameEn }}
{{ line.sku }} · {{ Number(line.price).toFixed(2) }} EGP
{{ line.qty }}

📱 أوردر واتساب / هاتف

{{ manualOrder.crmHit }}

١–٢ مجاني من ٨٠٠ · ٣ من ١٣٠٠ · ٤ حد ١٨٠٠ / مجاني ٢٧٠٠ — Zones 1–2 free 800 · Z3 1300 · Z4 min 1800 / free 2700

{{ item.nameEn }}
{{ item.sku }} Recipe
{{ (calculateTargetSellPrice(item) || 0).toFixed(2) }}
{{ item.quantity }} pcs
No products
Cart empty
{{ line.nameEn }}
{{ line.qty }}
{{ ((line.qty || 0) * (line.price || 0)).toFixed(2) }} EGP
Subtotal{{ manualOrderTotals.subtotal.toFixed(2) }} EGP
Total{{ manualOrderTotals.total.toFixed(2) }} EGP

Point of Sale (Retail)

Shift Open: {{ shiftOpeningCash }} EGP
{{ item.nameEn }}
{{ item.sku }} Recipe
{{ (calculateTargetSellPrice(item) || 0).toFixed(2) }} EGP {{ item.quantity }} pcs

Current Cart

Cart is empty.
{{ cartItem.nameEn }}
{{ cartItem.sellQty }}
{{ ((cartItem.sellQty || 0) * (cartItem.sellPrice || 0)).toFixed(2) }} EGP
Total Due{{ (posCartTotal || 0).toFixed(2) }} EGP

Wholesale Orders

Invoice Date
{{ cust.companyName || cust.name }}
{{ cust.customerCode }} {{ cust.phone }} {{ cust.area }}

Add Item from Warehouse

⚠ Warehouse is empty!
Selected: [{{ selectedWholesaleItem.sku }}] {{ selectedWholesaleItem.nameEn }} — {{ selectedWholesaleItem.quantity }} pcs
[{{ wItem.sku }}] {{ wItem.nameEn }}
{{ wItem.nameAr }} {{ wItem.barcode }} {{ wItem.quantity }} pcs

Current Invoice Details

SKU & ProductQtyUnit PriceTotalAction
{{ cartItem.nameEn }} {{ cartItem.sellQty }} {{ cartItem.sellPrice.toFixed(2) }} EGP {{ (cartItem.sellQty * cartItem.sellPrice).toFixed(2) }} EGP
{{ wholesaleCreditDue.toFixed(2) }} EGP
{{ wholesalePaymentStatus }}
Total Invoice Amount{{ wholesaleCartTotal.toFixed(2) }} EGP

Past Wholesale Invoices

No wholesale invoices yet.
{{ wo.client || 'Client' }} · #{{ wo.id }}
{{ wo.date }} · {{ (wo.items||[]).length }} items · {{ wo.phone }}
{{ Number(wo.revenue || wo.total || 0).toFixed(2) }} EGP {{ wo.paymentStatus || 'Unpaid' }}
Total {{ Number(wo.revenue || wo.total || 0).toFixed(2) }}
Does NOT change warehouse stock

Expenses & Marketing 📊

Promo Codes

{{ promo.code }} {{ promo.discount }}% OFF

Business & Marketing Expenses

{{ exp.name }}
{{ exp.platform }} • {{ exp.date }}
{{ exp.cost.toFixed(2) }} EGP

{{ crmTab === 'suppliers' ? 'Suppliers CRM & Sourcing 🌍' : 'Customers CRM & Pipeline 👥' }}

New version · {{ crmTab === 'suppliers' ? 'Sourcing partners auto-mapped from job orders, classified by location' : 'Customer 360 · one CRM source' }}

Client / Company Name & Code Type & Contact Location Orders Last order LTV & Rewards Points
{{ client.type === 'Wholesale' && client.companyName ? client.companyName : client.name }} {{ client.stage }}
Contact: {{ client.name }}
{{ client.customerCode }}
{{ client.type }}
{{ client.phone }}
{{ client.phone2 }}
{{ client.country || 'Egypt' }}
{{ client.area || 'N/A' }}
{{ client.ordersCount || 0 }}
{{ customerIdleLabel(client) }}
{{ (client.totalSpent || 0).toFixed(2) }} EGP
{{ (client.points||0) >= 1500 ? 'Gold' : ((client.points||0) >= 500 ? 'Silver' : 'Bronze') }}
{{ client.points || 0 }} Pts
No customers found.
Supplier / Store Location Type Currency Job orders Last order
{{ sup.name }}
{{ sup.id }}
{{ sup.country || 'Unspecified' }}
{{ sup.city }}
{{ sup.type || 'Import' }} {{ sup.currency || '—' }}
1 {{ sup.currency }} = {{ zzFxRate(sup.currency).toFixed(3) }} EGP
{{ sup.orderCount || (sup.jobOrders || []).length || 0 }}
{{ sup.lastOrderDate || '—' }}
No suppliers yet — name a supplier on a Job Order and it registers here automatically.

{{ jobDeskTab === 'local' ? 'Local Market Purchase' : 'Import Job Order' }}

{{ jobDeskTab === 'local' ? 'EGP only · rate 1 · no freight or PAX tickets.' : 'Any origin · ' + jobCurrencyLabel + ' → EGP @ ' + Number(jobOrder.exchangeRate || 0).toFixed(3) + ' · PAX / Sea / Air' }}

Synced to supplier CRM {{ activeJob.supplierName }} · {{ activeJob.supplierLocation }}
EGP (ج.م) · locked
1.00
Seeded default — confirm in Landed Cost desk
Local pickup / market

🧳 PAX Trip Cost Details

Total Trip Cost
{{ paxTotalTripCost.toFixed(0) }} EGP
Cost per kg
{{ paxCostPerKg.toFixed(2) }} EGP/kg
Cost method (Purchase + In Transit)
Weight Used
{{ draftTotalWeightKg.toFixed(2) }} / {{ (jobOrder.weightAllowanceKg || 0) }} kg ({{ draftWeightUsedPct.toFixed(0) }}%)
Total Volume
{{ draftTotalVolumeM3.toFixed(4) }} m³
Trans. Product Info & SKU Qty & Pcs Landed (EGP) Sell Price Action
{{ item.nameEn }}
SKU: {{ item.sku }} {{ item.edition }}
{{ item.quantity }} {{ item.packageType }} {{ (calculateLandedCost(item) || 0).toFixed(2) }} {{ (calculateTargetSellPrice(item) || 0).toFixed(2) }}
Draft is empty. In Transit items stay visible below.

{{ jobDeskTab === 'local' ? 'Local purchases (not in warehouse yet)' : 'Import in transit (not in warehouse yet)' }}

Product Pcs Weight (kg) Cost (FC) Cost EGP Sell / Pc Margin % Expected Revenue Expected Profit Action
{{ t.nameEn }}
{{ t.sku }}
{{ (t.snapshot && t.snapshot.pcs) || 0 }}
{{ Number((t.snapshot && t.snapshot.weightKg) || ((t.unitWeightKg || 0) * (t.quantity || 0)) || 0).toFixed(3) }}
{{ Number(t.unitWeightKg || 0).toFixed(3) }} /pkg
{{ formatTransitCostCny(t) }}
{{ zzMoney((t.snapshot && t.snapshot.costEGP) || 0) }}
{{ zzMoney((t.snapshot && t.snapshot.costPerPcEGP) || 0) }} /pc
Total: {{ zzMoney(transitExpectedRevenue(t)) }}
% {{ zzMoney(transitExpectedRevenue(t)) }} {{ zzMoney(transitExpectedProfit(t)) }}
Total Weight: {{ deskTransitItems.reduce((s, t) => s + Number((t.snapshot && t.snapshot.weightKg) || ((t.unitWeightKg || 0) * (t.quantity || 0)) || 0), 0).toFixed(2) }} kg  |  Total Pcs: {{ deskTransitItems.reduce((s, t) => s + ((t.snapshot && t.snapshot.pcs) || 0), 0) }}  |  Total Cost: {{ zzMoney(deskTransitItems.reduce((s, t) => s + Number((t.snapshot && t.snapshot.costEGP) || 0), 0)) }} EGP
Total Selling: {{ zzMoney(deskTransitItems.reduce((s, t) => s + transitExpectedRevenue(t), 0)) }} EGP
Total Expected Profit: {{ zzMoney(deskTransitItems.reduce((s, t) => s + transitExpectedProfit(t), 0)) }} EGP

Products

Catalog for storefront — prices & visibility (no stock counts) · New version · catalog tools · {{ productsNeedsFixCount }} need fix

{{ selectedProductIds.length }} selected

To be corrected

Missing barcode, weight, pcs, price, duplicates, and other clear data gaps — list shrinks when you Save with fields filled

No products match this Needs fix filter.
SKUProductMissing
{{ row.item.sku }}
{{ row.item.nameEn }}
{{ row.item.nameAr }}
{{ iss.label }}
Price - EGP
showing {{ productsShowingFrom }}-{{ productsShowingTo }} of {{ filteredProductsCount }} · {{ selectedProductIds.length }} selected

Warehouse Inventory

Dark stock board · card inventory · select to print or share with customers

{{ warehouseFilterTotals.count }} shown
📦
Items
{{ warehouseFilterTotals.count }}
📥
Pcs
{{ warehouseFilterTotals.pcs }}
💰
Stock value
{{ zzMoney(warehouseFilterTotals.landed) }} EGP
📈
Expected Rev
{{ zzMoney(warehouseFilterTotals.rev) }}
💹
Expected Profit
{{ zzMoney(warehouseFilterTotals.profit) }}
⚠️
Low stock
{{ warehouseFilterTotals.lowStock }}
{{ selectedWhIds.length }} selected / محددين
Storefront placement
Item
On-hand
Buy EGP
Sell EGP
Landed
Buy CNY
Sell CNY
Margin %
Actions
{{ item.nameEn }}
{{ item.nameAr }}
{{ item.sku }} Recipe Internal 📌 🏷 🎉 {{ item.storePlacement.occasion }}
{{ item.quantity || 0 }} pcs
⚠️ Low stock
BOM auto-deduct
{{ zzMoney(warehouseBuyEgpPc(item)) }}
{{ zzMoney(warehouseSellEgpPc(item)) }}
{{ zzMoney(item.finalLandedCostEGP || 0) }}
{{ formatWarehouseCny(item, 'buy') }}
{{ formatWarehouseCny(item, 'sell') }}
{{ warehouseMarginPct(item) == null ? '—' : (warehouseMarginPct(item).toFixed(1) + '%') }}
More ▾
No warehouse items match these filters
Page {{ whPage }} / {{ whPageCount }} · {{ warehouseFilterTotals.count }} items

🗑 Deleted Products (Soft Deleted)

No deleted products
SKU & Name Deleted At Actions
{{ item.nameEn }}
{{ item.sku }} · {{ item.category }}
{{ item.deletedAt ? new Date(item.deletedAt).toLocaleString() : '-' }}

Similar products — check photo & location before merge

Same name can be a different flavor. Look at the picture. Deleted items are not listed. Pick KEEP only if they are truly the same product.

Different words: {{ g.flavorWarn }} — probably different flavors. Merge only if you are sure.
{{ it.nameEn }}
SKU {{ it.sku }} · warehouse qty {{ it.quantity || 0 }} pcs · landed {{ Number(it.finalLandedCostEGP || 0).toFixed(2) }} EGP
{{ b.label }}

Accounting

Variant B-v3 · editable couriers & payment methods · FX + QR · courier COD AR · materials · ads · cash flow · sidebar live links · localStorage only (no warehouse/DB)

Accounting · costs (live ERP)

Same numbers as Dashboard + Expenses. Nothing from the old demo. Pay: cash / InstaPay / WhatsApp (manual).

Sales
{{ dashboardMetrics.totalGoodsRevenue.toFixed(2) }} EGP
From POS + Web + Wholesale
Cost of goods
{{ dashboardMetrics.goodsCost.toFixed(2) }} EGP
Landed cost of sold items
Gross profit
{{ dashboardMetrics.goodsProfit.toFixed(2) }} EGP
Ads / materials / other
{{ dashboardMetrics.marketingSpend.toFixed(2) }} EGP
Same list as Expenses & Marketing
Net
{{ dashboardMetrics.finalNetProfit.toFixed(2) }} EGP
Gross + delivery − expenses
Stock value
{{ dashboardMetrics.inventoryValue.toFixed(2) }} EGP
On-hand × landed · warehouse

Add cost (ads, materials, courier…)

Saves into the ERP database — also shows under Expenses & Marketing.

Cost log

No expenses yet. Add one above.
DateWhatTypeEGP
{{ exp.date }} {{ exp.name }} {{ exp.platform }} {{ Number(exp.cost||0).toFixed(2) }}

FX Rates Board Alpha edit

Alipay / WeChat checkout converts RMB → EGP using this board. Last update stored locally.

RMB / EGP · CNY→EGP
{{ Number(accFx.rmbEgp).toFixed(2) }} EGP
Last update: {{ accFx.updatedAt || '—' }}
USD / EGP
{{ Number(accFx.usdEgp).toFixed(2) }} EGP
Last update: {{ accFx.updatedAt || '—' }}
Checkout use
Alipay + WeChat
Customer pays RMB · ERP books EGP
Sample convert
¥{{ accSampleRmb }} → {{ accSampleEgp }} EGP
@ {{ Number(accFx.rmbEgp).toFixed(2) }} RMB/EGP · editable sample
Sample ¥ amount
Local calculator only

Payment QR · Alipay / WeChat / Instapay Omar sends QR later

Upload file → dataURL or paste URL · stored in localStorage · Alpha only · no server upload

Alipay

Alipay QR
QR PLACEHOLDER
Sample · ¥ {{ Number(accQr.alipayAmtRmb).toFixed(2) }}

≈ {{ (Number(accQr.alipayAmtRmb) * Number(accFx.rmbEgp)).toFixed(2) }} EGP @ {{ Number(accFx.rmbEgp).toFixed(2) }}

WeChat Pay

WeChat QR
QR PLACEHOLDER
Sample · ¥ {{ Number(accQr.wechatAmtRmb).toFixed(2) }}

≈ {{ (Number(accQr.wechatAmtRmb) * Number(accFx.rmbEgp)).toFixed(2) }} EGP @ {{ Number(accFx.rmbEgp).toFixed(2) }}

Instapay

Instapay QR
QR PLACEHOLDER
Label · {{ Number(accQr.instapayAmtEgp || 0).toLocaleString() }} EGP

Optional EGP amount label (local only)

Cash on hand
{{ Number(accBalances.cash).toLocaleString() }} EGP
Drawer · POS float
Bank — CIB
{{ Number(accBalances.bank).toLocaleString() }} EGP
Main operating
Instapay wallet
{{ Number(accBalances.instapay).toLocaleString() }} EGP
Mobile transfers
CN wallets (held)
¥ {{ Number(accBalances.cnWalletRmb).toLocaleString() }}
≈ {{ (Number(accBalances.cnWalletRmb) * Number(accFx.rmbEgp)).toFixed(0) }} EGP · Alipay+WeChat
STUB / DEMO

Courier & Payment Method Lists Alpha editable

Not a fixed enum — add / rename / remove · used by COD collections, courier fees, payment ledger & pickers · persisted in localStorage

Couriers

{{ c }}

Payment methods

{{ m }}

Daily / Monthly P&L Snapshot

Pulls from dashboard metrics when available · else demo stub

Period revenue
{{ Number(accPnl.revenue).toLocaleString() }}
EGP · {{ accPnl.orders }} orders · {{ accPnl.source }}
Period net
{{ Number(accPnl.net).toLocaleString() }}
After COGS + ads
Goods profit
{{ Number(accPnl.goodsProfit).toLocaleString() }}
EGP
Ads / expenses
{{ Number(accPnl.marketing).toLocaleString() }}
EGP in range
LineAmount (EGP)
Goods revenue{{ Number(accPnl.revenue).toLocaleString() }}
Delivery fees{{ Number(accPnl.delivery).toLocaleString() }}
Goods profit{{ Number(accPnl.goodsProfit).toLocaleString() }}
Ads & expenses−{{ Number(accPnl.marketing).toLocaleString() }}
Net{{ Number(accPnl.net).toLocaleString() }}

Expenses & Ads Log

DateItemChannelEGP
{{ row.date }} {{ row.name }} {{ row.channel }} {{ Number(row.amount).toLocaleString() }}

Receivables / Payables STUB

Receivables (AR)
{{ accArTotal.toLocaleString() }}
EGP
Payables (AP)
{{ accApTotalLabel }}
mixed CCY stub
PartyTypeDueAmount
{{ r.party }} {{ r.type }} {{ r.due }} {{ r.amountLabel }}

Payment Methods Ledger STUB + editable list

Methods from your list · demo volume stub · add method above or inline

MethodOrdersVolumeShare
{{ m.name }} {{ m.orders }} {{ m.volume }} {{ m.share }}

Active methods list: {{ (accPaymentMethodList||[]).join(' · ') }}

FX History

RMB/EGP last entries · CSS bars

  • {{ h.date }} · RMB/EGP {{ h.rate }}

Multi-currency Journal STUB

DateAccountDrCrCCY
{{ j.date }}{{ j.account }}{{ j.dr || '—' }}{{ j.cr || '—' }}{{ j.ccy }}

Cash Flow Snapshot LOCAL

Cash in hand+bank+Instapay · earned but pending with couriers · cash out (courier fees + materials + ads MTD)

Cash in (liquid)
{{ accCashInTotal.toLocaleString() }}
EGP · cash + bank + Instapay wallet
Pending courier (AR)
{{ accCourierPendingTotal.toLocaleString() }}
EGP · earned, remittance lag ~30d
Cash out MTD
{{ accCashOutMtd.toLocaleString() }}
EGP · courier fees + materials + ads
Note: Pending courier COD is earned but pending cash (AR from courier), not lost revenue. No live bank API — Alpha edits balances manually.

Courier COD Collections (pending remittance) DEMO OK

Your courier list (editable above) · remittance may lag ~30 days · Alpha editable

Total pending with couriers
{{ accCourierPendingTotal.toLocaleString() }} EGP
Pending + Partial remaining
Due this week
{{ accCourierDueWeek.toLocaleString() }} EGP
Remittance due ≤ 7 days
Received this month
{{ accCourierReceivedMonth.toLocaleString() }} EGP
Status = Received · MTD
CourierRef / periodCollectedDueStatusNotes
{{ row.courier }} {{ row.ref }} {{ Number(row.amount).toLocaleString() }} EGP {{ row.dueDate }} {{ row.status }} {{ row.notes || '—' }}

Courier / Delivery Cost EXPENSE

Per shipment or weekly invoice · linked to expenses · MTD summary

MTD courier cost
{{ accCourierFeesMtd.toLocaleString() }}
EGP this month
Rows logged
{{ (accCourierFees||[]).length }}
local log
Tip
Weekly invoice OK
Any courier from your list
DateCourierPeriodFee EGP
{{ row.date }}{{ row.courier }}{{ row.period }}{{ Number(row.fee).toLocaleString() }}

Marketing & Ads CHANNELS

Meta / TikTok / Google / Influencer / Other · budget vs spend · MTD ads total

{{ ch.name }}
{{ ch.spend.toLocaleString() }} / {{ ch.budget.toLocaleString() }}
spend / budget EGP · MTD
MTD ads total
{{ accAdsMtdTotal.toLocaleString() }}
EGP all ad channels
DateChannelNameSpendBudget
{{ row.date }} {{ row.channel }} {{ row.name }} {{ Number(row.spend).toLocaleString() }} {{ Number(row.budget||0).toLocaleString() }}

Shipping & Warehouse Materials CONSUMABLES

Boxes, tape, bubble wrap, labels, bags, other supplies · item · qty · unit cost · total · date

MTD materials cost
{{ accMaterialsMtd.toLocaleString() }}
EGP this month
Lines logged
{{ (accMaterials||[]).length }}
local consumables log
Common items
Boxes · Tape · Bubble · Labels · Bags
+ Other
DateItemQtyUnitTotalNote
{{ row.date }} {{ row.item }} {{ row.qty }} {{ Number(row.unitCost).toLocaleString() }} {{ Number(row.total).toLocaleString() }} {{ row.note || '—' }}

Tax / VAT Note OPTIONAL STUB

Simple local note — not a live tax filing system · Alpha editable

Keep tax filings with your accountant. This box is a reminder only (no bank/ETA API).

Export & Reports

Client-side CSV download of stub / aggregated local data

v1.0.34

Company Branding

No Logo

Change Password

Legal & Business Info

These details will appear on printed invoices and receipts.

System Email Configuration

Use an App Password if using Zoho/Google with 2FA.

Data Management

Restore Data

System Health (safe)

Diagnose + limited fixes only. Never changes warehouse quantities or invoices.

{{ erpHealthReport }}

Users & Permissions

Add New User

Current Users

{{ user.name }}
{{ user.email }}
ID: {{ user.userId }}
{{ user.role }}

Product Categories

{{ cat.group }}
{{ cat.name }}

Marketing Broadcast

Use these lists to send bulk SMS, WhatsApp messages, or Emails for holidays, discounts, and incentives.

{{ isEditingCustomer ? '✏️ Edit Customer' : '👤 Add New Customer' }}

Customer ID {{ isEditingCustomer ? editingCustomerId : (generatedCustomerId || 'Auto on save') }}

Identity · codes

Phone · contact

Address · location

Customer 360 · Rich profile

One CRM source · linked Web / WhatsApp / Wholesale / POS
{{ selectedCustomer.type || 'Retail' }} · {{ selectedCustomer.customerCode || '—' }}

Identity · codes

Phone · contact

Address · location (summary)

Related orders — click a row to open the items

No orders found for this client.
IDChannelDateTotalStatus

Full address · maps

Log new interaction

Activity history

No activities logged yet for this client.
{{ act.type }} {{ act.date }}

{{ act.notes }}

Notes

Open maps

🍹 Create New Drink Recipe (BOM)

{{ ing.nameEn }}
{{ ing.qty }} {{ ing.unit }}{{ (ing.cost).toFixed(2) }} EGP

Edit In Transit

Purchased line. Same detail as Draft, with RMB + EGP totals and per piece. Sell price is the master.

Product Images
Factory pack: scan or type it. No barcode on pack: press Generate 20… (never mixes with 69 / 88 / 89).
Local ZenZen barcode (20…)
وزن العبوة الواحدة فقط
Margin is calculated from this price. Do not type a negative margin.
Smart Preview (auto) · FX {{ transitEditPreview.rate.toFixed(2) }}
Total Paid CNY: ¥ {{ transitEditPreview.costCNY.toFixed(2) }}
Total Paid EGP: {{ transitEditPreview.productEGP.toFixed(2) }}
Cost / pc CNY: ¥ {{ transitEditPreview.productPerPcCNY.toFixed(2) }}
Cost / pc EGP: {{ transitEditPreview.productPerPcEGP.toFixed(2) }}
Ship total EGP: {{ transitEditPreview.shipEGP.toFixed(2) }}
Ship / pc EGP: {{ transitEditPreview.shipPerPc.toFixed(2) }}
Sell / pc EGP: {{ transitEditPreview.sellPc.toFixed(2) }}
Sell total EGP: {{ transitEditPreview.sellTotal.toFixed(2) }}
Total pcs: {{ transitEditPreview.pcs }}
Total weight: {{ transitEditPreview.totalW.toFixed(2) }} kg
Weight / pc: {{ transitEditPreview.wpc >= 1 ? (transitEditPreview.wpc.toFixed(3) + ' kg') : ((transitEditPreview.wpc*1000).toFixed(1) + ' g') }}
Landed / pc: {{ transitEditPreview.landedPerPc.toFixed(2) }} EGP  ·  Landed total: {{ transitEditPreview.landedEGP.toFixed(2) }} EGP
Profit {{ transitEditPreview.profitTotal.toFixed(2) }} EGP ({{ transitEditPreview.marginPct.toFixed(0) }}%)

Edit Product

{{ editingItem.nameEn || '—' }}
SKU: {{ editingItem.sku || '—' }}
Unsaved changes
Alpha: change to a spice code (SPC-…) — must stay unique.
EAN-13 / Chinese 69… factory barcode, or Generate 20… for local packs
Empty in database — Generate 20… or scan factory
Local ZenZen barcode (20…)
History summary
On-hand: {{ warehouseHistoryTotals(editingItem).onHand }} Bought (Purchases): {{ warehouseHistoryTotals(editingItem).bought }} Ledger (bought−sold): {{ warehouseHistoryTotals(editingItem).ledgerOnHand }} Revenue: {{ zzMoney(warehouseHistoryTotals(editingItem).revenue) }} EGP Profit: {{ zzMoney(warehouseHistoryTotals(editingItem).profit) }} EGP
The number you type is the warehouse. Save records an Alpha correction — not a new purchase from China.
{{ editingItem.category_type_source === 'manual' ? 'Pinned manually — auto-tagging will not change it.' : 'Auto-tagged from category. Changing it here pins the value.' }}
lot-migrate-v1: Buy Unit ↔ Total Paid sync DISABLED · On-hand from lots · qty locked
{{ editCostLinkLabel }}
Supplier Last PO / Date Qty Unit cost
No supplier lots yet
{{ lot.supplier || editingItem.supplier || '—' }} {{ lot.orderRef || '—' }} · {{ (lot.date || '').toString().slice(0,10) || '—' }} {{ lot.qty }} {{ formatLotFc(lot, 'unit') }}

Primary image for Warehouse / website / Meta prep.

📦

Item History

SKU: {{ editingItem.sku || '—' }} | {{ editingItem.nameEn || '—' }}

Track all inventory movements and transactions for this item.

📦 On-hand
{{ warehouseHistoryTotals(editingItem).onHand }} Units
Warehouse qty (POS truth) · hist-onhand-wh-v3
Ledger (bought−sold): {{ warehouseHistoryTotals(editingItem).ledgerOnHand }}
Revenue EGP
{{ zzMoney(warehouseHistoryTotals(editingItem).revenue) }}
All-time sales
Profit EGP
{{ zzMoney(warehouseHistoryTotals(editingItem).profit) }}
All-time sales
Date Type / Event Source Supplier or Channel Order ref Qty Unit cost/price Line total Landed EGP/pc Sold Remain Revenue Profit Notes
No purchase lots yet
{{ (lot.date || '').toString().slice(0,10) }} {{ lotEventLabel(lot) }} {{ lot.sourceLabel }} {{ lot.supplier || '—' }} {{ lot.orderRef || '—' }} {{ lotQtySigned(lot) }} {{ formatLotFc(lot, 'unit') }} {{ formatLotFc(lot, 'total') }} {{ Number(lot.landedEgp||0).toFixed(2) }} {{ lot.soldQty }} {{ lot.remainQty }} {{ zzMoney(lot.lotRevenue) }} {{ zzMoney(lot.lotProfit) }} {{ lot.notes || '' }}
Date Type / Event Channel Qty Unit price Line total Cost Profit
No sales in period
{{ (row.date || '').toString().slice(0,10) }} Sale / Outbound {{ row.channel }} −{{ row.qty }} {{ zzMoney(row.sellEgp||0) }} {{ zzMoney(row.revenue||0) }} {{ zzMoney(row.cost||0) }} {{ zzMoney(row.profit||0) }}
TOTAL (filtered) −{{ warehouseSalesPeriodTotals(editingItem).qty }} {{ zzMoney(warehouseSalesPeriodTotals(editingItem).revenue) }} {{ zzMoney(warehouseSalesPeriodTotals(editingItem).cost) }} {{ zzMoney(warehouseSalesPeriodTotals(editingItem).profit) }}
hist-onhand-wh-v3 · ZenZen ERP

📣 Meta Post Prep

انسخ الكابشن + افتح الصورة، وانشر من Business Suite يدوي لحد ما التوكن يتفتح.

SKU: {{ metaPostItem.sku }} · {{ metaPostItem.nameEn }}
Open image

{{ metaPostStatus }}

  1. Copy caption + Download image
  2. Open Business Suite أو FB Page (لو Composer طلع error سيبه)
  3. Create post / نشر → اختار صفحة ZenZen Mart → ارفع الصورة → الصق الكابشن → Publish
  4. Instagram: نفس الصورة والكابشن من التطبيق أو Business Suite → Instagram

📦 Repack Bulk Product

Source Item (Bulk)
{{ repackData.sourceItem.nameEn }}
Available in Stock{{ repackData.sourceItem.quantity }}
Bag + sticker per 100g pack. 0 if not counted yet.
What will happen
  1. Bulk {{ repackPreview.bulkG }}g sell {{ repackPreview.sourceSell.toFixed(2) }} · cost {{ repackPreview.bulkCost.toFixed(2) }} · margin {{ repackPreview.srcMarginPct.toFixed(1) }}%.
  2. Goods cost {{ repackPreview.packG }}g = {{ repackPreview.bulkCost.toFixed(2) }} × ({{ repackPreview.packG }}/{{ repackPreview.bulkG }}) = {{ repackPreview.goodsCost.toFixed(2) }}.
  3. + pack & label {{ repackPreview.packLabel.toFixed(2) }} → total cost {{ repackPreview.newCost.toFixed(2) }} EGP.
  4. Same margin {{ repackPreview.srcMarginPct.toFixed(1) }}% → sell {{ repackPreview.sell.toFixed(2) }} EGP (weight-only would be {{ repackPreview.sellFair.toFixed(2) }}).
  5. Open {{ repackPreview.deduct }} bulk ({{ repackPreview.have }} → {{ repackPreview.left }}) → {{ repackPreview.newQty }} packs.
  6. Adds into existing SKU: {{ repackPreview.mergeName }}.
  7. Creates a new card “{{ repackData.newNameEn }}”.
HD & CO. TRADING
ZenZen Specialty Stores
ZenZen Tax Reg #: {{ companyTaxId }}
UUID: {{ receiptData.id }}
Date/Time: {{ receiptData.date }}
Type: {{ receiptData.type }} ORDER
Customer: {{ receiptData.client }}
Buyer Tax ID: {{ receiptData.taxId }}
ItemQtyTotal
{{ item.nameEn }} ({{ item.selectedFlavor }}) {{ item.sellQty || item.qty }} {{ ((item.sellQty || item.qty) * (item.sellPrice || item.price)).toFixed(2) }}
Delivery Fee: +{{ receiptData.deliveryFee.toFixed(2) }} EGP
{{ invoicePromoLabel(receiptData) }}: -{{ receiptData.discount.toFixed(2) }} EGP
TOTAL EGP: {{ parseFloat(receiptData.revenue).toFixed(2) }}