What's New

Keep up with the latest releases, improvements, and fixes.


+12.3k−335
⚙️ Backend🌐 WebAttendance

Launch self-service punch kiosks and one-click PDF reports

The attendance system now supports dedicated wall-mounted punch stations and full PDF report downloads, closing the last gaps with the old application.

  • Punch kiosks are back, done properly: Admins can register shared punch stations (for example, a tablet at the front gate) from a new admin page. Employees scan their personal QR code and the kiosk automatically records check-in or check-out based on the day's state, with a live screen showing today's attendance counters and the most recent punches.
  • Secure device credentials: Each kiosk gets its own secret key, shown only once at setup and stored encrypted. Keys can be rotated or revoked instantly from the admin panel, so a lost or compromised tablet never exposes employee data. Kiosks never hold a personal employee or admin login.
  • Direct PDF downloads everywhere: Attendance history, monthly team reports, leave, permits, overtime, visits, work reports, and payslips can now all be downloaded as polished PDF files directly from the browser, with photos and evidence embedded. No print dialogs, no extra software on the server.
  • Complete report coverage: Monthly reports include every calendar day (holidays, leave, and absences included), per-employee totals, and GPS coordinates, matching everything the old printable reports contained and more.
  • Verified end to end: The full API test suite now runs against the staging database with 143 of 143 routes exercised and 559 checks passing, including the new kiosk punch, feed, and key rotation flows.
🌐 WebAttendance

Approve requests straight from the queue with photo previews

Reviewing attendance requests gets faster for admins, and submitted evidence is now visible without leaving the page.

  • One-click decisions: Pending leave, permit, overtime, visit, and work report requests now show an approve/reject dropdown directly in the queue table's status column, like the old admin reports. No more opening each request just to make a decision.
  • Photo previews in place: Clicking an evidence thumbnail (check-in selfie, check-out photo, or visit photo) now opens the full image in a pop-up window on the same page instead of jumping to a new browser tab, so admins can review evidence without losing their place in the list.
  • Cleaner buttons: Menu and filter buttons across the app now share the same rounded shape and size as the rest of the interface, for a consistent look on every page.
⚙️ Backend🌐 WebAttendance

Photo evidence in admin tables and bilingual notifications

Attendance records and notifications become more informative and readable for everyone.

  • Selfie evidence at a glance: Admin attendance lists now show check-in and check-out photo thumbnails right in the table, next to the punch times, so day-to-day oversight no longer requires opening each record to see the evidence.
  • Clearer punch layout: Check-in and check-out are grouped into a single labeled column with the punctuality status (on time or late) directly beneath each time, and dates show the weekday underneath, making the tables read like a calendar.
  • Notifications in your language: Approval and submission notifications (leave, permits, visits, work reports) are now stored as templates and rendered in the reader's chosen language, so Indonesian-speaking employees no longer receive English notifications.
  • Safer photo access: Evidence photos are served through a protected, authenticated channel with permission checks per feature, replacing direct storage links. Someone with a photo link alone can no longer open another employee's evidence.

+1.0k−48
⚙️ BackendWMS

Stop false server-error alarms and explain sign-in failures in WMS

The WMS backend no longer treats routine events as server failures, and error responses now explain themselves instead of showing a generic message.

  • Fewer false alarms for the ops team: When a user closes a page or navigates away while data is still loading, the system now records it as a normal cancelled request instead of logging it as a server error, so real outages stand out in monitoring instead of being buried in noise
  • Clearer sign-in and permission messages: Expired sessions now say "Authentication is required. Please sign in again." and blocked actions say "You do not have permission to access this resource." instead of the generic support message
  • Real failures stay visible: Genuine database or server problems are still reported as errors even if the user's connection drops at the same moment, so nothing important gets hidden by the new cancellation handling
  • Slow requests still flagged: Any request taking more than 3 seconds is recorded as a warning, keeping the existing performance signal intact
⚙️ BackendTMS

Fix vehicle search crash on records with missing optional details

Searching or opening vehicle records no longer crashes when optional details were never filled in.

  • Crash fixed: Vehicle entries saved without a color, description, frame number, or engine number could break the vehicle search and listing. These fields are now safely treated as empty, so every vehicle shows up in search results regardless of how much detail was entered
  • Covers the full workflow: Creating, searching, listing, opening, and editing a vehicle with all optional fields left blank now works end to end, verified by an automated test
  • No action needed: Existing vehicle records don't need to be corrected or migrated; they simply display normally again
🌐 WebTMS

Courier and vehicle forms now catch mistakes before saving, with visible errors

Saving courier and vehicle records was silently failing or leaving users stuck. The forms now validate input and show exactly what went wrong.

  • Branch required, clearly: Courier and vehicle forms now check that a branch is selected before saving. If it's missing, the form stays open and shows "Pilih cabang terlebih dahulu." instead of failing silently in the background
  • Failed saves are now visible: Previously, some failed saves (such as a duplicate courier name or a missing record) disappeared without any notification. Every failed save now shows the actual error message from the system, so users know immediately that their data wasn't saved
  • A summary of all problems at once: When a form has multiple issues, all of them are listed together at the top of the dialog instead of appearing one at a time
  • New records active by default: New courier and vehicle entries are now automatically set to active, while edits to existing inactive records keep their status unchanged
⚙️ BackendApproval

Email notifications no longer fail on demo or malformed addresses

Approval email notifications now skip addresses that can never receive mail, instead of failing the whole delivery.

  • Demo accounts no longer cause delivery errors: Notification emails addressed to the application's built-in demo accounts (such as @demo.test addresses) are recognized and skipped before any email delivery is attempted, removing recurring failed-delivery noise from the system
  • One bad address no longer blocks the rest: If a notification contains a malformed address alongside valid ones, only the bad entry is skipped. Everyone else on the To, Cc, and Bcc lists still receives the email as normal
  • Cleaner handling when nobody remains: If every recipient on an email is a demo or invalid address, the system simply skips sending it rather than erroring out, keeping approval workflows running without interruption
  • Display names preserved: Recipients entered with display names (for example "Rina <rina@company.com>") are still delivered in exactly the same format as before

+2.5k−347
🌐 WebApproval

Rebuild the Indonesian user guide as complete per-form walkthroughs

The LEN Approval user guide has been restructured into six complete form walkthroughs (BL Inbound, BL Outbound, Pickup Domestic Delivery, Pickup Delivery, MRN Request, and MRF Inbound). Each walkthrough now keeps everything for one task together: prerequisites, filled inputs, confirmation dialogs, notifications, follow-up actions, and the resulting status.

  • Complete walkthroughs: Staff no longer need to jump between sections to follow a form from start to finish. Each of the six form chapters shows the full journey, from filling the form to the final notification and status, in one place.
  • WhatsApp price negotiation covered step by step: The guide now shows how a Manager receives a price link on WhatsApp, enters the price on the opened page, and passes the task on for final approval. It also covers expired or completed links, escalation to the Director for prices above Rp50 million, and how to review estimates with incomplete reference data.
  • Shipment receipt (ACK) in the right place: Proof-of-delivery receipt entry is now documented inside the relevant form's chapter, together with its reminder and confirmation messages, instead of as a separate detached section.
  • Fresh screenshots and a new Excel example: All application screenshots were recaptured from the current released version, and a new MRF Inbound Excel example was added alongside the existing BL Inbound, Pickup Domestic, and CJ price examples.
  • Verified end to end: All 159 guide pages were checked for overflow and broken images, with 183 application screenshots and 35 WhatsApp message illustrations verified, and all 68 existing pricing and negotiation tests passing.
🌐 WebApproval

Polish the form selection page and launch the new user guide

  • Consistent form selection cards: The Create New Form page now displays all form cards with equal heights and aligned titles, descriptions, and arrows on desktop and mobile, making it easier to scan and pick the right form.
  • Keyboard friendly: Forms can be selected with Tab, Enter, or Space with a clearly visible focus indicator, alongside normal mouse clicks, and the Refresh button reloads the available form types.
  • Clearer card descriptions: Each form card now carries a short, plain description of its purpose, with technical implementation notes removed.
  • New Indonesian user guide: The full user guide was rebuilt with a simpler cover, filled input examples, real application dialogs and result screens, all ten reference-data sections, and Excel examples. WhatsApp message illustrations now appear at every step that triggers one, from submission through approval to price negotiation.

+1.3k−71
⚙️ BackendApproval

CJ price authority tiers and negotiated totals in BL Outbound approval

Approval forms for BL Outbound now enforce who may negotiate and approve CJ prices, based on how much money is at stake.

  • Authority tiers by amount: Price agreements are routed by value: default bands are under Rp10 juta, Rp10-50 juta, and above Rp50 juta. Each band has its own negotiation group and final approval group, so a supervisor can settle small prices while large amounts require manager or director sign-off.
  • Automatic escalation: If a negotiator proposes a price above their band's limit, the proposal is not accepted. The form stays at the negotiation step and is forwarded to the higher authority level, which must negotiate and agree afresh.
  • Four-eyes protection: The person who recorded the agreed price can never also give the final approval for it. Final approval requires a different, eligible member of the approval group.
  • Reviewed estimates for incomplete quotes: When the CJ reference price doesn't cover every route, a designated estimate-review group must review a total (with a mandatory reason) before the form can move, instead of the form silently stalling.
  • Agreed totals flow to ERP: After final approval, the agreed freight-plus-packing total is allocated exactly across all AWBs sent to ERP, while any price edits made by ERP operators are preserved and reported as conflicts.
  • Tamper protection: Old approval and WhatsApp links stop working once shipment details change or the form is resubmitted, and price-affecting edits restart the negotiation automatically.
🌐 WebApproval

Configure CJ price authority levels in Form Configuration

Admins can now define and manage the CJ price authority matrix directly from the BL Outbound Form Configuration page.

  • Editable authority matrix: Set up to 10 price tiers, each with a name, an upper amount limit, a negotiation group, and a final approval group. The last tier is unlimited by design, and a routing preview shows exactly which tier a given amount lands in (e.g. Rp25 juta lands in Manager).
  • Safe activation: The policy starts disabled and cannot be switched on until real CJ groups are assigned to every tier and to the estimate-review group. Forms already in progress keep the policy version they were submitted under.
  • Authority visible in Nego Harga: The price panel now shows the assigned authority level, the routing amount, the required groups, and any hold reason, so users always know who needs to act next.
  • Estimate review workflow: Authorized reviewers can submit a reviewed estimate with a mandatory reason directly from the price panel when the CJ reference is incomplete.
  • Guided final approval: The approval dialog confirms the reviewer is authorized for the price before enabling the button, and escalation notices ("Kewenangan dinaikkan") make it clear when a proposal moved to a higher tier.

+1.8k−359
🌐 Web⚙️ BackendWMS

Rebuild the location inventory dialog in WMS

The Inventory List dialog on Management > Lokasi > Racking has been rebuilt from the ground up, with a matching new backend endpoint scoped per warehouse and rack.

  • Chip filters: Inventory rows can now be narrowed by Plant, Material, Unit of Measure, and Vendor. Each filter opens a searchable chip picker, and selected filters appear as removable chips at the top, with a one-click reset.
  • Readable stock rows: What used to be seven cramped table columns is now four clean columns grouping material, location/vendor, and stock details. Each row shows the available quantity plus Quality Inspection, Blocked, and In Transit breakdowns, with negative quantities highlighted in red.
  • Independent paging and sorting: The dialog now keeps its own search, sorting, page size, and page jump controls, separate from the location list behind it. Warehouse, SLOC, and rack context are always shown in the header.
  • Faster, safer data loading: Inventory is loaded page by page from a new endpoint that filters by warehouse and rack before summing stock, and cancelled stock with zero balance is excluded. Filter options load on demand as you type, outdated requests are cancelled so results never mix, and all inputs are validated and injection-safe.
  • Mobile and dark mode: The dialog gets compact card-style rows on phones with touch-friendly controls, plus consistent Light and Dark theme colors.
🌐 WebAttendance

Add calendar date pickers across the attendance portal

Date filters throughout the attendance portal now use proper calendar popups instead of bare text boxes.

  • Calendar popups: Every date filter now opens a visual calendar for picking a day, replacing the free-text date fields that were easy to mistype. Available on the admin attendance overview, the analytics dashboard, and all admin forms with a date field.
  • Date range selection: Request lists (leave, overtime, work reports, and similar) get a two-month range picker: click the start day, click the end day, done. Clicking the selected range clears it.
  • Bilingual and validated: The calendar displays in Indonesian or English following the app's language setting, respects minimum and maximum dates, and works in both required forms and URL-driven filters.
  • Toolbar fix: Filter fields no longer overflow their card on narrow screens.
🌐 Web⚙️ BackendAttendance

Fix login sessions and make punch flow flow smoothly

  • Sessions survive proxies: The login "remember me" cookie is now stored on the site root instead of a narrow path, fixing sessions that silently failed to refresh when the web app proxies the API under a path prefix. Employees had been getting logged out mid-shift.
  • Straight to check-out: After a successful check-in, the punch page now refreshes in place and shows the recorded punch above the form, which flips directly to check-out. Employees no longer need to leave the page and come back to clock out.
  • Overtime notes always visible: The optional notes box on the overtime clock-out form is now a normal field instead of hidden behind an extra collapsible step.
🌐 WebAttendance

Make navigation buttons behave like real links

Buttons that only navigate (Back to Home, View History, Add Employee, Open Payslip, and dozens more across employee, admin, and payroll pages) now use one consistent building block that renders a true link styled as a button.

  • Middle-click and open-in-new-tab work: Every navigation button in the app can now be opened in a new tab or middle-clicked like any normal link.
  • Better screen reader announcements: Navigation controls are announced as links rather than buttons, which is the correct semantics for assistive technology.
  • Consistent touch size: The standardized buttons keep the same minimum height on mobile, so nothing shrinks or shifts.

+9.5k−2.0k
⚙️ BackendWMS

Fix serial number references to the correct outbound document

When a serial number (such as a shared meter unit) has moved through several outbound documents over its lifetime, outgoing goods records were pointing at the wrong historical document. This release fixes the root cause going forward:

  • Correct document references: Issuing goods against a serial number now always records the reference and quantity of the outbound document actually being processed, instead of the first one the serial ever appeared on. This affects the Network, BNPB, and XL Home workflows.
  • No more duplicated history: The XL Home flow previously added an issue history entry for every past document that contained the serial. It now records exactly one entry per real issue.
  • Accurate quantities for sets and special units: Quantities read for SET and special-unit serials are now summed only across the current document, so repeated serial numbers no longer inflate the totals.
  • Clear error when data is inconsistent: If a serial is not linked to the document being processed, the system now stops with a clear message in Indonesian instead of silently recording a wrong reference.
  • Faster routing slip history: A new database index makes the serial history dialog lookup seek directly instead of scanning over 2 million history rows; a sampled production read dropped from about 312 ms to under 100 ms.

Note: past records with wrong references are left untouched for now; a separate, reviewed repair is planned so legitimate history is never accidentally deleted.

🌐 WebWMS

Rebuilt serial number history dialog with filters and search

The dialog that shows a serial number's movement history (routing slip) and the list of serials under a restriction have been rebuilt into one modern, faster detail view used across Network and XL Home:

  • Filters and search: Filter the history by action type or by the user who performed it, and for restricted serials by test result (Tested/Pending), disposition (Available/Blocked/Pending), and whether the serial number was filled in. Search now matches the readable status label, not just internal notes.
  • Color-coded statuses: All six inventory history actions get distinct colored badges (Incoming, Verified, Allocated, Requested to pick, Picked for test, Issued), with readable detail text kept alongside.
  • Sorting and paging: Sort newest/oldest (or by serial number for restrictions) and page through results with page-size choices; content loads page by page so long histories stay responsive.
  • Material and location context: The dialog header shows the material and its source location together, with a collapsible detail panel on mobile.
  • Reliable behavior: Loading, empty, error, and retry states are handled consistently; dismissing the dialog cancels pending requests; filters and paging are kept if you reopen the same serial and reset when you open a different one. Works on desktop, tablet, and phone in Light and Dark themes.
⚙️ Backend🌐 WebAttendance

New admin attendance dashboard with trends and location breakdown

Admins get a new attendance dashboard that turns daily punch data into an at-a-glance overview:

  • Daily snapshot: Key numbers for the selected date: employees checked in, late arrivals, scheduled employees who have not checked in, and approved leave plus permits, each with a sparkline showing the recent trend.
  • Trend charts: A stacked daily chart splits check-ins into on time, late, and unclassified, so attendance patterns over the chosen 7, 14, or 30-day period are visible at once. A second chart tracks follow-up items: people who have not checked in and approved time away.
  • Arrival punctuality: The on-time share of everyone who checked in, shown as a percentage with a breakdown bar. If nobody has checked in yet, the dashboard says so instead of showing a misleading 0%.
  • Attendance by location: A ranked list of locations by attendance, clickable to jump straight to that location's attendance page.
  • Flexible scope: Pick the end date, trend period, and filter by location or position; everything is reflected in the page address so views can be shared. The pending review queues for leave, permits, and overtime stay live alongside the dashboard.
  • Honest numbers: Holidays are flagged (national holidays take precedence over weekly ones), overlapping leave requests never count an employee twice, and the dashboard never invents an absence count.
🌐 WebAttendance

Sortable tables and richer filters across the attendance app

All the main data tables in the attendance and payroll screens have been upgraded to a new sortable table design, with a more capable filter toolbar:

  • Sortable columns: Click any column header to sort employees, salaries, attendance history, payroll runs, requests, and roles ascending or descending. The sorted column is highlighted, and rows glide into place instead of jumping.
  • Filter chips: Active filters now appear as removable chips in a toolbar, with an "Add filter" menu for picking filters and values, replacing plain dropdowns. Filters and page selection live in the page address so filtered views can be shared and survive refreshes.
  • Better pagination: Page numbers you can click directly, with clear previous/next controls, replacing the old previous-only paging.
  • Mobile-friendly tables: On phones, tables fold into readable cards automatically, and the column headers become a strip of sort buttons so sorting stays one tap away.
  • Clearer admin navigation: Every admin menu item now has its own distinct, meaningful icon instead of most sections sharing the same one, making the sidebar easier to scan.
🌐 WebAttendance

Show/hide password toggle on the login form

The login form's password field now has an eye button to show or hide what you typed, so users can verify their password before signing in instead of retyping after a failed attempt. Labels are localized in Indonesian and English.

⚙️ BackendAttendance

Move file storage to Azure Blob Storage

Attendance selfie photos and profile pictures are now stored in Azure Blob Storage instead of Amazon S3:

  • Single cloud provider: File uploads, downloads, and temporary access links all use Azure, matching the rest of the company's cloud setup and removing the separate AWS credentials to manage.
  • Same behavior, new backend: Uploads from the mobile app, secure time-limited viewing links, and photo verification all work exactly as before; only the storage location changed.
  • Graceful degradation unchanged: If storage is not configured, photo-required punches still fail safely with a clear reason rather than recording punches without evidence.

+2.0k−565
🌐 WebApproval

Make the WhatsApp price negotiation page easier to use on phones

The page that approvers open from WhatsApp to record the CJ price they negotiated has been redesigned for mobile use.

  • Mobile-first layout: The page now reads as a clean card on a phone screen, with full-width buttons, larger price input, and clear section separation
  • Route tariff breakdown: Each route row now shows how its price was built: charter rate or per-kg rate, any wooden packing surcharge, and a "min" badge when the route minimum was applied
  • Coverage at a glance: A badge on the reference card shows whether all routes have CJ tariffs or only some of them do
  • One-tap reference price: A quick-fill chip inserts the full CJ reference price into the agreement field, no typing needed
  • Live difference preview: While typing the agreed price, the page instantly shows whether it saves money or goes over the CJ reference, in Rupiah and percent

The general approval and confirmation pages sent by link also get a cleaner look, a success/failure badge, and now redirect back to the production approval site correctly.

🌐 WebApproval

Put CJ price details where approvers decide

Price negotiation information is now visible directly inside the approval screens, so approvers no longer have to hunt for it.

  • Price summary in the Approve dialog: For BL Outbound forms, the final approval confirmation now shows the compact CJ reference price next to the agreed price before confirming
  • Direct Nego Harga action: Forms waiting at the Nego Harga step get a dedicated "Nego Harga" button on desktop rows and mobile cards in Need Approval, plus a "Nego" badge next to the step name
  • Richer price comparison: The price panel shows coverage and difference-percentage pills, a per-route tariff column (charter or per-kg rate, plus wooden packing), and a quick "Salin angka referensi" button
  • Step types in Flow Configuration: Each flow step now displays its type: Approval, Data Entry (AWB), or Nego Harga
  • More useful Users page: User rows and cards now show WhatsApp numbers (with a Dummy badge for placeholder numbers) and group memberships, and search matches phone numbers and group names too
⚙️ BackendWMS

Faster, filtered serial number lookups for transfers

New backend support for the redesigned serial number picker used in Network and BNPB stock transfers.

  • Filtered picking: Warehouse staff can narrow available serial numbers by condition, completeness, power-on test result, and whether the serial has been captured or is still blank
  • Search everything: One search box matches serial number, MAC address, product code, and remarks
  • Faster responses: Only the requested page of serials is read from stock, so picking stays quick even in bins holding thousands of units
  • Warehouse-safe: Results are always limited to the signed-in user's assigned warehouse and the exact material, storage location, bin, and unit selected
🌐 WebWMS

Rebuild the serial number picker for stock transfers

The "Pilih S/N" dialog for Network and BNPB transfers has been rebuilt into one shared, much more capable picker.

  • Source context up front: The dialog header shows the source material, plant, storage location, bin, and exactly how many units are available before picking
  • Filter chips: Searchable Condition, Completeness, Power-on test, and filled/blank serial filters, with removable applied chips and a Reset filter button
  • Selections that survive: Chosen serials stay selected while paging, searching, filtering, and reopening the dialog, and stale choices clear automatically when a different source stock is selected
  • Bulk select: Pick or release the entire visible page in one pass, with a "Hapus pilihan" button to clear everything
  • Readable details: Serial, MAC, product code, test results, and remarks are combined into compact columns, with phone-friendly cards and proper Light/Dark theme colors
🌐 WebWMS

Keep the Tested Inventory menu highlighted on every page

Fixed the sidebar navigation for Reporting > Tested Inventory.

  • Correct highlight: The Tested Inventory menu item now stays highlighted on all of its pages, including Rekap, Per Material, Per S/N, approvals, and detail pages
  • Clean switching: Opening another report correctly clears the previous highlight instead of leaving two menus active

+17.3k−3.8k
⚙️ BackendWMS

Open stock detail dialogs for all warehouse inventories

The warehouse system now has a single, reliable way to look inside any inventory, covering Network, BNPB, and XL Home stock plus status history for all seven Channel products.

  • One detail view everywhere: Clicking an inventory row opens the same detail experience for stock items, status history, and serial numbers, so staff no longer learn a different screen per warehouse type
  • Filter and search inside the dialog: Narrow results by location, unit, vendor, status, or user, with searchable suggestions so large warehouses stay fast to browse
  • Nothing goes missing: Items with zero stock and serial numbers with an unknown status still appear, so counts always match what is physically on the shelves
  • Faster pages: Stock lists load page by page and serial numbers only load when opened, keeping the dialog responsive even with hundreds of rows
  • Warehouse safety: Every read is automatically scoped to the signed-in user's warehouse, so one branch can never see another branch's stock
⚙️ BackendWMS

Rebuild stock picking for outbound orders with filters

The back end behind picking stock for outbound shipments was rebuilt so every warehouse variant uses one consistent picker.

  • Pick stock in steps: Staff choose a material, then see the exact locations and quantities available, with the same flow across Network, BNPB, XL Home, BL, and all seven Channel products
  • Filter chips: Narrow the picker by location, unit, vendor, batch, or AWB number before choosing, instead of scrolling long stock lists
  • Trustworthy quantities: The available stock shown always matches the warehouse's own numbers, including vendor-split stock for BNPB and box-level detail for BL shipments
  • Faster under load: Counts and filter suggestions no longer load serial-number history, so the picker stays quick even for serialized inventory
⚙️ BackendWMS

Make Excel inventory uploads dramatically faster

A slow spot in the Excel upload process was found and fixed, cutting the system's database workload for uploads by a wide margin.

  • The problem: Every row of an inbound or tested-inventory upload was checking its material code the hard way, forcing the database to read an entire lookup table for each row
  • The fix: Material code checks now use the lookup table's index directly, so each row reads a handful of records instead of thousands
  • Measured impact: This single check was consuming about 1,112 seconds of database time every two weeks in production; a 1,000-row upload now takes 3 seconds instead of 10, and a 10,000-row upload 43 seconds instead of 123
  • No behaviour change: Every upload accepts or rejects rows exactly as before, including unusual codes, so existing templates keep working
🌐 WebWMS

Rebuild inventory detail dialogs with filters and clean layout

The pop-up screens warehouse staff use to inspect inventory were rebuilt into one modern, consistent dialog across all inventory types.

  • One dialog for everything: Network, BNPB, XL Home, and all seven Channel products now share the same detail view for stock, status history, and serial numbers, instead of four separate older screens
  • Filter chips: Searchable filters for location, unit, vendor, status, and user, with removable chips and a one-click reset, make it easy to drill down and back out
  • Readable tables: Related information is combined into fewer, well-organized columns, so stock levels and history are easier to scan at a glance
  • Smooth navigation: Moving from stock to history or serial numbers and back keeps your filters and page exactly where you left them
  • Works on phones: Controls are sized and laid out for touch, and both Light and Dark themes are supported
🌐 WebWMS

Rebuild stock picker for outbound with filters and safety checks

The screen staff use to pick inventory when creating outbound orders was rebuilt into a single modern picker for every warehouse type.

  • Guided picking: Choose material, then location and quantity, in clear steps that work identically across Network, BNPB, XL Home, BL, and all seven Channel products
  • Filter chips: Searchable filters narrow the stock list before choosing, and selected items stay saved when you page, filter, or step back
  • Fewer mistakes: Quantities are checked against available stock before saving, unavailable stock cannot be picked, and duplicate saves are blocked
  • BL helpers kept: Bulk copy to Excel, select-a-page, and per-box weight and dimension entry all carry over into the new picker
  • Phone friendly: Pagination and buttons are sized for touch, in both Light and Dark themes
⚙️ BackendApproval

Record agreed CJ prices through a Nego Harga approval step

BL Outbound approvals now include a dedicated "Nego Harga" step, so the price agreed with CJ by phone or WhatsApp is written down and visible to the final approver instead of living only in chat.

  • Price as a workflow step: Forms can stop at a Nego Harga step where a designated negotiator records the agreed total with an optional note, or accepts the CJ reference price when every route has a tariff
  • Reference price on submit: Each form saves the CJ price-list quote for its routes at submission, so the agreed price is always compared against the reference it was negotiated from
  • Approve over WhatsApp, no login: Negotiators with a phone number receive a personal, secure link that opens a simple page to record the price; links stop working once the form moves on or the person is deactivated
  • Final approver sees the deal: Approval notifications and history now show the agreed price, the CJ reference, the difference, and who agreed it
  • Approval-only record: The agreed price stays in the approval system and is not pushed into ERP or TMS
⚙️ BackendApproval

Fill ERP air waybills completely from approval forms

Shipment forms (BL Outbound, BL Inbound, Pickup Domestic) now write complete air waybills into ERP, filling in what previously had to be typed by an ERP operator by hand.

  • Full route and contacts: Origin branch, sender customer with address and phone, destination village, and recipient all come from the approval form's reference data
  • Automatic pricing: Each AWB now carries the CJ price, either per-kilogram with its minimum weight or a flat charter rate, plus packing wood fees, instead of arriving in ERP unpriced
  • ERP operators stay in charge: Anything an ERP operator already filled in is never overwritten; mismatches are kept and reported so someone can settle them
  • Sync log per AWB: Every waybill records whether it was created, updated, skipped, or failed, with warnings for anything the form could not fill in, and administrators can re-send a form's AWBs on demand
  • Bug fixes included: Pickup Domestic AWBs no longer carry zero weights, missing transport modes are no longer silently defaulted, and AWBs are updated (not only created) during the AWB step
🌐 WebApproval

Record and compare agreed CJ prices in Need Approval

The approval app now supports the new Nego Harga step and shows CJ prices side by side on BL Outbound forms.

  • Nego Harga in Need Approval: When a form reaches the price negotiation step, the action menu offers recording the price instead of a plain approve, with a dialog showing the CJ reference per route
  • Enter or accept a price: The negotiator types the agreed total (with a live difference against the reference shown while typing) or takes the reference price in one click when all routes are priced
  • Harga CJ card: Every submitted BL Outbound form shows the reference quote, the agreed price, who agreed it, when, and any note
  • Stays in sync: After a price is recorded from a WhatsApp link, refreshing the card picks up the agreement
🌐 WebApproval

See exactly what each form wrote to its ERP waybills

A new "AWB di ERP" panel on shipment forms shows, for each waybill, what the approval system sent to ERP and what it held back.

  • Status per waybill: Whether each AWB was created, updated, skipped, or failed in ERP, with ERP's own explanation
  • Route and price at a glance: The origin, destination, transport mode, and CJ price written for each waybill
  • Warnings explained: Anything the form could not fill in, and why, is listed in plain language
  • ERP edits respected and visible: Fields where an ERP operator entered something different are shown side by side rather than silently overwritten
  • Admin re-send: Administrators get a "Sync ulang ke ERP" button with a confirmation, and it never deletes or clobbers operator edits

+9.3k−1.4k
⚙️ BackendWMS

Speed up inbound and outbound detail pages

Warehouse detail pages load dramatically faster, and the status shown for each document and item is now always the right one.

  • Faster detail pages: The inbound and outbound document and item pages now find each item's latest status directly instead of scanning the entire status history on every view. The slowest lookups, which had reached 22 seconds each in production, now return almost instantly.
  • Always the correct status: When two status updates carry the same timestamp, pages now consistently show the latest one instead of an arbitrary pick.
  • Speed-up applied immediately: The supporting database indexes were already applied to production before this release, so the improvement takes effect the moment the new version goes live.
  • Verified against production: Old and new pages were compared on live production data and returned identical results on every screen, monitoring view, report export and serial number lookup.
⚙️ BackendApproval

Import the CJ price list as CJ sends it and quote per route

The Approval system can now read CJ's price list workbook directly and price a whole form per route the way ERP prices an AWB.

  • Direct Excel import: Admins upload CJ's own price list file with no export or conversion step. A preview reports every rate it would add or change before anything is written, and the import is refused if the file or stored rates changed after the preview was reviewed.
  • Safe by design: The import only adds and updates rates, never deletes them. Routes priced more than once in the workbook are flagged, with the most current sheet winning, and existing rates the file does not mention are kept untouched.
  • Per-route quoting: A new quote prices a form's items grouped by route: items sharing one AWB number, route and transport mode are billed together, and each route's minimum weight charge is applied once instead of per item. This fixes quotes that came out roughly a third too high on forms with many light items.
  • Clear statuses: Each route group is priced, marked as waiting for missing form data, or flagged as having no CJ rate, and totals state how many routes they cover.
  • Missing-rate report: A new report lists shipment routes that no CJ price covers, most used first, so gaps can be closed before users encounter them.
🌐 WebApproval

Add CJ pricing admin pages and clearer per-route prices on BL Outbound

A new CJ pricing section gives admins full control over rates, and BL Outbound forms now show one clear price per route.

  • Price list import page: Choose CJ's workbook, review a full preview with tabs for the changes, routes priced twice, rates kept but absent from the file, and any skipped rows, then import with a single confirmation.
  • Rate management pages: New pages to search, add, edit, activate and deactivate per-kg and charter rates, plus settings for the pricing modes CJ uses, all filterable and paginated.
  • Missing-rate checklist: Lists BL Outbound routes without a CJ price, most used first, each with the reason and a direct link to the page that fixes it.
  • One quote per route: The "Hitung Harga Referensi CJ" button now prices the whole form in a single step, one line per route with its billed weight, rate, packing costs and total. Each item row shows which route it belongs to.
  • Fairer, self-checking totals: The minimum weight is charged once per route as ERP does instead of per item, unpriced routes are never silently excluded from the total, and the panel asks for a re-quote whenever form data changes.

+11.8k−336
⚙️ BackendApproval

Connect Approval pricing and shipping references to ERP

Approval now speaks the same language as the CJ price list and ERP for transport modes and places, so shipments can be priced and booked without staff translating names by hand.

  • Moda reference: Every transport mode on a form can now be linked to its ERP counterpart, with its own volume divisor, CJ tariff basis and ERP delivery service. The old alias list is replaced by this fuller reference.
  • Origin & destination reference: Free-text places on forms ("RITRA-KUALA KENCANA", "Sidoarjo", "Cakung") are mapped to the city the CJ price list actually prices them as, and to the ERP branch, sender and recipient details an ERP AWB requires. Agreed mappings like Sidoarjo priced as Surabaya and Cakung as Jakarta are seeded in.
  • Safe ERP sync: Administrators can preview exactly what a sync from ERP will change before anything is written, and the apply is refused if the data has moved in between. The sync only adds, links and updates; it never deletes, and hand-picked divisors are preserved.
  • Safer new modes: A transport mode ERP adds that the CJ price list doesn't recognise is flagged "needs review" instead of being priced by guesswork; pricing politely refuses it until an administrator decides.
  • Unmapped values report: The system can list every origin, destination and moda value already appearing on forms that nothing maps yet, with per-form usage counts, so administrators know exactly which gaps matter most.
🌐 WebApproval

New Reference Data hub for shipping, moda and ERP syncing

Reference Data moves out of Form Configuration into its own admin menu, with two brand-new pages that keep shipping references and ERP in step.

  • Dedicated Reference Data menu: A new admin-only "Reference Data" section in the sidebar, grouped into "Shipping & ERP" and "Warehouse & material", so each reference lives in a sensible place instead of an ever-growing tab list. Old bookmarks to the previous location redirect automatically.
  • Origin & destination page: Each real place gets one row showing the form spellings that mean it, the CJ price-list city it's priced as, and its ERP sender and recipient details. Places with no ERP link yet are flagged at a glance.
  • Moda page: Every transport mode shows its ERP link, its volume divisor and where that divisor comes from, whether it matches ERP, and its CJ tariff basis. Modes waiting for a decision are listed first.
  • Sync from ERP with a preview: Both pages can sync from ERP through a dialog that shows every change and warning before anything is written, and never deletes anything. Changes that would alter CJ prices are highlighted.
  • Unmapped values panel: Each page lists form values nothing maps yet, sorted by how often they're used, and one click starts a new entry with that value pre-filled.

+7.7k−2.1k
🌐 Web⚙️ BackendWMS

Add location filters and date sorting to the restriction list

Finding restricted inventory is now much quicker: the restriction list gained the same modern filtering experience as the other inventory screens, plus clearer date tracking.

  • New filters for Plant, SLOC, Bin and Material: Staff can now narrow the restriction list by storage location and material using collapsible filter buttons that show how many choices are selected, with removable chips for every active filter and a one-click "Reset all"
  • Searchable filter choices: Instead of one long checkbox list, each filter searches the warehouse's actual data as you type, showing up to 50 matching choices so even large catalogs stay manageable
  • Clearer date records: Each restriction now shows both when it was created ("Restricted") and when it was cleared ("Resolved") in one Dates column, sorted newest or oldest first, with the person who resolved it visible on hover
  • Phone-friendly sorting: A simple "Order by" dropdown on mobile replaces tap-the-header sorting, and missing resolution dates are labeled explicitly instead of showing misleading values
🌐 Web⚙️ BackendWMS

Rebuild the serial number inventory picker

The dialog for choosing stock when entering serial numbers was rebuilt to be faster, easier to filter, and far easier to read.

  • Modern filter chips: Plant, SLOC, Bin, Material and Unit of Measure filters replace the old category checkboxes. Each group shows a count of active selections, applied filters appear as removable chips, and everything resets with one click
  • Compact table: The picker went from eleven columns to six by merging material code and name, location details, and the three serial capacity figures into clean stacked cells, so the table fits comfortably without horizontal scrolling
  • Clear capacity at a glance: Available serial slots are highlighted in green when there is room, and unknown capacity now shows a clear dash instead of a misleading zero
  • Faster, tidier searches: Filter suggestions load from the warehouse's own data as you type, outdated results are cancelled automatically, and failed loads offer a retry instead of leaving stale rows selectable
🌐 Web⚙️ BackendWMS

Rebuild the transfer inventory picker

Choosing stock for an inventory transfer got the same overhaul as the other pickers: smarter filters, a compact layout, and noticeably faster loading.

  • Modern filter chips: Plant, SLOC, Bin, Material and Unit of Measure filters replace the old scattered checkboxes. Active counts appear on each filter button, selections show as removable chips, and "Reset all" clears everything in one click
  • Compact five-column table: The picker now shows just No, Material, Location, Stock and Actions. Material code and description, the full location hierarchy (SLOC, bin, plant), and available stock with On Test, Blocked, In Transit and Issued indicators are grouped into neat stacked cells
  • Faster stock lookups: The picker now talks to dedicated fast endpoints that find transferable stock directly instead of scanning serial history, so results appear much sooner on large warehouses
  • Reliable searching: Typed filter searches are debounced and outdated requests cancelled, with clear retry messages if a lookup fails
🌐 Web⚙️ BackendWMS

Rebuild the adjustment inventory picker

Picking inventory for a stock adjustment was rebuilt around a clearer two-step flow, replacing three separate popups with one guided dialog.

  • Guided two-step selection: Instead of juggling three overlapping popups, staff now pick a material and then its storage location in one window, with a visible "1. Material > 2. Lokasi" progress trail and a back button between steps
  • Full filtering on both steps: Plant, SLOC, Bin, Material and Unit of Measure filters are available when choosing a material, and location filters appear on the second step. Selections show as removable chips with counts, plus a "Reset all" option
  • Selections survive paging and closing: Chosen rows and edited quantities persist while paging, filtering, switching steps, or closing and reopening the dialog, so nothing is lost mid-adjustment
  • Clear loading feedback: Clicking "Lokasi" shows a spinner on the button, skeleton rows while lists load, and contextual messages like "Memuat lokasi inventory...", with buttons disabled during transitions to prevent double-clicks
  • Zero-stock materials stay visible: Materials with no remaining stock still appear in the list so they can be adjusted, matching how the adjustment process actually works
⚙️ Backend🌐 WebWMS

Speed up dashboards and inventory list loading

