For Administrators

Administrator Guide

How to run the PMJ Sales back office: manage staff and roles, publish the daily metal prices that open the sales floor, feed the catalogue from the ERP and bulk uploads, keep master data clean, and read the numbers.

Roles & access model

PMJ Sales uses a deny-by-default access model enforced on the server: every request is checked against the user's single role, and every product query — list, detail, similar products, counts and aggregate totals — is scoped by that user's assigned locations and departments. There is no "else bucket" that quietly sees everything: a role without an explicit grant gets nothing.

RoleLanding pageProducts visibleAdmin surfaces
ADMIN
/admin/usersThe entire catalogue in every channel — no location or department scoping, no category exclusions.Everything: users & customers, imports, metal prices, master-data settings, IP allowlist, Synergics, reporting.
MANAGER
/admin/metal-pricesProducts in their assigned locations and departments.Metal-price editing only — the daily rate board is the manager's one admin surface. No users, imports or settings.
SALES_REP
/customer-entryUnion of assigned locations and departments, minus category exclusions and items whose product type, category or classification is inactive.None — sales floor only (catalogue, estimates, wishlist, compare, scan, visits).
CUSTOMER_CARE
/customer-entryIdentical scoping to SALES_REP.None — same sales-floor surface as SALES_REP.
MERCHANDIZER
/catalogueAssigned locations and departments — read-only product browsers across inventory and channels.None — no users, no settings, no imports.
HEAD_OFFICE
/catalogueSame as MERCHANDIZER, plus the WIP and Design Bank channel browsers.None — read-only browsing.
CUSTOMER
— (no login)Nothing. Customers never sign in to the dashboard.None. A customer is a directory record plus visits, wishlists and estimates recorded by staff on their behalf.

Three scoping rules worth memorising:

Zero assignments = empty catalogue

A staff user with no locations and no departments assigned sees an empty product list. If someone reports “no products”, check their assignments on /admin/users first.

Location ∪ department union

A non-admin sees products that match ANY of their assigned locations OR any of their assigned departments — it is a union, not an intersection.

Category exclusions apply to the floor

Sales reps and customer care additionally never see products covered by a category-exclusion rule or belonging to an inactive product type, category or classification. Admins see everything, exclusions included.

One role per user

Legacy accounts could stack multiple role flags; in PMJ Sales each user has exactly one role. If someone genuinely needs two hats (for example merchandizing and sales), give them the broader role and scope their locations tightly.

User administration (/admin/users)

/admin/users is the admin landing page: a searchable staff directory with role filters, an activation toggle on every card, and per-user location/department assignment. Customers live separately at /admin/customers.

Create a staff account

  1. 1
    Open /admin/users and press Add User.
  2. 2
    Fill in the identity fields: name, gender, phone number (unique across the system), email, and the Employee ID — this is what the person types at /login, on both the dashboard and the Android app.
  3. 3
    Set an initial password. Staff can change it themselves later from /profile → Change Password.
  4. 4
    Choose exactly one role: ADMIN, MANAGER, SALES_REP, CUSTOMER_CARE, MERCHANDIZER or HEAD_OFFICE. (CUSTOMER records are not created here — see the customer directory below.)
  5. 5
    Assign locations and departments. Pick specific stores/departments, or use the select-all option to grant every location or every department at once. Remember: no assignments means an empty catalogue for that user.
  6. 6
    Save. The account is active immediately and can sign in.

Activate / deactivate

Every user card has an active toggle. Deactivating blocks login instantly but keeps the account's history — their estimates, visits and import records stay attributed to them. Use deactivation instead of deletion when staff leave; you can reactivate at any time.

Change role or reassign locations

  1. 1
    Find the user (search by name, phone or employee ID; filter the grid by role).
  2. 2
    Open Edit and change the role or the location/department assignment.
  3. 3
    Save — the new scope applies to the user's very next request; they do not need to log out and back in.

Scoping is the security boundary

A sales rep's assigned locations decide exactly which inventory (and which aggregate totals) they can see. When a rep transfers between stores, update their assignment the same day — leaving old locations attached leaks that store's stock, prices and weights to someone who no longer works there.

Customer directory (/admin/customers)

The customer directory lists every registered customer with search by name or phone. Customers are normally registered on the sales floor at /customer-entry during their first visit (name, phone, date of birth, gender, address with country/state/city, and a "how did you hear about us" source). From /admin/customers you can correct demographic details and review a customer's visit history. Customers never receive passwords or logins — their identity exists only so visits, wishlists and estimates can be attributed to them.

Daily metal prices (/admin/metal-prices)

