Columns: phone (required), name, email, notes, loyaltyPoints.
Matching is by phone. An existing customer is updated, never duplicated — and their
points/spend are left alone, because those are derived from real bills.
A starting loyaltyPoints only applies to a customer with no bill history to derive them from.
Columns: customerPhone and grandTotal (both required), billNo, date, customerName, branchId, paymentMode, notes.
These are recorded as already-settled history: no stock is deducted and no
"thanks for your purchase" message goes out. A phone with no customer yet gets one created.