A coordinated performance release across the warehouse app and its API makes the dashboard and inbound screens feel noticeably lighter and quicker.

  • Faster dashboards: The dozens of behind-the-scenes data lookups that fill the dashboard cards and charts now run in parallel instead of one after another, so the whole dashboard finishes loading sooner on every warehouse variant
  • Faster inbound and outbound item lists: Serial numbers for a page of items are now fetched in one batched request instead of one request per item, removing a major slowdown on pages with many rows
  • Lighter app download: Unused bundled scripts were removed and web server compression enabled, cutting the initial JavaScript download by roughly a third (about 4.4 MB down to 3.1 MB uncompressed)
  • Fewer redundant requests: The user's assigned warehouse is now fetched once per page load and shared across the menu, header and dashboard instead of four separate requests, with dashboard counters animating on a single shared timer to reduce background work
  • Resilient dialog lookups: The material and location lists inside inbound dialogs now load only when a dialog is first opened, keep working if one list fails, and retry cleanly the next time
🌐 WebWMS

Smooth the sidebar expand and collapse animation

Collapsing the navigation sidebar is now a fluid animation instead of an abrupt snap.

  • Fluid transitions: The sidebar and the page content beside it now glide smoothly over 300 milliseconds when expanding or collapsing, instead of jumping instantly between states
  • Graceful label fading: Menu titles, section captions and badges fade and slide away as the sidebar compacts, rather than disappearing mid-word, and reappear cleanly on expand
  • Charts keep their size: A resize signal fires after the animation finishes, so charts and tables beside the sidebar re-fit to the new width without being cut off mid-transition
⚙️ BackendTMS

Lay the groundwork for Excel-based AWB uploads

The API gained a complete, fully tested channel for receiving AWB entry files as Excel uploads, delivered switched off so current uploads are untouched.

  • A dedicated upload channel, ready but hidden: A new submission endpoint for AWB Excel files is built and covered by 257 passing tests, but it answers as if it does not exist until the feature is switched on, and it stays out of the API documentation so nothing can call it early
  • Safe by design: Files are checked for type and exact size before anything is stored, each upload carries a unique key so a retry can never create a duplicate job, and a half-sent file is rejected with a clear message instead of being silently accepted
  • Protected against overload: When the server is already processing another upload, new submissions receive a friendly "try again shortly" message rather than piling up
  • No change to current behavior: Existing uploads, databases and storage are completely unaffected; enabling the channel later is a configuration decision

+1.6k−1.4k
🌐 WebWMS

Fill wide screens and smooth dialog closing

The warehouse web app now uses the whole screen on large monitors, and closing a dialog no longer flashes black.

  • Full-width on big monitors: On screens wider than about 1940px, the app previously shrank into a centered 1920px box with empty gaps on both sides and above the header. The layout now stretches edge to edge at every screen width; screens of 1920px and below look exactly as before
  • Cleaner dialog closing: When a dialog closed, its tinted backdrop faded out through a flash of solid black. The navy tint now stays until the backdrop has fully faded, so closing a dialog is a smooth, single-step transition
  • No layout ripple: Verified that page positions at common laptop sizes and screenshots at desktop and phone sizes are pixel-identical to before, so only the wide-screen gap and the closing flash changed
🌐 WebWMS

Complete the redesign of every popup dialog

The final batch of popup dialogs now follows the modernized layout, covering forms, inventory, uploads, and confirmations across the warehouse app.

  • One consistent dialog layout: Every remaining dialog now shares the same design as the previously migrated ones: a fixed header with a large, easy-to-tap close button, content that scrolls within a clearly bounded frame, and Save/Delete/Cancel actions always visible at the bottom instead of being cut off or hidden behind scrolling
  • Shipment details as readable facts: The shipment detail dialog now presents fields like Subject, Requested By, dates, PIC, and Address as cleanly labelled facts instead of a cramped wall of input boxes, with the status history table below and its page controls always visible in the footer
  • Fixes while migrating: Corrected the shipment status dialog so it shows which shipment you are updating, and made table rows wrap long values instead of breaking the layout; delete and cancel confirmations now follow the same tidy layout too
  • Themed uploads and evidence: File pickers, warning notices, and delivery photo/PDF evidence controls now match the Light and Dark themes and remain easy to use on touch screens
  • Verified at scale: All 262 production dialogs were automatically re-rendered and checked at desktop and phone sizes in both themes, with form validation, permissions, and keyboard behavior preserved

+425−190
🌐 WebWMS

Redesign the S/N routing slip history dialog

The S/N Routing Slip history dialog on the Network S/N, XL Home S/N, and Tested Inventory Per S/N pages has been rebuilt with a cleaner, consistent layout.

  • Fits any screen: The dialog now fits the screen properly, shows the serial number in the header next to a large close button, and keeps pagination and the Tutup button visible even on short screens
  • Only the history scrolls: Long history lists scroll inside the dialog while the header and buttons stay in place, and long statuses or values wrap cleanly instead of being cut off
  • Honest loading state: The dialog now shows its own "Memuat riwayat..." loading indicator instead of the page's loading spinner painting over it, and "Belum ada data" only appears once the history has actually finished loading
  • Theme aware: Table text follows the Light/Dark theme (including on hover), and phone users still see the column labels (No, Action, Tanggal, User) on each card

+504−85
🌐 WebWMS

Smoother scrolling and refreshed dialogs across the WMS

  • No more scroll bounce: Pages stop overscrolling when you reach the top or bottom, so long lists no longer judder on touch screens and trackpads.
  • Scrolling over tables restored: Scrolling with the mouse wheel or a swipe now works when the cursor is over a data table, instead of getting stuck. Horizontal table scrolling still works as before.
  • Refreshed pop-up dialogs: View and edit dialogs got a cleaner look with properly aligned titles, footers, and buttons, so actions like "Tutup" and "Simpan" sit where you expect them.
  • Polished form fields: Input boxes and dropdowns now have consistent heights, borders, and focus highlighting, and dropdown fields show a clear arrow icon.
  • Select and click in tables: Cell text in tables can be selected and copied again, and document numbers (DO, AWB, adjustment, transfer numbers) are now clearly clickable links that open the detail page.
🌐 WebWMS

Account menu now readable in every theme

  • Fixed unreadable account menu: The profile and logout menu under your account name in the header was nearly invisible in some themes because it borrowed colors from the dark sidebar. It now has its own background and text colors that match the active theme.
  • Clearer menu actions: The "Profil" and "Log out" options now have icons, comfortable touch-sized rows, and hover highlighting, so it is obvious what each option does.
  • Logout stands out: The "Log out" option is shown in a distinct warning color, separating it from normal navigation.
  • Verified contrast: Text in the menu meets readability standards in all four themes (Light, Dark, Cosmic, Corporate), in normal, hover, and pressed states, on both desktop and phone screen sizes.

+17.4k−12.9k
⚙️ BackendTMS

Stop accidental double dispatches at the source

Dispatching a manifest (marking it as departed) is now protected against being triggered twice, even when two people click at the same moment.

  • One departure only: The system now claims the departure in a single atomic step, so a double click, two open tabs, or two users dispatching simultaneously can never send a manifest twice or corrupt its shipment statuses
  • Clear Indonesian explanations: A manifest that already departed returns "Manifest sudah diberangkatkan dan tidak dapat diberangkatkan kembali" instead of a generic server error, and any other invalid state names the current status and asks the user to reload
  • Empty manifests rejected cleanly: Trying to dispatch a manifest without any AWBs gets a friendly conflict message ("add at least one AWB first") instead of an internal error
🌐 WebTMS

Make manifest dispatch safe from double clicks and stale pages

The manifest pages now double-check everything before dispatching and guide the user with clear Indonesian messages instead of raw errors.

  • Fresh status before sending: Before every departure the app re-reads the manifest's latest status from the server, so a manifest that already departed (or has no AWBs) is stopped with a specific message before anything is sent
  • Locked while working: All edit buttons, AWB inputs and checkboxes freeze while a dispatch or AWB change is in progress, so a fast double click can no longer submit the same action twice
  • Honest outcomes: If the connection drops mid-request, the page says the departure could not be confirmed and refreshes to show the real status, rather than showing a false success or a technical error
  • Reload prompt when data is stale: If the page cannot refresh its data (for example a gateway hiccup), a warning banner with a "Muat ulang data manifest" button appears and dispatch is paused until the data is reloaded
🌐 WebWMS

Give the WMS a full visual refresh with dark mode and clearer screens

The whole WMS web application received a brand refresh in Light and Dark themes, covering the navigation, dashboards and data tables.

  • New LEN look: Navy sidebar with the LEN logo, a cleaner header showing the active warehouse at a glance, a one-click light/dark toggle that remembers the user's choice, and softer "natural" status colors that are easier on the eyes during long warehouse sessions
  • Denser, more useful dashboards: All dashboards (every business type) were rebuilt to keep every figure the old ones showed but in less space: a Today card, weekly inbound/outbound stage cards, compact breakdown tiles, and ranked lists that are easier to read than pie charts
  • Tables fit the screen: On 61 list and report pages, related columns are now merged into stacked cells (e.g. part number, name and plan in one column), so wide tables no longer require sideways scrolling; every field, sort and permission is unchanged
  • Clearer inbound progress: The allocation progress is now shown as a Stage column (Staged, Confirmed, Allocated) with a small step indicator, so a document is never displayed as "partly" confirmed when confirmation is all-or-nothing
  • Optional 14/30-day trend card: A new inbound vs outbound trend chart appears on dashboards; it stays hidden without errors until the matching API update is deployed
🌐 WebWMS

Redesign WMS detail screens with progress steps and a modern look

Following the main refresh, all 36 detail, action and management screens were redesigned to match, covering inbound and outbound detail for every business type, delivery, adjustments, transfers, serial numbers and more.

  • Workflow progress at a glance: Inbound, outbound and change-material detail pages now open with a progress strip showing exactly which stage the document is at (Draft, Staged, Confirmed, Allocated) and a plain-language note of what happens next, so staff no longer guess where a document stands
  • Cleaner page structure: Every detail page now has a clear header with a back link, the document number with its status, key facts (date, item count, related document numbers), and the action buttons grouped in one place
  • Readable forms and item lists: Document fields sit in a tidy auto-fitting grid, and item lists merge related columns into compact cells with chips instead of wide colored rows
  • Fully themed pop-ups: Every modal and input field now follows the Light and Dark themes, including date pickers and read-only view screens, instead of staying light-only
  • Clearer test results: Confirm-on-test shows serial number matches and mismatches as green and terracotta chips (mismatches get an alert icon) instead of hard-to-read bright labels

+605−170
🌐 WebTMS

Streamline app release publishing panel

  • Upload as a pop-up form: Publishing a new app release now happens in a focused dialog (version, title, release notes, APK file) instead of a panel that pushed the page content down, and the button is reachable from the latest-release card, the empty state, and the table toolbar.
  • Clearer loading feedback: The releases table shows a spinner overlay while data loads, and the refresh button spins and locks while reloading so it cannot be double-clicked.
  • Tidier table layout: Download and delete actions are combined into a single "Aksi" column with hover tooltips, freeing a column for release information.
⚙️ BackendWMS

Fix outbound deletion failing on shared meter serials

  • Deletion no longer errors: Deleting an outbound document whose meter serial is linked to more than one item used to fail with a "Sequence contains more than one element" error. Stock is now released correctly, counting each item once even when its serial link is duplicated.
  • All-or-nothing cleanup: Stock reservations, serial statuses, and the document itself are now committed together, so a failed deletion no longer leaves stock numbers half-released or inconsistent.
  • Safer guards: Deletion is refused when the stock reservation is insufficient instead of pushing stock negative, and already-issued documents and other warehouses remain protected, including status records that share identical timestamps.

+4.2k−341
⚙️ BackendTMS

Faster AWB file validation with fewer database reads

Uploading an AWB file for checking is now noticeably lighter on the database. The validation step was re-checking several reference lists it never actually used, so those extra lookups were removed without changing any validation rule.

  • Less database load per upload: Checking a file for errors now performs only the three reference lookups it truly needs (services, truck types, item types), instead of also pulling mode, courier, payment, and origin lists on every part of a large upload
  • Same validation results: Every rule is unchanged: truck requirements, document checks, required fields, and service name handling all behave exactly as before
  • Templates keep their dropdowns: Downloading a blank AWB template still loads all reference lists for the dropdown columns, so nothing about filling in the template changes
  • First step for background imports: This is the groundwork for a planned background import system, which will let staff close the browser while a large file processes
📱 MobileTMS

Courier navigation now uses confirmed location pins