/admin/metal-prices is the daily rate board — the single most time-sensitive admin task in the system. Every product price and every estimate is computed from these per-purity rates, so the board is effectively the gate that opens the sales floor each morning. Admins and managers can edit it (it is the manager role's only admin surface).

  1. 1
    Open /admin/metal-prices and pick the currency tab: INR (India) or USD (USA). Each tab is an independent rate board.
  2. 2
    Edit the per-purity rows — gold rates per gram for 24K, 22K, 18K and 14K, plus silver and platinum. Enter the day's rate and save each row.
  3. 3
    Saving publishes a new price snapshot (the history of previous rates is kept, with who set it and when) and triggers the repricing job: the worker recomputes every product's list price against the new rates and invalidates the price caches, so the catalogue, product detail pages and estimates all show the new numbers immediately.
  4. 4
    Spot-check one known product on /catalogue after saving — if the rate was fat-fingered (a missing digit is the classic), you will see it instantly in the list price.

Enter today's gold rate before the floor opens

Estimates always use the latest published rate. If yesterday's rate is still on the board when the store opens, every quote given to a customer that morning is wrong. Make the rate update the first task of the day, in both currency tabs if you administer both regions.

How currency drives tax

The tax model is chosen by the product's currency (which comes from its location), never by hand:

INR — India

Estimate total = (metal + making + wastage + stones) × 1.03 — a 3% GST line, with TCS shown as a 0% line item on the printed estimate.

USD — USA

Customs duty is applied first (the location's customs-duty %), then sales tax (the location's sales-tax %) on the duty-inclusive amount. Both percentages are configured per location in /admin/settings.

Purity fallback

If a product's purity has no live rate on the board, pricing falls back to the metal-rate seed imported with the product from the ERP file. Keep the board complete for every purity you sell so the fallback is never the number a customer sees.

Bulk uploads & ERP ingestion (/admin/imports)

/admin/imports is where the catalogue gets its data. There are two sources, and both create an import run you can watch on this page:

Automatic — the ERP daily email

The ERP mails a stock CSV every day; the system polls the mailbox hourly, downloads the file and ingests it without anyone lifting a finger. This is the primary source of truth for inventory.

Manual — per-channel uploads

Upload an Excel/CSV file for any channel: Inventory, Best Seller, Social Media, WIP or Design Bank. Each channel has its own file dialect and its own upload button.

Upload a file

  1. 1
    Open /admin/imports and choose the channel you are uploading for — Inventory, Best Seller, Social Media, WIP or Design Bank. Uploading a file into the wrong channel is the most common import mistake.
  2. 2
    Pick the Excel/CSV file. The inventory dialect is the ERP's 43-column stock export (variant names carry the 4-level taxonomy; KT column carries purity and colour; stone rows carry the BOM). Channel files use their own column dialects.
  3. 3
    Submit. An import run is created in
    PENDING
    , moves to
    RUNNING
    when the worker picks it up, and finishes as
    COMPLETED
    — or
    CANCELLED
    if the file is unreadable.
  4. 4
    Watch the run in the imports table: it shows who uploaded it, the source-file download, live progress, and on completion the row statistics (rows read / created / updated / deactivated / errored).
  5. 5
    If any rows errored, open the run's row-error report. Bad rows are quarantined with a per-row reason (bad barcode, unparseable weight, unknown location…) while every good row still lands — one bad row no longer cancels the whole file.

Imports are idempotent upserts — nothing gets wiped

An import never empties the catalogue. Each row is matched by its product code (barcode) within the channel: existing products are updated in place, new ones are created, and products missing from a full inventory file are soft-deactivated (hidden from the floor but kept in the database). Estimates and wishlists keep pointing at the right products across re-imports, and re-uploading the same file is harmless.

New locations arrive unconfigured

When an import references a store location the system has never seen, the location is created with the configured flag off and does not silently price as INR. Finish the job in /admin/settings → Locations: set its currency (and, for USD, customs duty % and sales tax %), then mark it configured.

After every successful inventory run the worker automatically reprices the catalogue, recomputes product ageing, and refreshes the "Last updated" stamp shown to staff on /catalogue. Failed runs trigger an email notification to administrators.

Master data & settings (/admin/settings)

/admin/settings holds every lookup the catalogue and pricing engine depend on. Most of it is maintained automatically by the ERP import — your job is to curate titles, images and flags, and to configure anything the import cannot know.

Taxonomy (four levels)

Products are classified on a four-level tree: Product Type → Category → Sub-Category → Sub-Sub-Category. Nodes are auto-created from the ERP file's variant names, so you rarely add them by hand. What you do maintain:

  1. 1
    Edit a node's display title and image — these drive the filter menus and category tiles staff see on the floor.
  2. 2
    Toggle a node's active flag. Inactive product types, categories and classifications are hidden from sales reps and customer care (admins still see everything) — the fastest way to pull a whole category off the floor without touching products.

Locations

Locations are the region and currency carriers. Each location row holds: code, title, currency (INR or USD), customs duty % and sales tax % (used only for USD pricing), optional geo-coordinates, an active flag, and the configured flag described in the imports section. Get a location's currency wrong and every product priced there is wrong — this is the single most consequential settings screen.

Other masters

Classifications

Gold/silver/platinum-style groupings. A classification can be flagged as platinum-rated so its products price from the platinum rate instead of gold.

Collections & sizes

Named collections and size masters used as catalogue filters; refreshed by the import, curatable here.

Departments & vendors

Departments feed user scoping (assigned departments) and filtering; vendors appear as an admin-browser filter.

Purities

The purity + colour lookup (24K/22K/18K/14K gold colours, 92 silver, 95 platinum…) with fallback rates — keep it in step with the metal-price board.

Category exclusions ("specials")

Exclusion rules hide specific category + product-type combinations from sales reps and customer care — used for internal, repair, sample and old-stock categories that must never be quoted to a customer. The internal location-name and category-code exclusion lists that were once hardcoded are seeded configuration here too: edit the rule, not the code. Exclusions apply consistently to lists, detail pages, counts and totals.

Prefer flags over deletion

Almost everything in settings has an active flag. Deactivate rather than delete — historical estimates and import stats keep their references, and you can flip it back when the jewellery comes back in season.

Store IP allowlist (/admin/ip-allowlist)

The IP allowlist ties the sales floor to the store network: catalogue browsing for sales reps and merchandizers is only permitted from a registered store IP address. Combined with location assignments, it means a rep's device shows the right store's stock — and shows nothing from the car park. The check is made against the server-observed connection IP, so it cannot be spoofed with a header.

  1. 1
    Find the store's public IP (from the store router, or ask IT — it is the IP the store's internet connection presents to the outside world).
  2. 2
    Open /admin/ip-allowlist and press Add IP. Enter the IP address and a label naming the store (for example "Jubilee Hills — Fibre 1").
  3. 3
    Save. Devices on that connection can now browse the catalogue with sales-floor roles.
  4. 4
    Use the active toggle on each row to suspend an entry without deleting it — handy when a store changes internet provider and you want to keep the old entry documented during the switchover.

