The Job Log is where an Encik Beku technician does their work in the Ops app. The office creates the order and assigns the job in the Encik Beku portal. The technician starts the job on site, records the items, photos, and payment, and finishes it with the customer's signature.
Every change is saved to the Encik Beku backend through Utopia OE, which uses the same rules as the portal. A technician only sees and changes their own jobs.
The technician sets Today's Assignment on the Home tab. It is saved once and used for every job until they change it.
Pick the vehicle. A job cannot be started without one.BD leads can choose Own vehicle instead of a company plate.Pick up to 5 helpers, or none.The vehicle list is a temporary fixed list of plates for the pilot branches: Shah Alam, Negeri Sembilan, Melaka, Johor, and Penang. It will be replaced by a filter on business unit once the fleet data has one.
The Job Log tab lists only the signed-in technician's jobs.
Tab
Order
New Job (opens first), Postpone, Recheck, Continue Job
Earliest first, by date and then start time. Overdue jobs rise to the top.
Job Done
Most recently finished first.
All
Newest date first.
Search looks at the order number, customer name, address, area, phone, job title, and technician.Search ignores spaces, dashes, and capital letters, and every word typed must match. wr 4510 finds WR-4510C.
The technician presses Start Job on the job. If Today's Assignment has no vehicle, the app asks them to set one first.Starting marks the job in progress and unlocks Edit Job Log. On the portal, the items move to the Fulfillment stage.The vehicle and helpers from Today's Assignment are recorded on the job. After the start, only the office can change them, on the portal.A finished job is view-only in the app.
Edit Job Log has four steps. Every step stays on screen, so a saved draft can be finished later in any order. The finish button only unlocks when all of them are complete.
LG orders are partner jobs, flagged by the backend, with order numbers such as MLG0001. They skip the Items and Payment steps and only need a work-proof photo before finishing.
For Job Done, the technician hands the phone to the customer. The customer sees only the items and the total after discounts, and must sign before the job can be completed. The signature is saved on the job.
Completing the job freezes a copy of the items and sends it to Accounts.
A payment belongs to the order. The technician records what was collected on this visit.
Choice
Options
Method
Cash, Bank Transfer, QR / DuitNow, Cheque, E-Wallet, or No Payment
Type
Full Payment, Booking Deposit, Partial Payment, Balance Payment, or Security Deposit. The same list as the portal, which the AutoCount export depends on.
The amount starts at the balance and can be lowered. It cannot be more than the balance.A Security Deposit is held and refunded later. It never reduces the balance and is not limited to it.Every method except cash needs a receipt photo.Cash counts as paid straight away. The bank-in slip can be added later and shows under Pending Cash Receipts, one row per cash payment, until it is uploaded.No Payment ("customer belum bayar") needs a photo of the customer's IC, licence, or SSM. It leaves the balance owing.For a partial payment, the IC is offered as security but not required.ID photos are kept on the customer's record, not the job. The two most recent are kept, and one already on file does not need uploading again.The QR code and bank details shown belong to the technician's branch company, not the job's.A payment can be edited or deleted only from the visit that collected it.A real payment recorded after a "No payment" replaces it as the job's payment state.
Discounts apply at two levels: per line first, then on the order. Neither can take a figure below zero.A line price must be above RM1, or below −RM1 for a credit such as a trade-in. Anything in between is refused. The backend and portal use the same rule.Every total shown to the technician or the customer is after both discounts.Item search covers the whole catalogue, tolerates typos, and understands some Malay words, so "cuci" finds "cleaning".An "Other" line prints its remark on the invoice instead of the word "Other".If the office added a line while the technician was on site, the technician's save keeps it. Lines the office already removed are not brought back.
Item changes saved without signal are kept on the phone and sent automatically when the connection returns.A job cannot be completed while its item changes are still waiting to send. Otherwise Accounts would receive the wrong items.If the server refuses a queued save outright, the app stops retrying and waits for someone to look at it.A photo that fails to upload stays on screen marked "not synced", but it is not sent again automatically and is lost when the app closes. The technician has to upload it again. Payments and status changes need a connection.
Every call goes through Utopia OE to the Encik Beku backend with the technician's Hub token. The backend checks the job belongs to them.
Action
Endpoint
Job list
GET /api/v1/ops/my-jobs
Start
POST /api/v1/ops/jobs/{id}/start
Items
POST /api/v1/ops/jobs/{id}/itemize
Photos
POST /api/v1/ops/jobs/{id}/proof and DELETE …/proof/{proofId}
Payments
POST …/payment, PATCH or DELETE …/payment/{paymentId}, POST …/payment-proof
Customer ID photo
POST /api/v1/ops/jobs/{id}/customer-id-doc
Postpone or Continue
POST /api/v1/ops/jobs/{id}/outcome
Warranty choice
PUT /api/v1/ops/jobs/{id}/warranty
Job Done with signature
POST /api/v1/ops/jobs/{id}/complete
Today's Assignment
GET and PUT /api/v1/ops/my-pairing, GET /api/v1/ops/vehicles, GET /api/v1/ops/helpers
Pending cash
GET /api/v1/ops/pending-cash-receipts
Catalogue
GET /api/v1/ops/inventory
The code is in src/features/joblog/. The rules are in lib/, with tests.The price rule, discount maths, and payment types copy the backend. Change the backend, portal, and app together.