When a courier taps Google Maps on a shipment, the app now checks first whether an exact door location is already on record and navigates to that pin instead of searching the address text.

  • Exact pins take priority: If a confirmed pin exists (set by an operator, captured from a courier's GPS, or recorded at a previous delivery), Maps opens directly at that door position rather than a generic address search
  • Area estimates are clearly labelled: When only a rough neighborhood-level area is known, the app explains it is an estimate (with its approximate radius) and asks for confirmation before opening Maps, so couriers know not to trust it as a door position
  • Why it matters: Drivers are directed to the actual recipient door instead of a street-level search result, cutting wasted trips and calls for hard-to-find addresses
  • Graceful fallback: If the pin lookup fails or the courier lacks access, the app quietly falls back to the normal address search so navigation always works
📱 MobileTMS

Couriers can report their position and save exact location pins

Couriers on the road can now report where they are directly from the mobile app, and can save a precise GPS pin for a recipient or pickup address so future deliveries navigate to the right door.

  • Position reports from the field: On an active delivery run, manifest, or pickup, couriers see a "Laporkan posisi" action that captures their current GPS, attaches an optional note and up to five photos, and posts the report straight to the shipment's timeline and Live Monitoring
  • Save exact recipient and pickup pins: A "Simpan titik lokasi ini" action lets the courier record a door-level GPS point for the address they are standing at; future shipments to that address can navigate straight to the pin
  • Quality safeguards: Pins are only accepted when GPS accuracy is 50 meters or better, the phone must be within Indonesia's bounds, and replacing an existing exact pin requires an explicit confirmation, keeping stored locations trustworthy
  • Reports are confirmed before sending: Each position report shows the coordinates for a final check, and if the connection drops mid-send the courier is warned to verify the timeline before resending, avoiding duplicate reports
  • No background tracking: Location is only captured at the moment the courier taps the action; nothing is tracked or reported continuously

+2.0k−471
⚙️ BackendTMS

Smarter delivery printouts: fewer pages, complete contact details, cleaner forms

Delivery documents now print as a compact set of pages that reflect who is actually on the truck, with the detail block finished properly.

  • Grouping that matches real deliveries: Print pages are now combined when shipments come from the same origin branch and go to the same full delivery address, instead of only matching on route. Shipments with different senders or contacts on that stop are all preserved on the shared page, so nobody's details silently disappear from the paperwork, and unclear addresses still get their own page rather than being wrongly merged
  • Honest origin labels: The origin shown on each print page now comes only from the shipment's recorded origin branch. Sender addresses or delivery villages are never shown as the origin, so drivers and receiving branches always see the true pickup branch
  • Complete detail block: The Koli, Kilo, Volume, Quantity and Biaya Packing section prints as a tidy aligned list. Empty fields get a fill-in line instead of underscores, large numbers scale to fit instead of overflowing, and Biaya Packing sits with the other totals
  • AWB numbers on the DRS sheet: The DRS printout lists each shipment by its AWB number again, matching how staff reference shipments on paper
⚙️ BackendTMS

Open the activity log fast, even with a long change history

The activity log page now loads in two steps so browsing history is quick and the full record is still one tap away.

  • Fast list, detail on demand: The list loads each entry's summary only, without the heavy before-and-after value records, so the first page appears quickly even for accounts with a long history
  • Full change record on tap: Opening an entry's detail fetches its complete record with old and new values on demand, so nothing is lost compared to before
  • Lighter database work: History queries skip re-reading unchanged data and fetch only the display name they need, keeping the page responsive as records accumulate
🌐 WebTMS

Refreshed activity log page with faster loading and clearer filters

The activity log page gets a cleaner toolbar and no longer freezes while it loads.

  • Non-blocking refreshes: The table stays visible behind a small loading spinner when filters change or more entries load, instead of the whole page going blank on every search
  • Clear filter toolbar: Search, from/to date pickers, and the "search in old/new values" options sit in one tidy bar, styled consistently with the rest of the TMS and WMS pages
  • Detail while you wait: Opening an entry shows a loading state inside the detail card until its full change record arrives, and shows a clear note when an action has no stored values
🌐 WebTMS

Sleeker sidebar: readable profiles, tidy scrolling, smooth resizing

A pass of polish on the navigation sidebar so it looks and behaves right on every screen.

  • No more cropped profiles: Long user names, roles and email addresses no longer get cut off at the drawer edge. Names wrap to two lines, roles and emails truncate neatly with the full value visible on hover, and the avatar gets a subtle ring
  • Working custom scrollbar: The slim rounded scrollbar now actually appears in Chrome and Edge (a browser quirk previously forced the bulky grey native bar). It stays hidden until you hover the menu, keeping the sidebar clean
  • Clean separation: A subtle divider now separates the profile card from the menu below it
  • Responsive drawer: Resizing the window between desktop and mobile widths now switches the sidebar to the correct mode immediately, instead of needing a page reload to catch up
🌐 WebTMS

Expired sessions now sign users out cleanly instead of throwing errors

Users whose login has expired are now taken back to the sign-in page quietly, instead of seeing unhandled error screens.

  • Clean redirect to login: When a session expires mid-use, the app cancels the pending action and sends the user to login without an error popup
  • No more duplicate refresh storms: Several tabs or requests expiring at the same moment now trigger a single refresh attempt, and a failed refresh clears the stale session completely so the app lands on login in a clean state
  • Real failures stay visible: Genuine server problems are no longer mistaken for an expired session, so users are not signed out when the server itself is briefly unavailable
📱 MobileTMS

Proof of delivery now records the exact GPS position of each stop

Delivery confirmation locations are now captured precisely, which makes the GPS evidence on each POD trustworthy.

  • Fresh GPS at every submit: Each delivery confirmation takes a new GPS reading at the moment of submission instead of reusing a position cached from the previous stop, so two nearby deliveries no longer report the same coordinates
  • Location source is recorded: Every POD now carries a marker showing the coordinates came from the device GPS, so back-office staff can trust the location evidence when reviewing deliveries or customer disputes
  • Clearer GPS problems: When location is unavailable, the app now distinguishes GPS being switched off, permission denied, and timeouts, each with its own specific guidance for the driver

+1.0k−160
⚙️ BackendTMS

Exact recipient pins now drive delivery maps

Exact recipient locations are now used for delivery tracking whenever a parcel only had an approximate area estimate, both on tracking pages and on courier trip maps.

  • Backfilled 10,028 parcels: A one-time repair filled in missing or approximate recipient pins for 10,028 AWBs in the production WMS database, 9,520 of which had no exact pin at all. Every updated record was verified afterwards with zero mismatches, and an encrypted backup was saved for rollback.
  • Exact beats estimate: When a shipment has no exact pin, the system now looks up a saved recipient address that matches the same customer, destination village, and full address text, and uses that saved pin instead of falling back to the village-wide estimate.
  • Ambiguous matches are refused: If the saved addresses for the same address text point to different coordinates, the match is skipped rather than guessing, so tracking never shows a pin for the wrong house.
  • Faster trip maps: Vendor and DRS trip maps now resolve saved pins in batches of up to 500 parcels instead of one lookup per parcel, keeping large delivery runs responsive.
  • Safety rails: The repair tool previews before applying, enforces a row cap, takes an encrypted backup before committing, and the village estimate remains as a fallback when no reliable exact pin exists.
⚙️ BackendTMS

Allow villages with the same name in different districts

Village master data no longer blocks legitimate entries just because another village shares the same name.

  • Duplicate names allowed: Many villages across Indonesia share a name, so creating or editing a village now only rejects a duplicate when its official code already exists, not when the name matches another village.
  • Clearer error message: When a duplicate code is rejected, the message now names only the code, so admins know exactly what collided.
🌐 WebTMS

Dashboard maps unified and stock dots now show true totals

The location maps on the Network, B2B, and Channel dashboards were restyled to match the TMS dashboard, and the warehouse maps now show correct stock totals.

  • Consistent look: Map dots now use the same green, amber, and red tones as the TMS dashboard cards, and clicking a location opens a cleaner popup card built from the same design as the dashboard panels, with the map tiles slightly muted so status colours stand out.
  • Popups in Bahasa Indonesia: Each popup now labels what the dot represents (Gudang, Mitra, or Channel) and shows its stock status and quantity. Misleading "Last Restock Date" and "Order Fulfillment" lines that always showed today's date and 0 / 0 orders were removed; the last-updated date appears only when a real one exists.
  • Correct stock per warehouse: The Network and B2B maps previously drew one dot per inventory row, stacking dozens of dots on each warehouse and understating its stock. Each warehouse now has a single dot sized by its total summed stock, matching how the Channel map works.
  • Graceful empty state: When no warehouse has saved coordinates, the Network and B2B dashboards now show a clear "no locations" message instead of a blank map, and warehouses missing coordinates no longer break the page.
🌐 WebTMS

TMS dashboard map cards redesigned and never clipped

The TMS dashboard map tooltips became rich status cards, and they now stay fully visible anywhere on the map.

  • Card-style tooltips: Hovering a kota now opens a polished card with an icon, the area name and province, total AWB count, a delivery-rate badge, a colour-coded status bar, and a breakdown of Terkirim, Di jalan, Menunggu, and Bermasalah counts, plus a hint to click for detail.
  • Cards dodge the edges: The cards previously could be cut off near the map's borders. They now automatically open above, below, or beside the marker depending on the space available, and slide fully inside the map at corners.
  • Stays put while navigating: The repositioning also holds after panning, zooming, or resizing the map, and the card's arrow always keeps pointing at the location it describes.
  • Button alignment: The Live Monitoring button in the page header was resized and aligned to sit evenly with the period tabs.

+5.1k−1.1k
⚙️ Backend🌐 WebTMS

Enter POD for every shipment on a DRS or Manifest in one go

Proof of delivery can now be recorded for an entire delivery document at once, instead of hunting shipments one by one.

  • New "Input POD by DRS / Manifest": Type a DRS or Manifest number on the Shipment Status page and every AWB on that document loads into one form, with the document's date, status, route, driver and vehicle shown up front so staff can confirm they have the right delivery
  • Fill all rows at once: A new "Isi semua baris" option applies one status and date to every empty row (or all rows, with a clear warning when it touches rows already in edit mode), turning dozens of repetitive entries into a single action
  • Search by document toggle: Choose DRS or Manifest with a toggle, press Enter to load, and only shipments the user is allowed to touch appear in the list
  • Restyled form: The POD input dialog now matches the newer app look with a gradient header, rounded inputs, status pills per row and clearer progress messages while saving
🌐 WebTMS

Print the AWB form straight from a DRS, with PO numbers on the DRS print

A new way to print air waybill forms for a whole delivery, plus more useful numbers on the existing DRS printout.

  • New "Print AWB" button: Available on both the Manage DRS list and the DRS detail page, it prints full-page AWB forms for every shipment on the delivery without opening each shipment individually
  • One page per route: Shipments sharing the same origin and destination merge onto a single AWB form carrying the DRS number, with quantities, weights and volumes summed and repeated details printed once, so a ten-shipment delivery does not produce ten separate forms
  • PO numbers on the DRS print: The DRS printout now shows each shipment's PO (reference) number where the AWB number used to be, matching how the paper documents are referenced by customers
⚙️ Backend🌐 WebTMS

Open the notification bell faster, with a cleaner look

The notification bell now opens quickly and matches the dashboard's panel style, even as notification history grows.

  • Opens faster every time: The list loads instantly on repeat clicks and refreshes in the background, and the page no longer counts the entire notification history just to show the first ten, so the bell stays snappy as records pile up
  • Keeps up with growth: New database indexing and a leaner query mean the bell, unread count and "mark all read" stay fast even though every shipment status change adds notifications and none are ever deleted
  • New look: The popup matches the TMS dashboard panels with category icons, shaded unread rows, coloured Urgent/High tags and tinted status words, plus a shimmer loading state and a friendlier empty message
  • Fairer ordering: Read Urgent and High notifications no longer stay pinned at the top forever; once read, they take their place by date like everything else
🌐 WebTMS

Make the TMS dashboard easier to filter and read at a glance

Filtering and exploring the TMS dashboard is smoother, and the map now shows where shipments are heading.

  • Searchable filters: The customer, branch, province and service filters are now type-to-search dropdowns instead of plain lists, so picking from hundreds of customers takes seconds
  • Routes come alive: Selecting a destination city draws arrows and a travelling dot along each route feeding it, making direction of flow obvious at a glance
  • Clear feedback while loading: A spinner pill appears near the top of the page with a specific message such as "Memuat data Jakarta", the selected ranking row shows its own spinner ring, and picking a city previews it on the map immediately instead of waiting for numbers
  • No more scroll jump: Changing a filter no longer snaps the page back to the top, and the selected city is named on the map itself with a one-click way to clear it
📱 MobileTMS

Add photo and GPS evidence to pickup confirmation in the courier app

Confirming a pickup now produces the same kind of evidence as delivery, protecting the company against disputes about whether and where goods were collected.

  • Dedicated confirmation page: Confirming a pickup opens a full page instead of a small popup, showing booking details, notes and evidence in one place
  • Stamped photo evidence: Up to five photos can be attached, each automatically stamped with the location and time it was taken, the same as delivery proof
  • GPS location captured: The pickup's coordinates and resolved address are saved with the status and shown later in the booking's status history, alongside thumbnail photos that open full size
  • Reliable GPS: When a courier switches on location services during confirmation, the app allows a longer moment for the first GPS fix instead of failing immediately
⚙️ BackendTMS

Keep the activity log and notification history fast as data grows

Behind-the-scenes speed work so two frequently used features stay quick as history accumulates.

  • Faster activity log: The "My Logs" page now reads from a purpose-built index instead of scanning the entire audit table, so the first open is no longer slow, and the index is built in a way that never blocks anyone from saving work while it is created
  • Faster notification lookups: The unread count and "mark all read" now query only the notifications that belong to the user, rather than reading the whole ever-growing notification table on every bell click
⚙️ BackendTMS

Pin area locations manually on the map data

Administrators can now set exact coordinates for an area (kelurahan) directly in the area master data, instead of relying only on automatic geocoding.

  • Manual coordinates: Latitude and longitude can be entered when creating or editing an area, and exports include them for review
  • Respects manual fixes: A manually entered coordinate is marked as authoritative, so the automated pin-placement process will not overwrite it later; edits that leave the coordinates blank keep the existing values

+4.0k−898
🌐 WebTMS

Explain every manifest step in Live Monitoring

The Update Status dialog in Live Monitoring now guides staff through each manifest stage instead of just asking for confirmation.

  • Where it is now: Each dialog opens with a clear picture of the manifest's current position, so staff no longer have to guess whether a truck is still on the road or already arrived
  • What saving changes: The dialog spells out exactly what happens when the status is saved, including automatic arrival timestamps, before anything is committed
  • What comes next: Every dialog ends with the next operational step, such as creating a follow-up manifest for transit routes or preparing delivery sheets at the destination
  • Tailored per manifest type: Transit handovers, destination arrivals and vendor handovers each get their own guidance, and vendor manifests now explain that parcels stay with the vendor for onward delivery
🌐 WebTMS

Rebuild the TMS dashboard around a live shipment map

The TMS dashboard has been rebuilt from a list of totals into a map-first operations view that answers "where are our shipments and what needs attention" at a glance.

  • Interactive Indonesia map: Destination cities appear as bubbles sized by shipment volume, origin branches as markers, and the busiest routes as connecting lines; hovering shows each city's delivery progress and problem counts, and clicking a city filters the whole dashboard to it
  • Dashboard-wide filters: Filter by period, customer, origin branch, service type and destination province or city; the filters stay in the web address, so refreshing, sharing the link or going back returns to the exact same view
  • Created vs delivered trend: A new trend chart shows how many shipments were created against how many were delivered, per day or per month depending on the range, with hover details for each date
  • Rankings and action queue: Top destination cities, customers and origin branches are ranked by volume with delivery rates, and a "Perlu Tindakan" panel gathers everything waiting on staff: problem shipments, AWBs missing manifests or delivery sheets, and bookings waiting for pickup
  • Every figure is a doorway: Each number and chart segment opens the matching AWB or pickup list with the same dates, statuses and filters already applied, so a count on the dashboard and the list it opens always agree
⚙️ BackendTMS

Power the TMS dashboard with shipment insights and consistent filters

Backend support for the new TMS dashboard: shipment totals, destination areas, origin branches, busiest routes, top customers and delivery trends, all computed within each user's own data visibility.

  • One complete dashboard feed: A single shipment insights summary serves the whole dashboard, covering status totals, per-city breakdowns, origin branches, the busiest routes, top customers and the created-vs-delivered trend, so the page needs fewer round trips and always shows consistent numbers
  • Filter by destination and service: Shipment lists, searches and exports now support destination province/city and service filters, matching what the dashboard offers, so drilling down from a dashboard figure lands on exactly the same shipments
  • Dashboard and lists always agree: Destination and origin filtering uses the same rules in both the dashboard and the shipment lists, eliminating cases where a dashboard count opened a list showing a different number
  • Customer accounts handled safely: Customer login accounts see only their own shipments, and an account that is not yet linked to a customer is shown a clear message until an administrator completes the link, instead of seeing an empty or misleading dashboard

+2.4k−1.6k
🌐 WebTMS

Smoother tracking map with clearer legends and route detail popups

A round of polish on Live Monitoring and the tracking map: legends now tell the truth about what is on the map, opening a shipment's detail shows the same numbers as the list, and map movements no longer flash or land on grey squares.

  • Honest legends: Every tracking map now has a legend card that lists only the colours and marks actually drawn; two maps never explain the same colour with different meanings again
  • Route detail in the popup: Clicking Lacak on a manifest or courier run now opens a detail window that shows its full destination list and the same delivery progress bar as the list, so the two views never disagree
  • Vendor destinations named: A vendor manifest now shows the actual cities or regencies its shipments are going to, not just a blank destination
  • Smoother map flights: Zooming across the country fades the route lines during the move and preloads the destination map tiles, so the map lands sharp instead of flashing a giant dot or grey squares
  • Calmer refreshes: Map updates that bring nothing new no longer redraw the route, so the pulsing position markers keep running without flicker
🌐 WebTMS

Clearer map origins, compact page titles and bolder tracking buttons

Three refinements to how shipment tracking reads at a glance: the start of a trip is no longer mistaken for a delivered parcel, page titles take less space, and the tracking buttons are easier to spot.

  • Origin marker fixed: The start of a trip (pickup point or departure branch) is now a dark blue badge with a warehouse or shop icon; it used to be green, the colour that everywhere else means delivered
  • Same legend everywhere: The map legend is now a shared fold-away card used on Live Monitoring and on every tracking map, always listing only the marks actually on the map
  • Compact page headings: The title banners across Manifest, DRS and AWB pages were rebuilt as one shared design, giving every page more usable space
  • Bolder Lacak buttons: The Lacak and Update buttons on monitoring cards are now filled pill buttons that are easier to find and tap
🌐 WebTMS

Purple banner headers on every form page

The Add, Edit and Detail form pages (AWB, Booking, Warehouse, Invoice and others) previously had plain white title bars that did not match the purple banners used on list pages. Every form page now opens with the same compact purple banner, so the whole application looks like one product.

  • Consistent look: All form pages share one banner design, matching the list pages that were updated earlier
  • More room for content: The compact banner starts content higher on the screen, so less scrolling is needed to reach the actual form
  • Clear main action: On the banner, the back button is subtle while the page's main action (Edit, Export, View Status) stands out in solid white, so there is always one obvious next step
  • Better on mobile: The wide item tables on the AWB request form now scroll sideways inside their own card instead of stretching the whole page
🌐 WebTMS

Delivery tracking maps that are easier to use, with proof of delivery on the pin

Clicking a dot on the tracking map used to take several tries. The pins now have a much larger invisible tap area, so one tap is enough even when several pins sit close together, and the keyboard works on them too.

  • Delivery proof on the map: Tapping a delivered parcel's pin shows who received it, when, any notes, and up to three photos of the handover, without leaving the map
  • Quick AWB shortcut: Every parcel popup has a direct button to the AWB's status screen, so updating a shipment after a failed attempt takes one tap
  • Bigger tap targets: The visible dot stays small and tidy, but a 44-pixel invisible area around it makes pins far easier to hit on touch screens
  • Multiple parcels at one address: When several shipments share the same drop point, the popup offers a picker so each one can still be opened individually
⚙️ BackendWMS

Unit codes now managed per warehouse instead of a fixed built-in list

Which units of measure (PCS, BOX, ROL and so on) a warehouse may use was previously a fixed list written into the system. It now lives in a database catalogue per warehouse, so administrators control it, and every entry path checks against it.

  • Per-warehouse control: Each warehouse has its own unit catalogue; administrators add new codes from the reference panel without code changes or redeployment
  • Applied everywhere at once: Manual entry and Excel upload for inbound, outbound, adjustments, transfers and tested inventory all validate against the same catalogue, replacing the old fixed list
  • Stock identity protected: Existing unit codes can never be deleted or renamed, because they identify stock and transaction history
  • Fails safely: If a warehouse has no catalogue configured, the system reports it clearly instead of silently accepting anything
🌐 WebWMS

Unit dropdowns and filters now follow each warehouse's catalogue

The WMS web pages previously showed the same hardcoded unit list everywhere, regardless of warehouse. Dropdowns and filters on all inventory pages now load each warehouse's own unit catalogue, matching what the system actually accepts.

  • Correct options per warehouse: Unit dropdowns on inbound, outbound, adjustment, transfer, serial number and tested inventory pages show exactly the units configured for the signed-in operator's warehouse
  • Filters follow too: The unit filter chips on inventory pages come from the same catalogue, so users are never offered a filter that matches nothing
  • Guided administration: The reference panel shows a clear warning on the unit catalogue explaining that codes cannot be deleted or renamed and why new measured units need review first
  • Clear failures: If the catalogue cannot be loaded, pages show a retryable error message rather than quietly falling back to the old fixed list

+4.0k−1.1k
⚙️ BackendWMS

Fix mobile app sessions dropping after login expires

Fixed a problem that blocked WMS mobile users partway through a shift: after a login token expired, the app's renewal request came back incomplete, so it could not recover and users were stuck.

  • Session renewal works again: the mobile app now receives its renewed access and refresh credentials in the standard response format, so it can quietly extend a session instead of failing until the user logs in again.
  • Web login untouched: browser-based logins, token lifetimes, and security limits behave exactly as before.
  • Retries are safe: when the app retries a renewal after a weak connection, the server returns the same answer instead of issuing confusing duplicates.
⚙️ BackendTMS

Upload large AWB files without duplicates or timeouts

Overhauled the bulk AWB Excel upload on the server side, so staff can send much bigger files and never create the same shipment twice after an interrupted upload.

  • Files up to five times larger: one Excel file can now hold up to 1,000 AWB rows instead of 200. The server reviews the whole file up front, then saves it in small batches so no single batch runs into a time limit.
  • Duplicate protection: if an upload is interrupted and the same file is sent again, rows already saved are recognized and skipped rather than being created twice. Rows without their own AWB number are matched against identical shipments the same user made in the last 24 hours.
  • Honest reporting: rows skipped as already saved are counted separately from errors, and each one shows which AWB number it was saved as and when.
  • Fix-and-resend: a new download produces an Excel file containing only the rows that failed, each with its error explanation in an extra column, ready to correct and upload again.
🌐 WebTMS

Run AWB uploads in the background with pause and resume

Rebuilt the AWB upload page so large files save in the background while staff keep working, and interrupted uploads recover instead of starting over.

  • Runs in the background: once saving starts, users can move to other pages; a progress indicator in the corner of the screen keeps showing the percentage and live counts of saved, skipped, and failed rows.
  • Stop and resume: uploads can be stopped on purpose, and if the connection drops, a Continue button picks up exactly where it left off without re-saving what is already done.
  • Repeat confirmation: when rows look identical to shipments created in the last day, they are flagged and skipped by default so AWBs are not duplicated; a checkbox lets the user confirm they really are separate parcels and save them anyway.
  • Quick error recovery: after the upload finishes, one download delivers an Excel of only the failed rows with the reasons attached, ready to fix and re-upload.
  • Clearer flow: the page now walks through three visible steps (choose file, review contents, save), with drag-and-drop and a pre-upload review that shows what is ready, what will be skipped, and what needs fixing.
🌐 WebTMS

Live monitoring map and list rebuilt for clarity and speed

A major visual refresh of the Live Monitoring page (the two monitoring PRs merged that day), making the map and the shipment list easier to read, smoother to use, and honest about what each pin means.

  • New look, more map: the page gets a compact branded header and a tighter layout, so the map fills the whole screen below the controls instead of scrolling.
  • Clearer shipment cards: each trip row shows its route as "origin → destination" (with real destination cities for vendor trips, since those have no destination branch), departure time, and a progress bar of how many AWBs are done versus still moving. Alerts appear as a clear "Needs attention" highlight.
  • Better map behavior: clicking a shipment draws its full route; routes now cross-fade when switching, the view flies straight to the selected route, and a "show all" button returns to the overview. Pins no longer get covered by background icons, so every pin is clickable.
  • Interactive legend: the map's color key moved into a collapsible legend panel that adapts to what is on screen, explaining every pin, line, and pulse instead of a static footnote.
  • Smoother transitions: tabs, filters, and route loads now animate as one movement, with new rows fading in and no page jumping.
⚙️ BackendTMS

Trip monitoring shows where vendor shipments are headed

Added destination information for vendor trips to the monitoring service, so dispatchers can see where goods actually go even when a trip has no destination branch of its own.

  • Destination cities per trip: each trip now reports the top five cities/regencies its AWBs are delivered to, with the busiest destination first, plus a total count of distinct destinations.
  • Searchable by destination: the search box on trip monitoring now also matches destination city names, so typing a city finds trips heading there.
  • Clearer overdue wording: attention messages for long-running trips were rephrased in plainer Indonesian (for example, "more than 3 days since departure, arrival not yet recorded").

+6.2k−660
🌐 WebTMS

Overhaul Live Monitoring with clickable routes and map place search

The Live Monitoring page was rebuilt so dispatchers get a real operational picture instead of a static list:

  • Click any row to see its route: Selecting a pickup, trip, or delivery run now draws its full route on the map, with origin, destination, and each parcel's drop point. Other vehicles dim, a "back to all data" button restores the overview, and a "Lacak detail" shortcut opens the full tracking timeline.
  • Vehicles without a position report still appear: Items that have never reported a position now show at their last known point, such as the pickup location or the branch a trip left from, drawn as a dashed badge so staff can tell estimates from confirmed reports at a glance.
  • Place search in the map picker: When placing a delivery pin, staff can now search for a building, company, street, or area by name. The picker even searches the recipient's name and address automatically and flies to the best match inside the address area, so pinning a destination usually takes one click instead of hunting on the map.
  • Clearer loading and clustered badges: Skeleton loaders, per-tab spinners, and a thin progress bar replace blank flashes. Vehicles parked at the same spot (several trips from one branch) now share a single badge with a count instead of piling up.
  • Status history pin labels: The map legend and popups now distinguish device GPS, courier GPS at handover, staff-placed points, and area estimates, so everyone reading the map knows how trustworthy each point is.
⚙️ BackendTMS

Overhaul Live Monitoring with clickable routes and map place search

Backend support for the Live Monitoring overhaul, plus two fixes for location data quality:

  • Last-known locations on the map: Pickups, trips, and courier runs that have not reported a position are now placed at their last known point: the pickup location, the branch a trip departed from, or the courier's home branch. Vendor trips also show the destination area of the parcels they carry.
  • Place search for the location picker: A new search service returns suggestions for businesses, streets, and areas across Indonesia as staff type in the map picker, sorted nearest first. Search results only guide the user; the point actually saved is always the one they click on the map.
  • Pin precision fix: A calculation error was storing automatic delivery pins and area coordinates rounded to two decimal places, putting them up to about a kilometer off. New pins are stored at full precision, and a repair script re-computes the affected existing pins (about 1,900 shipments).
  • Pins follow destination edits: When a shipment's destination village or address is changed, through any editing path including approved edit requests, its old pin is cleared so the map immediately reflects the new destination instead of pointing at the previous address.
🌐 WebTMS

Bulk POD status upload now runs in the background with stop, resume, and a failed-rows file

Uploading hundreds of POD statuses from Excel used to time out and fail as one big request. The whole flow was rebuilt:

  • Guided three-step dialog: Pick the file, review the check results, then save. The file is validated up front and split into three counts: rows ready to save, rows already saved (skipped, not errors), and rows that need fixing, with the first 20 problems listed on screen.
  • Background progress: Saving happens 25 rows at a time so no request can time out. The dialog can be closed and staff can move to another page while an "Upload data" panel in the bottom corner keeps counting, shows estimated time left, and announces completion anywhere in the app.
  • Stop and resume: An upload can be paused after the current batch and resumed from where it stopped, including after a connection drop. If the browser tab closes mid-upload, re-uploading the same file simply skips rows already saved, so nothing is ever duplicated.
  • Download just the failed rows: One button produces the same Excel template containing only the failing rows, each with its reason in a new red "Keterangan Error" column, ready to fix and re-upload as-is.
  • Protects against accidental loss: The browser asks for confirmation before closing or reloading the tab while an upload is running.
⚙️ BackendTMS

Bulk POD upload in parts, failed-row workbook, and clearer AWB upload limits

Backend support that makes large POD status uploads reliable, and removes a silent data-loss trap in AWB uploads:

  • Uploads in parts: Bulk POD files are now processed 200 rows per request, so even a 700-row file no longer hits the time limit that previously failed every remaining row. The full file is still validated as a whole, so duplicates across parts are caught exactly as before.
  • Failed rows as a ready-to-fix workbook: A new download returns the operator's own uploaded template containing only the rows that failed, with a clearly visible "Keterangan Error" column explaining each problem. Sheets, dropdowns, and formatting are preserved, so it can be corrected and re-uploaded as-is.
  • Re-uploading is safe: Rows whose shipment already has the same status are now reported as "skipped" instead of "failed". An interrupted upload can simply be sent again, and the summary distinguishes saved, skipped, and failed counts.
  • No more silent truncation in AWB uploads: The AWB Excel upload previously processed only the first 200 rows and quietly ignored the rest. Files with data past row 200 are now rejected up front with a clear message telling the operator to split the file.
📱 MobileTMS

Courier app shows booking materials list and instant search

Two courier-facing improvements to the pickup flow:

  • Materials list on pickup detail: The pickup detail screen now includes a "Daftar Barang" card listing every item on the booking, with its description, piece count (Qty), and total weight and volume per line, plus a row and piece-count summary in the header. Couriers can verify what they are collecting without opening the web app.
  • Search-as-you-type: The search bar now filters the booking list automatically half a second after typing stops, no Enter press needed. Clearing the field instantly restores the full list.
  • Search that actually finds senders and recipients: A search bug was making lookups by sender, recipient, or reference number return nothing. One search term now matches across booking number, sender, recipient, reference, and creator names.

+14.8k−103
⚙️ BackendTMS

Live shipment monitoring with position reports, map pins and photo evidence

The system can now show where every shipment actually is, in real time, instead of only listing status changes.

  • Live Monitoring dashboard: A new monitoring view shows all active pickups, line-haul trips (own trucks, air cargo, sea cargo, and vendor handovers) and courier delivery runs in one place, with summary counts, the latest reported position of each vehicle, and flags for items that need attention (for example a pickup running late or a parcel waiting too long)
  • Position reports with evidence: Drivers and couriers can report where the goods are right now from the field, with an optional location note and up to 5 photos. One report updates every shipment on that vehicle at once, so a truck checkpoint or a courier stop appears on all the AWBs being carried
  • Automatic map pins: Every shipment gets a destination pin automatically: the exact point already known for that customer address, otherwise the centre of the destination kelurahan shown as an area circle. Staff or couriers then place the exact point, and the system remembers it so future shipments to the same address start accurate. Pickup points work the same way for sender addresses
  • Real road routes on the tracking map: Tracking maps draw the actual road route between checkpoints, with estimated distance and travel time for the remaining trip, instead of a straight line. Flights and sea voyages are shown as direct lines between reported points
  • Fast lookup: Typing any booking, AWB, manifest or DRS number finds where that shipment is right now and opens it on the right monitoring list
  • Fix: An "ALL CUSTOMERS" assignment now correctly takes priority over an outdated customer claim when scoping bookings and shipments for TMS operators
🌐 WebTMS

New Live Monitoring page with tracking maps, position reporting and photo evidence

The web panel gets the front end of live monitoring: a single page to watch all moving shipments, plus the tools to report positions and attach evidence.

  • Live Monitoring page: Four tabs (Pickups, Trips, Deliveries, and Awaiting Delivery) show what is moving right now, with auto-refreshing positions, vehicle icons for courier, truck, plane or ship, and attention highlights so staff can spot stalled pickups, late vendor cargo or overdue parcels at a glance
  • Live tracking map: Bookings, shipments, manifests and courier runs each get a map card showing the route travelled, the remaining route, the latest reported position, and a progress bar with estimated time and distance to the destination. The map refreshes automatically while the shipment is active
  • Report position dialog: Staff can report where a pickup, trip or delivery run is with a couple of taps: GPS or a map point is required, while a place name, note and up to 5 photos are optional. The dialog adapts its wording to the mode of transport (road, air cargo, sea cargo, vendor)
  • Photo and location evidence: Approve, inbound and status-confirm dialogs now accept optional photos (with previews and a 5-photo limit) and a map pin, and the tracking timeline shows that evidence with thumbnails and the location source (device GPS or picked on the map)
  • Recipient pin dialog: Staff can set or adjust the exact delivery point for a shipment, a saved customer address, or a pickup point, starting from the current estimate, with a clear explanation of how precise the existing pin is
  • Quick POD entry: The bulk POD input table now has a per-row map point column, so back-office staff can record an exact delivery location for each parcel

+79−6
🌐 WebTMS

Smoother loading experience on the App Updates page

The App Updates page now shows a cleaner loading state while the release list is being fetched:

  • Skeleton placeholder instead of a spinner: While releases load, the page now shows a greyed-out preview of the actual table (matching the real columns and row shapes) with a subtle shimmer animation, instead of a generic spinning circle
  • Less layout jumping: Because the placeholder mirrors the real table's column layout, rows settle into place without the page shifting once the data arrives
  • Screen-reader friendly: The loading announcement is preserved for visually impaired users, while the decorative placeholder stays hidden from assistive technology

+581−14
⚙️ BackendWMS

Let the WMS mobile app update itself in-app

The WMS Android app can now check for and receive app updates on its own. Previously, updating the app required manually downloading and installing a new APK file; now the app can offer the update directly to its users.

  • In-app update check: The mobile app can now ask for the latest published release (version, title, release notes, download link, and file size) so staff see a prompt to update right inside the app instead of hunting for install files
  • Simplified access: Warehouse devices no longer need ERP credentials or special permissions to check for updates; the WMS system fetches the release information on their behalf, so any logged-in app user can update
  • Graceful handling: If no update has been published yet, or the update service is briefly unreachable, the app shows a clean message with a retry option rather than a technical error
🌐 WebTMS

Show loading feedback and continuous numbering on the app updates page

Improvements to the App Releases list on the app updates admin page, so it no longer looks empty or misnumbered while loading or paging.

  • Loading indicator: The page now shows a spinner with a "Memuat data..." message while release data is being fetched, instead of briefly appearing empty
  • Continuous row numbers: When the release list spans multiple pages, numbering continues from the previous page (e.g. page 2 starts at 11) instead of restarting at 1 on every page
🌐 WebTMS

Render release notes with full formatting

Release notes on the app updates page are now displayed as formatted text instead of a plain block of characters.

  • Rich formatting: Headings, bullet and numbered lists, quotes, code snippets, and clickable links in release notes all render properly, matching how they were written
  • Easier to read: Notes authored for the TMS and WMS mobile apps now display the same way they do elsewhere in the admin panel, so staff can scan what changed in each release at a glance

+63−45
⚙️ BackendTMS

Prevent duplicate document numbers when staff create documents at the same time

Document numbers for AWB and DRS are generated by looking up the highest existing number and adding one. When two staff members created a document at exactly the same moment, both could read the same highest number and receive identical numbers.

  • Duplicate numbers eliminated: Document number generation now locks the sequence while a number is being issued, so two simultaneous creations can never receive the same AWB or DRS number
  • Applies everywhere numbers are issued: Manual AWB creation, booking-based AWB creation, and daily DRS numbering all use the same protection
  • Cleaner records: Prevents the downstream confusion of two shipments sharing one document number, which previously required manual correction
🌐 WebTMS

Stop double-clicks from creating duplicate DRS submissions

On the new DRS form, the save button now disables itself while a submission is in progress.

  • One click, one document: Clicking "Simpan DRS" repeatedly no longer submits the same DRS multiple times; the button is inactive until the save finishes
  • No more duplicate cleanup: Removes a common source of duplicated delivery sheets that staff had to find and delete afterwards
📱 MobileTMS

Fix Android app updates failing to install

Android requires every new app release to carry a strictly higher internal version number than the one installed, otherwise the phone silently rejects the update. The build numbering scheme had drifted to a point where new releases could collide with or undercut earlier installs.

  • Updates install reliably again: Release builds now take their Android version number directly from the app's version file, so each shipped build is guaranteed to be higher than the previous one
  • Clear rule for future releases: Every code change that ships must bump the build suffix, and the build pipeline enforces this before release
  • Simpler installer files: Each device variant now downloads a single standard installer package instead of split packages, reducing confusion about which file to install

+167−11
🌐 Web⚙️ BackendTMS

Add clear release titles to app updates

App releases used to squeeze everything into a single notes field, so the ERP release list showed cut-off text and the mobile update prompt displayed a raw commit message. Every release now carries a proper headline, kept separate from the full notes:

  • Headline for every release: The ERP app-updates table now shows a short, one-line title for each release instead of truncated notes; older releases automatically fall back to the first line of their notes so nothing looks broken
  • Title field when uploading: Publishing a new app version from the ERP panel includes a dedicated "Judul Rilis" field, with a hint on the notes field clarifying that it's what appears in the update prompt on the mobile app
  • Search by title: Finding a past release no longer requires knowing its exact version number; search now matches titles as well as versions
  • Readable update prompts on phones: Automated app builds now attach a proper headline and full description to each release, so the TMS app's update sheet explains what's new in plain language instead of showing a raw commit message

+6−6
🌐 WebTMS

Restore working download buttons for app updates and petty cash attachments

Download buttons on two pages looked normal but did nothing when clicked, leaving users unable to get the files in front of them:

  • APK downloads working again: The "Unduh APK" button on the app updates page, plus the small download icon next to each release in the list, now respond to clicks so staff can actually download the latest app version
  • Petty cash attachments fixed: In the attachment preview window, the "open in new tab" and "Download" buttons now work again, including the download button shown as a fallback when a file type can't be displayed on screen
  • Released as app version 1.24.6: The fix ships with new release notes visible in the app update screen, so users know why they should update

+2.2k−717
⚙️ BackendWMS

Fix inbound upload failures and stuck serial numbers

Inbound Excel uploads could fail in ways that left the system in a bad state: the page reported an internal error and serial numbers claimed by the failed upload stayed reserved, blocking retry attempts until someone cleaned up manually.

  • Clean failure recovery: When an upload fails partway, the system now undoes the partial data completely and reports the failure properly instead of crashing midway
  • Serial numbers released automatically: Serial numbers claimed by a failed upload are freed again right away, so operators can retry immediately without waiting for manual cleanup
  • Blank optional columns tolerated: Upload files that leave Condition, Completeness, or Power On Test empty for some serial numbers no longer cause the whole upload to fail
⚙️ BackendWMS

Stop inbound lists from showing every item twice

After warehouse 8 received its own warehouse-specific set of inbound statuses, inbound item lists started showing every item twice, once per copy of its status label.

  • Duplicate rows eliminated: Every inbound item now appears exactly once in the inbound lists, no matter how many warehouses define its status labels
  • Correct status per warehouse: Items show the status label from their own warehouse first, with a safe fallback for warehouses without local labels
  • Verified against real data: The main inbound list went from roughly 195,000 displayed rows to the correct 97,000, matching the actual number of recorded items
⚙️ BackendWMS

Keep storage location records tied to the right warehouse

Several warehouses use the same storage location codes (N3, N4 and N31 exist in more than one warehouse). Location lookups matched by code only, so records could be filed under another warehouse's location without any error.

  • No more duplicate inventory records: Uploading goods whose storage code exists in two warehouses could create two inventory records from a single row; matching is now limited to the uploading warehouse, and a scan of existing upload data found about 18,600 cases where this could have happened
  • Correct warehouse on manual entry: Keying items in one by one with a shared code like N3 silently filed the item under another warehouse's location; each warehouse now resolves its own codes
  • Covers every entry path: Standard inbound uploads, XL Home inbound and outbound uploads, tested-inventory uploads, and one-by-one entry all use the corrected matching
  • Guarded by automated checks: New regression checks ensure the warehouse scoping cannot quietly disappear from these flows in future updates
🌐 WebWMS

Restore serial number input when quota slots remain

On the Manage Serial Number page, the input form got stuck claiming "Kuota serial number untuk data ini sudah terpenuhi" even when the bin still had free slots, blocking operators from recording serial numbers.

  • Input form restored: The remaining-quota check now completes properly, so operators can input serial numbers up to the remaining slots
  • Stable during bulk editing: The form keeps working when the page is switched in and out of bulk edit mode
  • Verified live: Confirmed against a real material with 15 units and 8 recorded serial numbers: exactly 7 slots offered and the input opens cleanly
🌐 WebTMS

Bring labeled card-style tables to every page on mobile

Until now only the AWB list rendered as readable stacked cards on phones; other pages still showed wide tables with bare values. Every table in the TMS web app now gets the same mobile card treatment automatically.

  • App-wide mobile cards: All tables across the app now collapse into stacked cards on small screens, with no per-page setup needed
  • Field labels beside values: Each card line shows the field name, taken from the table's own header, next to its value
  • Bulk selection stays usable: Where a list supports select-all, that control remains visible above the cards
📱 MobileTMS

Deliver app updates in-app from the company's release channel

The LEN Logistics Android app now manages its own updates end to end: it checks the ERP app-updates module for new releases, downloads them with a progress bar, and walks the user through installation.

  • Updates from company servers: New releases come from the ERP app-updates module instead of GitHub, so distribution no longer depends on an external platform
  • Update sheet on the home screen: When a new version is available, an update icon appears in the header; the sheet shows the new version, current version, file size, and release notes, with download progress and a cancel button
  • Check for updates on demand: A "Periksa Pembaruan" option in the account menu checks immediately and confirms when the app is already up to date
  • Safer installation: Downloaded updates are size-checked before install, and the app guides users through the install permission

+44−8
⚙️ BackendWMS

Keep app sessions renewing reliably

Session renewal for warehouse app users is now more dependable when something goes wrong.

  • Clear sign-in prompt on renewal failure: If a session cannot be renewed due to an unexpected problem, users now get a straightforward "please sign in again" response instead of a silent failure or server error
  • Safe handling of incomplete requests: Renewal requests that arrive without the needed session data are rejected cleanly with a clear message, instead of causing a server-side crash
  • Faster support diagnosis: Unexpected renewal problems are now recorded together with the requesting device's address, so recurring issues from a specific site or device can be traced quickly
⚙️ BackendWMS

Show the real reason when a request fails

Failed actions in the WMS system now show their actual explanation on screen, instead of a generic failure notice.

  • Specific error messages preserved: When an action is rejected (for example, a duplicate entry or a rule violation), the exact reason now appears to the user instead of being replaced by a generic "validation failed" message
  • Clean plain-text messages: Short text responses are now displayed as-is, without leftover quotes or escaped characters cluttering the message
  • Less guesswork for staff: Warehouse teams can see immediately why something failed and correct it, rather than retrying blindly or escalating to support
⚙️ BackendWMS

Show the correct item status for each warehouse in monitoring

Inventory monitoring pages now resolve item statuses against the item's own warehouse, fixing wrong or mismatched status information in multi-warehouse setups.

  • Warehouse-specific statuses: When two warehouses use the same status code with different meanings, each item now shows the status label defined by its own warehouse instead of whichever one happened to match first
  • Accurate monitoring views: Both the detailed and summarized tested-inventory monitoring pages now report consistent, correct statuses across all warehouses

+547−352
⚙️ BackendTMS

One update system now serves both the TMS and WMS mobile apps

The release system that powers in-app updates has been expanded from a single-app list to a multi-app platform, so the growing WMS app can be distributed through the same channel as TMS.

  • Both apps, one place: Every release is now tagged with the app it belongs to, so TMS and WMS updates live side by side in the same system without getting mixed up.
  • Per-app latest version: Each app has its own "latest version" lookup, so TMS users are only ever offered TMS updates and WMS users only WMS updates.
  • History preserved: All releases published before this change are automatically recognized as TMS releases, so the existing update history stays intact.
  • Wrong-app protection: Publishing a release now requires naming its target app, preventing a build from going out to the wrong audience.
🌐 WebTMS

App Updates page reorganized with separate tabs for TMS and WMS

The App Updates page in the admin panel now mirrors the multi-app support on the server, giving each mobile app its own dedicated view.

  • Separate tabs per app: Releases are split into an "Aplikasi TMS" tab and an "Aplikasi WMS" tab, each with its own latest version card, upload form, search, and release history.
  • Latest version up front: Each tab opens with a highlight card showing the newest version, its release notes, file size, publish time, and a direct download button.
  • Uploads scoped to the tab: Uploading from a tab automatically files the release under that app, so there is no risk of sending a TMS build to WMS users.

+2.2k−198
⚙️ BackendTMS

Add approval workflow for petty cash expense claims

Petty cash expenses now go through a proper approval process instead of being recorded directly by whoever fills in the form.

  • Submit for approval: Drivers and couriers can submit expense claims with 1-5 proof attachments. Claims enter a pending queue and do not reduce the cash balance until they are approved.
  • Approve or reject: Petty Cash Officers and Admins can approve or reject pending claims, optionally adding review notes. Approved claims count toward the balance; rejected ones stay on record for audit but are excluded from it.
  • Automatic notifications: When a claim is submitted, all approvers receive a high-priority notification. The submitter is notified as soon as their claim is approved or rejected, including the reviewer's notes.
  • Cleaner balance reporting: The cash balance now counts only approved transactions, and separately shows how much money is tied up in claims waiting for approval.
  • Privacy by role: Drivers and couriers can only see the claims they submitted themselves; full visibility stays with the petty cash team and admins.
🌐 WebTMS

Add claim submission and review screens for petty cash

The petty cash page now supports the full claim and approval process right in the browser.

  • Dedicated claim form: Drivers and couriers get their own submission page with a clear notice that the claim awaits approval. Their name is filled in from their account and locked, so vouchers can no longer be filed under someone else's name.
  • One-click review: Approvers see a Review button on every pending claim. A dialog shows the amount and the submitter, then offers Approve or Reject with optional notes.
  • Status column and filter: The transaction list now shows each claim's status (Waiting, Approved, Rejected) and who submitted it, with a status filter to quickly find pending items.
  • Read-only detail page: A new detail view shows the complete voucher, the review outcome with notes, and proof attachments, without risking accidental edits.
  • Role-aware screens: Buttons, balance cards, and the side menu adapt to each user's permissions, and approvers get a card showing how many claims are waiting for them.
⚙️ BackendWMS

Fix master data errors for new warehouses

Setting up a new warehouse no longer runs into dead ends on the master data screens.

  • New warehouse setup fixed: The Referensi page previously failed with a "Terjadi Kesalahan" error on any warehouse that had no storage locations (SLOC) entered yet, including on the very screen used to add the first ones. It now shows an empty list as it should. Three warehouses were hitting this error in production, observed live two minutes before their first location was created.
  • Mobile transfer dropdowns fixed: The SLOC and BIN pickers in the mobile Transfer wizard now show an empty list for warehouses without locations instead of raising an error.
  • Accurate error messages: When a record genuinely does not exist, apps now display the real reason instead of a generic message blaming a missing address, making problems easier to understand and report.

+549−59
⚙️ BackendWMS

Add a dedicated Network repair warehouse

Repair work for Network items now has its own home: a new warehouse at Pondok Ungu, dedicated entirely to repair activity. Until now, repair stock lived inside the main Network warehouse alongside live operations. This release also tightens how bulk stock adjustments are scoped.

  • New "Pondok Ungu - Network (Repair)" warehouse: A separate warehouse now exists just for Network repair work, so repaired items and their stock are kept apart from the main Network warehouse instead of mixed together.
  • Ready to use immediately: Everyone with access to the main Network warehouse automatically gets access to the repair warehouse, and serial number tracking is switched on there by default, matching how the main Network warehouse operates.
  • Stock adjustments stay in their lane: Bulk inventory adjustments now only read and update stock in the warehouse the signed-in operator is assigned to. Repair staff can no longer accidentally change stock belonging to the main Network warehouse.
  • Careful, check-first rollout: The warehouse was set up on both environments with a process that verifies all existing data before saving anything and refuses to run when it finds conflicts. It starts completely empty, with no stock, no storage locations, and no transactions, so the team can build it out cleanly.
⚙️ BackendWMS

Fix duplicate rows in warehouse and outbound item lists

Several list and report pages could show the same warehouse or outbound item more than once when different warehouses shared the same reference codes. Three fixes merged the same morning eliminate those duplicates and make status labels reflect each item's own warehouse.

  • Warehouse lists show each warehouse once: Warehouse and warehouse user listings duplicated rows whenever a shared reference code existed under more than one warehouse. Every warehouse now appears exactly once, and page totals are accurate again.
  • Outbound item listings show each item once: The outbound item pages and reports could repeat items under the same conditions. Each item now appears a single time.
  • Status labels come from the right warehouse: An outbound item's status is now always read from its own warehouse's reference data, so items from one warehouse no longer display a status name that belongs to another warehouse.
  • Guarded against coming back: Automated checks were added for every affected listing, so a future update cannot silently reintroduce duplicate rows.

+284−35
⚙️ BackendWMS

Fill in missing serial numbers without touching stock

Some units of stock carried a placeholder instead of a real serial number, and those rows were hidden from Manage Serial Number even though they still counted toward the bin's stock. That made bins look short of serial numbers with no way to correct them. This release lets operators complete those records safely.

  • Waiting stock can now be completed: A row whose physical serial number was never captured can be filled in directly, and the stock quantity and its entire history stay exactly as they were. Fixing a missing serial no longer means recreating stock.
  • Inspection workflows stay in charge: Units still owned by Quality Inspection or the test bench cannot be filled from this screen. The system explains that the serial must be recorded through the Tested Inventory flow instead, so the two processes can no longer conflict.
  • Shipped goods stay protected: Units that already have outbound history still cannot have their serial number replaced here.
  • Deletion is blocked for real stock: A unit waiting for its serial number cannot be deleted; the only valid action is filling in the actual serial, which prevents stock from silently disappearing while the quantity remains on the books.
  • Cleaner messages for operators: Error messages never expose internal placeholder codes; waiting rows are described as still waiting for their serial number.
🌐 WebWMS

Show and fill stock waiting for its serial number

The Manage Serial Number screen now shows units whose serial number has not been captured yet and guides operators to fill them in.

  • "Menunggu S/N" badge: Rows waiting for a serial number are clearly labeled on the list instead of being hidden, and each waiting row is flagged with a "Perlu diisi" marker in the bulk editor.
  • On-screen guidance: When waiting units are present, a notice shows how many there are and explains the fix: select those rows and use Bulk Edit S/N to enter the physical serial numbers.
  • Guarded actions: The single-row edit button is hidden for waiting stock, and Delete is disabled while any waiting row is selected, so the only path forward is filling in the real serial number.

+832−138
⚙️ BackendWMS

Bulk-correct serial numbers from Manage Serial Number

Warehouse teams can now fix mislabeled serial numbers in bulk instead of one at a time.

  • Bulk replacement, up to 500 at once: Staff can relabel up to 500 available serial numbers in a single save, as long as they sit under the same material and storage bin
  • Stock stays untouched: Only the label changes; stock quantities, storage locations, and transaction history remain exactly as they were
  • All-or-nothing saving: Every row is re-checked at save time (right warehouse, same material and bin, still available, label unchanged since loading). If anything moved mid-edit, the whole batch is cancelled instead of half-applied
  • Shipped numbers are locked: Serial numbers that already have outbound delivery history can no longer be relabeled, keeping shipping records trustworthy
  • Simpler deletion rules: During data reconciliation, serial numbers with restriction or transfer history can now be deleted manually; only Tested or Outbound history still blocks deletion
🌐 WebWMS

Fix serial numbers in bulk with Excel copy-paste

A new Bulk Edit S/N workflow on Manage Serial Number lets staff correct label mismatches entirely on one screen, using the Excel sheets they already work with.

  • New "Bulk Edit S/N" button: Select the rows to fix, click Bulk Edit S/N, and the existing table switches into editing mode showing only the selected rows with current and new S/N columns
  • Paste straight from Excel: Copy a column of serial numbers from Excel and paste it into any "S/N baru" cell; values fill downward in order, and pasting mid-list anchors to that row
  • Per-row status badges: Each row shows Belum diisi, Tidak berubah, or Siap disimpan so progress is visible at a glance, with a counter showing how many rows are selected
  • Warnings before saving: Blank rows, duplicates, extra pasted values, and unchanged rows are flagged with counts, and Save stays disabled until every row is filled
  • Cleaner, responsive layout: A guide banner explains the paste workflow, Cancel and Save sit in a fixed footer, and the controls stack neatly on smaller screens
⚙️ BackendWMS

Reuse serial number labels from issued records on tested inventory

Replacing the label on tested inventory no longer fails when history gets in the way.

  • Fewer false duplicate errors: Staff relabeling tested inventory can now reuse a serial number even if the same label already exists on issued, already shipped records
  • Active stock still protected: The duplicate check now looks only at live stock in the warehouse, so two items currently on the racks can never end up sharing one serial number

+658−29
⚙️ BackendWMS

Protect serial history from deletion and fix serial capacity checks

Serial numbers in the warehouse now carry stronger protection against accidental data loss, and the capacity math that decides how many serials fit on a stock line has been corrected.

  • Deletion guards with clear messages: Inbound items and serial numbers that already carry testing, quality hold, transfer, or outbound history can no longer be deleted; staff now get a specific explanation of why the delete was blocked and are pointed to data reconciliation instead of manual removal
  • Accurate capacity counting: Stock lines with a blank serial count no longer slip past the availability filter, and a single overfilled stock line can no longer cancel out the free slots of other lines, ending false "no capacity" errors when registering serials or shipping tested units
  • Safer restriction closure: Closing a quality hold or block now first verifies that every linked serial record is intact; if any record is missing, the closure stops and asks an administrator to reconcile the data rather than writing incomplete results
⚙️ BackendWMS

Restore two lost serial records after data incident

A follow-up to the serial history protection work: a sharper warning when deletion is blocked, plus a tightly controlled repair for two serial records lost in a past incident.

  • Sharper blocked-delete message: The rejection message now names exactly which activities are on record for the serial in question (testing, quality hold or block, transfer, outbound) and tells staff to reconcile the data rather than remove it by hand
  • Incident repair prepared: Two serial numbers whose stock records were deleted out from under them, despite carrying testing, quality hold, and transfer history, can now be restored with a purpose-built repair that touches only those two exact serials
  • Safety gates on the repair: The restoration runs as a dry run by default, requires warehouse confirmation that both physical units are still on hand before it can change anything, and never modifies testing, restriction, transfer, or outbound history

+2.5k−322
⚙️ BackendWMS

Attach PDF test reports to inventory correction requests

Tested inventory correction requests ("Pengajuan Perubahan") can now carry the PDF test result document itself, not just photos and field changes.

  • Submit, replace, or remove: An operator can attach a new PDF, propose replacing the serial's current one, or mark the existing one for removal. Each serial holds a single PDF, so an approved replacement automatically retires the old file.
  • Approval stays the gate: Nothing touches the official evidence until a WMS Super Administrator approves. The old document is swapped for the new one in a single safe step, and a rejection leaves the original completely untouched.
  • Review before deciding: Approvers read the staged PDF directly in the review screen, so they can check the replacement against the original before approving.
  • Guardrails included: Uploads are verified as real PDFs and size-limited, requests are scoped so reviewers only see their own warehouse, and rejected requests leave no leftover files in storage.
🌐 WebWMS

Read and manage PDF evidence without leaving the page

The in-page PDF viewer used for test evidence was rebuilt into a full document reader, and the correction request flow now handles PDF evidence end to end.

  • Full viewer controls: Zoom in and out, fit to page width or full page, jump straight to any page, and download a copy. Searching finds text across the whole document with every match highlighted (typed text only, not words inside scanned images).
  • PDF evidence in correction requests: In "Pengajuan Perubahan", operators can attach a new PDF, propose a replacement, or mark the current one for removal alongside photos and field changes. The stored document stays untouched until the request is approved.
  • Preview before submitting: Photos and PDFs in the request dialog open full-size on click, including files that were just attached but not yet sent, so what is being submitted is never a surprise. Approvers see the same previews on pending requests.
  • Mobile friendly: The correction form now scrolls properly with its action buttons reachable on small screens, and closing a photo or PDF preview no longer closes the whole request window by accident.
⚙️ BackendWMS

Filter the tested inventory report by PDF evidence

The Tested Inventory Per S/N report can now be filtered by whether each serial has its PDF test report attached.

  • Two new filter options: "Ada PDF" shows only serials that already carry a PDF test result, while "Belum Ada PDF" surfaces the ones still missing documentation, making follow-up easy to track down.
  • Combines with existing filters: Works alongside the photo, status, condition, and warehouse location filters for precise lists.
  • Downloads agree with the screen: The Excel export applies the same PDF filter, so a filtered view and its downloaded file can no longer show different rows.
🌐 WebWMS

Faster tested inventory pages and a PDF evidence filter

The Tested Inventory Per S/N screen gains the new PDF filter and loads noticeably faster on large pages.

  • New PDF filter: "Ada PDF" and "Belum Ada PDF" options sit next to the photo filter, and are included in the active filter chips and the reset control so they behave like every other filter.
  • Quicker page loads: Rows that have no photos or PDFs no longer trigger a separate lookup for each one, which removes the loading lag when displaying 25, 50, 100, or 500 rows at once.
  • Consistent downloads: The PDF selection travels with the report request, so the Excel export matches what the operator filtered on screen.
⚙️ BackendWMS

Make newest-first sorting reliable in the tested inventory report

The Tested Inventory Per S/N report now sorts by "most recently changed" in a stable, predictable way.

  • No more shuffling or duplicates: Serials that share the same timestamp no longer swap places or appear twice when paging through the report.
  • Evidence edits count as activity: Uploading, deleting, or copying photos and test reports refreshes the serial's last-modified time, so recently worked-on serials rise to the top where staff expect to find them.
  • Consistent column sorting: Sorting by serial number, test date, or other columns behaves the same on screen and across pages.
🌐 WebTMS

Redesign the expense voucher form for faster, safer entry

The petty cash expense voucher form was reorganized into clearly grouped sections with much easier money input.

  • Grouped sections: Trip identity, odometer and fuel readings, road money and driver incentives, operational costs, and e-toll each get their own labelled section, with the Total in a highlighted panel of its own so it is impossible to miss.
  • Thousands separators while typing: Money fields format themselves as you type (for example 1.500.000), so amounts stay readable and mis-keyed digits stand out immediately.
  • Familiar field layout: Labels now sit above each field with rupiah and kilometre markers attached, matching the rest of the app's forms and making the voucher quicker to fill in on the road.
🌐 WebTMS

Show attachment previews in the petty cash list

The petty cash list now shows what was attached instead of only file names.

  • Photo thumbnails: Image attachments appear as small photo previews directly in the list, so receipts and proof documents are recognizable at a glance.
  • Clear document icons: PDFs and other files get a dedicated document icon instead of a plain text chip.
  • Click to view: Any thumbnail or icon opens the full attachment preview, just like before.

+1.4k−223
⚙️ BackendWMS

Deliver evidence PDFs through the API so they can be viewed in the page on any device

The WMS API can now deliver the stored PDF test report itself, instead of only handing out a storage link, so the web app can display evidence directly on the page.

  • Evidence served in-app: The API now streams the stored PDF test report itself to the web app, so reports can be displayed right on the page rather than relying on whatever viewer the browser happens to have
  • Phones finally included: Mobile browsers have no built-in PDF viewer, so evidence used to download instead of display; with the report delivered through the API, the page can render it on any device
  • Warehouse checks on every view: Opening a report re-confirms the viewer belongs to the warehouse that owns it, so test evidence stays restricted to the right teams
  • Damaged files caught early: If a stored file is no longer a valid PDF, the viewer now shows a clear error message instead of quietly failing to open
🌐 WebWMS

View test evidence PDFs directly in the page on phones and desktops

Test evidence PDFs now open inside the Tested Inventory page itself, with a viewer that works the same on every device, plus tidier evidence cards in the resolve dialog.

  • Built-in evidence viewer: Evidence PDFs open directly on the page instead of jumping to a new browser tab or downloading, and the same view now works on phones, which previously could not display PDFs at all
  • Lighter on mobile data: Only the essential viewer components ship with the app, roughly halving what a phone downloads to open an evidence file, and report pages render as you scroll so long documents stay smooth
  • Everything runs in-house: The viewer is bundled with the WMS itself rather than loaded from an external source, so previews keep working behind restrictive networks and documents never leave LEN's infrastructure to be displayed
  • Page count at a glance: The viewer header now shows the total number of pages once a document is open
  • Tidier evidence cards: In the resolve dialog, long file names, file details, and remove controls now stay neatly inside the evidence card on narrow screens instead of overlapping or spilling out
🌐 WebWMS

Explain why an evidence PDF will not open instead of blaming the file

When an evidence PDF fails to open, the preview now reports the real cause, and a viewer that fails to load no longer stays broken for the rest of the session.

  • Honest error messages: A failed preview now says what actually went wrong: password-protected files, damaged uploads, and a viewer that failed to load each get their own distinct message
  • No more wasted re-uploads: Every failure used to look like "this PDF is damaged," sending operators to re-upload evidence that was perfectly fine
  • Self-recovering viewer: A viewer that fails to load no longer stays dead until a full page reload; trying again just works
  • Easier support diagnosis: The underlying technical cause is now recorded in the browser console, so failures in the field can be diagnosed instead of guessed at from a screenshot
⚙️ BackendWMS

Make evidence PDF previews open reliably

Fixed the issue that made freshly delivered evidence PDFs fail to open in the new in-page viewer.

  • Previews open again: The layer that packages every API response was accidentally corrupting evidence PDFs on their way to the viewer, so previews failed with "this file cannot be read"; reports now arrive complete and unaltered, and previews open normally
  • Nothing else changed: Only the evidence preview path is affected; all other responses, error handling, and permission checks work exactly as before
  • Protected against regression: Automated tests now verify that a sample PDF arrives intact, so previews cannot silently break again

+2.4k−49
⚙️ BackendWMS

Record actual test dates and surface stock aging in Tested Inventory

Every test result now remembers when the test actually happened, and Tested Inventory reports can finally answer "how long has this stock gone untested?".

  • True test dates on every result: Approving a test per serial, per material, or across a whole batch now saves the operator's real test date and time in Jakarta time, instead of an automatic server timestamp. Tests logged after the fact can be backdated to the day they were actually performed
  • Spreadsheet uploads keep their dates: Serials resolved through Excel uploads inherit the batch's recorded test date, so imported results no longer look like they were tested at the moment of upload
  • Aging in the reports: Per-serial reports show how many whole days since each physical unit was last tested, and material-level reports show the earliest and latest test dates across the group
  • The worst unit drives the number: Material rows report the most overdue unit in the group rather than an average, which is the figure a retest schedule actually needs. One freshly tested serial can no longer hide a long-overdue sibling
  • No fake "fresh" data: Units never tested, or still waiting on their serial number, show no aging figure at all instead of "0 days", so the oldest untested stock cannot be mistaken for stock tested today. Historical records are backfilled from their batch dates, so aging works from day one
🌐 WebWMS

Pick the real test date when resolving and see aging on screen

The Tested Inventory screens now let staff enter the actual test time when approving results, and the reports display how long each unit has gone since its last test.

  • Editable test date in every resolve dialog: Per S/N, Per Material, and batch resolve now include a Jakarta-time date and time field, prefilled with the current moment and freely editable for backdated tests, past or future
  • Set once, adjust per row: A bulk field applies one test date to every selected serial at once, while each row keeps its own editable value for selections that were tested at different times
  • Aging visible on screen: Per S/N shows each unit's test date and days since its last test, Per Material shows the earliest and latest test dates plus maximum aging per group, and Rekap now separates the batch date from the real serial test span
  • Missing history stays honest: Rows with unknown, never-tested, or unlinked history display a dash instead of "0", so "no record" is never confused with "tested today"
🌐 WebWMS

Preview test-result PDFs without leaving the page

Test-result PDFs now open in a full-screen preview inside Tested Inventory instead of pulling staff out to a new browser tab, and the resolve dialog finally keeps its columns in line.

  • In-app PDF preview: Clicking a test-result document opens it in a full-screen overlay, so staff reviewing a long table keep their scroll position and filters instead of losing them to a new tab
  • Familiar viewer: The preview mirrors the existing photo viewer (same backdrop, round controls, Escape and click-outside to close), shows the file name and size, and badges PDFs reused from a previous test
  • Balanced resolve dialog: The approval table now budgets every column explicitly, so an uploaded PDF can no longer squeeze serial number, condition, completeness, or Power On Test down to a sliver; wide tables scroll sideways instead of clipping fields
  • Safe and resilient: Only verified secure storage links can open in the preview, the access link is cleared the moment it closes, and an "open in new tab" fallback is always on screen for browsers that block inline PDF rendering

+939−12
🌐 WebWMS

Pick and copy previous-test evidence inside Tested Inventory

The copy-evidence capability is now live in the interface. Staff working in Tested Inventory Per S/N can pull the photos and the PDF test report from a serial's previous completed test onto its new record, without re-uploading anything by hand.

  • "Salin bukti sebelumnya" button: Each serial that has earlier test evidence gets a copy button under its photo area, opening a picker that shows everything the previous completed test holds
  • See before you copy: The picker shows each earlier test's result, its photos and PDF with their dates, and a live counter of remaining photo slots, so staff know exactly what will be added before confirming
  • "Salinan" labels everywhere: Copied photos and PDFs are tagged in the evidence grid, the saved-photo viewer, and the PDF chip, so reused proof is never mistaken for evidence captured during the current test
  • Nothing automatic, nothing lost: Files are copied only when explicitly ticked, the original test's evidence stays untouched, and the dialog warns when the target is full or already has a PDF
  • Completed records stay immutable: The copy option only appears while evidence is still editable, so finished tests remain unchanged
🌐 WebTMS

Fix missing separators under the last mobile table record

On phones, tables display as stacked cards where every field sits on its own labeled line, but the very last record on any page was missing the separator lines under its fields, making it blur into the content below.

  • Consistent cards: The last record in any table now keeps a separator line under each of its fields, matching every other record on the page
  • All pages at once: The fix sits in the shared mobile styling, so every table in the web app benefits, including the Airway Bill list
  • Phones and tablets: The correction covers all small-screen layouts where tables stack into labeled cards

+1.0k−19
🌐 WebTMS

Show field labels beside values in the mobile AWB list

On phones, the Airway Bill list hid the column headers and showed each row as a bare run of values, so staff had to guess which number was the AWB number, which was the date, and which was the recipient.

  • Labels beside every value: Each row now displays its field label (AWB number, date, sender, recipient, destination, status) right next to the value, so shipment details are readable at a glance without guessing
  • Card-style rows: On small screens, rows render as stacked cards instead of a cramped table, matching the layout already used on other operational pages
  • Nothing left unlabeled: All columns keep their labels on mobile, including who created the AWB and the row's action buttons
⚙️ BackendWMS

Keep serial test history intact when transferring On-Test stock

When a serial number sitting in an On-Test bin was transferred while its parent material batch was still in Recorded status, the system judged the serial by the batch's status and deleted the serial's completed test record during the move, losing its evidence.

  • Test results survive transfers: A serial number that already has a test result now keeps its Tested Inventory record and all attached photos and documents when it is transferred, even while the parent batch is not finished yet
  • Complete audit trail: The transfer records where the unit went in the serial's test history, so the paper trail stays intact end to end
  • Untested serials unchanged: Serial numbers without a test result still follow the existing cleanup flow, keeping stock quantities accurate
⚙️ BackendWMS

Copy test evidence forward from a previous test of the same serial

When an already-tested serial number is transferred, the system keeps the completed test record and opens a fresh record at the destination, which used to mean staff had to re-upload the same photos and PDF test report by hand for the new record.

  • One-step evidence copy: Staff can now bring the photos and the PDF test report from an earlier completed test of the same serial number onto the new record, instead of re-uploading everything manually
  • Pick exactly what to carry over: A picker lists the previous tests that still hold evidence, shows each test's result, and displays how many photo slots remain on the new record
  • Independent copies: Every copied photo or PDF is saved as its own separate file, so deleting one record can never break the other and the original test's evidence stays untouched
  • Reused proof is labeled: Evidence carried forward is flagged as copied from a previous test, so it is never mistaken for proof captured during the current test
  • Guardrails enforced centrally: Existing limits still apply, including the maximum photos per serial and one PDF per serial, and copying is restricted to completed tests of the same serial within the user's own warehouse

+176−53
⚙️ BackendTMS

Count the full end date in reports, balances, and exports

Date-range filters were quietly cutting off the last day of any selected period. A report for August 1 to August 31 left out everything recorded on August 31, so balances and statistics looked lower than they really were.

  • Accurate period totals: Petty cash income and expense balances now include every transaction recorded on the end date, so period figures match reality
  • Complete statistics: Shipment and booking statistics, customer performance rankings, daily trend charts, and service performance reports all count the full final day of the chosen range
  • Correct exports: Downloaded shipment status and proof-of-delivery files follow the same full-day range, so exported files no longer miss the last day's records
  • Manifest lists included: Manifest lookups by date range also cover the entire end date, keeping on-screen lists consistent with exports
⚙️ BackendTMS

Keep driver and vehicle details out of public tracking

Anyone with an AWB number could previously see operational details about who is moving a shipment on the public tracking timeline, including driver names and vehicle identifiers.

  • Driver privacy protected: Courier and driver names no longer appear in public tracking updates once a shipment is assigned for delivery
  • Vehicle details removed: License plates for land transport, aircraft and cargo codes for air freight, and vessel and container details for sea freight no longer show on the public timeline
  • Neutral status wording: Delivery assignment messages now simply say the shipment is in the delivery process instead of naming the assigned driver
  • Staff view unchanged: Team members logged into the system still see full operational details for day-to-day handling
🌐 WebTMS

Stop date filters from dropping today's records

Date filters on list pages were hiding the current day's records because of a timezone mismatch between the browser and the server. The Today shortcut returned no results at all, and wider periods silently excluded everything recorded today.

  • Today works again: Selecting Today now shows the current day's shipments, bookings, and transactions as expected
  • No more missing rows: This week and this month shortcuts include everything recorded today, not just up to yesterday
  • Fixed across the system: Shipment, booking, manifest, delivery running sheet, petty cash, and audit log pages all use the corrected filters
  • Lists match exports: On-screen results and downloaded files now always cover the same date range
🌐 WebTMS

Add a privacy guard on the public tracking page

The public tracking page now hides internal notes attached to delivery assignment steps, adding a second layer of protection on top of the server-side cleanup.

  • Internal notes hidden: Delivery assignment steps no longer display notes containing driver names, license plates, or aircraft and vessel details
  • Covers historical records: The page filters these details on its side, so even older entries stored before the server-side fix stay clean
  • Safe to share: Customers can pass tracking links to their own clients without risking exposure of internal operational information
🌐 WebProfile

Hide internal courier notes in the tracking timeline

The tracking timeline in the profile portal now hides internal notes on shipment handling steps, matching the privacy cleanup on the main tracking site.

  • Internal notes hidden: Manifest and delivery assignment steps no longer show notes with courier names, drivers, or vehicle details
  • Older records covered: Entries stored before the server-side cleanup are also hidden from view
  • Privacy on every surface: Customers get the same protected timeline whether they track from the main site or the portal

+2.9k−457
⚙️ BackendTMS

Add operational expense voucher to petty cash

Petty cash expense records now support a full operational voucher alongside the existing amount and proof attachments. Previously, expenses only captured a total amount, date, and a free-text description with no structured trip or cost breakdown.

  • Driver and vehicle identity: Each expense can record the driver name, vehicle plate number, service area, and transaction date as required header fields
  • Trip distance tracking: Starting and ending odometer readings are captured, and the total distance travelled is automatically calculated by the system (never user-editable)
  • 12 expense categories: Travel allowance, in-city and out-of-city incentives, loading/unloading and security, charter, vendor, handling, maintenance, fuel amount, and an "other" catch-all can each be recorded as separate line items
  • E-Toll tracking: Starting balance, top-up amount, toll usage, parking usage, and remaining balance are tracked in one dedicated section
  • Trip context: Optional notes, pick-up point, and delivery destination provide searchable context for each expense
  • Backward compatible: Existing expense records with no voucher details continue to work unchanged; the voucher is optional for new expenses
⚙️ BackendWMS

Fix mobile login failing to return access and refresh tokens

Mobile users could not complete login because the response layer was stripping the token values from the login response. The mobile app received a successful status but no usable tokens to authenticate subsequent requests.

  • Tokens now wrapped correctly: The access token and refresh token are returned inside the standard response format, so the mobile app reads both values reliably on every login
  • No impact on web: Web and unidentified clients continue to receive the existing eight-hour session token without any change in behavior
🌐 WebTMS

Replace inline attachment lists with standardized card previews

All three petty cash forms (income, expense, and edit) now share one attachment component instead of each maintaining its own duplicated file upload and display code. The result is a consistent, card-based experience across the entire petty cash workflow.

  • Card-based previews: Uploaded files appear as thumbnail cards showing image previews for photos and recognizable icons for PDFs, with file name and size displayed underneath
  • Edit-page preview dialog: Clicking an existing attachment on the edit page opens a full-screen viewer with a file sidebar, so receipts and proofs can be inspected without downloading
  • Smart delete protection: On expense records, the last remaining proof attachment cannot be deleted, preventing incomplete expense records
  • Consistent upload limits: The same 5-file maximum and format validation (PDF, PNG, JPG, JPEG) applies everywhere, with clear counter and helper text
🌐 WebTMS

Add helpful guidance when the app updates list is empty

The App Updates page now shows contextual messages instead of a blank table when there are no releases to display.

  • Empty catalog: When no APK releases have been uploaded yet, the page shows a clear explanation and a direct "Unggah Rilis Baru" button for authorized users
  • No search results: When a keyword search returns zero matches, a separate message is shown with a one-click "Hapus Pencarian" button to clear the filter
  • Better error feedback: If the system fails to load the latest version information, an in-page error notification appears instead of failing silently
🌐 WebTMS

Add operational expense voucher form for petty cash

The expense creation page now displays a structured voucher form organized into four clearly labeled sections, replacing the previous simple amount-and-description layout.

  • Data Operasional section: Driver name (Nama), vehicle plate (NoPol), date, area, starting and ending odometer readings, fuel volume in liters, and an auto-calculated distance field
  • Rincian Biaya section: Twelve monetary fields covering every line item from the physical voucher, including travel allowance, incentives, loading/unloading, charter, vendor, handling, maintenance, fuel cost, and a manually entered total, all formatted with Indonesian Rupiah separators
  • E-Toll section: Five fields for starting balance, top-up, toll usage, parking usage, and remaining balance
  • Catatan Perjalanan section: Free-text notes, pick-up point, and delivery destination
  • Historical compatibility: Older expense records that lack voucher details show an informational notice on the edit page and keep the simple edit layout, so past data is never disrupted
  • Input validation: All monetary fields reject negative values, odometer readings are validated (end cannot be lower than start), and identity fields are required before submission

+1.5k−182
⚙️ BackendTMS

Fix mobile app update check

  • Update check restored: Fixed the server route so the mobile app can correctly communicate with the update service and detect new versions
⚙️ BackendWMS

Attach PDF test results to inventory serial numbers

  • PDF evidence per serial number: Operators can now upload one PDF test-result document to each serial number in Tested Inventory, stored securely and served via short-lived read-only links
  • Strict PDF validation: Uploaded files are checked by extension, MIME type, and binary signature to ensure only genuine PDFs are accepted, with a 10 MB size limit per document
  • Warehouse-scoped access: All evidence reads and mutations are restricted to the operator's assigned warehouse, preventing cross-warehouse data exposure
  • Automatic cleanup: If a database write fails mid-upload, the cloud-stored file is automatically removed so no orphaned documents accumulate
  • Operator Checker access: The Operator Checker role can now upload and delete draft evidence without needing higher admin privileges, and read-only viewers can view uploaded documents
🌐 WebWMS

Upload and view PDF evidence in Tested Inventory pages

  • PDF column in Tested Inventory: The per-S/N evidence column now shows an uploaded PDF alongside photo thumbnails, with a file-name link to open it and a delete button to remove it
  • PDF attachment in resolve dialog: When resolving or saving a draft, operators can attach a new PDF test result directly from the modal, with pending uploads clearly marked in amber until saved
  • Evidence must upload first: Photos and PDFs are uploaded to the server before the stock result is saved, so a failed upload blocks the mutation and keeps the dialog open for retry instead of creating incomplete records
  • Photo limit reduced to 3 per serial number: New uploads are capped at three photos per S/N, though legacy photos beyond that count remain visible and deletable
  • Draft save for non-admins: Operators who can add serial numbers but cannot resolve stock now see a "Save as Draft" button, letting them record evidence before an admin performs the final resolve
🌐 WebApproval

Fix page navigation in reference data table

  • Pagination now works correctly: Clicking "next page" in the reference data table (materials and storage locations) properly loads the next set of records from the server instead of staying on the current page
  • Status filter fixed: Toggling the active/inactive dropdown now correctly applies the filter to the server query
  • No more loading flicker: The table uses built-in lazy loading instead of a separate loading overlay, so page transitions feel smoother with the spinner appearing directly inside the table

+2.2k−29
⚙️ BackendWMS

Add secure mobile login with automatic session renewal

  • Short-lived mobile sessions: Mobile logins now receive a 15-minute access token instead of the 8-hour token used on the web. This limits the window of exposure if a token is ever intercepted.
  • Automatic session renewal: Mobile apps can silently renew their session in the background using a rotating refresh token, so operators stay logged in as long as they are actively using the app without re-entering their password.
  • Stolen token detection: If a refresh token is used a second time, the system recognizes the reuse, invalidates every token in that session family, and forces a fresh login. This protects against token theft.
  • Immediate session revocation: Changing a password or tapping logout revokes all active sessions for that user on mobile, ensuring no stale access remains.
  • Fully backward-compatible: Web users, the RFID system, and all existing integrations continue to work exactly as before with 8-hour tokens and no changes to the login flow.
⚙️ BackendWMS

Secure inventory and inbound item data behind authentication

  • Closed auth gap on inventory details: The inventory tested detail pages could be accessed without logging in, because the controller was missing an authentication requirement. Anyone with the URL could view the data.
  • Same fix applied to inbound items: While investigating the inventory issue, the same gap was found on the basic inbound items controller. Read, monitoring, lookup, and export actions were all reachable without authentication.
  • Automated guard against recurrence: A new test now scans every controller in the system and fails the build if any new controller ships without proper authentication, preventing this type of exposure from happening again.

+8.5k−97
⚙️ BackendTMS

Fix date range filters to include the selected end date

Inclusive end dates: Date range filters across delivery reports, inventory documents, inventory movements, forecasted inventory, POD statistics, and notifications now correctly include records that fall on the selected end date. Previously, selecting "August 1 to August 27" would miss any record on August 27 itself.

Consistent behavior: All six affected filters (search and export) have been updated to use the same boundary logic, so reports and on-screen results always match.

⚙️ BackendApproval

Add full reference data management for the Approval system

Admin reference data panel: Admins can now create, edit, search, and manage eight types of operational and pricing reference data directly from the system: materials, storage locations, pickup/delivery types, local transport modes, pricing modes, moda aliases, normal tariffs, and charter tariffs. Previously these could only be changed through database scripts or CSV imports.

Safe deactivation instead of deletion: Every reference entry can be activated or deactivated without deleting it. Inactive entries are hidden from form pickers and dropdowns, but historical records that already reference them remain intact.

Non-destructive CSV imports: Pricing imports now reconcile with existing data by updating matching routes in place, rather than wiping the entire table first. Manually added tariffs and deactivated entries survive a CSV refresh.

Non-destructive seed scripts: The material and storage location seed scripts now insert only missing values and never delete or overwrite existing rows, so manual edits and deactivations are preserved across script re-runs.


+2.5k−81
⚙️ Backend🌐 WebWMS

Add testing position report for warehouse inventory quality

  • New "Testing Report" page: A dedicated report now sits alongside the existing Data WMS report in the Reporting menu, showing tested inventory grouped by warehouse location and material instead of listing each serial number individually
  • Quality at a glance: Each row displays Good, Broken, and Faulty counts with Total Tested as the sum, so the warehouse team can immediately see the condition distribution of tested stock at every position
  • Snapshot view: Like Data WMS, this is a point-in-time report with no date range filter, making it ideal for daily stock quality reviews
  • Search and export: Filter by any column (location, material, vendor, category), browse with server-side pagination, and download the full result set to Excel with a progress indicator
🌐 WebApproval

Add reference data management for admins

  • New "Reference Data" page: Admins can now view, add, edit, and deactivate materials and storage locations directly from the Approval app, under the Form Configuration menu
  • Focused on upload-relevant data: Only materials and storage locations are shown, since those are the reference types used by MRF Inbound Excel uploads
  • Soft activate and deactivate: Deactivating a reference hides it from new forms without affecting historical records, and it can be reactivated at any time
  • Search and filter: Find specific entries by keyword, toggle between active-only and all-statuses views, and browse with server-side pagination
⚙️ BackendApproval

Validate MRF Inbound uploads against live WMS reference data

  • Warehouse-scoped validation: All reference values in the Excel upload (material codes, plant, storage location, type product, vendor, and product category) are now checked against the WMS database at upload time, scoped to the correct warehouse
  • Immediate row-level errors: Each invalid value is reported with its exact row number and the offending value, so the uploader can fix the file and re-upload without guessing what went wrong
  • Prevents downstream failures: Previously, invalid values would pass the upload and only fail later during MRF approval synchronization, forcing the entire form to be rejected after approvers had already reviewed it

+1.4k−24
🌐 WebApproval

Show exact notification recipients in every submit and approval dialog

Every form submission and approval dialog now displays a live preview of who will receive automatic notifications, so users always know exactly who gets informed before they confirm an action.

  • Recipient preview banner: A new info panel appears inside submit, approve, reject, and revision dialogs showing each recipient's name, email address or WhatsApp number, and approval group, split by delivery channel
  • Covers all form types: The preview is integrated into BL Form, BL Outbound (create and edit), MRF Inbound, MRN Request, Pickup Delivery, and Pickup Domestic submission flows, as well as all approval actions on the Need Approval page
  • Actions wait for the preview: Submit and approval buttons stay disabled until the recipient list has finished loading, preventing accidental submissions without visibility into who gets notified
  • Channel-specific display: Only the delivery channels that actually apply to the selected form and action are shown, so users see email recipients for email-only forms and WhatsApp recipients for WhatsApp-only forms
⚙️ BackendApproval

Preview notification recipients before submitting or approving forms

The approval system can now show exactly who will receive automatic email and WhatsApp notifications before a form action is confirmed.

  • Recipient details on demand: When someone is about to submit, approve, reject, or request revision on a form, the system resolves the full list of recipients including their names, approval groups, email addresses, and WhatsApp numbers
  • Channel-aware routing: Different form types use different notification channels. For example, Pickup Domestic outcome notifications go through WhatsApp only, while most other forms use email. The preview reflects these rules accurately
  • Workflow context: The preview shows which approval step comes next, who the remaining approvers are in all-member-approval steps, and whether the requester will receive a status update after the action

+7−1
⚙️ BackendTMS

Fix new package rows not saving when approving AWB edit requests

  • New packages now persist after approval: When an AWB edit request adds new koli (packages) and a manager approves it, those new rows are now properly written to the database
  • Prevents silent data loss: Previously, newly added packages during AWB edits would appear accepted in the UI but fail to save, leaving the package count on approved AWBs incomplete

+411−14
🌐 WebApproval

Make email recipient list optional on BL Outbound submissions

  • Optional notification: The email recipient list (To/Cc) on BL Outbound submissions is no longer required. Users can now submit without selecting a recipient list, and the dropdown can be cleared after selection
  • Submit button always active: The submit button is no longer blocked when no recipient list is chosen, removing a common point of friction for users who do not need email notifications on every outbound request
🌐 WebApproval

Fix Pickup Domestic date display and recover from stale page loads

Two reliability fixes that improve the day-to-day experience for approval users.

  • Correct pickup date: The Pickup Domestic detail view now displays the actual request date from the system, instead of a placeholder value. Users reviewing or approving pickup requests will see the right date without confusion
  • Self-healing navigation: If a user clicks into a form details page and sees a blank screen (caused by the browser loading an outdated cached version of the page), the app now detects this and automatically reloads the correct version. No more manual refresh needed
⚙️ BackendApproval

Grant LEN AWB Team access to BL Outbound forms

New group permission: The LEN AWB Team user group can now view and submit BL Outbound forms. Previously this group was locked out, forcing requests to go through other teams.

  • Form visibility aligned: The BL Outbound form now appears in the sidebar for all members of the LEN AWB Team group, matching the form's configured flow initiator
  • Submit and query access: Members can create new BL Outbound requests and query existing BL inventory, not just view the form
  • Safe rollout: The permission is applied via a database migration with idempotent guards, so it deploys cleanly even if the group or form does not yet exist in a given environment

+162−141
⚙️ BackendTMS

Support combined status filters and fix date handling in list searches

  • Multi-status filtering: Booking, AWB, Manifest, and DRS list searches now accept comma-separated status values, so a dashboard card that counts items across two statuses (e.g., "CREATED" and "READY FOR MANIFEST") can pass the exact same filter to the list and show matching results
  • Accurate end dates: Search end dates are now handled consistently on the server. Previously, a timestamp-bearing client request could push the search window into the following day, causing records from the wrong day to appear
  • Consistent customer visibility: Booking search now uses the same customer scope resolver as the rest of TMS, so operators and shipment status viewers see the same data on the dashboard and in the booking list
🌐 WebTMS

Make dashboard counts match their destination lists

  • Dashboard cards show matching data: Every clickable dashboard count (Total Booking, Total AWB, Total Manifest, Total DRS) now carries the correct status filter to the destination list, so the number on the card and the rows shown in the list always agree
  • Action items use combined statuses: The "AWB Perlu Manifest" card now opens the AWB list filtered to both "CREATED" and "READY FOR MANIFEST", and "Manifest Sedang Berjalan" opens with "ON PROGRESS" and "DEPARTED" combined, matching exactly what the card counts
  • Date filters no longer skip the last day: The list pages previously doubled up on end-of-day logic, causing records from the final day of a date range to be excluded. This is fixed so the selected period returns complete results
  • Partner dashboard links directly to documents: Recent manifest and DRS rows on the partner dashboard now open the specific document detail page instead of the full list
  • Completion cards filtered to completed status: Partner dashboard cards for "Manifest Selesai" and "DRS Selesai" now open their lists pre-filtered to "COMPLETED" status
  • Cleaner status distribution: Status breakdowns now show the five largest statuses only, removing the catch-all "Lainnya" row that mixed unrelated statuses

+1.6k−83
⚙️ Backend🌐 WebWMS

Give monitoring users full access to Tested Inventory

Page no longer crashes for read-only users: Accounts with monitoring-only access (Guest, XL Smart) can now open the Tested Inventory page without errors. Previously, the page would fail to load because the server blocked two data requests that every row on the Per S/N grid needs: photo thumbnails and correction status. The browser interpreted the blocked responses as a connectivity outage rather than a permission issue, so the page showed a confusing "Tidak terkoneksi dengan API service" message instead of the actual data.

New read-only detail view: Monitoring users get a dedicated view-only dialog to inspect the serial numbers behind each material group. The dialog shows saved serials, their test status (Tersimpan or Teruji), metadata (vendor, product type, site), and how many slots are still waiting for serial numbers. It contains no input fields, save buttons, or edit controls, keeping warehouse data safe from accidental changes.

Consistent access control: Both monitoring roles (Guest and XL Smart) now have the same level of read access across the entire Tested Inventory section. Previously, one role could see photos while the other could not, leading to confusing partial access where two different monitoring accounts had different capabilities. A single access constant now ensures both roles are always granted or denied together.

All write actions stay locked down: Photo uploads, correction submissions and approvals, the approval queue, and every data entry operation remain restricted to operator and admin roles. Only the viewing endpoints were opened, and the frontend already hides every write action from monitoring users, so the UI and the server now agree on what these accounts can do.

⚙️ Backend🌐 WebWMS

Add storage location filter and column to Per S/N report

New SLOC column in the report table: The Per S/N report now displays a storage location column directly in the grid. Previously, the location was only visible after exporting to Excel, so staff had to download the entire report just to check which warehouse location a serial was stored in. The column reads the same data field the export uses, so the table and the file always agree.

Filter by storage location: A new "Filter By SLOC" block appears alongside the existing status, condition, completeness, and photo filters. The options are loaded from the warehouse location master data, so they stay in sync whenever locations are added or renamed. If the master data cannot be loaded, the grid still works normally and the filter shows a "Daftar SLOC tidak tersedia" message instead of an empty box.

Excel exports match the on-screen filters: The download button now sends every active filter to the server, including the new storage location filter and the photo presence filter that was previously only applied on-screen. Before this fix, a user could filter the report to "Belum Ada Foto," click Download, and receive a file containing the exact rows they had just filtered away.

🌐 WebWMS

Show accurate progress and status for grouped materials

Detail dialog shows the group's total progress: When viewing a group of materials (for example, a pallet split into ten individual rows), the serial number progress counter now adds up every row in the group. Previously, it only showed the count from the first row, displaying "1/1 S/N" for a pallet that actually had ten serial numbers saved across its members.

Status badges display test counts: Collapsed material groups now show test progress using the same clear format as individual rows: a green "Tested" badge when all serials are tested, or an amber "Partial (3/4)" badge with the actual count when testing is in progress. Previously, all mixed groups showed the generic label "Sebagian" with no numbers, making it impossible to tell at a glance how far along a group was.


+982−123
⚙️ BackendWMS

Fix Per Material inventory pagination to keep split materials together on one page

When a material is carved into multiple rows by hidden metadata (Site, WBS, Tower), those rows look identical in the monitoring table but are stored separately. The old pagination treated each row independently, which could split a group across two pages. The result: operators saw partial totals on one page and incomplete serial number data when opening a dialog.

  • Group-based pagination: The server now counts and pages by material group instead of individual rows, so every carved variant of the same material always lands on the same page
  • Accurate totals: Page counts and the "last page" now reflect the actual number of material groups, not the raw row count, preventing empty or missing pages
  • No data changes: The rows returned per page are exactly the same fields as before. Only the page boundaries shifted to respect group boundaries
🌐 WebWMS

Collapse duplicate Tested Inventory rows into expandable summaries with multi-member S/N editing

When a material is carved (split by hidden metadata like Site, WBS, or Tower), it creates multiple rows that look completely identical to the operator. The Per Material screen now folds those duplicate rows into a single summary row with combined totals, cleaning up the table and restoring the ability to edit all serial numbers in one dialog.

  • Collapsed rows: Duplicate rows are automatically folded into one row with summed totals for quantity, good, broken, faulty, complete, on, and off counts. A small indicator shows how many metadata variants are hidden inside
  • Expand to inspect: Click the chevron on a collapsed row to reveal each variant on its own sub-row, labelled with the exact metadata (Site, Site ID, WBS, Tower ID) that separates it from its siblings
  • Combined S/N dialog: Opening the serial number editor from a collapsed row loads and merges serials from every member variant into one grid, so operators can paste, edit, and save all serials together instead of opening each variant separately
  • Partial failure reporting: If a save or resolve only succeeds for some of the member rows (e.g., one row has locked stock), the dialog stays open and reports exactly how many succeeded and which one failed, instead of showing a generic error
  • Mixed status badge: When member variants have different test statuses, the collapsed row shows a "Sebagian" (Partial) badge instead of a single misleading status

+229−59
⚙️ BackendWMS

Prevent reupload from overwriting confirmed test results

The Tested Inventory reupload feature now checks whether any serial numbers in the batch have already been tested before allowing the reupload to proceed. Previously, uploading a new file could silently overwrite confirmed results on serial numbers that had already passed testing.

  • Upload blocked for tested S/N: If any serial number in the batch already has a test result, the system rejects the reupload immediately with a clear error message, preventing accidental data loss
  • Transactional safety: Even if a result slips through the initial check, a second guard at the database level ensures only untested serial numbers can be updated, rolling back the entire operation if a conflict is detected
⚙️ BackendWMS

Fix Tested Inventory Excel export crash

The Tested Inventory per-serial-number Excel download previously crashed with an ambiguous column error when the search filter was used. This has been resolved by qualifying all column references in the download query.

  • Search filter now works in exports: Operators can use the search bar to filter by serial number, product code, vendor, location, or other fields, then download the filtered results to Excel without errors
  • No data changes required: The fix is purely in the export query; all existing data and reports remain unaffected
🌐 WebWMS

Fix Tested Inventory navigation errors and show resolve feedback

Two navigation fixes and a feedback improvement for the Tested Inventory module. Clicking into a record from the Rekap or Per Material tabs previously showed a 404 page due to a routing issue from an earlier update. This has been corrected.

  • Detail pages load correctly again: Clicking on an existing Tested Inventory record or creating a new one from the Rekap and Per Material tabs now navigates to the correct detail page
  • Clearer resolve feedback: When resolving serial numbers, operators now see exactly how many were newly resolved and how many were skipped because they had already been tested, instead of a generic success message

+1.4k−138
⚙️ BackendWMS

Resolve individual serials from tested inventory groups

  • Individual serial release: Operators can now resolve and release a single completed serial from quality inspection without waiting for the entire material group to be finished, so one tested item no longer blocks the rest of the workflow
  • Accurate stock tracking during merge: Stock quantity checks now correctly account for serials that already exist in merged groups, preventing false rollbacks when finalizing groups that share a parent record
  • Tolerant QI isolation: Serial resolve no longer fails when shared quality inspection restriction headers carry historical links from previously released serials, as the system now recalculates the active quantity from currently-restricted serials instead of relying on denormalized totals
  • Plain-language error messages: Validation messages now name the specific missing data (Vendor, Kategori Produk Material, and Type Product) instead of referring to internal steps like finalization or breakdown
⚙️ BackendWMS

Fix inventory transfer for serials with retained quality inspection history

  • Released serials can transfer: Serials that have already passed quality inspection but still carry historical QI restriction links can now be moved between warehouse bins without being incorrectly blocked
  • Checks current stock state: The transfer guard now verifies whether a serial is actively in QI by checking its current stock bucket, rather than relying on the presence of a historical restriction link, so audit history is preserved without blocking valid moves
  • Clear operator guidance: When a serial genuinely cannot be transferred due to incomplete QI data, the error message now tells the operator to contact the administrator instead of asking them to run data reconciliation
⚙️ BackendWMS

Fix outbound on-test stock calculation error

  • Decimal stock values handled correctly: Outbound on-test resolve now reads stock quantities that contain decimal values (e.g. 128.00 or 12.5) without crashing, fixing resolve failures that occurred when the database stored numeric precision that did not fit a whole-number format
🌐 WebWMS

Improve tested inventory Per Material operator experience

  • Legacy groups are read-only: Complete legacy material groups no longer show the edit action, so operators can proceed directly to testing without being offered an irrelevant metadata editor. Historical metadata is preserved as reference only
  • Batch reset for pasted data: A new Kosongkan S/N & metadata button clears incorrectly pasted serial numbers and their metadata from multiple selected rows at once. The action requires confirmation and never removes already-saved data
  • Plain-language save flow: The save button now reads Simpan instead of Simpan & Pecah, status text says siap disimpan instead of siap dipecah, and success toasts use dikelompokkan menjadi N material instead of dipecah menjadi N breakdown
  • Consistent mode detection: The serial capture mode (Per S/N vs Legacy Group) is now determined from the authoritative API response rather than inferred from local S/N counts, ensuring the UI behavior matches the backend state
⚙️ BackendTMS

Fix notification unread count crash for users with large histories

  • Badge loads reliably: The unread notification count now loads without errors even for users with thousands of past notifications. Previously, the system attempted to load every notification into memory and build an unbounded filter list, which exceeded the database expression limit and caused server errors
  • Server-side filtering: Customer-based visibility rules are now applied directly in the database query instead of being evaluated in memory, so only relevant notifications are counted
  • Faster counting: Read notification filtering uses a database anti-join and per-category aggregation runs entirely on the server, reducing the data the application needs to process

+2.1k−113
⚙️ BackendWMS

Add login rate limiting and progressive account lockout

Login attempts to the WMS system are now protected against automated attacks. Previously, the captcha-free mobile login path had no attempt limits, making it the weaker entry point for credential stuffing.

  • Rate limiting per source address: After 20 login attempts from the same address in one minute, further attempts are blocked with a time indicator until the window resets
  • Rate limiting per username: After 5 failed attempts with the same username in one minute, that account is temporarily throttled regardless of which address the requests come from
  • Progressive lockout: Consecutive failed logins trigger escalating lockouts: 15 minutes after 5 failures, 1 hour after 8, 4 hours after 12, and 24 hours after 15
  • Protection applies to both login paths: The web login (with captcha) and the mobile login are guarded by the same rate limit and lockout rules
  • Swagger documentation hidden in production: The API documentation page is no longer publicly accessible on the live server
  • Origin allowlist for cross-origin requests: Only authorized domains can call the API with credentials, preventing unauthorized websites from making requests on behalf of signed-in users
⚙️ BackendWMS

Fix serial number breakdown for shared quality inspection restrictions

When warehouse staff split serial numbers that share a single quality inspection restriction header (a legacy data pattern from older inbound records), the system could reject the operation because the counts and quantities on the shared header did not match the subset being split.

  • Automatic restriction isolation: Before splitting, the system now separates the target group into its own dedicated restriction header, leaving unrelated serial links and quantities untouched on the original shared header
  • Clearer error messages: If something is still inconsistent, the rejection now lists every specific mismatch (which count is wrong, what the expected value was) instead of a generic failure message
  • Incremental finalization works again: Individual serial numbers can be finalized and resolved as soon as their data is complete, without waiting for every other serial in the provisional group
🌐 WebWMS

Make Tested Inventory tabs bookmarkable and shareable

Each tab on the Tested Inventory page (Rekap, Per Material, Per S/N, Persetujuan Perubahan) now has its own URL path, so the selected tab survives a page refresh or a shared link.

  • Stable URLs per tab: Navigating to a tab updates the browser address bar, so the link can be copied, bookmarked, or sent to a colleague
  • Browser navigation works: The back and forward buttons now restore the previously selected tab instead of leaving the page
  • Safe redirects: Invalid or unauthorized tab links are automatically corrected to the Rekap tab, preventing errors from old bookmarks or mistyped URLs

+3.0k−462
⚙️ BackendWMS

Identify and test serial numbers incrementally instead of waiting for the full batch

Previously, a batch of 60 Quality Inspection serials had to be fully identified before any of them could be carved into separate breakdown groups and sent to testing. If even one serial was missing its metadata, the entire batch was stuck.

Incremental carve: Operators can now identify, carve, and resolve serials in smaller batches across multiple days. A 60-unit pallet can be processed ten units at a time while the remaining 50 stay provisional and wait for their turn.

Automatic regrouping: If an already-carved serial has its metadata corrected (for example, a wrong Vendor or Type Product), the system re-opens it and moves it to the correct breakdown group on the next carve, matching it with serials that share the same attributes.

Merge into existing groups: When a later carve produces a group whose attributes match a group that was already carved from the same batch, the serials join the existing group instead of creating a duplicate.

Protected value accounting: QI monetary value is allocated using a proportional splitting method that guarantees the parts always add up to exactly the original amount, preventing rounding drift across repeated carves.

⚙️ BackendWMS

Block Quality Inspection stock from bypassing Test Bin checks, and repair 960 stranded units

A safety guard that was supposed to prevent Quality Inspection stock from going directly into a Test Bin was reading the wrong data source. It checked a view that was empty at the time of the check, so it appeared to be working while letting every QI allocation pass through silently. As a result, 960 serials from Batch-6 ZTE ended up in a Test Bin with no Tested Inventory document behind them, making them impossible to test or resolve through the normal workflow.

Repair script: A transactional repair was run to create the missing Tested Inventory document for the 960 stranded serials. The script runs as a dry-run by default, validates every precondition (serial counts, restriction status, QI quantities), and creates a full backup before applying changes. The repaired documents are now visible and can proceed through the standard testing flow.

Guard fix: The safety check now reads the inventory table directly instead of the allocation-gated view, so it can detect QI stock before the allocation step completes and reject it with the specific bin name that is blocked.

Legacy route protection: The same safety check was applied to the older item-by-item confirmation and allocation routes, which are no longer used in the UI but can still be called through the API. This closes the gap so that no route can bypass the invariant.

🌐 WebWMS

Replace the Tested Inventory serial entry form with an Excel-like grid

The Per-S/N serial entry dialog in Tested Inventory Per Material has been rebuilt from a sequential scan-and-queue list into a spreadsheet-style grid where every slot in the batch is visible as a row from the moment the dialog opens.

Excel-style paste: Paste a column of serial numbers directly into the grid and they fill the rows in order. Multi-column pastes work too: paste serial numbers with their Vendor, Category, and Type columns and everything fills in one action. Operators can paste serials first and fill in metadata columns later.

Row selection and bulk actions: Shift-click to select a range, use select-all, then apply toolbar metadata to the selection, copy values from one row down to the rest, or clear metadata in bulk.

Live breakdown preview: The dialog footer shows how the current entries will be split (for example "2 breakdown (2 + 1)"), grouped by the same attributes the system uses when carving, so operators know the outcome before confirming.

Per-serial locking: Only serials that have been fully resolved are locked. Saved but unresolved serials stay editable and automatically move to a different breakdown group when their metadata changes, preventing operators from getting stuck with incorrect groupings.

Unresolved value handling: If a pasted or typed value does not match any entry in the master list, it stays visible with an amber highlight and blocks saving until it is corrected, rather than being silently substituted with a similar-sounding match.


+3.3k−255
⚙️ BackendWMS

Per-serial metadata mode for Tested Inventory quality inspection

Each serial number in a new Inbound QI group can now carry its own vendor, material category, and product type instead of sharing one set of metadata across the entire group. This means a single shipment containing mixed suppliers or product types can be recorded accurately at the individual serial level.

  • Individual serial metadata: Operators assign vendor, material category, product type, WBS element, tower ID, site, and site ID to each serial number during the Tested Inventory workflow, instead of filling one shared form for the whole group
  • Automatic breakdown finalization: Once all serials are identified and their metadata is complete, the system splits the single provisional parent into separate records for each distinct metadata combination, recalculating stock quantities and monetary values atomically so totals never drift
  • Mandatory for new groups: Fresh Inbound QI groups that have not yet identified any serial must use the new per-serial mode, preventing data inconsistencies from the old single-metadata approach
🌐 WebWMS

Per-serial metadata capture and breakdown finalization in Tested Inventory

The serial number dialog in Tested Inventory Per Material now supports entering each serial with its own vendor, material category, and product type, replacing the previous one-size-fits-all approach. Once all serials are identified, operators can finalize the breakdown in one click.

  • Per S/N scanning mode: Each scanned serial receives its own metadata record. Operators fill in the vendor and product details once, then scan one or more serials that inherit those values, making it fast to process mixed batches
  • Inline metadata editing: Each saved serial's metadata can be edited individually through a pencil icon, giving operators full control to correct or update details before finalization
  • One-click breakdown finalization: A finalize button appears automatically when all provisional slots are filled, splitting the group into separate records without changing total stock
⚙️ BackendWMS

Fix Test Bin transfer stock and restriction consistency

Transfers into Test Bins now correctly detect each serial's actual stock status (available, quality inspection, or blocked) instead of assuming all Test Bin stock is already under QI restriction. Serials moving from available stock into a Test Bin get their QI restriction created automatically during the transfer.

  • Correct stock bucket detection: The system reads each locked serial's authoritative status from the database, preventing available stock from being treated as quality-inspected and vice versa
  • Automatic QI restriction creation: Serials in available stock that are transferred into a Test Bin now receive their QI restriction atomically as part of the transfer, closing a gap that left stock untrackable and unable to be resolved
  • Warehouse-scoped validation: Test Bin lookups, including the destination-rack check, are now restricted to the authenticated user's assigned warehouse, preventing cross-warehouse confusion in multi-warehouse setups
⚙️ BackendWMS

Preserve QI restriction history when moving serials to Blocked

Serials moved from Quality Inspection to Blocked now keep their original QI restriction link as an immutable history record instead of deleting it. This preserves the complete audit trail showing where each serial came from.

  • Retained QI history: The resolved QI link stays in the database while the new Blocked restriction becomes the only active one, so operators can still see the serial's original inspection context
⚙️ BackendWMS

Stop propagating legacy zero-inbound transfer labels

Send-to-Test transfers no longer carry the misleading label "TRANSFER FROM INBOUND ID: 0" into Tested Inventory records. Previously, when a source pallet already had this stale text, the transfer copied it forward instead of replacing it with the correct label.

  • Normalized transfer remarks: All transfer remarks are now processed through a single validation step that rewrites the legacy zero-inbound text to "TRANSFER FROM EXISTING INVENTORY", while preserving genuine pallet remarks and real inbound references unchanged
🌐 WebWMS

Translate restriction labels and clarify resolved restriction history

The Inventory Under Restriction page now displays all restriction labels in Bahasa Indonesia, and resolved restrictions show their retained serial history count instead of a misleading "0" quantity.

  • Bahasa restriction labels: Resolved restrictions show "Selesai - tidak ada stok terestriksi aktif" with the serial history count, and the serial list dialog is titled "Riwayat S/N Selesai" for resolved rows and "Daftar S/N Terestriksi" for ongoing ones
🌐 WebWMS

Reduce mobile page gutters for more usable content width

All WMS pages on mobile devices now use narrower horizontal padding (8px instead of the previous wider gutters), giving tables, forms, and action buttons significantly more screen space on phones.

  • Consistent 8px mobile padding: Every theme variant now uses the same compact mobile page padding, so content reaches closer to the screen edges on all phone sizes
  • Flattened page cards: Presentation-only wrapper cards on routed pages are transparent on mobile, removing their background, border, shadow, and padding so content fills the available width
  • Compact action bars: Refresh, Download, and create actions share a single compact row on phones instead of stacking vertically, and filter groups collapse behind a toggle button
  • Horizontally scrolling tabs: Tab navigation on Tested Inventory and Occupancy pages scrolls within the viewport on phones instead of overflowing off-screen

+345−48
⚙️ BackendWMS

Prevent quality inspection stock from bypassing the proper test workflow

  • Blocked invalid receiving path: Quality inspection stock can no longer be received directly into a registered Test Bin. Previously, operators could accidentally allocate QI stock straight into a Test Bin, which would mark the items as "On Test" in the system but without ever creating the required Tested Inventory document. This left the batch permanently stuck and untestable through the normal workflow.
  • Clear operator guidance: When the system detects this scenario, it now rejects the allocation and displays a message in Indonesian naming the specific bin that caused the conflict. The message instructs the operator to first receive the stock into a normal QI storage bin, then send it to test through the dedicated "Send to Test" menu.
  • Consistent across warehouse workflows: The protection applies to both the standard and XLHome inbound processes, so the same data integrity rule is enforced regardless of which warehouse module the operator is working in.
⚙️ Backend🌐 WebWMS

Add 'Faulty' test result condition for inventory quality inspection

  • New "Faulty" condition: Items can now be classified as "Faulty" during quality testing, alongside the existing "Good" and "Broken" categories. This gives warehouse teams a more precise way to label items that have partial defects or cosmetic issues but are not completely broken, making it easier to track and disposition items that may still be repairable.
  • Yellow warning badge: Faulty items display with a distinct yellow badge across every inventory page and report, immediately distinguishable from Good (green) and Broken (red). This visual coding works in serial number views, monitoring tables, the inbound detail page, and the tested inventory detail modal.
  • Dashboard on-test breakdown updated: The statistics cards on the main dashboard now show a three-way split of Good, Broken, and Faulty, so management can see quality outcomes across all three categories at a glance without drilling into individual reports.
  • Full reporting and upload coverage: The new Faulty column appears in the inbound monitoring table, tested inventory rekap, per-material report, and per-serial-number view. Excel upload templates and validation messages have been updated to accept "Faulty" as a valid condition value, with instructions written in Indonesian for operators.

+639−71
⚙️ BackendWMS

Correct tested-item counts on Inventory Under Restriction reports

  • Accurate Tested/Available/Blocked counts: The restriction report previously pulled test status from copied fields that could be stale when stock was moved between bins. Now it reads directly from actual test records, so the progress numbers match reality.
  • Per-row status reflects real test outcomes: Each serial number under restriction now shows the correct Tested/Pending and Available/Blocked status based on genuine quality inspection results, not inherited metadata from the source bin.
⚙️ BackendWMS

Show accurate labels for existing-inventory stock transfers

  • Clear "TRANSFER FROM EXISTING INVENTORY" label: Stock transferred from existing warehouse inventory now carries a descriptive label instead of the misleading "TRANSFER FROM INBOUND ID: 0" text, making transfer origin immediately clear on reports and inventory views.
  • Dashboard figures stay clean: Warehouse dashboard statistics (daily inbound, recorded, verified, weekly totals) now properly exclude all transfer-sourced rows using a broader filter, keeping operational counts accurate regardless of the transfer source.
🌐 WebWMS

Streamline serial number input in Tested Inventory

  • Paste multiple serial numbers at once: Scanning or pasting a block of serial numbers into the Tested Inventory Per Material form now splits them automatically into individual entries, instead of recording only the first value and discarding the rest.
  • No serial dialog for completed transfers: Rows that originated from a transfer bin and already carry all their serial numbers no longer show the serial capture dialog, reducing clutter and preventing accidental re-entry.
🌐 WebWMS

Recognize new transfer labels in Tested Inventory detail

  • Consistent transfer row detection: The Tested Inventory Per Material dialog now recognizes the updated "TRANSFER FROM EXISTING INVENTORY" label in addition to the original "TRANSFER FROM INBOUND ID" format, so transfer rows continue to be handled correctly across both label variations.
⚙️ BackendApproval

Fix pricing errors caused by mismatched tariff spreadsheet columns

  • Correct minimum weight on 36 tariff routes: Four tariff sheets in the annual pricing workbook store the minimum weight and lead time in a different column order than the other sheets. The import previously read them swapped, causing quotes on 36 routes to undercharge by as much as 94% because the weight floor and transit time were used interchangeably.
  • Automatic column detection from header row: The import now reads each sheet's own header row to locate the right columns, so pricing stays correct even when new sheets are added to the workbook or existing ones are restructured.
  • Handles sheets with offset headers: Tariff sheets that open with a blank row are now scanned correctly instead of losing their first row of data to a misaligned header.

+960−115
⚙️ Backend🌐 WebWMS

Enforce quality inspection workflow when moving stock to Test Bin

  • Ordinary stock moved to Test Bin creates QI restriction automatically: When warehouse staff transfer regular inventory into a registered Test Bin, the system now creates a Quality Inspection restriction behind the scenes, ensuring all test-bound stock follows the proper QI lifecycle
  • Restricted QI stock must use Send to Test: Active QI-restricted serials can no longer bypass the inspection workflow through a general transfer; the system blocks the move and directs staff to use the dedicated Send to Test action from Inventory Under Restriction
  • Clearer guidance in Bahasa Indonesia: The transfer screen now explains the workflow steps in Indonesian: ordinary stock transferred to Test Bin is recorded as QI, and restricted stock should go through Send to Test
  • Test Bin detection is more accurate: The "Can Send to Test" indicator no longer appears for QI rows already sitting in a Test Bin, preventing redundant actions
⚙️ Backend🌐 WebWMS

Show testing progress and serial status for restricted inventory

  • Progress counter on each restriction row: The Inventory Under Restriction list now shows how many serials have been tested out of the total (e.g., "On Test · 3/5 Tested"), giving warehouse managers a quick snapshot of inspection progress
  • "Test Complete" badge: When all serials in a restriction have been tested, the row displays a green "Test Complete" badge instead of the yellow "On Test" indicator
  • Per-serial status and disposition columns: The restricted serial number detail table now has Status (Pending or Tested) and Disposition (Available, Blocked, or Pending) columns with color-coded badges, replacing the previously hidden status field
  • Pagination fix: The serial number list now correctly applies the user's selected page size when navigating between pages
⚙️ BackendWMS

Keep serial numbers in sync after quality testing

  • Serial numbers update across views: When a serial number is reassigned during quality testing (e.g., from a placeholder to a physical reading), the updated number now appears in the Inventory Under Restriction list immediately instead of showing the old value
  • All three update paths covered: The sync applies when serials are tested through the normal upload flow, when candidates are approved, and when serials are replaced, ensuring consistency across all testing scenarios
  • Reconciliation script included: A SQL repair script is provided to fix any existing mismatched serial numbers from before this fix, so historical data can be corrected in one pass
🌐 WebWMS

Add search to product metadata dropdowns in test form

  • Live search on all three metadata fields: Vendor, Kategori Produk Material, and Type Product dropdowns in the Tested Inventory Per Material dialog now support typing to filter results, instead of requiring operators to scroll through the entire list
  • Alphabetical ordering: All options across the three dropdowns are sorted A to Z by display name, making it faster to locate entries regardless of how many items the list contains
  • Consistent search control: The existing typeahead control (already used elsewhere in WMS) replaces the plain select boxes, giving operators a familiar search-as-you-type experience
🌐 WebWMS

Show complete serial number list in Per Material test dialog

  • All saved serials now visible: The "Isi S/N per Remark" dialog displays every saved serial number, including ones that have already passed testing, instead of silently hiding resolved rows
  • Resolved rows are read-only: Tested serials appear with a gray "Teruji" badge and no edit button, preventing accidental changes to finalized results
  • Only unresolved rows can be edited: The replace button remains available only on serials that have not been resolved, keeping the replacement flow focused on pending entries

+1.9k−133
⚙️ BackendWMS

Enable pallet metadata and test-result drafts in Tested Inventory

  • Pallet-level metadata: Operators can now fill in Vendor, Kategori Produk Material, and Type Product once per pallet group when saving serial drafts, along with optional fields like Wbs, Tower ID, and Site. These values persist on the parent record and carry through to the inbound data when the batch is finalized.

  • Save test results as drafts: A new result-draft endpoint lets operators save Condition, Completeness, Power On Test, and Remark for each serial without resolving. Drafted values pre-fill into the resolve dialog when the operator returns, so progress is never lost between sessions.

  • Automatic inbound sync: When a tested batch is finalized through resolve or confirm/reupload, test results and pallet metadata are automatically written back to the on-test inbound record. This keeps the inbound data in sync without manual updates.

  • Preserve pallet labels on send-to-test: Pallet remarks (such as "Pallet 1") now carry over when items are moved into the On-Test area, instead of being replaced with a generic transfer marker.

⚙️ BackendWMS

Improve Tested Inventory draft management and export reliability

  • Draft snapshot: Returns previously saved serial numbers for a detail row, so the UI can display saved entries when the draft dialog is reopened at partial progress.

  • Menunggu S/N filter: Status filtering now correctly identifies items waiting for serial input (Menunggu S/N) in both the monitoring list and the exported report.

  • Metadata and resolve guards: Operators can save mandatory pallet fields without adding new serials, and provisional items are blocked from resolution when Vendor, product category, or product type is still blank.

  • Export fixes: Downloaded reports now include Kategori Produk Material, Type Product, and Pallet Remark columns. A crash caused by a missing column reference in the export query has also been fixed.

⚙️ BackendWMS

Fix false blocking of tested item transfers out of On-Test bins

  • Serial-level validation: Tested items can now be moved out of On-Test bins without being falsely rejected. The guard now checks each serial's individual test result, instead of the parent batch status which could be stale after re-test or re-upload flows.
⚙️ BackendWMS

Add safe serial number replacement for tested inventory

  • In-place replacement: An incorrect serial number can now be replaced directly on a tested item that has been identified but not yet resolved, with full server-side validation to prevent data inconsistency.

  • Dual-table update: Both the tested record and the linked inventory record are updated simultaneously, so the serial number stays consistent across the system.

  • Validation guards: The system enforces warehouse-wide uniqueness, blocks replacement on already-resolved serials, and rejects system-reserved serial prefixes, preventing accidental data corruption.

🌐 WebWMS

Redesign Tested Inventory pages with grouped layout and draft saving

  • Grouped Per Material table: Rows are now organized under material batch headers and pallet remark sub-headers, with each group showing its batch reference and pallet count. Duplicate columns that previously repeated on every child row have been removed.

  • Pallet fields in draft dialog: Operators fill in Vendor, Kategori Produk Material, and Type Product once per pallet group, with required dropdown validation and optional fields (Wbs, Tower ID, Site, Site ID).

  • Excel-style serial paste: Multiple serial numbers can be pasted from a spreadsheet at once and are automatically split into individual entries, matching the workflow of the Manage Serial Number page.

  • Save as Draft for test results: A new button in the Per S/N resolve dialog saves Condition, Completeness, Power On Test, and Remark without finalizing. Drafted values pre-fill when the operator returns to the dialog.

🌐 WebWMS

Fix Tested Inventory draft dialog to show saved data and stay editable

  • Saved serials visible on reopen: Previously saved serial numbers now appear in the draft dialog when reopening a partial entry, so operators can see and manage existing progress instead of an empty list.

  • Edit at full capacity: The dialog stays editable at 15/15 (all serials filled) when mandatory Vendor or product type fields are still blank, with the Save button active for metadata-only saves.

  • QI-only edit action: The edit button now appears only on quality inspection rows, preventing confusion on standard inbound items that do not use the serial draft workflow.

  • Review mode at 5/5: Fully resolved rows (all serials identified) can still be opened for review instead of the dialog closing silently.

🌐 WebWMS

Relabel REKAP summary column for clarity

  • Belum Ditest label: The Recorded column in the REKAP summary has been renamed to "Belum Ditest" (Not Yet Tested), making the formula read Belum Ditest + Tested = Total instead of the previous Recorded + Tested, which could be confusing when Tested exceeded Recorded past 50% completion.
🌐 WebWMS

Add inline serial number editing in Tested Inventory

  • Inline edit in draft dialog: Saved serial numbers in the Per Material draft dialog can now be edited in place with a confirmation prompt, instead of requiring deletion and re-entry.

  • Inline edit in resolve dialog: Serial numbers in the Per S/N resolve dialog also support inline editing, with the same confirmation and validation flow.

  • Smart edit gating: The edit button only appears on unresolved, non-provisional serials, preventing accidental changes to finalized records.


+1.4k−450
⚙️ Backend🌐 WebWMS

Send multiple Quality Inspection restrictions to test in one step

  • Multi-select on the main table: QI restriction rows can now be checked off directly on the restriction list, including across pages, instead of drilling into each row's serial number list to pick individual units
  • One-step bulk transfer: All selected rows share the same destination Test Bin and Tested Inventory document, so operators can process an entire batch of QI restrictions in a single action
  • Atomic processing: Every transfer in the batch either succeeds together or rolls back as a unit, so inventory counts are never left in a partially-moved state
  • Clear visual feedback: The bulk action bar appears only after rows are selected, the button dynamically shows the restriction type, and the dialog lists every selected row with its source location and quantity
⚙️ Backend🌐 WebWMS

Resolve Blocked restrictions with optional stock transfer

  • Two resolve modes: The resolve dialog now offers a choice between freeing stock in place ("Freed") and freeing then immediately moving it to a chosen destination ("Freed with transfer"), so operators no longer need to create a separate transfer after resolving
  • Bulk selection for Blocked rows: Multiple Blocked restrictions can be selected through the same left-column checkboxes used for QI, with a unified destination SLOC and Bin applied to every row in the batch
  • Destination safety: Test Bins are rejected as a transfer destination, and both SLOC and Bin must be picked before the resolve can be confirmed, preventing misplaced stock
  • Atomic release and move: The free and transfer run inside a single transaction, so either the entire resolve-and-move succeeds or nothing is committed
⚙️ BackendWMS

Fix deadlock preventing QI-direct stock from reaching the test bench

  • QI-direct stock can now reach the test bench: Items created with a placeholder serial number (before a physical unit is scanned) can move into a Test Bin, where the real serial number is captured at the bench
  • Placeholder serials stay contained: The block on provisional serials still applies to all non-test destinations (free stock, outbound, ordinary bin moves), so a placeholder serial can never leak out of the quality inspection workflow

+10.5k−143
⚙️ Backend🌐 WebWMS

Select specific serial numbers when sending quality inspection items to test

Operators can now pick individual serial numbers from a quality inspection restriction and send only the chosen ones to a test bin, instead of moving the entire restriction at once.

  • Checkbox selection per serial number: The restricted S/N list now has checkboxes next to each unit, with a "Select All" option that only picks serial numbers still eligible for testing. Selections persist when paging through the list but reset if search or page size changes
  • Partial send to test: Once serial numbers are selected, pressing "Send Selected to Test" opens the existing destination dialog with the count of chosen units. The quantity shown updates to reflect the selection rather than the full restriction
  • Eligibility status per row: Each serial number displays whether it is still at the quality inspection source bin ("Ready for Test") or has already been moved ("Already moved"), so operators can see at a glance which units can still be sent
  • Concurrent transfer protection: The system locks serial records during transfer and rejects requests if another operator moved the same serial in the meantime, preventing duplicate transfers from corrupting inventory counts
⚙️ Backend🌐 WebWMS

Add serial number identification and approval-gated corrections for Tested Inventory

Tested Inventory now supports capturing physical serial numbers before test resolution, and allows corrections to already-tested data through an approval workflow instead of direct editing.

  • Serial number capture per material and pallet: Operators can scan or type physical serial numbers for each material and inbound remark group (e.g., per pallet) before recording test results. The Per Material grid shows identification progress directly on each row (e.g., "S/N 3/10"), and a dedicated dialog with real-time duplicate checking lets operators fill in serials one at a time
  • Provisional unit visibility: Serial numbers that have not yet been identified appear with a yellow "Menunggu S/N" (Waiting for S/N) badge in the Per S/N grid. These rows are highlighted and prevented from being resolved or receiving photos until their identity is recorded
  • Approval-gated corrections: Tested serial numbers can now be corrected through a request-and-approval workflow. Operators submit changes to serial number, MAC address, remark, or photos with a mandatory reason, and a WMS Super Administrator reviews the old/new diff before approving or rejecting
  • Correction review queue: A new "Persetujuan Perubahan" (Change Approval) tab in Tested Inventory shows all correction requests filtered by status, with a badge counter for pending items and a detailed review dialog that includes photo previews
  • Dashboard split: The Inventory On Test dashboard card now separates work in progress from completed testing. Both numbers always reconcile to the same total, so operators can see at a glance how many units still need results versus how many are ready to be racked
⚙️ BackendApproval

Map ERP transport mode names to pricing tariff modes

Forms that arrive from the ERP system carry transport mode names that the pricing calculator did not recognize, leaving 42 shipment items unpriceable. A new alias table translates these names to the modes the tariff master prices by.

  • Mode name translation: ERP service names like "Darat Reguler" are now automatically translated to the pricing mode DARAT, and "Multi Charter CDD" translates to CHARTER with vehicle type CDD. The 42 stranded shipment items in production can now be calculated without any change to the ERP data
  • Charter vehicle detection: Labels that include a vehicle class (e.g., "Multi Charter CDD") not only map to the CHARTER mode but also supply the vehicle type, so charter pricing works even when the form does not explicitly state one
  • Dynamic mapping: New translations are added as a single database row with no deployment required. A seed script reports which ERP mode names on existing forms are still unmapped, so the product owner always knows what remains to be decided

+2.4k−85
⚙️ BackendWMS

Simplify QI inbound with one-row-per-material upload and one-click confirmation

  • Simplified upload template: Operators can now record one row per material with a total quantity, instead of filling one row per individual serial number. The system automatically expands each row into individual units behind the scenes, keeping the rest of the inbound pipeline unchanged.

  • One-click QI confirmation: Quality Inspection batches no longer require a separate download-and-reupload step for confirmation. Since the information the confirmation spreadsheet was collecting (storage Bin and MaterialType) is already known from the QI template, operators can confirm and allocate in a single action.

  • Pending serial numbers: Units created through the simplified flow start with a placeholder serial number that is filled in later by scanning on the Tested Inventory screen. This keeps inventory counts accurate from the start, while preventing placeholder units from being transferred or shipped before they are properly identified.

  • Corrected inbound counts: Inbound batches that are entirely in Quality Inspection or Blocked status now report their correct quantities across all status views (Recorded, Verified, Recorded Serial Number), instead of showing zero until they reach the Allocated stage.

🌐 WebWMS

Add simplified upload mode and one-click QI confirmation to inbound workflow

  • Upload mode selector: A toggle on the upload modal lets operators choose between the full template and the new simplified "QI Direct" template. The simplified mode only requires material code, quantity, plant, storage location, bin, unit of measure, and a pallet label.

  • One-click QI confirmation: QI batches show a dedicated "Konfirmasi & Alokasi QI" button instead of the standard upload-based confirmation flow, reducing the process to a single click. The button only appears when the batch was uploaded via the QI Direct template.

  • "Pending S/N" display: Serial numbers created by the simplified upload are shown as "Pending S/N" in the item list, making it immediately clear which units still need physical scanning on the Tested Inventory screen.

⚙️ BackendApproval

Preserve typed item descriptions and manufacturer part numbers on save

  • Manufacturer part number preserved: When saving a Part item, the manufacturer's part code (e.g., "SKF-6205-2RS") is no longer overwritten with the internal material number. Previously, every save destroyed the manufacturer reference and replaced it with the system material code, making the original value unrecoverable from the form itself.

  • Typed descriptions kept: A description entered by a requester or approver is no longer silently replaced by the master material name. The master name is still used as a default when no description is provided, but a typed value is now respected on every save.

  • Protected across all form types: The fix applies to BL Inbound, BL Outbound, and Pickup Domestic forms, so no form type was left vulnerable to the data loss.

⚙️ BackendApproval

Stop tariff re-import from silently resetting pricing configuration

  • Volumetric divisor preserved: Re-importing CJ tariff sheets no longer resets the volumetric weight divisor for each transport mode back to its default value. An operator who tuned a divisor for a specific mode will keep that setting across future imports, preventing prices from changing silently.

  • Mode identity stable: Pricing modes keep their original database identity and configuration after a re-import, instead of being deleted and recreated from scratch. This prevents foreign key mismatches and keeps audit trails intact.

  • Inactive mode warnings: If a required transport mode is stored as inactive, the import now warns about it explicitly. Without this, tariffs for the inactive mode would appear to import successfully but would never produce a price, reporting as "route not registered" instead.

🌐 WebApproval

Show CJ reference price on BL Outbound items

  • "Hitung Harga Referensi CJ" button: A new button on the BL Outbound form calculates the CJ reference price for each item on demand. Prices are calculated only when the operator requests them, not on page load, to keep the experience responsive.

  • Per-item price column: Each item row now has a "Harga Referensi" column showing the calculated reference price in Rupiah. Hovering over the price reveals the full breakdown: actual weight, volumetric weight, billed weight, rate per kg, and lead time.

  • Clear error states: Items that cannot be priced show a specific reason rather than a blank cell. "Data kurang" means the row is missing required fields (origin, destination, mode, or weight) that the operator can fix. "Tarif belum ada" means the route is genuinely absent from the CJ tariff master.

  • Summary bar: A total reference price across all priced items is shown above the table, alongside a count of items that could not be calculated.


+2.1k−85
⚙️ BackendTMS

Distribute Android app updates from the admin panel

  • New APK release management: Admins can now upload, browse, and delete Android app releases directly from the system, with each release tagged by version number and optional release notes
  • Automated CI/CD uploads: The build pipeline can push new APK versions automatically using a secure API key, so every build can be published without manual intervention
  • Cloud-hosted files: Uploaded APKs are stored in Azure Blob Storage and served via direct download links, keeping the server lightweight
  • Role-based access: Only users with Admin or Super Admin roles can manage app releases
🌐 WebTMS

Preview petty cash attachments and upload files with image thumbnails

  • Attachment preview dialog: Clicking an attachment name on the petty cash list opens a full preview panel that displays images and PDFs inline, with a file sidebar for switching between attachments
  • Card-based upload: The expense and income forms now show uploaded files as visual cards with image thumbnails instead of a plain text list, making it easy to verify the right photos were selected
  • Clickable attachment chips: The transaction list replaces the plain "N file(s)" text with individual file name chips, so users can jump straight to a specific attachment
🌐 WebTMS

Admin page for publishing and managing Android app updates

  • "Pembaruan Aplikasi" page: A new page under the System menu where admins can view the latest release, upload new APK files, and browse the full release history
  • Version highlight card: The latest published version is shown prominently at the top with its release notes, file size, and a one-click download button
  • Drag-and-drop upload: New releases are uploaded by entering a version number, optional release notes, and selecting an APK file, all within the same page
  • Searchable release history: Past releases are listed in a table with search, showing version, file size, date, and download links
🌐 WebApproval

Show expiry countdown on pending approval requests at a glance

  • Countdown badges: The approval queue and My Pending Forms lists now display a small countdown badge (e.g., "3d left", "5h left") next to each request, so approvers can immediately see which items need urgent attention
  • Urgency coloring: Badges change color based on time remaining: neutral for requests with more than 48 hours, amber under 48 hours, red under 12 hours, and grey with strikethrough for expired requests
  • Hover for exact time: Hovering over any badge reveals the exact expiry timestamp
  • No clutter for non-expiring forms: Form types that do not have an expiry (Pickup & Delivery, MRN Request, MRF) show no badge at all
⚙️ BackendApproval

Fix Pickup Domestic approval rejecting valid items during final review

  • Merged-state validation: Final approval validation now checks each item's complete data (combining the approver's edits with the stored values) instead of only the fields the approver changed, so items that were not edited are no longer incorrectly flagged as invalid
  • Material type preserved: Omitting the material kind on a partial edit no longer silently reclassifies Non-Part items as Parts, which previously caused validation to fail for missing box numbers