Store ISP changed = floor goes dark

If a store's reps suddenly can't load the catalogue while admins can, the store's public IP has almost certainly changed (new router, ISP re-lease). Add the new IP here and toggle the stale entry off.

Synergics ERP finance files (India only)

The Synergics integration exchanges finance files with the Synergics ERP. It is India-region only and ships behind a feature flag — in the USA deployment the tools simply do not appear. When enabled, the Synergics tools live alongside the upload tools on /admin/imports.

  1. 1
    Store the Synergics user credential (username + password) once. Credentials are encrypted at rest — they are never displayed back in full.
  2. 2
    Upload or fetch finance files; each transfer is listed in the finance-file table with its date and originator.
  3. 3
    Download past finance files from the table when accounts asks for a re-send.

Low-frequency, high-importance

Finance files move rarely (a handful per year), so it is easy to forget the credential exists. If Synergics rotates the account password on their side, update it here before the next file exchange fails.

Reporting

Because every estimate is persisted server-side with its full numeric breakdown (not just a PDF), the reporting on /dashboard is real, not decorative:

Estimates per rep per day

How many estimates each sales rep produced, day by day — the core sales-floor activity metric, covering estimates made on the dashboard and on the Android app alike.

Share rate

How many estimates were printed or shared to the customer on WhatsApp (with-rate vs without-rate variants), and when.

Attendance & visits

Customer check-ins and check-outs per store and per rep — footfall as the system sees it.

Active users

Which staff accounts are actually signing in and working, useful before an access review or a deactivation sweep.

  1. 1
    Open /dashboard and set the date range and, where relevant, the store location.
  2. 2
    Drill from a rep's daily count into their individual estimates — each one keeps its product code, breakdown, totals and the printed/shared timestamps.
  3. 3
    Cross-check unusual discount activity: estimates record the rep's edits to making rate, wastage % and stone rates, so a rep who routinely quotes below list shows up in the data.

Regions: India (INR) & USA (USD)

One application serves both regions. Each region runs against its own database, and the deployment's region setting controls labels and region-only features — but the behavior that matters day-to-day is data-driven by location:

Currency comes from the location

A product priced at a location with currency INR shows ₹ and Indian digit grouping; a USD location shows $. No per-user or per-session currency switch exists.

Tax model follows the currency

INR: +3% GST with a TCS line. USD: customs duty % first, then sales tax % on the duty-inclusive amount — both percentages set per location in /admin/settings.

Separate rate boards

The INR and USD tabs on /admin/metal-prices are independent — updating the Indian gold rate does not touch the US board, and each region's repricing runs against its own snapshot.

Region-only features

Synergics finance files are India-only. All four extra channels (Best Seller, Social Media, WIP, Design Bank) are available in both regions, subject to what data each region imports.

Administering both regions?

Treat them as two checklists: publish today's rate on the INR board and the USD board, watch each region's ERP import complete, and remember that users, imports and settings are per-region — creating a staff account in India does not create it in the USA.

That is the whole back office. For the sales-floor perspective your staff see every day, continue to the Sales & Staff Guide; for the in-store tablet workflow, the Android App Guide.