⚙️ BackendApproval

Fix pricing import incorrectly reading Indonesian number formats

  • Locale-safe number parsing: The tariff import now correctly reads prices exported from both English and Indonesian Excel, so "41.500" (forty-one thousand five hundred in Indonesian format) is no longer misread as 41.5
  • Charter rates preserved: Values in the millions (common for charter flat rates) that previously failed to parse entirely and were silently skipped now import correctly
  • Accurate minimum weights and lead times: Minimum weight cells like "Min 10 Kg / 3 hari" now correctly extract the first number (10) instead of concatenating all digits (103), and lead time ranges like "3-4 hari" use the lower bound
⚙️ BackendApproval

Block tariff imports that would silently erase the pricing master

  • Import safety check: A tariff import that parses zero rows is now rejected outright, and one that would shrink the stored data below half is blocked unless explicitly approved, preventing a bad file from destroying the entire pricing database
  • Clear error messages: When an import is blocked, the response tells the operator exactly how many rows were parsed versus how many exist, so the cause (format error, wrong file, locale mismatch) is immediately clear
  • Override for deliberate changes: If the reduction is intentional, the operator can re-run the import with a confirmation flag that acknowledges the risk

+243−14
🌐 WebApproval

Add DO Number with auto-generate and PO auto-fill for BL Inbound and Pickup Domestic

  • DO Number field with auto-generate toggle: Both BL Inbound and Pickup Domestic create forms now include a DO Number field. By default, the system previews and fills the next available number automatically, but users can switch to manual entry at any time
  • PO auto-generate option: A new header-level checkbox lets the server automatically assign PO numbers to line items that don't already have one, reducing manual data entry during form creation
  • WBS / Neg. Res label correction: The field previously labeled "BL/DO Number" now correctly shows "WBS / Neg. Res" across create and view forms, matching the actual data it holds
  • DO Number visible on detail pages: After a form is saved, the DO Number appears as a read-only field on the BL Inbound and Pickup Domestic view pages for easy reference

+13.7k−267
⚙️ BackendWMS

Resolve tested inventory to Available or Blocked stock

  • New "Blocked" outcome: When resolving tested items, operators can now choose to move stock into Blocked status instead of releasing it to Available. Blocked stock cannot be used for outbound but can still be relocated between bins.
  • Per-item control: Each serial number can be assigned its own outcome (Available or Blocked) within a single resolve request, so a batch of tested items can be split between the two statuses in one step.
  • Accurate quantity tracking: When items are moved to Blocked, the system correctly transfers the quantity from the Quality Inspection bucket to the Blocked bucket and creates an active restriction record, so stock counts remain accurate at every stage.
🌐 WebWMS

Attach evidence photos and choose stock outcome when resolving tested inventory

  • Resolve photos: Evidence photos can now be uploaded directly in the resolve dialog, with preview thumbnails, drag-and-drop support, and the existing 5-photo, 10 MB per-photo limits.
  • Separate resolve buttons: Two clear actions, "Semua Available" and "Semua ke Blocked," replace the single resolve button so operators can explicitly choose the final stock status for the whole batch.
  • Per-row stock outcome: A new "Hasil Stok" dropdown appears on each serial number row, allowing mixed outcomes in one submission. A live summary bar shows the count of Available and Blocked items with color-coded badges.
  • "Resolve Pilihan" button: When a mix of Available and Blocked items is selected, a dedicated button appears to submit the mixed resolve with a clear progress message showing how many items go to each status.
⚙️ BackendWMS

Stop blocked and on-test stock from being outbounded

  • Accurate available quantity: The outbound availability check now correctly subtracts Blocked and Quality Inspection quantities from the total, preventing items that are under test or restricted from being allocated to outbound orders.
  • Consistent across all flows: The same formula (received minus in-transit, issued, blocked, and on-test) is applied to meter-based serial checks, standard outbound item entry, and the material stock query used by transfer and adjustment pickers.
🌐 WebWMS

Show accurate stock availability in transfer, outbound, and adjustment pickers

  • "Stock" column replaces "Jumlah": The picker tables in Transfer, Outbound, and Adjustment now show a clear "Stock" column with the available quantity in bold, followed by an "Available" label.
  • Status badges for non-available stock: When items have stock in other states, colored badges appear below the available quantity: orange "On Test," red "Blocked," blue "In Trans," and gray "Issued." This makes cases like 20 available with 618 on-test immediately clear.
  • Correct quantity limits: The maximum quantity that can be entered now matches the backend formula, so users can no longer attempt to outbound more than what is truly available on the rack.
⚙️ BackendApproval

Add CJ reference pricing calculator for normal and charter shipments

  • Price calculation: A new pricing endpoint calculates the reference cost for any origin-destination pair across three transport modes (Darat, Laut, Udara) using per-kg rates, with volumetric weight conversion and minimum weight rules.
  • Charter flat rates: For charter shipments, the calculator returns a flat rate based on vehicle type (CDE, CDD, Fuso, Wingbox) instead of a per-kg price.
  • Transparent breakdown: Every calculation returns the actual weight, volumetric weight, chargeable weight, and the formula used, so the pricing logic is always visible.
  • Bulk import: Admins can refresh all tariff data at once from CSV price sheets, replacing the entire reference table in a single transaction.
⚙️ BackendApproval

Classify approval items as Part or Non-Part with validation

  • Part vs Non-Part classification: Every item on BL Inbound, BL Outbound, and Pickup Domestic forms now has a Material Kind (Part or Non-Part). Part items must have a valid material code in the approval master and box numbers. Non-Part items use a manual description and can omit boxes.
  • Real-time validation: When submitting or uploading items, the system checks Part codes against the approval-owned material reference table and returns clear Bahasa Indonesia error messages for unknown codes. This prevents invalid part numbers from entering the workflow.
  • SLOC validation: Storage location codes on Pickup Domestic and BL Outbound forms are validated against the approval-owned location reference, catching typos before submission.
  • Historical data classified: All existing form items have been automatically classified as Part or Non-Part based on whether they had complete box numbers, and matching material codes have been linked where available.

+1.3k−124
⚙️ BackendWMS

Partially resolve Tested Inventory serials without completing the full batch

  • Resolve by serial number: Individual serial numbers can now be marked with test results (Condition, Completeness, Power On Test) and released for outbound one at a time, instead of requiring the entire batch to be resolved together
  • Resolve by material group: All unresolved serial numbers belonging to a specific material within a batch can be resolved in a single action, applying the same test result to every item in that group
  • Immediate outbound eligibility: Resolved serial numbers are released from Quality Inspection restriction right away, so they can be included in outbound shipments even while other serials in the same batch are still pending
  • Automatic batch completion: The batch status automatically flips to "Tested" only when the very last serial number is resolved, keeping progress tracking accurate throughout the partial resolve process
  • Photo presence tracking: The Per S/N reporting view now shows whether each serial has uploaded photos, and results can be filtered to show only serials with or without photos
🌐 WebWMS

Add resolve actions on Tested Inventory Per S/N, Per Material, and Rekap pages

  • Per S/N multi-select resolve: Staff can now tick individual Recorded serial numbers and resolve them in bulk through a single modal. Each selected serial can have its own Condition, Completeness, Power On Test, and Remark values, or all can be set at once with the "Apply to All" button at the top of the modal
  • Same-batch validation: The system ensures all selected serial numbers belong to the same Tested Inventory batch before allowing the resolve to proceed, preventing accidental cross-batch actions
  • Per Material resolve: A Resolve button now appears next to each material on the Per Material page, allowing all unresolved serial numbers of that material within a batch to be resolved in one step
  • Batch resolve on Detail page: The whole-batch Resolve action has been moved from the Rekap summary list to the Tested Inventory Detail page, placing it alongside the existing upload and confirm workflow where it logically belongs
  • Photo filter: A new "Ada Foto / Belum Ada Foto" filter on the Per S/N page lets staff quickly find serial numbers that have or have not had photos uploaded yet
🌐 WebWMS

Pin action columns while scrolling and fix resolve button visibility

  • Sticky action columns: The Aksi (Action) column now stays pinned to the right edge of the table while scrolling horizontally on the Tested Inventory Per S/N list, Rekap list, Shipment Form list, and Shipment Form detail outbound picker. This keeps action buttons always reachable without scrolling back to the right
  • Resolve Batch on Draft batches: The Resolve Batch button on the Tested Inventory Detail page is now correctly shown for Draft batches that already have uploaded serial numbers. Previously the button was hidden because the visibility check required a status higher than Draft, even though the backend allows resolving Draft batches
🌐 WebWMS

Improve Tested Inventory mobile layout with collapsible filters and sticky columns

  • Collapsible mobile filters: On phone screens, all filter groups (Status, Condition, Completeness, Power On Test, Photo) are now hidden behind a single "Filters" toggle button by default. Tapping the button expands all filters in a compact, horizontally scrollable layout, so the data table is immediately visible without scrolling past a wall of filter chips
  • Paired sticky columns: On desktop, the Status column is now pinned next to the sticky Aksi column, so both remain visible during horizontal scroll. When the user has resolve permission, Status sits just left of Aksi; without permission, Status takes the rightmost pinned position itself
  • Clean column boundaries: The Status badge text and sticky column shadow have been refined so content no longer bleeds through into adjacent columns while scrolling, and striped row colors render correctly across the sticky columns
  • Per Material download button: The Excel download button on the Per Material page has been moved above the table alongside the other action buttons, making it easier to find

+11.9k−208
⚙️ BackendWMS

Show correct stock quantity on Per Material inventory report

The "Jumlah" (total quantity) column on the Per Material tested inventory report now includes items sitting in Quality Inspection and Blocked status, instead of only counting regular Quantity stock.

  • Accurate totals for Recorded items: Materials in "Recorded" status previously showed 0 because their stock was held in Quality Inspection, not the Quantity bucket. The column now sums all three stock sources for a correct total
  • Consistent with Rekap report: This mirrors the same fix already applied to the Rekap (summary) view, so both pages now report identical figures
🌐 WebWMS

Make all tables mobile-friendly with card layout and page size selector

All data tables across the WMS system have been overhauled for phone users and now include a page size control for faster navigation on desktop.

  • Card layout on mobile: Every data table (inbound, outbound, delivery, tested inventory, user management, and more) now stacks into clean, easy-to-read cards on phone screens instead of displaying as cramped horizontal rows that require scrolling
  • Page size selector: Every table footer now includes a "Tampilkan" dropdown with options from 10 up to 500 rows, so users can view more data without clicking through multiple pages
  • Smart column hiding: Secondary columns like Material Document and Remark are automatically hidden on small screens to keep the card view focused on what matters
  • Better pagination on mobile: The page navigation and page size controls rearrange vertically on phones with properly sized buttons, preventing overflow and wrapping issues
  • Photo zoom fix: The full-screen photo viewer now calculates drag boundaries based on the actual screen size, so users can pan all the way to the edges of highly zoomed images
⚙️ BackendApproval

Auto-generate PO and DO numbers on approval forms

BL Inbound, BL Outbound, and Pickup Domestic forms now support automatic PO and DO number generation, eliminating the need to manually assign these reference numbers.

  • Automatic numbering on submit: PO numbers (format PO260721-00001) and DO numbers (format DO260721-00001) are generated from dedicated sequences when a form is submitted, with the date embedded in the number for easy identification
  • Manual override available: Users can type a custom DO number or disable auto-generation entirely per form, giving flexibility for pre-assigned numbers from external systems
  • Duplicate prevention across all form types: The system rejects any DO number that already exists on a BL Inbound, BL Outbound, or Pickup Domestic form, with a clear Bahasa Indonesia error message explaining the conflict
  • Per-item PO numbers: PO numbers are assigned to individual line items, so each material in a form gets its own unique PO reference
⚙️ BackendApproval

Automatically expire unprocessed approval requests after 7 days

Pending approval forms that sit unprocessed for too long are now automatically moved to an "Expired" status, keeping the approval queue clean and preventing stale decisions.

  • Configurable expiration window: Forms default to expiring after 7 days (168 hours), with the ability to set different durations per form type (BL Inbound, BL Outbound, Pickup Domestic) through configuration
  • Background sweep every 5 minutes: A background job continuously checks for forms past their expiration time and transitions them to "Expired" status, recording the change in the status history
  • Automatic notification: When a form expires, the submitter receives both an email and a WhatsApp message in Bahasa Indonesia informing them that their request can no longer be processed
  • Blocked approval actions: Approvers are prevented from approving or rejecting an expired form, with a clear message explaining that the form has already expired
  • Clean dashboard counts: Expired forms no longer appear in the pending approval queue or dashboard statistics, so the "Pending" count only reflects actionable items

+716−35
⚙️ BackendWMS

Fix quality inspection Send-to-Test workflow and prevent duplicate transfers

Quality Inspection items being sent to a Test Bin now follow the correct transfer path. Several issues in the transfer lifecycle have been resolved to keep inventory counts accurate and prevent accidental double-moves.

  • Correct stock bucket selection: Items held under Quality Inspection are now moved from the proper stock bucket, so transfer records and remaining inventory both stay accurate
  • Duplicate send prevention: A second attempt to send the same restricted items to a Test Bin is automatically rejected, keeping the restriction status unchanged until testing is confirmed
  • Readable transfer reference: Each Send-to-Test transfer now generates a Transaction Number using the Plant name and destination location, replacing the previous blank value
  • On Test eligibility indicator: The restriction list now exposes whether each item is still eligible for Send-to-Test or has already been moved, so the frontend can show the right status badge and hide or show the action button accordingly
  • Warehouse-scoped bin detection: Test Bin identification now considers the warehouse context, preventing cross-warehouse bin misidentification
⚙️ BackendWMS

Correct Tested Inventory quantity counters for quality inspection records

The Recorded, Verified, and Tested quantity counters on the Tested Inventory report now include all relevant stock amounts for items that passed through Quality Inspection.

  • Accurate quantity totals: Each counter now sums the item's base Quantity, Quality Inspection amount, and Blocked amount, then groups it by the latest inspection status, so items that were sent through QI show the correct recorded quantity instead of a zero or partial value
🌐 WebWMS

Show On Test status badge and Plant Transfer column in inventory management

Two improvements to the Inventory Under Restriction and Transfer History pages give warehouse staff clearer visibility into item movement status.

  • On Test badge: Items that have already been sent to a Test Bin now display an "On Test" badge, and the Send to Test action is hidden to prevent duplicate attempts
  • Mandatory field validation: The Send to Test button stays disabled until all required selections (destination location, bin, and test record) are filled, preventing incomplete submissions
  • Plant Transfer column: Transfer History now includes a column showing source and destination Plant names, making it easy to see cross-plant movements at a glance
🌐 WebWMS

Restore photo upload, drag-and-drop, and deletion on Tested Inventory Per S/N page

Warehouse staff can now attach and manage photos for each serial number directly from the Tested Inventory report table, replacing the previous view-only image display.

  • Inline photo gallery: Thumbnail previews appear inside the table row, each clickable to open a full-size lightbox viewer
  • Upload and drag-and-drop: Photos can be added via the file picker or by dragging files onto the row, with a limit of 5 images per serial number (up to 10 MB each)
  • Delete with confirmation: Each thumbnail has a delete button that opens a confirmation dialog before removing the photo
  • Status-locked editing: Once a serial number reaches Tested status, uploads and deletions are disabled to protect finalized inspection records

+931−138
⚙️ BackendWMS

Enable XL Smart Customer access to WMS reporting and inventory

New XL Smart Customer role: A dedicated user group has been created so XL Smart team members log in with their own role instead of falling back to the generic Guest role. This ensures proper access control and clear audit trails.

Reporting access unlocked: XL Smart users can now view the Network Data WMS report, the Tested Inventory serial number report, and photo thumbnails for tested inventory items. Previously, these pages returned access denied errors for XL Smart accounts.

Incremental rollout across three updates: The role was introduced first, then reporting endpoint access was added, and finally photo thumbnail access was enabled as each missing permission was discovered during testing.

🌐 WebWMS

Add XL Smart Customer role with read-only dashboard and restricted menu

Restricted sidebar menu: XL Smart Customer users now see only four menu items: Dashboard, Inventory Under Restriction, Tested Inventory, and Data WMS. All operational menus such as inbound, outbound, and delivery management are hidden, matching their read-only access level.

Trimmed dashboard view: A dedicated XL Smart dashboard has been created that shows only inventory-related statistics, tested inventory breakdowns, and material-by-vendor charts. Operational widgets for inbound, outbound, delivery, and shipments are removed to keep the view focused on what XL Smart needs.

Read-only controls: The green "Send to Test" button on the Inventory Under Restriction page is now hidden for XL Smart users, preventing accidental warehouse operations from a read-only account.

Profile menu added: XL Smart users can now access their profile page from the sidebar, matching the menu available to other roles.

🌐 WebWMS

Add shimmer loading animations to all dashboard charts and status cards

Status card shimmers: All number cards across the dashboard now display animated placeholder shapes while data loads. Users see a pulsing gray outline of the card instead of empty space or a sudden pop-in, giving a smoother, more professional feel during page load.

Chart placeholder animations: Pie charts now show a circular shimmer with a legend placeholder, and bar charts show animated placeholder columns with a Y-axis line. These cover all dashboard variants: Network, BL, BNPB, and XL Home.

Faster error recovery: If the data request fails, the shimmer disappears immediately and the dashboard shows its error or empty state without hanging on a loading animation.

🌐 WebWMS

Redesign Send QI to Test Bin confirmation dialog

Cleaner item summary card: The confirmation dialog for sending a Quality Inspection item to the test bin now shows a styled summary card instead of a plain text block. The material number and description are displayed prominently at the top, with the quantity shown in a green badge.

Source location chips: The origin location is displayed as labeled chips showing "SLOC" and "Bin" with an arrow between them, making it easy to verify the item is being moved from the correct location before confirming.

Warning icon for missing test bins: When no test bins are registered for the warehouse, the warning message now includes an alert icon for better visibility.

🌐 WebTMS

Show loading spinners immediately on all management pages

Instant spinner on page open: All list and management pages now display a loading overlay the moment they open, instead of briefly showing an empty table before data arrives. This covers AWB management, AWB printing, shipment status, booking, inventory, inbound, outbound, transfer, warehouse management, channels, inventory movement history, and smart search.

Consistent behavior across the app: Previously, the spinner only appeared after a brief delay because the loading state was not initialized on page load. All pages now follow the same pattern, so users get immediate visual feedback regardless of which page they navigate to.


+1.1k−254
⚙️ BackendTMS

Add restricted Shipment Status Viewer role with confidential export gating

A new role and permission system lets external stakeholders track shipment progress without accessing sensitive operational data.

  • New "Shipment Status Viewer" role: A read-only role for partners or clients who need to check shipment progress but should not see internal details. Viewers access only the Shipment Status menu and can export reports, but their exports omit per-item weights, the detailed per-koli breakdown, and the full status history
  • Opt-in confidential permission: A new "View Confidential Shipment Data" permission controls who receives the full, unredacted export. Only Admin, Super Admin, TMS Operator, Warehouse Manager, and Warehouse Operator roles receive this permission by default, keeping restricted users on a need-to-know basis
  • Customer-scoped visibility: Like TMS Operators, Shipment Status Viewers are limited to the customers assigned to them on the User Access page. Each viewer only sees and exports data for their own customers, preventing cross-customer data exposure
  • Redacted shipment metrics: When exporting without the confidential permission, the "Total Colli," "Total Weight," and "Total Volume" columns are hidden from the spreadsheet, and only the summary information sheet is generated
⚙️ BackendTMS

Send notification emails in the background for faster responses

Dispatch confirmations, delivery status updates, and inventory document emails are now sent asynchronously, so users no longer wait for the email server before getting a response.

  • Background email delivery: Emails triggered by manifest dispatch, shipment delivery status changes, and inventory document actions are placed in a background queue instead of blocking the user's request while the SMTP server responds
  • Snappier operations: Users submitting a dispatch or updating a delivery status get an immediate confirmation, making these frequent operations feel noticeably faster during peak hours
⚙️ BackendTMS

Fix AWB print weight showing blank when item weights are zero

AWB labels and manifests now display the correct weight even when individual item rows have zero weights.

  • Correct weight priority on AWB print: The printed weight now uses the AWB-level total (the user-approved shipment weight) as the primary source, falling back to item-level calculations only when the total is empty. Previously the system always recalculated from items, so AWBs with a valid summary weight but zero item weights printed with a blank weight field
  • Consistent manifest totals: The same fallback logic applies to manifest prints, so historical AWBs with valid summary weights contribute correct values to the manifest's actual and chargeable weight columns instead of showing zero
🌐 WebTMS

Restrict shipment detail access for viewers without full AWB permissions

The web interface now respects the new Shipment Status Viewer role by hiding sensitive navigation and making the confidential data permission easy to manage.

  • Gated AWB detail access: Users with the Shipment Status Viewer role see AWB numbers as plain text instead of clickable links, and the "View AWB Details" action button is removed from the shipment status list, preventing navigation to the full AWB page they are not authorized to view
  • TMS menu for restricted viewers: Users who only have POD access (such as Shipment Status Viewers) now correctly see the TMS Operations section in the sidebar, so they can navigate to the Shipment Status page without needing broader TMS permissions
  • Confidential permission in Role Editor: The "View Confidential Shipment Data" permission now appears under the TMS Operations category in the Role Permissions screen with a lock icon and a searchable description, making it easy for admins to find and assign to the appropriate roles
  • Customer scoping on User Access page: The customer mapping tab now lists users with the Shipment Status Viewer role alongside TMS Operators, so admins can assign specific customers to shipment-only viewers
🌐 WebTMS

Add direct navigation to user access from the Users list

Admins can now jump straight to a user's access configuration from the Users list, with a highlighted focus banner and role badges for quick identification.

  • Manage Access shortcut: A new "Manage Access" button appears on each user row in the Users list for users with eligible roles (TMS Operator, Shipment Status Viewer, Vendor, or Agent). Clicking it opens the User Access page filtered to that specific user, eliminating the need to search manually
  • Focus banner: When navigating from the Users list, a highlighted banner at the top shows which user's access is being managed, with a "Show all" button to clear the focus and return to the full list
  • Role column on Customer tab: The Akses Pengguna Customer tab now displays each mapped user's customer-scopable roles as badges, making it easy to see at a glance whether someone is a TMS Operator or Shipment Status Viewer
  • Searchable User dropdown: The User selector in the customer create/edit dialog now supports typing to search, with the user's role shown as a sub-label for quick identification without scrolling through the full list
🌐 WebTMS

Fix searchable dropdown behavior in form dialogs

Multiple rapid fixes to the searchable dropdown components ensure they work reliably inside EntityTable create and edit dialogs.

  • Proper overlay: Dropdown menus inside dialogs now float on top of the dialog instead of being trapped by the dialog's scroll area, so all options remain visible even in long forms
  • No auto-open on dialog focus: Dropdowns no longer spring open automatically when a dialog appears, preventing unexpected popups before the user has interacted with the field
  • Instant form refresh: Picking an option from a searchable dropdown immediately updates the form display, without needing to click away first
  • Click-outside to close: Multi-select dropdowns now close when clicking outside the dropdown area, matching standard form behavior
  • Removable selection chips: Selected items in multi-select fields display as individual chips with a remove button, allowing quick deselection without reopening the dropdown
⚙️ BackendWMS

Add Test Bin validation and filtering for quality inspection transfers

Quality inspection items can now only be transferred to officially registered Test Bins, and inbound allocation counts are fixed for inspected and blocked stock.

  • Test Bin destination validation: When sending a quality inspection item to a test bin, the system verifies that the chosen destination is a registered Test Bin for the user's warehouse. Invalid destinations are rejected with a clear error message, preventing accidental transfers to the wrong storage location
  • Dedicated Test Bin lookup: A new endpoint returns only the storage locations that contain registered Test Bins, grouped by their parent location, so the frontend can offer only valid destinations in its dropdowns
  • Fixed inbound allocation display: The inbound stock view now correctly counts items that are fully in quality inspection or fully blocked as "allocated." Previously, these batches showed zero allocated quantity because only the available-stock column was counted, making inventory reports appear incomplete
🌐 WebWMS

Improve quality inspection dialogs with search, pagination, and Test Bin filtering

The quality inspection dialogs in Inventory Under Restriction now have their own independent search and pagination, and the Test Bin selector only shows valid locations.

  • Independent dialog pagination: The Restricted Serial Number List dialog now has its own search box, page-size selector (10/25/50/100), and correctly numbered rows per page, fully independent from the main inventory restriction list. Empty search results display a "Belum ada data" message
  • Filtered Test Bin selection: The "Send QI to Test Bin" dialog only shows storage locations and bins that are registered as Test Bins for the user's warehouse. Invalid options are removed entirely from the dropdowns, preventing accidental transfers to non-test locations
  • Empty-state guidance: When no Test Bins are registered for the warehouse, the dialog displays a warning message in Bahasa Indonesia and disables the Send button, guiding the user to register Test Bins first
  • Clean dialog state: The "Send QI to Test Bin" dialog now opens with all fields cleared, avoiding stale selections from a previous use

+1.3k−534
⚙️ BackendWMS

Fix inbound allocation confirmation error

  • Inbound allocation confirmation no longer fails: Confirming an inbound allocation that contained certain material categories previously triggered a database error, blocking the user from completing the process. The two missing material classification fields have been added to the underlying query, so allocation confirmations now complete successfully for all material types.
⚙️ BackendTMS

Add destination hub to shipment status export

  • New "Hub" column in the bulk Excel export: The shipment status download now includes a Hub column right next to the destination field, showing the destination city or regency in clean title case. This makes it easier to identify the destination hub at a glance without parsing the full destination address.
⚙️ BackendTMS

Speed up search across all major list pages

  • Faster AWB search on Manage AWB and Shipment Status: Searches now filter the shipment database directly before joining 18 related tables, so results appear noticeably faster, especially when filtering by status, date range, or customer.
  • Faster Booking, Manifest, and DRS list pages: The same filter-first approach has been applied to booking, manifest, and delivery run sheet pages. Dropdown filters (status, date range, driver, vehicle, branch) now narrow down the base data before the system assembles the full row details.
  • Faster Warehouse searches: Inventory, Inventory Documents, and Inventory Movements all benefit from the same optimization. Status history, which previously required a separate database query for every row, is now loaded in a single batch, cutting response times on pages with many entries.
  • New database indexes: Supporting indexes have been created on all key search columns across AWB, Booking, Manifest, DRS, Inventory, Inventory Documents, and Inventory Movements to keep response times fast as data grows.

+9−26
⚙️ BackendWMS

Auto-fill dealer field on XLWG inbound uploads, removing manual input requirement

Auto-populate dealer from material group: When uploading XLWG inbound data from Excel, the system now automatically fills the Dealer column using the material group name. Staff no longer need to manually enter or verify a dealer value for each row.

Fewer required columns in the template: The Dealer column is no longer mandatory in the upload template, reducing the number of fields that must be prepared before submitting an inbound file.

No more dealer validation errors: Since the field is populated by the system, misspelled or unrecognized dealer names can no longer cause upload rejections or delays.


+37−42
⚙️ BackendWMS

Fix delivery note PDF crashing when shipment has many photos

  • Crash eliminated: PDF generation for Goods Delivery Notes no longer fails when a shipment has four or more photos attached, so operations staff can reliably print or download delivery documents for any shipment
  • One page per photo pair: Photos are now placed two per page, with each pair rendered as its own independent page, preventing the document generator from getting stuck in an infinite measurement loop
  • Improved image rendering: Updated the photo rendering method to handle image sizing more reliably across different photo resolutions

+2.5k−484
⚙️ BackendWMS

Attach photos to shipment records and include them in delivery documents

Staff can now attach up to 10 photos to each shipment record in the WMS. Photos are automatically compressed and stored in cloud storage with short-lived, read-only links for safe viewing.

  • Photo upload per shipment: Staff can attach photos to any recorded shipment, supporting common image formats (JPEG, PNG, WebP, HEIC) with automatic compression for efficient storage
  • Delivery document appendix: When a shipment has attached photos, the Goods Delivery Note PDF automatically appends a "Lampiran" (attachment) page in landscape orientation, displaying them in a two-per-row grid with numbered labels
  • Pagination fix: Shipments with four or more photos now generate the PDF correctly, preventing a layout error that previously caused the entire document to fail
  • Secure storage and cleanup: Photos are stored in cloud blob storage with short-lived read-only links. Deleting a photo removes both the file and its record
🌐 WebWMS

Add photo upload and viewer to the shipment form

A new "Foto Pengiriman" section on the Shipment Form lets staff attach, preview, and manage photos for each delivery. The Goods Delivery Note preview updates automatically when photos change, so staff can verify the attachment page before printing.

  • "Foto Pengiriman" card: A drag-and-drop upload area on the Shipment Form where staff can add up to 10 photos per shipment. Thumbnails display in a grid with a badge showing the count used out of the maximum
  • Full-screen image viewer: Clicking any thumbnail opens an interactive viewer with zoom (mouse wheel or buttons), pan, rotate, and keyboard shortcuts for inspecting photos in detail
  • Instant document preview: The Goods Delivery Note PDF preview refreshes automatically after photos are uploaded or deleted, showing the latest "Lampiran" page without a manual page reload
  • Smooth save experience: The photo panel no longer shows an indefinite loading spinner after saving the shipment form, making the upload area immediately usable
⚙️ BackendTMS

Enable tracking multiple shipments in a single request

The public tracking API now supports looking up multiple AWB numbers at once, returning each result together with its full delivery history. This powers the new multi-shipment search on the company profile website.

  • Batch tracking endpoint: Accepts up to 10 AWB numbers in a single request and returns each one with its shipment details and proof-of-delivery timeline, reducing the number of round-trips needed
  • Smart input handling: Numbers are automatically trimmed of whitespace, deduplicated regardless of case, and capped at 10, so the calling website does not need extra validation logic
  • Clear unmatched handling: AWB numbers that don't match any shipment are returned with a "not found" flag rather than an error, allowing the website to inform visitors which numbers could not be found
🌐 WebProfile

Track up to 10 AWB numbers at once from the company profile

The public tracking page on the company profile now supports entering multiple AWB numbers at once, with an adaptive layout that shows a sidebar summary on desktop and an accordion on mobile.

  • Multi-AWB chip input: Visitors can enter AWB numbers by typing and pressing Enter, or paste a comma-separated list to add several at once. Each number appears as a removable chip, with a clear counter showing how many have been added (capped at 10)
  • Desktop master-detail layout: On wide screens, a sticky sidebar lists all tracked shipments with their latest status and location, while the main panel shows the full detail and delivery timeline of the selected shipment
  • Mobile accordion view: On smaller screens, results collapse into an expandable accordion so visitors can inspect one shipment at a time without scrolling through a long page
  • Seamless single-AWB experience: Tracking just one number shows the same detailed view as before, so the upgrade is invisible to returning visitors

+541−35
⚙️ Backend🌐 WebWMS

Introduce Quality Inspection testing workflow with Test-Bin transfer and auto-release

  • Send to Test Bin: Quality Inspection items can now be moved from their restriction directly into a Test Bin for physical testing. Admins select the destination SLOC, Test Bin location, and the Tested Inventory document that will record the results, all from a single modal in the Inventory Under Restriction page.
  • Auto-release on test completion: When a Tested Inventory document is confirmed (whether items pass or fail), the linked Quality Inspection restriction is automatically resolved. Stock returns to the available pool without any manual release step, eliminating the risk of forgotten or delayed resolution.
  • Enforced testing process: Quality Inspection restrictions can no longer be manually resolved through the Resolve button. They must go through the Send to Test flow, ensuring every flagged item is properly tested before being released back into inventory.
  • Accurate restricted-stock tracking: Transfers of Quality Inspection and Blocked items now preserve their restricted status throughout the move, so total stock counts remain correct at all times regardless of how items are relocated.
  • Visual indicators: QI items in the restriction list now show a "Test required" badge and a green "Send to Test" button, making it immediately clear which items need the testing flow versus which can be resolved manually.

+2.5k−1.0k
⚙️ BackendWMS

Add Plant source and destination tracking to inventory transfers

Inventory transfers now record both the source Plant (Plant Asal) and destination Plant (Plant Tujuan) separately, instead of using a single Plant field. This enables accurate tracking when stock moves between different plants or facilities.

  • Separate Plant Asal and Plant Tujuan: Transfer records now capture where stock came from and where it is going, giving full visibility into inter-plant movements
  • Automatic stock re-categorization: When stock is transferred, the destination inventory is automatically categorized under the target Plant, keeping stock records accurate without manual updates
  • Backward compatible: Existing transfers and older clients continue to work with the legacy single-Plant field, which now defaults to the destination Plant
  • Tested item history preserved: Items that have passed quality testing retain their complete test history when moved out of an On-Test bin, instead of losing the records
  • Transfer blocked for untested items: The system now prevents moving untested serial numbers out of an On-Test bin to a regular bin, stopping incomplete quality checks from being bypassed
  • Transfer report columns: The Excel export now includes Plant Asal and Plant Tujuan as separate columns alongside the existing Plant field
🌐 WebWMS

Add Plant Asal and Plant Tujuan selector to transfer form

The inventory transfer form now shows Plant Asal and Plant Tujuan fields, allowing warehouse staff to specify the destination Plant when moving stock between facilities.

  • Plant Asal (read-only): Displays the current Plant of the selected material, so staff can confirm the origin before transferring
  • Plant Tujuan (dropdown): A selectable dropdown defaults to the current Plant but can be changed to any valid Plant, giving full control over the destination categorization
  • Transfer Summary row: The summary section now shows a Plant Asal to Plant Tujuan row, making it easy to verify the transfer before saving
  • On-Test departure warning: When transferring from an On-Test bin to a regular bin, a yellow warning banner appears to alert staff that only Tested-status items can proceed
⚙️ BackendTMS

Fix audit log timeouts and add automatic data cleanup

The audit log page was timing out because the system was counting every row in the audit table before displaying results. This has been fixed, and an automatic cleanup job has been added to keep the table manageable.

  • Page timeout eliminated: Removed the slow full-table count query on the audit logs endpoint, replacing it with a page-size-plus-one pattern that detects whether more rows exist without scanning the entire table
  • Automatic weekly cleanup: A background job now runs every week to delete audit records older than 180 days, preventing the table from growing indefinitely and slowing down queries
  • Longer query timeout: Database command timeout increased from 30 seconds to 120 seconds, reducing the chance of transient timeouts on large reports
🌐 WebTMS

Replace audit log pagination with Load More to eliminate timeouts

The Audit Logs page now loads entries incrementally with a Load More button instead of traditional pagination, eliminating the timeout that occurred when the system tried to count total log entries.

  • Load More button: Entries appear 10 at a time with a "Muat Lebih Banyak" button at the bottom, which hides automatically when all entries have been loaded
  • Instant filters: Changing the search keyword, date range, or value toggles now clears the list and reloads from the beginning, giving immediate feedback instead of waiting for a total count
  • No more blank wait: The page renders the first batch of results immediately, so users see their recent activity without any delay
🌐 WebTMS

Redesign search across all pages with debounced input and loading indicators

Every search bar across the TMS application has been rebuilt with a consistent, modern experience: debounced input that waits for the user to stop typing before searching, a visible loading spinner while results load, and protection against overlapping search requests.

  • Consistent search component: All 29 list pages, including AWB, Booking, Manifest, DRS, Inventory, Products, Warehouses, and more, now use the same search input with built-in debounce, clear button, and Enter-key shortcut
  • Visible loading overlay: A semi-transparent overlay with a spinning icon appears over the data table while search results are loading, so users always know the system is working
  • Debounced typing: The search waits 600ms after the user stops typing before sending a request to the server, reducing unnecessary load and improving responsiveness on slower connections
  • No more stuck spinners: Fixed a bug where the loading overlay could remain on screen after results finished loading, ensuring the indicator always disappears correctly
  • Race condition protection: Rapid-fire searches no longer produce conflicting results, as outdated requests are silently discarded in favor of the most recent one

+2.5k−121
🌐 WebWMS

Show product category and type in Tested Inventory detail

  • Product Category and Product Type columns now appear in the Tested Inventory detail table, giving inspectors and managers more context about each item at a glance
  • Both fields are also displayed in the detail info modal when viewing a specific item, pulled from the existing reference lookups
🌐 WebWMS

Photo upload, viewer, and management for Tested Inventory

  • Drag-and-drop or click to upload photos for each serial number in the Tested Inventory detail modal, with automatic validation for file type and size
  • Thumbnail gallery shows all attached photos alongside each serial number, with a delete button for authorized users
  • Full-screen image viewer with scroll-wheel zoom, mouse and touch pan, 90-degree rotation, carousel navigation between photos, keyboard shortcuts, and a download button
  • Photo count badge on each serial number row in both the main Tested Inventory table and the Per S/N report page
  • Loading spinners indicate when photos are being fetched, and uploads are restricted to Recorded status only
🌐 WebWMS

Fix stretched login page logo

The company logo on the login page no longer appears distorted. Sizing is now based on height to preserve the image's natural proportions on both desktop and mobile views.

🌐 WebWMS

Display Plant entries with warehouse info in Referensi

  • New "Kategori Material (Plant)" group now appears in the Referensi sidebar, with a read-only Gudang (warehouse) column showing which warehouse each Plant entry belongs to
  • Users can add and delete Plant entries through the existing Cd Code, Name, and Description form
🌐 WebWMS

Fix raw data appearing in error notifications

  • Error pop-ups that previously showed raw technical data (like serialized JSON objects) now display a clean Indonesian-language message instead
  • The fix applies globally across all pages, so any unexpected server error is presented in a user-friendly way
⚙️ BackendWMS

Add photo attachments to Tested Inventory serial numbers

  • Photo upload per serial number, with server-side compression that automatically resizes and optimizes images before storage
  • Per-S/N cap of 5 photos and a 10 MB per-file limit keep storage controlled and predictable
  • Photo count is returned with each serial number row, so the frontend can show how many photos are attached
  • Photos are stored securely in Azure Blob Storage and served via time-limited signed URLs that expire after 15 minutes
⚙️ BackendWMS

Improve Excel upload templates with dropdowns and proper number formatting

  • Dropdown validations on the Condition (Good/Broken), Completeness (Complete/Not Complete), and Power On Test (On/Off) columns guide data entry and prevent typos when filling in upload templates
  • Numeric columns like quantity are now real numbers in the spreadsheet, so formulas, sorting, and calculations work correctly instead of treating everything as text
  • Blank quantity cells no longer default to zero, allowing partial data entry where quantities are filled in later
  • Excel sheet names are now properly capped at 31 characters, preventing download errors on long table names
⚙️ BackendWMS

Add Plant category to reference data management

  • New "Kategori Material (Plant)" group is now available in the Referensi data list, letting the system serve Plant entries tied to each warehouse
  • Users can add new Plant entries and remove existing ones through the standard reference form
  • The group name has been updated to "Kategori Material (Plant)" to clearly distinguish it from the existing material category group
⚙️ BackendWMS

Fix broken API responses caused by corrupted data

Some API responses could arrive with invalid JSON due to leftover data from a previous response, causing pages to fail or show errors. The response layer now properly clears old data before writing new responses, preventing this corruption.


+960−104
🌐 WebWMS

Show only relevant material options per warehouse across all WMS pages

  • Smart material filtering: Each warehouse now only displays material groups it actually handles. A warehouse configured for SP XL and SP AXIS will no longer show options for AIGO, Serena, SIMCARD, or other irrelevant materials in dropdowns and tabs
  • All pages updated: The filtering applies across inbound, outbound, inventory, adjustment, change material, monitoring, and Data WMS reporting pages. Material group tabs on the reporting page are completely hidden when they do not apply to the active warehouse
  • Fewer mistakes: Staff can no longer accidentally select a material group their warehouse does not support, eliminating a common source of data entry errors
⚙️ BackendWMS

Add Bambu Apus warehouse for SP XL and SP AXIS channel operations

  • New warehouse location: Bambu Apus (Warehouse 7) is now registered as a Channel warehouse, handling SP XL and SP AXIS material types. Staff at Bambu Apus can immediately start processing inbound, outbound, and inventory operations for these channels
  • Automatic team setup: The same user groups and permissions from the Cimanggis warehouse are carried over to Bambu Apus, so no manual access configuration is needed before going live
⚙️ BackendWMS

Fix Serena outbound monitoring page crash

  • Monitoring page restored: The Serena outbound monitoring page was returning server errors on every request because a data query was trying to read a field that does not exist in Serena records. The query has been corrected, and the page now loads and filters normally

+4.6k−91
🌐 WebWMS

Add SERENA channel pages across the warehouse management dashboard

SERENA channel in the WMS web app: Serena is now fully integrated into the warehouse management interface, with dedicated pages and adapted table columns reflecting the Serena-specific data shape (ICCID ranges, vendor, purchase order, batch, and date instead of SIMCARD-specific fields like expiry, brand, and position)

  • Dashboard card and charts: A new "Total Serena" stock card appears on the dashboard, linking to the Serena inventory page. Serena inbound and outbound quantities are also tracked on the dashboard trend line charts alongside existing channels
  • Inbound pages: Serena appears as a selectable channel in the inbound grid. The inbound detail page shows adapted columns (No PO, DATE, Vendor) and supports Excel template download for Serena-specific item upload, allocation confirmation, and item deletion
  • Inbound monitoring: The monitoring page renders Serena items in the ICCID-range table layout with Serena-appropriate headers, and supports downloading monitoring reports filtered to Serena items
  • Outbound pages: Serena outbound items can be uploaded via Excel template, monitored with status filtering, and confirmed for goods issue through the dedicated Serena endpoints
  • Inventory pages: Serena inventory uses its own dedicated endpoint with material group filtering, inventory detail drill-down by material number, and routing slip status tracking
  • Inventory adjustment: The adjustment page includes Serena in the channel launcher, shows a Serena-specific picker with ICCID From/To columns, and supports Serena-shaped save payloads with ICCID range adjustment fields
  • Change material: The change material detail page displays a Serena-specific item list with Material New and Vendor columns, supports confirm, upload, delete, and template download for Serena change material operations
  • Data WMS reporting: Serena appears as a selectable filter tab on the Data WMS reporting page
⚙️ BackendWMS

Add SERENA as a new ICCID-range warehouse channel

New SERENA channel (CdMatCode=7): Serena is now available as a material channel across the entire WMS backend, enabling warehouse teams to manage Serena ICCID-based inventory alongside existing channels like SIMCARD AXIS and SIMCARD XL

  • Inbound with Excel upload: Upload Serena items from a spreadsheet template with columns for ICCID From, ICCID To, Qty, Vendor, Material, No PO, Batch, and Date. The system validates that quantities match ICCID ranges, rejects overlapping ICCID ranges for the same material, and verifies materials against the master data
  • Inventory tracking: Serena stock is tracked independently with its own inventory tables, showing ICCID ranges, quantities received and live, vendor, material, purchase order, and batch. Inventory detail views allow drilling into items by material number, and a routing slip tracks status changes over time
  • Outbound with Excel upload: Upload outbound items from a template, then confirm goods issue. The system reserves stock by ICCID range, reduces live quantities, and records status transitions from requested to issued
  • Inventory adjustment: Adjust Serena inventory quantities by changing ICCID ranges. When quantity increases, a new inbound record is created automatically. When quantity decreases, an outbound record is created. Deleting an adjustment reverses the ICCID range changes back to original values
  • Change material: Upload a spreadsheet to change the material code and vendor of existing Serena inventory items in bulk, with confirm and cancel workflow
  • Data WMS reporting: Serena stock levels appear in the Data WMS reporting page with its own dedicated query endpoint, filtering by material group
  • Comprehensive regression tests: Added test suites covering ICCID range validation, overlap detection, outbound ordering, full-consume quantity calculation, query correctness, and template shape contracts

+3.8k−427
🌐 WebApproval

Overhaul BL Outbound draft editing workflow

Comprehensive improvements to the BL Outbound form make draft creation, editing, and submission more flexible and reliable.

  • Create empty drafts: The form no longer requires stock items to be selected before saving, so users can start a request and add items later
  • Consistent editing experience: Editing a saved draft now opens the same creation page instead of a separate view, matching the BL Inbound workflow
  • Template download and Excel upload: Download Template and Upload Excel buttons are activated once a draft is saved, enabling bulk data entry via spreadsheet
  • Clearer validation messages: Submit checks are split into distinct warnings per item, telling users exactly which field is missing or which quantity exceeds remaining stock
🌐 WebApproval

Redesign BL Stock Monitoring cards and add sidebar access

BL Stock Monitoring is now accessible from the sidebar navigation and has a refreshed visual design.

  • Sidebar entry: BL Stock Monitoring appears under the Monitoring submenu for authorized users
  • Redesigned statistics cards: Four metric cards (In Stock, Held, Issued, Total Remaining Qty) now use rounded card containers with color-coded icons, matching the dashboard homepage style
  • Updated AWB dialog: The AWB update dialog uses Bahasa Indonesia labels and buttons, shows how many items will be affected, and has improved input styling
  • LEN team access: Members of len approver, len operator, len_logistics, and len groups can see the page in the sidebar
🌐 WebApproval

Add ETR Report page with PDF and Excel export

A new ETR Report page under the Reporting menu lets users search, filter, and export ETR records from all form types.

  • Reporting menu entry: ETR Report appears under the Reporting submenu alongside BL Stock Report
  • Filterable table: Search by ETR or reference number, filter by form type (BL Inbound, BL Outbound, Pickup Domestic), status, and date range
  • Export buttons: Each row has PDF and Excel download buttons for individual documents, plus a top-level bulk Excel export for all filtered results
  • Color-coded form types: The Form Type column uses styled badges matching the colors used across other form tables
⚙️ BackendApproval

Improve BL Outbound form editing and data protection

Backend improvements for BL Outbound forms enable more flexible draft workflows and prevent data integrity issues when issuing stock.

  • Empty draft creation: Users can save a BL Outbound draft without selecting stock items first, then add items later before submitting
  • Editable general information: A new endpoint lets draft creators update the outbound number, date, BL number, and remarks without re-creating the form
  • Stock protection on submit: The backend verifies each stock row's status before issuing, preventing double-issuing of already-dispatched items
  • Quantity and dimension validation: Issue quantities are checked against remaining stock, and submit enforces positive dimensions plus non-negative wood-packing costs
⚙️ BackendApproval

Authorize LEN team on BL Stock Monitoring

LEN team members can now access the BL Stock Monitoring feature to view stock levels and update AWB numbers.

  • Six new groups authorized: len approver, len operator, len_logistics, and len now have query and AWB update access on the monitoring endpoints
⚙️ BackendApproval

Add ETR Report with document export

New reporting endpoints aggregate ETR numbers from BL Inbound, BL Outbound, and Pickup Domestic forms into a single searchable, filterable list with export capabilities.

  • Unified ETR search: All three form types are combined into one list, searchable by keyword, form type, status, and date range
  • PDF document export: Each ETR record exports as a formatted PDF with the LEN Logistics logo, a labeled document number row, a six-column general information grid, a material table with quantities and totals, and a centered approval journey history
  • Excel document export: Both per-record detail sheets and bulk list exports use a bordered horizontal layout with grey label cells, frozen header rows, and automatic column widths

+661−494
🌐 WebApproval

Redesign BL Outbound creation page with streamlined stock picker and Bahasa validation

  • Card-based layout: The outbound creation page now follows the same clean section structure as the BL Inbound form, with fields organized into clear card groups (approval flow, general info, stock items) instead of the previous two-column layout
  • Searchable AWB selector: The stock picker dialog replaced its manual text filters with a searchable dropdown, so users can quickly find and select an AWB number instead of typing and pressing search
  • Select All and Copy to Excel: A checkbox in the stock picker table header selects all visible items at once, and a new "Copy to Excel" button copies the filtered inventory data as tab-separated values that paste directly into spreadsheet templates
  • Draft-first workflow: Users can now save a draft without adding any stock items first. Placeholder buttons for "Download Template" and "Upload Excel" appear on the create page with a guide banner, activating once a draft is saved
  • Cleaner form: Removed the "Requested By" and "Outbound Note" fields since the requestor is already tracked in audit trails and the Remark field covers notes. The submit button now reads "Submit" instead of "Submit for Approval"
  • Hidden number spinners: Browser up/down arrows on quantity and dimension inputs are hidden, giving more horizontal space and a tidier look
  • Bahasa validation messages: All form validation alerts, including missing item warnings and flow selection prompts, now display in Bahasa Indonesia instead of English

+1.5k−56
⚙️ Backend🌐 WebApproval

Grant CJ Operator users access to BL Stock Report

CJ Operator users can now open and view the BL Stock Report, which previously returned a forbidden error when they tried to access it.

  • Group access extended: The cj operator and cj_operator groups are now recognized by both the server-side access check and the frontend menu guard, so CJ Operator users see the report in the sidebar and can load the page without being blocked
  • WS-Security login fix: Users who sign in through WS-Security (rather than the standard login flow) now have their group memberships correctly read by the system, because the server now checks both the standard group claim type and the WS-Security specific claim type
  • Both layers aligned: The access control change was applied consistently on the backend (authorization check and configuration) and the frontend (auth guard and sidebar visibility), so the experience is seamless from login to report view
⚙️ BackendApproval

Fix REQ auto-number generation on form creation

New approval forms can now generate sequential REQ numbers correctly, fixing a server error that was blocking both the number preview and form submission.

  • Sequence generation fixed: The auto-numbering system now calls the database sequence directly instead of through a query wrapper that was causing SQL Server to return a 500 error, so the preview number loads and the final number assigns without failures
🌐 WebApproval

Add BL Outbound creation form with stock picker

A dedicated creation page for BL Outbound requests is now available directly from the form menu, replacing the need to use an external tool or spreadsheet to initiate outbound stock movements.

  • Two-step creation flow: Users first select an approval workflow from the available flow lists, then fill in the outbound details (reference number, date, BL number, notes) in a clean two-column layout with a general information panel on the left and selected items on the right
  • Stock picker dialog: A searchable inventory browser lets users filter by AWB or part number, check available stock, and attach items to the outbound form with a specified issue quantity, all within a popup window
  • Per-item detail fields: Each attached stock row supports entering the transport mode (darat, laut, udara), colly dimensions (weight, length, width, height), and packing cost, so all outbound details are captured in one place
  • Save as draft or submit: Forms can be saved as drafts for later completion, or submitted directly to the chosen approval workflow with email and WhatsApp recipient lists selected at submission time
🌐 WebApproval

Restore ETR Number label and load auto-number on page open

The ETR Number field label has been reverted to its original name across all form types, and the auto-generated number now appears as soon as the page opens instead of only after confirming the approval workflow.

  • Label consistency: All form types (BL, BL Outbound, Pickup Domestic) now show "ETR Number" as the field label on both the creation and viewing pages, reverting a previous rename to "REQ Number"
  • Instant number preview: The system fetches the next auto-generated number when the page first loads, so users see the number immediately without having to wait until they select and confirm an approval flow

+211−50
⚙️ BackendApproval

Preview and auto-generate REQ numbers for approval forms

  • REQ prefix: Transaction numbers now use the REQ prefix (e.g. REQ00069), replacing the previous ETR prefix for clearer identification of request numbers
  • Number preview: The system allocates and returns the next number in sequence before a form is saved, so the create forms can display it in advance
  • Custom number support: Users can override the auto-generated number with their own value, and the system validates that custom numbers are unique
🌐 WebApproval

Editable REQ number field on BL Inbound and Pickup Domestic forms

  • Always visible: The REQ Number field now appears as soon as a form flow is confirmed, rather than only after the first save
  • Auto-preview: When a new BL Inbound or Pickup Domestic form is started, the next REQ number is fetched and shown automatically in the field
  • Editable before save: Users can keep the auto-generated number or type a custom one. After saving, the field becomes read-only to prevent accidental changes
  • Consistent naming: All labels across BL Inbound, BL Outbound, and Pickup Domestic create and view pages now display "REQ Number" instead of "ETR Number"

+5.7k−10
⚙️ BackendApproval

Add globally unique ETR tracking numbers to approval forms

  • ETR numbers on every form: BL Inbound, BL Outbound, and Pickup Domestic forms now each carry a system-generated ETR (Electronic Transaction Record) number, formatted as ETR00001, ETR00002, and so on. These are auto-assigned during form creation and cannot be edited.
  • Globally unique across form types: A single shared counter ensures no two forms across any type will ever share the same ETR number, so every transaction can be unambiguously identified regardless of which form it belongs to.
  • BL Outbound gets its own reference number: BL Outbound forms now store a dedicated BL Number (the customer reference) separate from the internal outbound number, making it easier to match records with customer communications. Existing historical forms have been backfilled automatically.
🌐 WebApproval

Display ETR and BL reference numbers on approval form pages

  • ETR number visible on all form types: Users can now see the auto-generated ETR number on BL Inbound, BL Outbound, and Pickup Domestic create and view pages. The number appears as a read-only field so it is always visible but cannot be accidentally changed.
  • BL Outbound shows both reference numbers: The BL Outbound form page now displays both the ETR number and the customer-facing BL Number, so approvers and operators can verify they are looking at the correct record at a glance.

+100−24
⚙️ BackendApproval

Streamline BL Inbound AWB processing with one-step finalization

BL Inbound AWB workflows can now be configured so that the final AWB data entry step also finalizes and approves the form, removing the need for a separate CJ approval step afterward.

  • One-step finalization: When the AWB input step is the last step in the workflow, completing it immediately approves the form and triggers stock creation in a single action
  • Automatic stock creation: Inventory is generated the moment the form is finalized from the AWB step, with no additional approval round required
  • Eliminates redundant approval: Previously, every BL Inbound workflow required at least one approval step after data entry; now teams can configure workflows that end directly on the AWB input, cutting cycle time for straightforward inbound shipments
🌐 WebApproval

Add description field to workflow configuration

Admins can now add and edit a description on each approval workflow, making it easier to document and differentiate workflows across teams.

  • Editable description field: A new text area (up to 500 characters) is available both when creating a new workflow and when editing an existing one in the Flow Details page
  • Persistent and visible: Descriptions are saved to the backend and loaded when revisiting the configuration, so context about each workflow is always available

+406−138
🌐 WebApproval

Show specific error details when BL AWB save fails validation

  • Descriptive error messages: Instead of a generic "failed to save" popup, users now see the actual reason from the system, such as which AWB number has a Moda or Origin conflict
  • Language match: Error messages are displayed in Bahasa Indonesia, matching the interface language
⚙️ BackendApproval

Make form submit and approval instant by sending WhatsApp notifications in the background

  • Instant form responses: Submitting and approving forms no longer waits for WhatsApp messages to finish sending, cutting response time from roughly 5 seconds to instant
  • Background queue: All WhatsApp notifications are now handled by a dedicated background worker, so the system continues sending messages even after the user's page has already responded
  • Covers every notification type: The improvement applies across all form types, including approval requests, approval outcome alerts, and acknowledgment reminders
⚙️ BackendApproval

Prevent conflicting AWB data by enforcing one-Moda-one-Origin rule

  • Data integrity check: Every AWB number must now map to exactly one transport mode and one origin, preventing inconsistent entries that would break downstream processing in TMS
  • Applies to all entry paths: The validation runs on manual saves and both Excel upload flows, so no save method can bypass the check
  • Clear error messages: When a conflict is found, the system reports exactly which AWB has mismatched Moda or Origin values

+108−13
⚙️ BackendTMS

Show receiver name on printed AWB documents

Printed AWB documents now display the name of the person who received the package, drawn from the latest accepted proof-of-delivery record.

  • "Diterima oleh" section: When a shipment has been confirmed as received (accepted POD), the receiver's name appears in the right portion of the document's signature area, making it clear who accepted the delivery
  • Automatic lookup: The system checks POD records for all AWBs being printed in a single batch, so the receiver info is populated without any extra steps from the user
  • Clean fallback: If no accepted POD exists for a given AWB, the section is simply left blank, keeping the document layout tidy
🌐 WebTMS

Add customer filter to AWB print page

Users can now filter AWBs by customer before printing, making it easier to print documents for a specific client in one go.

  • Searchable customer dropdown: A new "Filter customer" field on the Print AWB Documents page lets users search and select a customer, narrowing the AWB list to only that customer's shipments
  • Works alongside existing filters: The customer filter combines with the date range, status, and search text filters already on the page, so users can drill down to exactly the set of AWBs they need
⚙️ Backend🌐 WebApproval

Grant CJ approver team access to BL stock report

Members of the CJ approver team can now view the BL Stock Report page, including both the report data and the sidebar menu entry.

  • Broader report access: Two new user groups (cj approver and cj_approver) have been added to the allowed list for the BL stock report, matching the same permission model used by the logistics and warehouse teams
  • Visible in the sidebar: The BL Stock Report menu item now appears in the navigation sidebar for CJ approver users, not just as a backend permission check
  • Consistent across API and frontend: Both the backend access check and the frontend route guard were updated together, so the experience is seamless

+13.7k−1.6k
⚙️ Backend🌐 WebApproval

Move BL stock management from WMS to Approval system

BL inventory is now tracked natively in the Approval system instead of being synced to WMS. This is a full migration of the BL stock lifecycle, from receiving stock through inbound approval to issuing stock through outbound approval.

  • Automatic stock recording on inbound approval: When a BL inbound form is approved, every item on the form is automatically recorded as in-stock inventory inside the Approval system, with full quantity tracking and remaining balance calculations.
  • Automatic stock issuance on outbound approval: When a BL outbound form is approved, the picked quantities are deducted from inventory. Items are marked "Held" if partially issued or "Issued" when fully consumed.
  • Live stock monitoring page: A new "BL Stock Monitoring" page shows summary cards (In Stock, Held, Issued, Total Remaining Qty) and a filterable data grid. Users can search by AWB or part number, change AWB numbers on un-issued items, and the grid auto-refreshes when stock changes elsewhere in the system.
  • Pick from Stock on outbound forms: A "Pick from Stock" button on the BL outbound form editor opens a searchable panel of available inventory. Users select items, specify issue quantities, and attach them directly to the form without leaving the page.
  • WMS BL pages decommissioned: All BL-related pages in WMS, including inbound monitoring, outbound monitoring, delivery forms, and inventory management, now redirect to the dashboard. The WMS API also blocks BL requests with a message directing users to the Approval system.
  • Existing stock migrated: All on-hand BL inventory records from WMS have been migrated into the new Approval ledger, preserving historical data. A backup of the original WMS data was created before migration.
  • Approved inbound confirmation banner: When viewing an approved BL inbound form, a green confirmation banner now shows that items have been recorded as stock.
⚙️ Backend🌐 WebApproval

Add BL Stock Report with Excel export and team-based access

A new dedicated reporting page for BL inventory stock is now available under a "Reporting" section in the sidebar. The page includes filtering, pagination, and Excel download capabilities, with access restricted to authorized teams.

  • BL Stock Report page: A new "Reporting > BL Stock Report" page displays a filterable, paginated table of all BL inventory records. Users can search by AWB number, part number, and status, with a Refresh button to reload data on demand.
  • Excel export with one click: Clicking "Export Excel" downloads a spreadsheet of all records matching the current filters, including BL number, status, AWB, part number, box details, quantities, moda, origin, and creation date. The file is named with the current date for easy reference.
  • Team-based access control: The Reporting menu and BL Stock Report page are only visible to admin users and members of designated teams (BL Operations, CJ Logistics, WMS Operators, BL Operators). Other users cannot see or access the page.
  • BL number displayed in report: Each inventory row now shows its associated BL number, linking stock records back to the original inbound form. Records from the initial migration show "MIGRATION" as the BL number.
🌐 WebWMS

Fix WMS dashboard inventory card links and combined pagination

Dashboard inventory summary cards now correctly navigate to the inventory channel page with the right filters applied, and combined material group views paginate properly without showing duplicate or missing rows.

  • Dashboard cards link with correct filters: Clicking "Total SP" opens the inventory page showing both XL and AXIS SP products. "Total Voucher" shows both XL WG and AIGO vouchers. "Total SIMCARD" shows both AXIS and XL SIM cards. Previously, some cards had broken or incomplete filter links.
  • Combined inventory pagination fixed: When viewing combined material groups (e.g., SIMCARD AXIS + SIMCARD XL), pagination now fetches all matching records from both sources first, merges them, sorts them, and then slices for the current page. Before this fix, each source was paginated independently, causing rows to be duplicated or skipped when changing pages.
  • Card labels corrected: Dashboard card labels were updated from "XL WIP" and "AXIS WIP" to "SIMCARD XL" and "SIMCARD AXIS" to accurately reflect the inventory categories they represent.
  • Week date range alignment fixed: All monitoring pages now use a shared date-range parser that adds one day to the week end date, matching the backend SQL BETWEEN behavior. Previously, reports for a given week could miss the last day of data.

+51−12
🌐 WebWMS

Connect dashboard cards to filtered inventory and monitoring pages

  • Dashboard SIMCARD card now navigates: Clicking the SIMCARD summary card on the dashboard opens the inventory channel page, automatically filtered to show only SIMCARD materials. Previously the card displayed counts but had no link to the underlying data.
  • Pre-filtered landing pages: When arriving from a dashboard card, the inventory page reads the URL parameter and selects the correct material group filter without the user having to choose it manually.
  • Fixed multi-parameter navigation: Dashboard cards that pass multiple filters (such as a material code plus a date range) now parse all parameters correctly. Previously, only the first parameter was recognized, causing the rest to be ignored.
  • Date range shortcuts for outbound monitoring: The outbound monitoring page can now accept week or range parameters in the URL, allowing dashboard cards to jump directly to a specific week or today's data with the date picker pre-filled.

+2.8k−150
⚙️ BackendWMS

Fix blank Excel download for Non-SAP inventory data

The Excel export for the Data WMS report now correctly includes Non-SAP inventory items when a category filter is active. Previously, downloading the report produced an empty spreadsheet because the export query did not use the updated Non-SAP storage location mapping. The downloaded data now matches exactly what users see on screen.

⚙️ BackendWMS

Show Spare Parts inventory separately on XLHome dashboard

  • Spare Parts inventory card: A new "SP" inventory count now appears on the XLHome dashboard, showing total stock classified as Spare Parts alongside the existing WMS and Non-SAP counts
  • Accurate Non-SAP classification: Non-SAP inventory is now determined by a dynamic configuration table instead of a hardcoded value, so the dashboard correctly reflects actual Non-SAP stock even when storage location mappings change
  • Admin-managed mappings: Both Non-SAP and Spare Parts classifications are configured through Management > Referensi, giving admins control over category assignments without requiring code changes
⚙️ BackendWMS

Add category filtering to XLHome Data WMS report and export

  • Filter by inventory type: The Data WMS report now accepts category filters (WMS, Non-SAP, SP) so users can narrow down results to specific inventory classifications
  • Export respects active filters: Downloading the report to Excel applies the same category filters, ensuring the exported data matches what is displayed on screen
🌐 WebWMS

Add WMS and Non-SAP category filters to Data WMS report page

  • Pill-shaped filter toggles: The Data WMS page now shows "WMS" and "Non SAP" filter buttons at the top of the report, letting users view only items in a specific inventory category
  • Filter carries through to export: Active filters are applied when downloading the report to Excel, so exported files contain only the selected categories
⚙️ BackendWMS

Prevent duplicate serial number entries from simultaneous saves

Serial number saves now use database row-level locking to ensure that two operators submitting serial numbers for the same item at the exact same time cannot both pass the available quantity check. This prevents over-allocation of stock that could occur during concurrent use.

🌐 WebWMS

Prevent duplicate serial number saves from repeated clicks

  • Save button locks during submission: The Save button on the Serial Number input page is now disabled while a save request is in progress, so accidental double-clicks cannot create duplicate entries
  • Backend protection paired: This works together with a server-side locking fix, providing two layers of protection against duplicate serial number records

+187−24
⚙️ BackendWMS

Make Non-SAP inventory classification configurable instead of hardcoded

  • Dynamic SLOC mapping: Inventory is no longer classified as "Non SAP" based on a single hardcoded value. The system now reads from a configurable mapping table (CgNo 22), so new Non-SAP storage locations can be added by admins without requiring any code changes.
  • Accurate dashboard totals: The SAP, ZEQP, ZNWS, and Non-SAP inventory counts on the warehouse dashboard now reflect the current mapping configuration instead of a fixed filter, ensuring totals stay correct as new Non-SAP locations are added.
  • Flexible reporting: Network Data WMS reports use the same dynamic mapping, so inventory classification in reports automatically stays in sync with admin-defined SLOC mappings.
🌐 WebWMS

Add Non-SAP SLOC mapping management to the Referensi panel

  • New "Non SAP SLOC Mapping" group: A new option appears in Management > Referensi under the reference group list, allowing admins to define which storage locations should be treated as Non-SAP inventory.
  • SLOC dropdown selector: When adding a Non-SAP SLOC mapping, admins pick a location from a dropdown instead of typing codes manually, reducing errors and ensuring only valid locations are selected.
  • Available for Network and XlHome warehouses: Both Network and XlHome warehouses see the new mapping group, giving each warehouse independent control over its Non-SAP classification.

+29−12
🌐 WebApproval

Pin dashboard footer to the bottom of the page

  • Footer stays in place: On dashboard pages with little content, the footer no longer floats in the middle of the screen. It now always sits flush to the bottom of the viewport.
  • Full-width layout: The footer stretches across the entire page width, matching the WMS app layout for visual consistency.
  • No more scroll drift: Previously the footer scrolled along with page content. It is now fixed in position so it remains visible regardless of how much content is on the page.
🌐 WebApproval

Fix dropdown menus cut off inside submit dialogs

  • Dropdowns no longer clipped by dialog borders: When filling out BL/DO Inbound or Pickup Domestic Delivery forms, the recipient list dropdowns previously had their option panels cut off by the submit dialog edges. Users could not see all available choices. The dropdowns now render at the page level, so the full list is always visible.
  • Applies across all recipient fields: The fix covers both the regular recipient list dropdown and the WhatsApp recipient list dropdown on the affected forms, ensuring consistent behavior.

+748−132
🌐 WebApproval

Require approval flow selection before filling forms and add delivery acknowledgment page

Flow-first form workflow: BL Inbound and Pickup Domestic forms now require users to pick an approval flow as the very first step before they can enter any shipment details or upload items. Previously, flow selection was hidden inside the final Submit dialog, meaning users could fill out an entire form without realizing which approval chain would handle it.

New AWB Acknowledgment page: A dedicated page under Monitoring lets users record and edit delivery acknowledgments for any AWB. Each acknowledgment captures who received the shipment, the date and time of receipt, and optional notes, with a full history of past acknowledgments visible in a sidebar panel.

Email and WhatsApp notifications: Both the acknowledgment page and the redesigned Submit dialog let users choose email and WhatsApp recipient lists so stakeholders are notified when a form is submitted or a delivery is acknowledged.

Simplified Submit dialog: The Submit dialog on BL Inbound and Pickup Domestic now focuses solely on choosing notification recipients, since the approval flow is already locked in at the start.


+25−15
⚙️ BackendTMS

Add status type and receiver name to AWB export

The Data AWB export now includes two additional columns right after the existing "Status" field:

  • "Tipe Status" column: Shows the latest delivery status category from the POD history (e.g., delivered, returned, in transit), so operators can see the status classification at a glance without opening individual AWB records
  • "Diterima Oleh" column: Displays the name of the person who physically received the package, pulled directly from the latest POD entry

+416−115
⚙️ Backend🌐 WebApproval

Transport modes now sync automatically from TMS

  • Live from TMS: The transport mode (Moda) dropdown no longer uses a fixed list of Darat, Laut, and Udara. Options are pulled directly from TMS, so any new transport mode added in TMS appears in Approval automatically, with no code change needed
  • Active-only filtering: Only transport modes marked as active in TMS are shown, preventing outdated or disabled modes from appearing in dropdowns and Excel upload templates
  • Need Approval: The Moda field in the final approval edit dialog is now a dropdown selector instead of a free-text input, reducing data entry errors and keeping values consistent with TMS
  • Excel templates: Upload templates now use a hidden-sheet reference for the Moda dropdown, removing the 255-character limit that previously capped the number of available modes
⚙️ Backend🌐 WebApproval

Fix and improve the delivery acknowledgment workflow

  • Reliable submissions: Acknowledging deliveries no longer triggers concurrency errors. The system now waits for the save to complete before building the response, eliminating a race condition that could cause ACK submissions to fail
  • Loading feedback: The Save button in the ACK dialog now shows a spinner and disables both Save and Cancel while the request is in progress, preventing accidental double-submission
  • WhatsApp clarity: ACK notifications sent via WhatsApp now include a bold "Acknowledgement Pengiriman (ACK)" header, making it immediately clear the message is an acknowledgement rather than a generic delivery update
  • Dialog redesign: The acknowledge delivery dialog has been refreshed with cleaner spacing, full-width form fields, and responsive sizing for smaller screens
⚙️ BackendApproval

Add Plan column to Origin/Moda Excel upload templates

  • Plan column included: The Origin/Moda Excel templates for BL Inbound and Pickup Domestic Delivery now include the Plan column, pre-filled with existing values on download
  • Non-destructive upload: When uploading the template, the Plan column updates existing records only if a value is provided, preserving any manually entered plans already saved

+3.8k−286
🌐 WebApproval

Replace Origin dropdown with free-text input on all approval forms

  • Free-text Origin: BL Inbound, BL Outbound, and Pickup Domestic forms now use a plain text input for Origin instead of a branch dropdown, so any origin value can be entered without being limited to predefined options
  • No validation blocking: The requirement that all items must have an origin selected from the dropdown before saving has been removed, since any free-text value is now accepted
🌐 WebApproval

Add recipient list selection to initial submit dialogs

  • Email recipient list: BL Inbound, BL Outbound, and Pickup Domestic submit dialogs now include a dropdown to select an Email Recipient List, so extra stakeholders can receive the initial approval notification without needing to be part of the approval flow
  • WhatsApp recipient list: A second dropdown lets users choose a WhatsApp Recipient List for the same initial notification
  • Preview before sending: Selected lists show a preview of the recipients (To, CC, and WhatsApp contacts) before the form is submitted, so users can verify who will be notified
  • New submit confirmation dialog: BL Outbound submit now uses a dedicated dialog step for selecting recipient lists before the form enters the approval flow
🌐 WebApproval

Add delivery acknowledgment tracking to AWB monitoring

  • ACK status column: The AWB Tracking table now shows an acknowledgment status badge for each BL Outbound and Pickup Domestic record, with a tooltip displaying the receiver name and date for acknowledged shipments
  • Capture acknowledgment button: Each eligible AWB row has a new action button to open a dialog for recording who received the shipment, when, and any notes
  • Edit existing acknowledgments: Already-acknowledged shipments show an edit button instead, allowing corrections to receiver details or notes
  • Acknowledgment history timeline: The AWB detail dialog includes a full timeline of all acknowledgment actions, showing who made each change, when, and what values were set
  • Optional notifications on ACK: The acknowledgment dialog lets users select an Email Recipient List and WhatsApp Recipient List to notify stakeholders when a delivery is confirmed
  • WhatsApp template configuration: New "Acknowledgment" template cards have been added to the WhatsApp Templates settings page for both BL Outbound and Pickup Domestic
⚙️ BackendApproval

Remove Origin branch mapping from Excel templates and TMS sync

  • Simplified Excel templates: Downloaded templates for BL Inbound, BL Outbound, and Pickup Domestic no longer include a dropdown validation list for the Origin column, so any value can be typed directly
  • TMS sync simplified: The origin-to-branch mapping step is no longer performed when syncing approved forms to the TMS system
⚙️ BackendApproval

Add extra email and WhatsApp recipients to initial form submission

  • Optional recipients on submit: When a BL Inbound, BL Outbound, or Pickup Domestic form is first submitted for approval, the system now accepts an Email Recipient List and a WhatsApp Recipient List to include as additional notification recipients alongside the standard approval flow notifications
  • Consistent with later stages: This brings the initial submission in line with the recipient list support already available on approval, rejection, and revision notifications, so stakeholders can be notified from the very first step of the workflow
⚙️ BackendApproval

Add delivery acknowledgment recording for BL Outbound and Pickup Domestic

  • Per-AWB acknowledgment: Each individual AWB within a BL Outbound or Pickup Domestic form can be independently acknowledged as delivered, recording who received it, when, and any notes about the delivery
  • Full audit trail: Every acknowledgment action (both create and edit) is logged in a dedicated history table with the actor identity, timestamp, and all field values, so the complete chain of custody is always visible
  • Email notifications on acknowledgment: A new professional email template is sent to the selected recipient list when an ACK is recorded, including the AWB number, receiver name, and received date
  • WhatsApp notifications on acknowledgment: WhatsApp messages are sent to configured recipient lists using customizable templates for BL Outbound and Pickup Domestic acknowledgment events
  • Edit after the fact: Existing acknowledgments can be updated with corrected information, with each edit also recorded in the audit history
🌐 WebWMS

Replace Origin dropdown with free-text input on BL Inbound and BL Outbound

  • Free-text Origin: The Origin field on BL Inbound and BL Outbound detail pages is now a plain text input instead of a branch dropdown, so users can type any origin value without being limited to predefined branch names
  • Consistent across dialogs: Both the add-item and edit-item dialogs on each page use the new text input
  • Existing data preserved: Previously saved origin values continue to display and work normally

+921−290
⚙️ BackendTMS

AWB prints and WhatsApp POD notifications now show who entered the data

  • Print footer update: AWB documents now display "Diinput oleh" with the name of the person who last modified the record, replacing the previous static "Create by" field that only showed the original creator
  • WhatsApp POD includes input by: Proof of delivery WhatsApp notifications now include the name of the person who entered the POD data, so recipients know exactly who handled the delivery confirmation
🌐 WebApproval

Show validation errors in a dialog when form submission fails

  • Stay on the form after validation failure: When a BL Inbound or Pickup Domestic form fails submit validation (e.g., missing Origin or Moda), the system now shows a popup dialog with the specific error message instead of navigating away to the forms list. Users can immediately fix the issue and resubmit without reloading the page
  • Indonesian error messages: Submit validation errors now display in Bahasa Indonesia, matching the language used across the rest of the application. For example, "Submit flow CJ First gagal. Semua item wajib memiliki Moda sebelum submit"
🌐 WebApproval

Standardize form type badge styling on the dashboard

  • Consistent badge appearance: Form type badges in the dashboard's Recent Forms and Pending Approvals sections now use uniform sizing, font weight, and padding, matching the styling used on the detail pages. Previously, badges on the dashboard had inconsistent formatting that made them harder to scan at a glance
⚙️ Backend🌐 WebApproval

Fix Pickup Domestic and BL Inbound Origin/Moda workflow end-to-end

  • Validation follows who starts the flow: Forms initiated by CJ teams require Origin and Moda before submission, while forms initiated by LEN teams defer those fields to a later workflow step. Previously, validation rules were tied to step names and could block or allow the wrong flows
  • Step-appropriate Excel templates and upload routing: Downloaded templates now show only the columns relevant to the current step (e.g., Origin/Moda templates include Quantity and Destination but omit dimensions), and uploading on a pending form correctly routes through the Origin/Moda handler instead of the draft item path
  • Approval queue shows the right action: Pickup Domestic forms waiting at the CJ Origin Moda Entry step now display "Selesaikan Data Entry" instead of the normal approve button, so approvers see the correct action for the current step
  • Final approval edits no longer erase data: When an approver edits a single field on a Pickup Domestic item (such as Remark), the save only updates that field. Previously, editing one field would erase all other untouched values including Box Number, PO No, Origin, and Moda
  • Origin/Moda controls on the detail page: Pickup Domestic form pages now show Download Template, Upload Excel, and Save buttons for Origin/Moda data when the user is at the relevant step, and table columns appear or hide based on what the step requires
⚙️ Backend🌐 WebApproval

AWB Tracking now monitors Pickup Domestic shipments alongside BL Outbound

  • Unified outbound tracking: Pickup Domestic AWBs now appear in the AWB Tracking list, giving one place to monitor all outbound shipments across both BL Outbound and Pickup Domestic forms
  • Color-coded form types: Each row displays a color-coded badge (green for BL Outbound, blue for Pickup Domestic) so the shipment source is visible at a glance without reading the text
  • Newest-first ordering: The list now sorts by creation date, newest first, so the latest shipments always appear at the top of the page
⚙️ BackendApproval

Fix approval notification for BL Vendor Inbound workflows

  • Next approver receives notification: When BL Vendor Inbound advances from CJ Origin Moda Entry to LEN AWB Entry, the system now correctly sends a WhatsApp notification and email to the next person in the approval chain. Previously, the notification was skipped because the form type was not recognized in the routing logic
  • AWB field no longer blocks CJ step: The AWB number field is no longer mandatory at the CJ Origin Moda Entry step for BL Inbound forms, since AWBs are assigned at a later step. This removes a validation error that was preventing users from completing the data entry step

+1.6k−378
⚙️ BackendWMS

Fix BL Outbound item data accuracy for warehouse operations

Sub-location detail and plan source values are now correctly saved when creating or editing outbound items, preventing "stock not found" errors during goods issue processing. Previously, the system was silently clearing the exact warehouse sub-location on every save, causing downstream validation to fail when operators tried to release goods.

  • Accurate sub-location tracking: The exact storage location (DetailLocationNo) is now preserved from the form input instead of being erased, so goods issue validation can match the correct stock record
  • Consistent plan values: Plan codes now come from the package ID, matching what is stored in inventory, which eliminates mismatches that blocked goods issue processing
  • Bulk upload fix: Excel uploads automatically pull the sub-location from inventory records, so operators do not need to fill it in manually for each row
  • Edit protection: Editing an existing item no longer overwrites the sub-location with a blank value, keeping the data intact across revisions
⚙️ BackendWMS

Streamline BL Transfer Order PDF layout

Removed the transport mode column from the BL Transfer Order PDF, giving Part Number and Description columns more horizontal space. The Moda field is only needed on the Goods Delivery Note for external partners, not on the internal warehouse picking list.

  • Wider columns: Part Number and Description now have 40% and 20% more space respectively, preventing text from wrapping awkwardly across multiple lines
  • Cleaner printout: The table is easier to scan at a glance with one fewer column, and total row alignment stays correct with the reduced column count
⚙️ BackendApproval

Fix Pickup Domestic approval workflow and notifications

Pickup Domestic Delivery forms were missing from the approval queue, meaning approvers could not see or act on them from the main dashboard. This also fixes approval notifications to link directly to the review page and personalize the greeting.

  • Visible in approval queue: Pickup Domestic forms now appear in the "Need Approval" list alongside BL, MRN, MRF, and Pickup International forms
  • Correct review links: Email and WhatsApp notifications now open the Pickup Domestic form view page, instead of a token-based API URL that landed on a blank screen
  • Personalized notifications: WhatsApp approval messages greet the approver by name and show their assigned group, making it immediately clear who is being addressed
⚙️ BackendApproval

Fix LEN First form Excel validation

Excel uploads for LEN First workflows no longer incorrectly reject rows that are missing Origin or Moda values. In the LEN First process, those fields are intentionally left blank because the CJ operations team fills them in during a later step. The system was previously blocking these uploads with validation errors.

  • No false rejections on LEN First uploads: Origin and Moda validation is skipped when the workflow is identified as "LEN First", allowing operators to upload item data without pre-filling transport details
  • Accurate flow detection: The system now identifies LEN First flows by checking the step name, which correctly distinguishes them from CJ First flows that require all fields upfront
  • Blank cells allowed in Moda dropdown: Empty cells in the Moda column no longer trigger a validation error popup in Excel, reducing friction when filling out templates
⚙️ BackendApproval

Add AWB tracking and monitoring from TMS

New monitoring capabilities let users look up any AWB number to see its full shipping status and event history pulled directly from TMS. A companion paginated list shows all synced AWBs with filters for date, transport mode, and status, so operations teams can track shipments without switching to the TMS system.

  • Standalone AWB lookup: Enter any AWB number to see sender, recipient, weight, transport mode, manifest number, DRS number, and a chronological event timeline
  • Searchable AWB list: Browse all outbound AWBs in a paginated table with filters for date range, transport mode (Darat, Laut, Udara), current status, and free-text search across AWB, manifest, and DRS numbers
  • Live TMS status: AWBs that have not yet synced their status from a booking link now fetch the latest status directly from TMS on each page load, so the list always reflects reality
  • Complete coverage: The AWB list now queries form item records instead of only booking links, so AWBs that were created without a formal booking still appear in the monitoring table
🌐 WebApproval

Add AWB tracking and monitoring pages

A new AWB Tracking page in the Monitoring section lets operations staff browse, filter, and drill into individual shipment statuses without leaving the Approval app. Clicking any row opens a detail popup with the full event timeline.

  • Paginated AWB table: All synced AWBs are displayed in a searchable table with columns for form number, transport mode, AWB number, status, manifest, DRS, and last sync time
  • Detail popup: Click the search icon on any row to open a dialog showing full shipment details (sender, recipient, weight, dates) plus a visual status history timeline
  • Filter bar: Narrow results by date range, transport mode (Darat, Laut, Udara), AWB status (Booking through Delivered), and free-text search across AWB, manifest, and DRS numbers
  • Color-coded transport modes: Moda labels appear as tinted pills (blue for Darat, cyan for Laut, purple for Udara) across both the AWB Tracking and BL Outbound Lifecycle pages, making transport types instantly recognizable
  • Sidebar navigation: AWB Tracking is now accessible from the Monitoring submenu in the left sidebar, alongside BL Outbound Lifecycle
🌐 WebApproval

Add form type badges to dashboard tables

The Recent Forms and Pending Approvals tables on the dashboard now display a colored badge for each form type, making it easy to distinguish between BL, MRN, MRF, Pickup Domestic, and other form categories at a glance without reading the form number.

  • Form Type column: A new column in both the Recent Forms and Pending Approvals tables shows a color-coded badge with the form type name (e.g., "BL Outbound", "Pickup Domestic")
  • Mobile layout: The form type badge also appears in the mobile card view, keeping the experience consistent across devices
  • Fixed data source: The "Pending Forms" section on the admin dashboard was incorrectly pulling recent forms data instead of pending forms; this now displays the correct dataset

+1.6k−275
⚙️ BackendApproval

Complete Pickup Domestic form workflow with multi-step approval and Excel data entry

Pickup Domestic Delivery forms now support a full multi-step approval workflow with Excel-based item data entry, AWB number registration, and automatic synchronization to TMS upon final approval.

  • Excel template upload for items: Users download a template, fill in item details (box number, PO, part number, quantity, destination, etc.), and upload it in one step. The template includes dropdown validation for transport mode (Darat, Laut, Udara) and origin branch
  • Two approval flows supported: "CJ First" flows require origin and transport mode at creation time, while "LEN First" flows allow these fields to be filled in at a later step by the LEN team. The system automatically adjusts validation rules based on the selected workflow
  • Dedicated AWB entry step: A separate Excel template downloads all current items so users can fill in AWB numbers, weights, and dimensions. This step is restricted to the AWB Data Entry workflow step only, preventing premature edits
  • Final approval editing: At the last approval step, approvers can edit any item field and remove items entirely, with all changes tracked and validated before saving
  • Automatic TMS sync on approval: When a Pickup Domestic form is fully approved, AWB records are automatically created or updated in the TMS system. Transport mode and origin branch are resolved automatically, and orphaned AWB records are cleaned up if items are removed
  • Form update and delete: Draft and Revision Requested forms can now be edited (header fields like BL number, request date, material document) or deleted entirely, giving users more control over their work-in-progress
  • My Forms integration: Pickup Domestic forms now appear in the "My Forms" dashboard alongside other form types, so users can track and manage all their submissions from one place
🌐 WebApproval

Pickup Domestic creation, viewing, and final approval editing interface

The Approval web app now provides a full interface for creating, viewing, and approving Pickup Domestic Delivery forms, including inline editing at the final approval step.

  • Creation page with flow-aware template: When downloading the Excel template, the selected workflow is passed to the server so the template columns match the flow type. Transport mode and origin columns are always visible in the items table for consistency
  • Final approval edit table: Approvers at the last workflow step see an inline editing table where they can modify item details (box number, PO, destination, quantity, etc.), change or remove items, and save all changes with a single button. Deleted items are visually struck through before saving
  • Simplified item columns: Plant and Sloc fields have been removed from all Pickup Domestic tables, streamlining the data entry experience to only the fields that matter
  • Edit permissions shown automatically: The system detects whether the current user is at the final approval step and shows or hides the edit section accordingly, so approvers only see editing controls when they have the authority to use them
⚙️ BackendApproval

Fix BL Outbound approval notifications to open form page in browser

BL Outbound approval notifications now direct approvers to the form view page in the web app, matching the behavior of BL Inbound notifications. Previously, the links pointed to a direct API approval token, which skipped the UI entirely.

  • Email and WhatsApp links updated: Both email and WhatsApp notification links now open the form view page in the browser, so approvers can review the full form context before making a decision
⚙️ BackendApproval

Show approver real name in WhatsApp approval notifications

WhatsApp approval notifications for both BL Inbound and BL Outbound now display the recipient's actual full name instead of the generic word "Approver", making messages more personal and easier to identify.

  • Personalized greetings: The {ApproverName} placeholder in notification templates now resolves to the approver's full name (falling back to username if no full name is set), so each person receiving a notification sees their own name in the message

+914−79
🌐 WebWMS

Copy all AWB preview rows to Excel across all pages

BL Outbound AWB preview now copies every matching row to the clipboard, not just the ones visible on the current page.

  • Full dataset capture: The copy-to-Excel action now fetches every page of AWB preview results and combines them into a single clipboard entry, so nothing is missed even when there are hundreds of items spread across multiple pages
  • Row count confirmation: A success message shows exactly how many rows were copied, so the user can verify the complete dataset was captured before pasting into the template
⚙️ BackendTMS

Search and filter personal activity logs by keyword and date

The personal activity log page now supports keyword search, date range filtering, and server-side pagination.

  • Keyword search: Users can type a keyword to filter logs by table name and change type. Optionally, the search can also look inside old and new values to find specific field changes
  • Date range filters: A start and end date narrows results to a specific period, making it easy to find changes from a particular day or week
  • Server-side pagination: Logs load page by page instead of all at once, keeping the page responsive regardless of how many entries exist
⚙️ Backend🌐 WebApproval

Multi-step Origin, Moda, and AWB data entry for BL Inbound forms

BL Inbound data entry is now split into separate workflow steps, so each team fills in only the data they own instead of one team handling everything.

  • Origin and Moda via Excel: CJ teams can download an Excel template pre-filled with item IDs, box numbers, and part numbers, then fill in Origin (with branch dropdown validation) and Moda columns and upload the completed file. This replaces manual one-by-one entry for forms with many items
  • Step-specific editing: AWB entry controls only appear at workflow steps specifically named for AWB entry, while Origin and Moda controls only appear at the CJ data entry step. Each team sees only the fields they are responsible for, reducing confusion and errors
  • Creator access restored: Form creators are no longer blocked from managing AWB numbers at the LEN AWB Entry step after submission, so the original submitter can fill in AWB data when the workflow reaches that step
  • Draft creation without items: Pickup Domestic forms can now be saved as drafts without requiring any items upfront, letting teams start a form and add items later
⚙️ Backend🌐 WebApproval

Excel editing and automatic TMS sync for BL Inbound final approval

Final approvers can now edit BL Inbound items in bulk via Excel, and AWB data is automatically synced to TMS when the form is approved.

  • Excel template for final approval: Approvers can download a template of the current items, edit quantities, destinations, origins, or moda in Excel, and upload the updated file. Changes appear in the edit table for review before saving
  • Editable Origin and Moda: These fields can now be changed at the final approval step, not only at the CJ data entry step, giving approvers the flexibility to correct values without sending the form back
  • Automatic TMS AWB sync: When a BL Inbound is fully approved, AWB records are created or updated in TMS automatically. The system matches by AWB number, resolves the transport mode and origin branch, and syncs item descriptions so both systems stay aligned without manual data entry
  • Orphan AWB cleanup: AWB records in TMS are automatically deleted when all corresponding items are removed from a BL Inbound, both during final approval editing and after full approval, preventing outdated records from lingering in TMS
  • Immediate WMS sync: BL Inbound data now syncs to WMS immediately on submit for all workflow types, so warehouse teams see inbound data sooner regardless of the approval flow used

+1.5k−2.7k
⚙️ Backend🌐 WebApproval

Consolidate Pickup Domestic into a single unified form

One form instead of two: Pickup Domestic Inbound and Pickup Domestic Outbound have been merged into a single "Pickup Domestic Delivery" form. Users no longer need to choose between two separate form types when creating a domestic pickup request.

Combined item fields: The unified form now includes all relevant fields from both previous forms in a single item table, including BL Number, Material Doc, AWB, transport mode (Moda), origin branch, dimensions (Weight, Length, Height, Width), and packing cost.

ERP integration preserved: AWB numbers from Pickup Domestic Delivery forms are still automatically created in the TMS system after the data entry approval step, keeping the downstream workflow intact.

⚙️ Backend🌐 WebApproval

Add WhatsApp notifications and personalized greetings for approval forms

WhatsApp alerts for Pickup Domestic and BL Vendor Inbound: Approvers now receive WhatsApp messages when a Pickup Domestic Delivery or BL Vendor Inbound form needs their approval. Requesters are also notified via WhatsApp when their form is approved, rejected, or returned for revision.

Personalized greetings: All approval WhatsApp messages now address each approver by their real name and department group (e.g. "Budi (Warehouse)") instead of a generic "Approver" label, making it easier to identify who is being contacted in group chats.

Customizable templates: Admins can now edit WhatsApp message templates for BL Vendor Inbound and Pickup Domestic Delivery forms directly from the WhatsApp Templates settings page, with separate templates for approval requests, approved, rejected, and revision outcomes.


+7.3k−53
🌐 WebApproval

Move required AWB columns to the front of data entry tables

  • Columns reordered in BL Inbound and BL Outbound views: Origin, Moda, and AWB No have been moved to the far left of the item table (right after the row number), so operators see the required fields first instead of scrolling to find them
🌐 WebApproval

Add Pickup Domestic Inbound and Outbound form pages to dashboard

New form pages and dashboard shortcuts for managing Pickup Domestic shipments:

  • Pickup Domestic Inbound form: users can fill in the BL number, material document, and inbound date, save as draft, then upload item details via an Excel template with a guided three-step process (save draft, upload Excel, submit)
  • Pickup Domestic Outbound form: create outbound requests with outbound number, date, requester, and notes, with draft save and approval flow selection
  • Dashboard quick access: three new buttons on the dashboard for BL Vendor Inbound, Pickup Domestic Inbound, and Pickup Domestic Outbound, so operators can jump straight to the form they need
  • Inbound detail view: authorized approvers can fill in Origin, Moda, and AWB numbers directly in the form detail page, with inline dropdowns and Excel upload support
⚙️ BackendApproval

Add Pickup Domestic Inbound and Outbound approval workflows

Two new form types are now available in the approval system for managing domestic pickup shipments:

  • Pickup Domestic Inbound: track goods received through domestic pickup with BL numbers, material documents, WBS references, and inbound dates, each with a multi-step approval workflow
  • Pickup Domestic Outbound: create outbound requests with item details including dimensions, weight, and packing costs, routed through the same configurable approval flow
  • Excel template upload: operators can download a pre-formatted spreadsheet with dropdown validation for transport mode (Darat, Laut, Udara) and origin branch, then upload it back to fill in all items at once
  • AWB auto-registration: after the AWB Data Entry approval step completes, AWB numbers are automatically created in TMS so shipments can be tracked immediately
  • Email and WhatsApp notifications: approvers receive notifications with direct approve/reject links at every workflow step, keeping the process moving without manual follow-up

+49−10
⚙️ Backend🌐 WebApproval

Strengthen BL Inbound data entry validation and error handling

  • Mandatory field enforcement: AWB, Moda, and Origin must now be filled for every item before the data entry step can be completed, preventing incomplete records from advancing through the approval workflow
  • Cleaner error prompts: When required fields are missing, the system now shows the total count of incomplete rows instead of listing every item ID, making it much easier to understand what needs fixing
  • One-click navigation to fix errors: A "Buka Form Detail" button now appears inside the error banner when validation fails, letting approvers jump straight to the form detail page to fill in missing data
  • Smarter approval routing: Notification links for the final approval step now open the full form view in the browser instead of offering a one-click approve, since that step requires reviewing and potentially editing item data

+1.5k−135
🌐 WebApproval

Add phone number to user profiles

  • WhatsApp phone field: User create and edit forms now include a phone number field, clearly labeled so admins know it is used for WhatsApp notifications
  • Clean display: Stored numbers are automatically formatted for WhatsApp delivery, and the technical chat ID suffix is hidden from view when editing a user
  • Smoother editing workflow: After saving changes to a user profile, the page refreshes in place instead of navigating back to the user list, so admins can continue making edits without re-opening the form
  • Balanced form layout: User create and edit forms now use a fixed two-column grid instead of a responsive auto-fit layout, giving a cleaner and more predictable appearance on all screen sizes
🌐 WebApproval

Add colored badges for form types and approval steps

  • Color-coded form types: Every form type (BL Inbound, BL Outbound, Pickup & Delivery, etc.) now appears as a distinct colored badge instead of plain text, making it easy to scan form lists at a glance
  • Step name badges: On the Need Approval page, each form's current approval step is also shown as a colored badge so approvers can quickly see which stage a form is at
  • Consistent colors across pages: The same form type always maps to the same color on every page and every session, using a hand-picked 30-color palette designed for bright readability
  • Covers all form pages: Colored badges appear on Need Approval, Approved, Rejected, Need Revision, Submitted, Drafts, and Pending pages, in both table rows and mobile card views
⚙️ BackendApproval

Strengthen BL Inbound approval with TMS integration

  • Duplicate AWB prevention: AWB numbers entered during BL Inbound data entry are now checked against TMS in real time, blocking duplicates before they can enter the system and cause downstream conflicts
  • Automatic TMS AWB creation: When the data entry step on a BL Inbound form is completed, the system automatically creates the corresponding AWB records in TMS, removing the need for manual re-entry
  • Final approval item editing: Approvers at the last workflow step can now correct item details (box numbers, quantities, destinations, descriptions) directly through a dedicated endpoint, with AWB fields protected from changes
  • Simpler BL Outbound sync: AWB synchronization for approved BL Outbound forms now works directly by AWB number instead of routing through booking records, making the process more straightforward and reliable
🌐 WebApproval

Edit BL Inbound items at final approval step

  • Inline editing dialog: Approvers at the final step of a BL Inbound form now see a pencil icon on each row that opens a full editable table of all items
  • Protected AWB fields: AWB numbers are displayed as read-only badges so approvers cannot accidentally change them, while all other fields (box number, PO, part number, quantity, destination, and more) are fully editable
  • Delete unwanted items: Items that are no longer needed can be removed directly from the dialog, and all changes are applied in a single save action

+796−417
⚙️ Backend🌐 WebTMS

Paginated audit logs with search, filters, and visual diff view

Server-side pagination: Audit logs now load page by page from the server instead of all at once (previously capped at 250), keeping the page responsive even as the log history grows

Keyword search: Type a search term to filter logs by action type, entity name, or optionally search within the old and new values of each change

Date range filter: Pick a start and end date to narrow down logs to a specific period, useful for reviewing activity during a particular shift or incident

User identity: Each log entry now shows the full name of the person who made the change, making it easy to identify who did what without cross-referencing user IDs

Visual diff view: Expanding a log entry reveals a before/after comparison table that highlights exactly which fields changed, with old values shown in amber and new values in green

Colored action chips: Each log entry is tagged with a color-coded chip (green for create, amber for update, red for delete) so the type of change is visible at a glance

All labels on the page are now in Bahasa Indonesia.

⚙️ BackendTMS

Fix product data loss and errors when updating master products

Preserve dimensions, images, and pricing: Editing a product previously silently dropped its dimension specs, photos, and pricing because those related records were not loaded during the update. All three are now included when a product is loaded for editing, so nothing gets lost on save

Safe pricing update: Updating a product's price used to delete and re-insert the pricing row, which could trigger a duplicate-key error if two saves happened close together. The pricing row is now updated in-place instead, eliminating the error

Image filenames saved: When adding a new image to a product variant during an update, the filename was left blank. It is now populated correctly so images can be referenced and displayed as expected

⚙️ BackendTMS

Enable QR code and barcode generation on production server

QR and barcode support on VPS: The TMS production server (recently migrated from Azure to a VPS) can now generate QR codes and barcodes. The image processing library required for this was a Windows-only dependency and has been enabled for Linux, so features that rely on QR or barcode output work correctly in production

🌐 WebApproval

Expand WhatsApp templates to cover full approval lifecycle

Eight notification templates: The WhatsApp Templates page previously only showed two templates (one per BL type). It now displays all eight: Approval Request, Approved, Rejected, and Revision Requested for both BL Inbound and BL Outbound

Tab-based layout: Templates are organized under two tabs (BL Inbound and BL Outbound) instead of a single long scrollable page, making it easier to find and edit the right template

Parallel save: Clicking save updates all eight templates simultaneously, so there is no need to wait for one to finish before the next starts


+322−146
⚙️ BackendTMS

Speed up AWB Excel upload processing

Faster bulk AWB registration via Excel upload. The upload process previously evaluated all VLOOKUP formulas across the entire spreadsheet (over a million rows), causing 20-30 second delays every time a user submitted an AWB template. This has been reduced to near-instant processing.

  • Tighter formula ranges: VLOOKUP formulas now reference only the actual reference data rows instead of the full column, eliminating unnecessary calculations
  • Smart row detection: Empty template rows are skipped without evaluating their formulas, so the system only processes rows where the user actually entered data
  • Safety cap: Uploads are limited to 200 data rows per submission, which is more than enough for daily operations while keeping processing times consistent
⚙️ BackendApproval

Send WhatsApp notifications for BL approval workflows

Approvers now receive WhatsApp messages whenever a BL form needs their action. Both BL Inbound and BL Outbound forms automatically notify the right person via WhatsApp at every approval step, including the AWB data-entry step.

  • WhatsApp on every step: When a BL Inbound or BL Outbound form is submitted or moves to the next approval stage, each assigned approver receives a WhatsApp message with the form number and a direct link to review it
  • Customizable message templates: Teams can configure WhatsApp message text per form type and notification stage (approval request, approved, rejected, revision needed) using database templates, with Indonesian-language fallback text built in
  • Outcome broadcasts: When a BL form is finally approved, rejected, or sent back for revision, the result is broadcast to the full email and WhatsApp recipient lists chosen by the approver, not just to the original requester
  • Duplicate notification prevention: On the final approval step, the system skips sending a separate "needs approval" broadcast to the WhatsApp recipient list, since approving that step immediately completes the form and triggers the outcome notification instead

+6.7k−33.3k
⚙️ BackendWMS

Redesign BL outbound approval workflow with AWB tracking and expanded shipment data

  • Manual "Send to Approval" replaces automatic sync: Outbound forms are no longer pushed to Approval automatically when staff upload the Excel file. Warehouse staff can now review, edit, and validate all required fields at their own pace before manually submitting, preventing incomplete data from reaching the approval queue
  • AWB inventory search and bulk reassignment: A new inventory lookup lets staff search by AWB number and see all items assigned to it. AWB numbers can be reassigned in bulk by selecting multiple items and entering a new number, useful when shipments are consolidated or corrected
  • Available AWB list: Staff can browse all AWB numbers currently in stock, filter by search term, and see the quantity and transport mode for each, making it easier to select the right AWB when building an outbound
  • Branch-sourced Origin field: Origin is now pulled from the branch master data via the Approval service instead of being entered as free text, ensuring consistent naming across WMS and downstream systems
  • Expanded outbound data fields: Each outbound item now carries AWB number, weight (kg), length, height, width (cm), and packing kayu cost, giving downstream teams the dimensional and cost data they need for shipment booking and costing
🌐 WebWMS

BL outbound workflow redesign with AWB preview, edit, and copy-to-Excel

  • Preview by AWB: A new modal lets warehouse staff search and view all inventory items for a specific AWB, then select items directly for the outbound
  • Edit AWB page: A dedicated inventory page to search by AWB number, view associated items, select them, and reassign to a new AWB in bulk
  • Copy to Excel: One-click copy of inventory data to clipboard, formatted for direct paste into the outbound Excel template for offline editing
  • Outbound item details: The add/edit outbound item dialog now includes Origin (branch dropdown), Moda, AWB, Weight, L/H/W, and Packing Kayu cost fields
  • Inline inventory editing: When previewing inventory by AWB in the outbound modal, Weight, L/H/W, and Packing Kayu can be typed directly into table cells
  • New columns across tables: Origin, Moda, and AWB are now visible in inventory, inbound detail, inbound monitoring, outbound detail, outbound monitoring, and BL reporting tables
⚙️ BackendApproval

WhatsApp notifications for BL form outcomes and BL Inbound AWB tracking

  • WhatsApp notifications on approval outcomes: When a BL inbound or BL outbound form is approved, rejected, or sent back for revision, designated recipients now receive a WhatsApp message with the form number and a direct link
  • WhatsApp recipient lists and templates: Admins can create named recipient lists and customize the notification message text for each form type
  • CC recipients on outcome emails: Notification emails for approved, rejected, or revision-requested forms now support CC recipients alongside the primary requester
  • BL Inbound AWB tracking: BL inbound form items now include AWB number, Origin, Moda, and Unit of Measure fields, enabling complete shipment data from inbound through outbound
  • Duplicate BL number validation: Creating a BL form with a number that already exists returns a clear Indonesian error message instead of a generic database error
  • Data Entry (AWB) step type: Approval flows can now include a step where LEN fills in AWB data without approving or rejecting, keeping the workflow organized by responsibility
🌐 WebApproval

WhatsApp configuration pages, BL Inbound AWB management, and dashboard improvements

  • WhatsApp Recipient Lists: New admin page to create, edit, and manage named lists of WhatsApp contacts for routing approval notifications
  • WhatsApp Templates: New admin page to customize the approval message text for BL inbound and BL outbound forms, with placeholder support for form number, approver name, and link
  • BL Inbound AWB management: From the BL Inbound view page, authorized users can download an AWB template, upload the filled file, and save AWB, Moda, and Origin data per item using inline dropdowns and text inputs
  • BL Outbound detail editing: Origin, AWB, Weight, Length, Height, Width, Packing Kayu cost, and Remark fields added to the outbound item table with inline editing for assigned approvers
  • Need Action dashboard widget: A clickable card on the dashboard shows the number of forms assigned to the current user for action, with direct navigation to the relevant form view
  • Dashboard chart with action data: The form type chart now shows two datasets: "My Forms" (created by the user) and "Need Action" (pending the user's review)
  • WhatsApp in all approval dialogs: Approve, reject, and revision dialogs now include a WhatsApp recipient list dropdown alongside the existing email recipient list option
  • WMS-originated outbound forms display an informational banner and disable inline editing, directing approvers to review the data submitted from WMS

+156−280
⚙️ BackendWMS

Strengthen data security and prevent upload conflicts in warehouse operations

  • SQL injection protection: All user-supplied values across warehouse operations (warehouse selections, status filters, material group filters, search terms) are now handled as safe parameters instead of being inserted directly into database commands, closing a potential security vulnerability
  • Concurrent upload safety: When multiple warehouse staff upload inbound or outbound Excel files at the same time, the system now properly locks records during processing to prevent ID collisions that could cause errors or data inconsistencies
  • Dashboard reliability: The warehouse dashboard's inventory breakdown by storage location now uses safe parameter handling, ensuring data remains accurate even with unusual storage location names

+210−64
⚙️ Backend🌐 WebTMS

Overhaul invoice creation and print layout with manual numbering, configurable tax rate, and redesigned PDF

  • Manual invoice numbering: Admins can type a custom invoice number or leave the field blank for auto-generation. Duplicate numbers are rejected automatically so no two invoices ever share the same reference.
  • Configurable PPN rate: Invoice drafts now offer a dropdown to choose between 1.1% and 11% tax rates, with the PPN amount calculated automatically from the subtotal after discount.
  • Packing fee as a separate cost: Each AWB line on an invoice now shows a dedicated "Harga Packing" column, so packing costs are tracked independently from freight and other charges in both the draft screen and the printed output.
  • Landscape PDF with richer shipment data: Printed invoices switch to landscape orientation with wider columns, and now include origin city, destination city, DO/Ref number, received date, and receiver name for every shipment line.
  • Signature city from company settings: The city shown on the signature block is now configurable from the company settings page under "Kota Tanda Tangan" instead of being hardcoded to Jakarta.
  • Blank payment terms preserved: When an invoice has no payment term, the printed PDF shows a dash instead of a default filler sentence.

+33−34
⚙️ Backend🌐 WebTMS

Allow AWB date to be modified via edit requests

  • New editable field: The AWB date (Tanggal AWB) can now be changed through the AWB Edit Request workflow, which was previously locked as read-only
  • End-to-end support: Operators select the new date from a date picker on the edit request form, and once approved, the system automatically updates the shipment record
  • Consistent with existing workflow: The date change follows the same approval process as other editable fields like service type, weight, and recipient details
🌐 WebProfile

Refresh company profile presentation and homepage video

  • Updated company profile slides: The presentation carousel on the company story page now displays the latest version of the company profile deck with refreshed content
  • New homepage video: The hero section video on the landing page has been replaced with an updated version
  • Carousel navigation fix: Previous/next buttons on the presentation carousel are now properly centered vertically

+3.1k−48
⚙️ BackendTMS

Add packaging content management with draft and publish workflow

  • New Packaging CMS module: Admins can create, edit, and delete packaging entries with a title (up to 100 characters), a short description (up to 255 characters), and one uploaded image
  • Draft and publish workflow: Packaging entries start as drafts. Before publishing, the system validates that the title, description, and image are all provided, showing clear Indonesian-language error messages if anything is missing
  • Public API for company website: Published packaging is served via a paginated endpoint, sorted by newest publish date, ready for the company profile frontend to display in a card or grid layout
🌐 WebTMS

Add admin pages for managing packaging content

  • Packaging list page: A searchable, sortable table at /cms/packagings shows all packaging entries with color-coded status badges (Draft/Published), last modified date, and quick-action buttons for viewing, editing, publishing, unpublishing, and deleting
  • Create and edit forms: Dedicated pages for adding new packaging and editing existing ones, with inline image upload (up to 10 MB), a live image preview, and client-side validation before saving
  • Navigation and access control: A new "Packaging" link appears in the CMS sidebar for users with the View Packagings permission. Separate permissions control who can create, update, and delete packaging entries
🌐 WebProfile

Show live packaging content on the Activity page

  • Dynamic packaging section: The packaging showcase on the Activity page now loads live data from the CMS API instead of using static images. When admins publish new or updated packaging, the website reflects the changes immediately
  • Skeleton loading state: A placeholder animation with three pulsing cards appears while packaging data is being fetched, so visitors always see a structured layout
  • Graceful empty state: If no packaging has been published yet, a friendly message invites visitors to check back soon instead of leaving a blank section
🌐 WebProfile

Add Pelita Air, Nam Air, and Rimbun Air as flight partners

  • Three new partner banners: Pelita Air, Nam Air, and Rimbun Air logos are now displayed in the flight partners section of the company profile website
  • Updated grid layout: The partner banner grid changed from 5 columns per row to 4, giving each banner more visual breathing room as the partner lineup grows

+6−6
🌐 WebTMS

Fix table layout on Articles and Activities CMS pages

  • Full-width tables: The Articles and Activities CMS pages now display their tables at full screen width instead of being constrained to a narrow container
  • Table rendering fix: Action buttons and table rows that were previously cut off or misaligned now render correctly across the full page

+154−7
🌐 WebTMS

Fix AWB bulk edit export

  • Bulk edit export now downloads correctly: Selecting AWBs and exporting them for bulk editing previously failed silently because the app was calling an outdated endpoint. The export file now generates as expected.
⚙️ BackendApproval

Show clear error messages when BL form submission fails

  • Validation errors now appear in plain language: When a BL form fails WMS validation during submission, the specific reason is shown (for example, "Plant tidak valid") instead of a generic "Unknown Error" message
  • Four error categories handled separately: Not found, unauthorized, validation failure, and unexpected server errors each return the appropriate response so the approval UI can display the right feedback
⚙️ BackendWMS

Add missing plant codes for Warehouse 6 BL operations

  • 25 new plant codes registered: BL operations in Warehouse 6 (Banjarmasin) now accept plant codes covering major cities across Kalimantan and Sumatra, including Surabaya, Muara Enim, Samarinda, Aceh, Balikpapan, and others
  • BL inbound and outbound forms no longer reject valid plants: Previously, submitting a BL form with these plant codes for Warehouse 6 would fail with a validation error, blocking staff from completing their work

+55−3
🌐 WebProfile

Add loading spinners and smooth transitions to image previews

Image preview dialogs now show a loading spinner while photos load and fade in smoothly once ready, replacing the previous behavior where images would abruptly appear.

  • Loading spinner in image dialogs: A spinning indicator appears while activity photos and tracking images are loading, so users know content is on its way instead of staring at a blank space
  • Smooth fade-in animation: Images transition from transparent to fully visible over 300ms, giving a polished feel when opening or switching between photos
  • Adjacent image preloading: The next and previous activity images are silently loaded in the background while viewing one, so navigating between photos feels instant with no waiting

+1.8k−627
⚙️ BackendTMS

Reserve AWB numbers before shipment details are ready

A new AWB Booking workflow lets operations reserve AWB numbers upfront, before shipment details are available.

  • New "BOOKED" status — AWB numbers can be created in a reserved state, so agents and branches can claim numbers in advance without filling in recipient or shipment data.
  • Book by range — Specify a prefix, start number, and end number (e.g. LEN-001 to LEN-050) to bulk-reserve consecutive AWB numbers in one step. An option to use the system auto-sequence is also available.
  • Book via Excel upload — Upload a spreadsheet with AWB numbers and optional sender details. The system validates all rows before creating anything, so errors are caught early without partial data.
  • Automatic status upgrade — When a booked AWB is later edited and the required fields (recipient name, item count) are filled in, it automatically transitions from BOOKED to CREATED, ready for the normal workflow.
  • Clean printed output for bookings — Printed AWB documents for booked numbers show blank fields instead of placeholder dashes, so the printed shell is ready to be filled in by hand.
🌐 WebTMS

Add AWB number booking page with range and Excel upload modes

A new Booking AWB page gives users a streamlined interface to reserve AWB numbers in bulk.

  • Two input modes — Choose between Input Range for consecutive numbers (with optional prefix and live preview) or Upload Excel for non-consecutive or large batches. A downloadable template is provided for the upload flow.
  • Customer auto-fill — Selecting a customer automatically populates sender name, phone, and address, consistent with the existing AWB creation flow.
  • Validation before commit — The Excel upload mode validates the file first and shows per-row results, so users can fix errors before submitting.
  • BOOKED badge and filter — The AWB list now shows a distinct orange "BOOKED" badge, with a new status filter to quickly find all booked AWBs.
  • Edit and delete for booked AWBs — Booked AWBs can be edited and deleted directly from the list, and when enough data is filled in, the status automatically upgrades to CREATED.
  • Print support for booked AWBs — Booked AWBs can be printed with clean blank fields. Colly label printing is disabled until items are added.
🌐 WebTMS

Switch CMS articles and activities to paginated tables

The Articles and Activities management pages now use paginated tables instead of card grids, making them faster and easier to navigate when content grows.

  • Server-side pagination — Content loads page by page from the server instead of all at once, keeping the page responsive even with hundreds of entries.
  • Column sorting — Sort by title, status, or last modified date with a single click on the column header.
  • Instant search — Search results update as you type, with a short debounce to avoid unnecessary requests.

+439−291
⚙️ BackendTMS

Redesign manifest dispatch notification email

The notification email sent when a manifest is dispatched has been completely redesigned with a new layout that puts the most important information front and center.

  • Route hero at the top prominently shows the origin and destination, so recipients immediately know which shipment the email is about
  • A compact facts table groups key details like driver name, vehicle, dispatch time, and manifest number in a scannable two-column layout
  • A horizontal summary row displays total AWB count, weight, volume, and koli at a glance without scrolling
  • The AWB detail table now includes a bold TOTAL footer row so recipients can quickly verify shipment totals
  • The table is wrapped in a scrollable container for comfortable reading on mobile phones
  • Overall padding and spacing have been reduced throughout the email for a denser, more information-rich layout
  • The "View Manifest Detail" button now always links to the production OMS, ensuring email links work reliably regardless of which server sent the notification
🌐 WebProfile

News and activity pages now load progressively with preview placeholders

The News and Activity pages on the company website now show animated skeleton placeholders while content loads, giving visitors immediate visual feedback instead of a blank screen.

  • Pages display a grid of animated preview cards that mirror the final layout, so visitors know exactly what to expect while waiting
  • Content streams in progressively — articles and activities appear as soon as they're ready, making the site feel noticeably faster
  • Error and empty states are still handled gracefully with clear messages if something goes wrong

+765−50
⚙️ BackendTMS

Show origin-to-destination city in AWB exports

AWB export reports now include a Kota column that displays the origin branch city and destination regency (e.g., "Jakarta-Bandung"). City and regency names are automatically cleaned of prefixes like "Kota" and "Kabupaten" and formatted consistently for readability.

The previous "Desa Pickup" column has been renamed to Tujuan to better reflect the actual destination data being shown.

This applies to both individual AWB exports and bulk shipment status exports.

⚙️ BackendTMS

Split manifest export into organized multi-sheet workbook

Manifest exports now generate a single Excel workbook with three dedicated sheets instead of one flat table:

  • Data Manifest — summary of each manifest with driver, vehicle, branches, vendor cost, transport category, and dispatch/inbound dates.
  • Detail AWB — per-package breakdown linked to each manifest, including sender, recipient, weight, volume, item count, and value.
  • Biaya Perjalanan — travel cost items with sequence, description, and amount for each manifest.

Raw internal IDs have been removed from the export. Each manifest row now also shows the name of the user who last modified the record, making it easier to track changes across teams.

🌐 WebTMS

Filter shipment status by customer

The shipment status page now has a searchable customer dropdown, letting users narrow results to a specific customer without having to scroll through the full list.

The selected customer is saved to the URL, so filtered views can be bookmarked or shared with team members directly.

🌐 WebTMS

Fix filter restoration when navigating from dashboard

Clicking a dashboard card now reliably applies the correct filters on the target page across all six list pages: AWB, Shipment Status, Manage Booking, Manage Manifest, Manage DRS, and Inbound Booking.

Previously, filters passed via the dashboard link were sometimes ignored due to a timing mismatch between URL parsing and table rendering. This has been resolved with a consistent post-render reload pattern.


+118−118
⚙️ BackendTMS

Auto-fill shipment weight and dimensions on printed AWB documents

Printed AWB (Air Waybill) documents now display shipment weight, koli count, and volume directly from the system when those values are available. Previously, these fields were always left blank on the printed document, requiring staff to fill them in by hand for every shipment.

  • Weight (Kilo), package count (Koli), and volume are printed automatically when the shipment data has been recorded in the system
  • Fields that have no data remain blank for manual entry, so the existing workflow is preserved for incomplete shipments
  • This applies across all AWB document types: the main AWB, the AWB label, and the colly document
🌐 WebProfile

Update homepage headline and refine site typography

The LEN Logistics public profile website now carries updated branding on the homepage with improved text readability.

  • Homepage headline changed to "Your Trusted Logistics Partner" to better reflect the company's positioning
  • Body text now uses a more compact line spacing and tighter letter spacing for a cleaner reading experience
  • The site's body font has been unified under the Geist type family for visual consistency across all text elements

+327−180
⚙️ BackendTMS

Filter bulk shipment exports by customer

  • The bulk shipment status export now supports filtering by a specific customer, making it easier to pull exports for individual clients rather than the entire shipment list.
  • This filter works alongside existing options like AWB number, status, and date range, giving more control over what gets included in the exported spreadsheet.
⚙️ BackendTMS

Show clear error when username or email already exists

  • Creating a user with a username or email that is already registered now returns a specific "already in use" message instead of a generic server error.
  • This lets operators know exactly which field needs to be changed, reducing back-and-forth when setting up new accounts.
⚙️ BackendTMS

AWB totals automatically calculated from item details

  • When creating or updating an AWB, the total item count, weight, volume, and heaviest item are now automatically recalculated from the item list.
  • This prevents mismatches between the item breakdown and the AWB header totals, so shipment data stays consistent without manual adjustment.
🌐 WebTMS

Heaviest item weight displayed on AWB forms

  • The add and edit AWB forms now calculate and display the heaviest item weight based on the item list entered.
  • When editing an existing AWB, the heaviest item value is loaded from the saved data so it stays visible and accurate throughout the editing process.
🌐 WebProfile

Homepage redesigned with new hero section and refined layout

  • The homepage hero now features a full-viewport background image with a concise headline and direct call-to-action buttons for getting a quote or tracing a shipment.
  • A new company profile video section is placed prominently below the hero, giving visitors a quick visual overview of LEN Logistics operations.
  • Sections now use clearer visual separation with alternating backgrounds, and partner logos are presented in individual card containers for a cleaner look.
  • The trace page adjusts its layout height dynamically: it fills the full viewport when empty and compresses to show results immediately once a shipment is tracked.
  • Proof-of-delivery image viewer navigation buttons are now overlaid directly on the image for a more intuitive browsing experience.

+128−256
🌐 WebTMS

Keep search and filter settings when navigating between list and detail pages

Users who filter an AWB, Booking, Manifest, DRS, or Inbound list and then open a record will no longer lose their filters when going back. Previously, returning from a detail or edit page would reset the entire list, forcing users to re-enter search terms and re-apply every filter. Now the active filters are saved to the browser URL, so the list automatically reloads with the same view.

  • AWB list: search keyword, status, date range, period, and customer filters all survive when opening a shipment and coming back
  • Booking, Manifest, and DRS lists: the same filter persistence applies to these pages, covering search, status, period, and date range
  • Inbound list: search and status filters are preserved after viewing or editing an inbound document
  • All detail and edit pages across these modules now use the browser's back navigation, which naturally restores the filtered list view

+194−26
🌐 WebTMS

AWB list filters are now preserved when returning from detail, edit, or request-edit pages

Users who filter the AWB list (by search keyword, status, date range, period, or customer) will no longer lose their filters when they open a record and navigate back. Previously, clicking the back button from any AWB detail, edit, or request-edit page would reset all filters, forcing users to re-enter them every time.

The AWB list page now encodes its active filter state into the URL and passes it as a returnUrl parameter when navigating to detail or edit pages. When the user finishes viewing or editing and clicks back, the original filtered URL is restored, including all search terms, status selections, and date ranges. The returnUrl is validated against an allowlist to prevent open redirect vulnerabilities.

  • View AWB: back navigation restores the exact filtered list view the user came from
  • Edit AWB: after saving changes or canceling, the list reloads with the same filters
  • Request Edit AWB: same filter preservation applies when returning from the edit request flow
  • All filter parameters (search, status, customer, period, from, to) survive the round-trip

+8.8k−21.8k
⚙️ BackendWMS

Inbound staging upload now matches rows by Vendor and KategoriProdukMaterial

Fixed a data integrity issue in the inbound staging upload service where the UPDATE statement used to link staging rows to inbound_items did not include Vendor and KategoriProdukMaterial in its WHERE clause.

Previously, when two logical items shared the same SapMaterial, Plant, and Sloc but differed in KategoriProdukMaterial (for example, LINKTEL vs AVAGO), the last processed group would overwrite all matching rows. This left the first group's inbound items orphaned, with missing Category and DetailLocationNo values, causing inventory anomalies during allocation.

The fix captures the original display values of Vendor and KategoriProdukMaterial before they are overwritten with CDS codes, then includes them in the WHERE clause so each staging row is matched to the correct inbound item.

Detection and remediation SQL scripts are also included for identifying and fixing any affected historical data.

🌐 WebTMS

Modal forms now display validation errors via MudAlert

Improved the Create User modal and all entity edit modals to properly display client-side validation errors.

Previously, the generic <ValidationSummary> component rendered validation errors as an unstyled HTML list that was difficult to notice. The modal has been updated to collect all DataAnnotations and IValidatableObject validation results into a styled MudAlert error banner that appears at the top of the form when invalid input is detected.

Errors are now displayed prominently with red alert styling, making it immediately clear to users what needs to be corrected before the form can be submitted.

🌐 WebProfile

Profile website migrated from Vite to Next.js App Router

The LEN Logistics public-facing profile website has been rewritten from Vite/React to Next.js App Router.

Key changes in this migration:

  • App Router architecture: All page routes now live under the app/ directory with server-rendered entrypoints, including the homepage, news, activity, clients, contact, and trace pages.
  • Shared layout system: A single app/layout.tsx provides the site frame, with dedicated site-navbar and site-footer components inherited across all routes.
  • Component restructure: Shared UI components, utilities, and data-fetching logic have been reorganized into components/, lib/, types/, and hooks/ directories.
  • Updated tooling: Build configuration, linting, and formatting have been migrated to the Next.js ecosystem, including next.config.mjs, PostCSS config, and Prettier setup.
  • News and activity pages: New dedicated components for article cards, activity grids, and client page layouts with loading and not-found states.
  • CMS integration: Content fetching has been updated to work within the Next.js server component model.

All existing surfaces (marketing, news, activity, contact, clients, and trace) are preserved under the new architecture.


+2.6k−31
⚙️ BackendTMS

Fix AWB Print Showing Blank Quantity

AWB print was displaying a blank quantity value. The root cause was SanitizePublicTrackingMetrics incorrectly setting entity.Quantity = null for all callers including the print function. The fix removes that line so the actual shipment quantity is preserved during printing.

⚙️ BackendTMS

Scoped Customer Filter Endpoint for AWB List

Added a new API endpoint (GET /awb/customer-filter-options) that returns customer options for the AWB list dropdown. The list is automatically scoped to each TMS operator's assigned customers through CustomerScopeResolver. Restricted operators with no assigned customers receive an empty list, while unrestricted operators see all active customers.

⚙️ BackendTMS

CMS Activities Management API

Added a complete backend module for managing company activities (news, events) for public listing on the website. Includes:

  • Full CRUD endpoints with draft/publish workflow
  • Image upload via Azure Blob Storage with format validation
  • Public paginated endpoint for published activities (no auth required)
  • New SQL table erp_cms.Activities with status and publish date tracking
  • Role-based permissions for View, Search, Create, Update, and Delete
🌐 WebTMS

AWB Customer Filter & User Form Validation

Added a searchable customer filter dropdown to the AWB list page. The filter persists across navigation via URL query parameters and applies to both search results and Excel exports. The customer list is fetched from the new scoped endpoint, so operators only see their assigned customers. Also added client-side validation hints to the user creation form, showing requirements for username (min. 6 characters, no spaces) and password (min. 6 characters, no spaces) before the form is submitted.

🌐 WebTMS

CMS Activities Management Module

CMS Activities Management Module

Added a full activities management section to the CMS admin panel. Admins can create, edit, view, publish, and unpublish activities with image uploads. Features include:

  • Activity list page with search and status filtering (Draft/Published)
  • Dedicated create and edit pages with image upload support
  • Publish and unpublish workflow for content control
  • Activity detail view page
  • Activities entry in the CMS navigation menu with permission-based visibility

+2.4k−249
⚙️ BackendApproval

BL Outbound Lifecycle Monitoring API

  • Added new MonitoringController with a GET /api/monitoring/bl-outbound/lifecycle endpoint that returns a paginated list of BL outbound forms with lifecycle summaries per moda (Booking, AWB, Manifest, DRS status at a glance).
  • Added a detail endpoint GET /api/bl-outbound-forms/{id}/lifecycle that returns the full lifecycle chain for a single form, including per-moda AWB records, manifest dispatch info, DRS data, and status history for each stage.
  • Extended the ERP integration layer (ErpLenApiService and ErpBookingIntegrationService) to fetch and aggregate AWB, Manifest, DRS, and status history data from TMS, mapping everything into structured lifecycle DTOs.
  • Added caching support so the monitoring list avoids live ERP calls per row, instead reading pre-synced status fields from erp_booking_links.
  • Fixed a startup crash where background workers (EmailSendWorker, ErpBookingStatusSyncJob) were incorrectly registered as scoped services by the convention-based DI auto-registration.
  • Bumped API version to 1.5.0.
🌐 WebApproval

BL Outbound Lifecycle Monitoring Dashboard

BL Outbound Lifecycle Monitoring Dashboard
  • Added a new Monitoring section in the navigation menu with a list view and detail page for tracking BL outbound form lifecycles.
  • The list page displays outbound forms in a table with columns for outbound number, date, status, requester, per-moda sync summaries (Booking/AWB/Manifest/DRS status badges), and last sync time. Includes filters for date range, moda, stage, status, and free-text search, with pagination.
  • The detail page shows the full form summary and an accordion per moda containing sync status, ERP booking ID, booking status history timeline, AWB records table, manifest info, and DRS details.
  • Added the lifecycle API service and response models to connect the frontend to the new backend endpoints.
  • Fixed an auth bug where a failed token refresh would cause an infinite loop calling /api/auth/revoke. Now it clears the local auth state once and stops.
  • Centralized status severity/tag color mapping into a shared utility so monitoring screens and the existing BL Outbound tracking section use consistent styling.
  • Bumped UI version to 1.3.0.