KoderKoder.ai
Bảng giáDoanh nghiệpGiáo dụcDành cho nhà đầu tư
Đăng nhậpBắt đầu

Sản phẩm

Bảng giáDoanh nghiệpDành cho nhà đầu tư

Tài nguyên

Liên hệHỗ trợGiáo dụcBlog

Pháp lý

Chính sách bảo mậtĐiều khoản sử dụngBảo mậtChính sách sử dụng chấp nhận đượcBáo cáo vi phạm

Mạng xã hội

LinkedInTwitter
Koder.ai
Ngôn ngữ

© 2026 Koder.ai. Bảo lưu mọi quyền.

Trang chủ›Blog›Xây dựng ứng dụng web để quản lý bảng giá nhà cung cấp và hợp đồng
29 thg 11, 2025·8 phút

Xây dựng ứng dụng web để quản lý bảng giá nhà cung cấp và hợp đồng

Kế hoạch từng bước để xây ứng dụng web quản lý bảng giá nhà cung cấp và hợp đồng: nhập file, phê duyệt, gia hạn, lịch sử kiểm toán và phân quyền an toàn.

Xây dựng ứng dụng web để quản lý bảng giá nhà cung cấp và hợp đồng

Ứng dụng cần giải quyết gì (và cho ai)

Hầu hết sự lộn xộn về giá và hợp đồng nhà cung cấp đều tương tự: bảng giá nằm trong file Excel gửi qua email, các PDF “final_FINAL” nằm trong ổ chia sẻ, và không ai chắc chắn điều khoản nào đang hiệu lực. Hệ quả là dễ đoán—giá cũ được dùng để đặt hàng, tranh chấp có thể tránh được với nhà cung cấp, và các gia hạn bị bỏ sót.

Vấn đề kinh doanh cần khắc phục

Một ứng dụng web tốt nên tập trung nguồn dữ liệu cho bảng giá nhà cung cấp và hợp đồng, đồng thời làm cho mọi thay đổi có thể truy vết từ đầu đến cuối. Nó nên giảm thiểu:

  • Sao chép thủ công giữa nhiều bảng tính, ERP và hộp thư
  • Lỗi giá do dùng phiên bản lỗi thời
  • Bỏ sót gia hạn và thời hạn báo trước
  • Thời gian tìm kiếm tài liệu ký/phiên bản sửa đổi mới nhất

Ứng dụng dành cho ai

Thiết kế hệ thống quanh những người tiếp xúc giá và điều khoản hàng tuần:

  • Procurement: nhập bảng giá, đàm phán cập nhật, theo dõi ngày có hiệu lực
  • Finance/AP: kiểm tra giá hóa đơn, tiền tệ, đơn vị, thuế/phí
  • Legal/Compliance: lưu hợp đồng đã ký, phụ lục, điều khoản bắt buộc
  • Approvers (ban quản lý): xem xét và phê duyệt thay đổi giá/điều khoản
  • Admins: quản lý người dùng, vai trò, dữ liệu chủ nhà cung cấp, mẫu

Chỉ số thành công để biết hệ thống hoạt động

Chọn vài mục tiêu định lượng ngay từ đầu:

  • Thời gian công bố cập nhật giá (ví dụ từ 2 ngày xuống 2 giờ)
  • Tỷ lệ lỗi nhập và số lần sửa tay sau mỗi upload
  • Tỷ lệ gửi nhắc gia hạn đúng hạn (ví dụ % hợp đồng có cảnh báo trước deadline)
  • Tỷ lệ chênh lệch giá (mismatch hóa đơn/PO liên quan đến giá có hiệu lực)

"Hoàn thành" nghĩa là gì: bản phát hành đầu tiên vs sau này

Bản phát hành đầu tiên nên hướng tới hồ sơ nhà cung cấp tập trung, nhập bảng giá với xác thực, lưu hợp đồng với ngày quan trọng, phê duyệt cơ bản, tìm kiếm và lịch sử kiểm toán.

Các lần lặp sau có thể thêm tích hợp ERP sâu hơn, thư viện điều khoản, đối sánh hóa đơn tự động, tổ chức đa đơn vị và dashboard báo cáo nâng cao.

Yêu cầu và ánh xạ luồng công việc

Trước khi vẽ màn hình hay bảng, hãy mô tả chính xác quy trình từ khi nhà cung cấp gửi bảng giá đến khi ai đó đặt hàng theo giá đó. Điều này ngăn bạn xây một “kho tài liệu” chung khi thực tế cần một hệ thống quản lý giá có kiểm soát.

Vẽ sơ đồ luồng hiện tại (as-is)

Bắt đầu bằng cách làm ví dụ thực tế với procurement, finance và legal. Ghi lại các bàn giao và artefact ở mỗi bước:

  • Nhận bảng giá (email, portal, spreadsheet, EDI) → ghi nhận ngày nhận và nguồn
  • Xem xét và đàm phán → ghi câu hỏi, counter-offer và thay đổi đã đồng ý
  • Phê duyệt giá và điều khoản → xác định điểm quyết định và chữ ký cần thiết
  • Ký và lưu tài liệu hợp đồng → liên kết điều khoản với bảng giá có hiệu lực
  • Vận hành và gia hạn → theo dõi hết hạn, thay đổi giá và ngoại lệ

Một sơ đồ swimlane đơn giản (Supplier → Buyer/Procurement → Legal → Finance → Operations) thường là đủ.

Xác định quyết định chính và vai trò (ai làm gì)

Liệt kê các quyết định ảnh hưởng đến kết quả kinh doanh và gán chủ sở hữu rõ ràng:

  • Ai được phê duyệt bảng giá mới so với phụ lục hợp đồng?
  • Ai được chỉnh các trường giá (tiền tệ, đơn vị, MOQ, thời gian dẫn), ai chỉ được yêu cầu thay đổi?
  • Ai được xem điều khoản nhạy cảm (điều khoản thanh toán, điều khoản trách nhiệm), ai bị giới hạn?

Ghi chú nơi phê duyệt khác nhau theo ngưỡng (ví dụ >5% cần phê duyệt finance) để sau này mã hoá các quy tắc đó.

Định nghĩa đầu ra cần thiết (mục tiêu người dùng)

Ghi rõ các câu hỏi ứng dụng phải trả lời ngay từ ngày đầu:

  • “Giá hiện tại cho sản phẩm X từ nhà cung cấp Y, có hiệu lực hôm nay là bao nhiêu?”
  • “Hợp đồng nào sẽ hết hạn trong 60/90 ngày tới, và ai phụ trách gia hạn?”
  • “Chúng ta có ngoại lệ ở đâu: giá đã hết hiệu lực vẫn bị dùng, thiếu MOQ, mismatch tiền tệ?”

Những đầu ra này phải dẫn dắt các trường dữ liệu, tìm kiếm và báo cáo — không phải ngược lại.

Ghi lại điểm đau và trường hợp biên sớm

Dữ liệu procurement lộn xộn. Hãy tài liệu hoá rõ các ngoại lệ phổ biến:

  • Cập nhật từng phần (nhà cung cấp cập nhật 20 SKU, không phải toàn bộ catalog)
  • Nhiều tiền tệ và giả định FX
  • MOQ, kích thước đóng gói, đơn vị (cái vs thùng) và quy tắc làm tròn
  • Ngày hiệu lực chồng chéo hoặc sửa lỗi ghi ngày trước

Xem danh sách này như tiêu chí chấp nhận cho import và phê duyệt, để hệ thống hỗ trợ thực tế thay vì ép buộc giải pháp tạm.

Kiến trúc tổng quan và phân chia module

Kiến trúc tốt cho bảng giá và hợp đồng không phải là các pattern thịnh hành mà là giảm bớt chi phí phối hợp đồng thời giữ khả năng mở rộng.

Cách tiếp cận xây dựng: bắt đầu đơn giản, phát triển có chủ đích

Với hầu hết đội (1–6 engineer), điểm khởi đầu tốt nhất là một modular monolith: một ứng dụng deployable với các module và ranh giới rõ ràng. Bạn được phát triển nhanh hơn, debug đơn giản hơn và ít phần vận hành hơn.

Chỉ tách service khi có lý do rõ ràng — ví dụ tải nhập lớn cần scale độc lập, nhiều đội làm song song, hoặc yêu cầu cô lập tuyệt đối. Con đường thường thấy: modular monolith → tách import/processing và document workloads vào các background worker → tuỳ chọn tách các domain lưu lượng cao ra service.

Nếu muốn đẩy nhanh prototype đầu (màn hình, luồng, phân quyền) mà không cam kết chu kỳ xây dựng dài, một nền tảng vibe-coding như Koder.ai có thể giúp tạo baseline React + Go + PostgreSQL từ một spec chat có cấu trúc, rồi lặp nhanh trên import, phê duyệt và lịch sử kiểm toán. Với đội procurement, điều này thường có nghĩa là xác thực luồng với người dùng thực sớm—trước khi bạn xây quá nhiều.

Module cốt lõi (tập tối thiểu dễ hiểu)

Thiết kế ứng dụng quanh vài domain ổn định:

  • Suppliers: hồ sơ nhà cung cấp, liên hệ, định danh, trạng thái
  • Catalog (Items/Materials): danh mục hàng nội bộ và mapping tới mã nhà cung cấp
  • Price Lists: header (nhà cung cấp, khoảng hiệu lực) và dòng (giá, đơn vị, tiền tệ), cùng lịch sử import
  • Contracts: hồ sơ hợp đồng, liên kết nhà cung cấp, các mục/loại được che phủ, ngày chính và tài liệu liên quan
  • Approvals & Governance: bước xem xét, ký duyệt, bình luận và lịch sử quyết định
  • Reporting: tìm kiếm, xuất, views về chi tiêu/giá và snapshot vận hành

Giữ mỗi module chịu trách nhiệm cho luật và truy cập dữ liệu của nó. Ngay cả trong monolith, thực thi ranh giới trong code (packages, đặt tên và API rõ ràng giữa các module).

Lập kế hoạch tích hợp sớm (dù không xây ngay)

Tích hợp thay đổi luồng dữ liệu, nên để điểm mở rộng rõ ràng:

  • SSO (SAML/OIDC) cho xác thực và provision user
  • ERP/finance cho vendor ID, item master và đẩy giá đã phê duyệt
  • Email/calendar cho nhắc gia hạn và thông báo phê duyệt
  • Document signing (tuỳ chọn) để hoàn tất phụ lục và hợp đồng mới

Yêu cầu phi chức năng (đặt mục tiêu trước khi release)

Định nghĩa kỳ vọng đo lường trước:

  • Hiệu năng: tìm kiếm phổ biến <2 seconds; import xử lý bất đồng bộ với hiển thị tiến độ
  • Khả dụng: mục tiêu uptime rõ ràng và lịch bảo trì dự kiến
  • Sao lưu & phục hồi: backup tự động, drill restore và retention phù hợp chính sách
  • Auditability: lịch sử bất biến cho import, phê duyệt và thay đổi hợp đồng, ghi lại user và timestamp

Mô hình dữ liệu: thực thể, quan hệ và versioning

Mô hình dữ liệu rõ ràng là thứ giữ một app procurement đáng tin cậy. Khi người dùng hỏi “Giá nào hợp lệ vào ngày 3 tháng 3?” hay “Hợp đồng nào điều chỉnh mua đó?”, database phải trả lời không mơ hồ.

Thực thể cốt lõi (tối thiểu cần có)

Bắt đầu với một bộ nhỏ các record xác định:

  • Supplier: tài khoản nhà cung cấp (tên, mã nhà cung cấp, trạng thái, tiền tệ mặc định, điều khoản thanh toán)
  • Contact: người liên hệ tại nhà cung cấp (nhiều contact / supplier)
  • Item/SKU: thứ bạn mua (mã, mô tả, danh mục, đơn vị đo)
  • PriceList: bảng giá do nhà cung cấp cung cấp hoặc lịch trình thương lượng (tên, ngày hiệu lực, tiền tệ, nguồn file, trạng thái)
  • PriceLine: dòng giá trong bảng (item, đơn giá, break/MOQ nếu có, cờ thuế)
  • Contract: thỏa thuận thương mại (số hợp đồng, nhà cung cấp, ngày bắt đầu/kết thúc, thiết lập gia hạn, trạng thái)
  • Term: điều khoản có cấu trúc (thời gian dẫn, bảo hành, giao hàng, SLA) bạn muốn tìm kiếm/báo cáo

Quan hệ giữ mọi thứ liên kết

Mô hình quan hệ phản ánh cách buyer làm việc:

  • Supplier → Contracts: một supplier có thể có nhiều hợp đồng
  • Supplier → PriceLists: một supplier có thể cung cấp nhiều bảng giá theo thời gian
  • Contract → PriceLists (tuỳ chọn nhưng hữu ích): liên kết hợp đồng tới bảng giá mà nó điều chỉnh
  • Item/SKU → PriceLines: một item có thể xuất hiện trong nhiều price line (qua nhà cung cấp, tiền tệ, ngày hiệu lực)

Nếu hỗ trợ nhiều địa điểm giao hàng hay đơn vị kinh doanh, cân nhắc thêm khái niệm Scope (ví dụ công ty, site, vùng) gắn vào hợp đồng và bảng giá.

Versioning: đừng ghi đè lịch sử

Tránh chỉnh sửa bản live tại chỗ. Thay vào đó:

  • Phiên bản bảng giá: mỗi import tạo một phiên bản PriceList mới (hoặc một record PriceList mới với ID “gia đình”). Giữ các phiên bản trước ở chế độ chỉ đọc.
  • Phụ lục hợp đồng: lưu mỗi phụ lục như một phiên bản mới với ngày có hiệu lực và tài liệu liên quan. View “hợp đồng hiện tại” là phiên bản phê duyệt mới nhất.

Điều này giúp trả lời câu hỏi audit dễ dàng: bạn có thể tái dựng những gì đã được phê duyệt khi nào và thay đổi những gì.

Dữ liệu tham chiếu và quy tắc duy nhất

Giữ dữ liệu tham chiếu trong bảng riêng để tránh text tự do lộn xộn:

  • Currency, Unit of Measure, Tax Code, và (nếu xuất khẩu) Incoterms

Thực thi identifier để tránh trùng âm thầm:

  • Supplier code duy nhất trong hệ thống
  • Item code duy nhất (hoặc duy nhất theo catalog/nguồn)
  • Contract number duy nhất theo nhà cung cấp (hoặc toàn cục—chọn và thực thi nhất quán)

Nhập bảng giá: mẫu, xác thực và xử lý lỗi

Bảng giá thường đến trong spreadsheet không dành cho máy. Một luồng import mượt mà là khác biệt giữa “chúng tôi sẽ dùng app” và “chúng tôi tiếp tục gửi Excel qua email.” Mục tiêu: cho phép upload dễ chịu, nhưng dữ liệu lưu phải nghiêm ngặt.

Định dạng hỗ trợ và mẫu tải xuống

Hỗ trợ CSV và XLSX từ ngày đầu. CSV tốt cho xuất từ ERP và BI; XLSX là thứ nhà cung cấp thường gửi.

Cung cấp mẫu tải xuống phản ánh mô hình dữ liệu (giảm nhầm lẫn). Bao gồm:

  • Dòng đầu chứa tên cột chính xác
  • Một hàng ví dụ với giá trị hợp lệ (tiền tệ, đơn vị, ngày)
  • Một sheet “notes” tùy chọn (cho XLSX) giải thích từng cột

Phiên bản hóa mẫu (ví dụ: Template v1, v2) để có thể thay đổi mà không phá vỡ quy trình hiện tại.

Quy tắc mapping: cột bắt buộc vs tuỳ chọn

Xác định mapping rõ ràng và hiển thị trong UI khi upload.

Cách làm phổ biến:

  • Cột bắt buộc: định danh supplier, item/SKU, price, currency, unit of measure, effective start date
  • Cột tuỳ chọn: effective end date, minimum order quantity, lead time, packaging, incoterms, comments
  • Giá trị mặc định (theo supplier hoặc theo upload): tiền tệ, đơn vị, start date mặc định là “hôm nay”, end date để trống

Nếu cho phép cột tuỳ chỉnh, lưu chúng như metadata để không làm lẫn vào schema giá lõi.

Quy tắc xác thực ngăn dữ liệu xấu

Chạy xác thực trước khi commit:

  • Định dạng số: từ chối ô giá không phải số; chuẩn hoá dấu phân cách hàng nghìn; bắt giá >=0
  • Mã tiền tệ: xác thực theo ISO 4217 (ví dụ: USD, EUR)
  • Khoảng ngày: bắt start date; end date phải sau start date; ngăn chặn chồng chéo hiệu lực nếu quy tắc yêu cầu độc quyền
  • Hàng trùng: phát hiện khoá trùng (ví dụ supplier + SKU + start date + currency + unit). Quyết định lỗi hay “lấy hàng cuối cùng” (lỗi an toàn hơn)

Thực hiện cả xác thực cấp hàng (hàng này sai) và cấp file (upload này xung đột với record hiện có).

Xử lý lỗi: xem trước, phản hồi theo hàng và upload lại

Một trải nghiệm import tốt là: Upload → Preview → Fix → Confirm.

Ở màn hình preview:

  • Hiển thị bảng với ô được đánh dấu và thông báo rõ ràng (ví dụ “Invalid currency code: US$”)
  • Cho phép người dùng tải báo cáo lỗi error report (CSV) kèm cột “error” bổ sung
  • Cung cấp luồng sửa và upload lại giữ lại lựa chọn mapping từ lần trước

Tránh “fail toàn bộ file vì một hàng”. Thay vào đó, cho người dùng chọn: chỉ nhập các hàng hợp lệ hoặc chặn cho đến khi sửa hết lỗi, tuỳ governance.

Lưu file thô để truy vết

Để kiểm toán và xử lý lại dễ dàng, lưu:

  • File gốc (exact bytes), với checksum và thông tin người tải lên
  • Các hàng đã parse và kết quả xác thực (bao gồm lỗi)
  • Cấu hình import (phiên bản template, mapping cột, giá trị mặc định)

Điều này tạo đường dẫn chứng minh cho tranh chấp (“chúng ta đã nhập gì và khi nào?”) và cho phép xử lý lại khi quy tắc xác thực thay đổi.

Hồ sơ hợp đồng: điều khoản, tài liệu và phụ lục

Lập kế hoạch trước, xây nhanh hơn
Dùng chế độ lập kế hoạch để xác định chính xác quy trình nhập dữ liệu, phê duyệt và theo dõi lịch sử trước khi thiết kế giao diện.
Thử chế độ lập kế hoạch

Một record hợp đồng nên hơn cả kho tài liệu. Nó cần đủ dữ liệu cấu trúc để điều khiển gia hạn, phê duyệt và báo cáo—trong khi vẫn giữ tài liệu ký dễ tìm.

Điều khoản hợp đồng cốt lõi (trường có cấu trúc)

Bắt đầu với các trường trả lời câu hỏi procurement nhận hàng tuần:

  • Ngày bắt đầu và kết thúc hợp đồng
  • Loại gia hạn (tự động gia hạn, thời hạn cố định, evergreen) và độ dài gia hạn
  • Thời hạn báo trước (ví dụ “60 ngày trước ngày kết thúc”) và ai phải được thông báo
  • Điều khoản thanh toán (Net 30/45/60, chiết khấu thanh toán sớm) và quy tắc lập hóa đơn
  • Chủ hợp đồng, contact nhà cung cấp và stakeholders nội bộ

Giữ trường text tự do cho trường hợp biên, nhưng chuẩn hoá mọi thứ bạn sẽ lọc, gom nhóm hoặc cảnh báo.

Tài liệu, tệp đính kèm và lưu trữ

Xử lý tài liệu như thực thể liên kết tới hợp đồng:

  • Hợp đồng đã ký (PDF)
  • Phụ lục/appendix
  • Statement of work, rate card, chứng chỉ bảo hiểm, tài liệu tuân thủ

Lưu metadata cho mỗi file: loại tài liệu, ngày hiệu lực, phiên bản, người tải lên và mức độ bảo mật. Nếu tổ chức có yêu cầu lưu trữ, thêm trường “retention until” và “legal hold” để app ngăn xóa và hỗ trợ kiểm toán.

Phụ lục và theo dõi điều khoản

Phụ lục không nên ghi đè lịch sử. Mô hình hoá chúng như các thay đổi có ngày: mở rộng điều khoản (ngày kết thúc mới), điều chỉnh điều khoản thương mại, hoặc thêm/bớt phạm vi.

Nếu có thể, thu các điều khoản chính dưới dạng dữ liệu có cấu trúc để cảnh báo và báo cáo—ví dụ: termination for convenience (Y/N), công thức indexing, service credits, giới hạn trách nhiệm, và tính độc quyền.

Một hợp đồng, nhiều nhà cung cấp hoặc site

Nếu mua tập trung mà vận hành đa site, hỗ trợ liên kết một hợp đồng tới nhiều site/đơn vị kinh doanh, với tuỳ chọn override ở cấp site (ví dụ địa chỉ thanh toán, điều khoản giao hàng). Tương tự, cho phép một hợp đồng che phủ công ty mẹ và các công ty con, nhưng vẫn giữ “bên ký” rõ ràng cho mục tuân thủ.

Luồng phê duyệt và quản trị

Phê duyệt là nơi bảng giá và hợp đồng trở nên có thể giải trình. Một luồng rõ ràng giảm tranh cãi “ai đã duyệt cái này?” và tạo đường đi có thể lặp từ nhà cung cấp gửi đến dữ liệu dùng được.

Luồng trạng thái (giữ rõ ràng)

Dùng lifecycle đơn giản, hiển thị cho cả bảng giá và hợp đồng:

Draft → Review → Approved → Active → Expired/Terminated

  • Draft: người tạo có thể sửa; không được dùng để mua
  • Review: khoá chỉnh sửa trừ khi có yêu cầu thay đổi; reviewer kiểm tra đầy đủ và phù hợp chính sách
  • Approved: quyết định được ghi; sẵn sàng được kích hoạt theo ngày
  • Active: có hiệu lực cho đặt hàng; thay đổi đòi hỏi phiên bản và phê duyệt mới
  • Expired/Terminated: chỉ đọc; lưu cho báo cáo/kiểm toán

Vai trò và trách nhiệm

Định nghĩa trách nhiệm trong app (không để trong tribal knowledge):

  • Submitter (Procurement/Supplier manager): tải bảng giá, soạn điều khoản, trả lời comment review
  • Reviewer (Category/Finance): kiểm tra giá, đơn vị, tiền tệ, phù hợp thương mại
  • Approver (Budget owner): quyết định cuối cùng với tác động thương mại
  • Legal: reviewer/approver bắt buộc cho ngôn ngữ hợp đồng, tài liệu và phụ lục
  • Admin: cấu hình ngưỡng, luật định tuyến, quản lý quyền—thường không phê duyệt nội dung kinh doanh mặc định

Quy tắc cho thay đổi giá (ngăn tăng chi phí lặng lẽ)

Thêm kiểm tra theo chính sách tự động kích hoạt bước phê duyệt thêm:

  • Phê duyệt theo ngưỡng: ví dụ nếu tăng >5% trên bất kỳ dòng nào hoặc ảnh hưởng tổng chi tiêu > $10,000, chuyển lên approver cao hơn
  • Định tuyến theo danh mục: nhóm chiến lược (IT, logistics) luôn cần legal + budget owner
  • Xử lý ngoại lệ: cho phép override chỉ khi có lý do bắt buộc và tài liệu đính kèm

Quyết định sẵn sàng cho kiểm toán: comment, lý do và bằng chứng

Mỗi phê duyệt/từ chối cần ghi:

  • quyết định (approve/reject/request changes)
  • mã lý do + giải thích tự do
  • timestamp, actor và phiên bản ảnh hưởng
  • bằng chứng liên kết (PDF email, thư nhà cung cấp, biên bản họp)

Kéo dài, timeout và trách nhiệm

Đặt SLA để tránh phê duyệt bị treo:

  • nhắc tự động sau 24/48 giờ
  • escalate tới approver dự phòng sau timeout
  • hiển thị trong “My pending approvals” và báo cáo quá hạn

Quản trị hiệu quả nhất khi nhúng vào luồng công việc—không phải áp đặt sau.

Trải nghiệm người dùng: màn hình, tìm kiếm và báo cáo

Giữ quyền kiểm soát qua việc xuất mã
Sở hữu toàn bộ mã nguồn cho ứng dụng React, Go và PostgreSQL khi bạn đã sẵn sàng.
Xuất mã

Ứng dụng procurement thành công hay thất bại dựa trên tốc độ trả lời các câu hỏi đơn giản: “Giá hiện tại là bao nhiêu?”, “Hợp đồng nào điều chỉnh mục này?”, “Đã thay đổi gì kể từ quý trước?” Thiết kế UI quanh các luồng đó, không phải quanh bảng dữ liệu.

Tìm thông tin nhanh: tìm kiếm và bộ lọc

Cung cấp hai điểm vào chính trong navigation:

  • Tìm kiếm nhà cung cấp (tên, mã thuế/vendor code, trạng thái, danh mục)
  • Tìm kiếm mặt hàng (SKU/part number, mô tả, nhà sản xuất, đơn vị)

Ở trang kết quả, dùng bộ lọc hợp đồng phù hợp công việc thực: ngày hiệu lực, trạng thái hợp đồng (draft/active/expired), đơn vị kinh doanh, tiền tệ, và “có phê duyệt đang chờ”. Giữ bộ lọc hiển thị và có thể xoá như chips để người không chuyên cảm thấy thoải mái.

Màn hình chính cần thiết thiết kế trước

Hồ sơ nhà cung cấp là hub: hợp đồng đang hoạt động, bảng giá mới nhất, tranh chấp/ghi chú mở và panel “hoạt động gần đây”.

View hợp đồng trả lời “Chúng ta được phép mua gì, theo điều khoản nào, đến khi nào?” Hiển thị điều khoản chính (incoterms, điều khoản thanh toán), tài liệu đính kèm và timeline phụ lục.

So sánh bảng giá là nơi người dùng dành thời gian. Hiển thị hiện tại vs trước song song với:

  • Ngày hiệu lực (và giá “tương lai”)
  • Delta theo item (tuyệt đối và %)
  • Đánh dấu mục mới/bị xoá

Báo cáo và xuất

Báo cáo nên mang tính hành động, không chỉ trang trí: “sắp hết hạn trong 60 ngày”, “tăng giá lớn nhất”, “mặt hàng có nhiều giá đang hoạt động”. Cung cấp xuất nhanh sang CSV cho finance và PDF để chia sẻ/phê duyệt, với cùng bộ lọc để dữ liệu xuất khớp với màn hình.

Giữ giao diện đơn giản và dễ hiểu

Dùng nhãn rõ ràng (“Effective date”, không phải “Validity start”), trợ giúp inline cho trường khó (đơn vị, tiền tệ), và trạng thái rỗng giải thích bước tiếp theo (“Import một bảng giá để bắt đầu theo dõi thay đổi”). Một checklist onboarding ngắn ở /help có thể giảm thời gian đào tạo.

Bảo mật, quyền truy cập và lịch sử kiểm toán

Bảo mật dễ thực hiện khi được thiết kế vào luồng công việc, không phải gắn thêm sau. Mục tiêu: người dùng thấy/chỉnh đúng phần họ chịu trách nhiệm, và mọi thay đổi quan trọng đều có thể truy vết.

Vai trò và quyền (nguyên tắc ít quyền nhất)

Bắt đầu với mô hình vai trò nhỏ, rõ ràng và gán quyền theo hành động, không chỉ theo màn hình:

  • Viewer: đọc-only các bảng giá đã phê duyệt và hợp đồng đang hoạt động
  • Editor: tạo draft, tải tài liệu, chuẩn bị import, sửa lỗi xác thực
  • Approver: phê duyệt/từ chối draft, khoá ngày hiệu lực, ký phụ lục
  • Admin: quản lý user, vai trò, dữ liệu tham chiếu và cài đặt hệ thống

Quyền phải được thực thi ở server cho mọi endpoint (UI không đủ). Nếu tổ chức phức tạp, thêm quyền theo scope (theo supplier, business unit, region).

Xử lý dữ liệu nhạy cảm

Quyết định sớm dữ liệu nào cần bảo vệ thêm:

  • Tệp hợp đồng (PDF, scan): mã hoá khi lưu, giới hạn tải xuống, tuỳ chọn watermark
  • Chi tiết ngân hàng: lưu ở khu vực riêng, hạn chế cho vai trò finance hẹp
  • Hiển thị giá: cân nhắc ẩn margin hoặc giá đặc biệt khỏi khán giả rộng; hỗ trợ view “nội bộ vs nhà cung cấp” nếu cần

Lịch sử kiểm toán: ai thay đổi gì và như thế nào

Ghi lại audit immutable cho các thực thể chính (hợp đồng, điều khoản, item giá, phê duyệt): ai, thay đổi gì (trước/sau), khi nào, và nguồn (UI/import/API). Ghi tên file import và số hàng để dễ truy vết và sửa lỗi.

Xác thực và session cơ bản

Chọn một phương thức đăng nhập chính:

  • SSO (SAML/OIDC) cho user doanh nghiệp, hoặc mật khẩu + MFA cho đội nhỏ

Thêm điều khiển session hợp lý: token ngắn hạn, cookie an toàn, timeout không hoạt động và yêu cầu đăng nhập lại cho hành động nhạy cảm (ví dụ xuất báo giá).

Yêu cầu tuân thủ cơ bản (không hứa quá mức)

Hướng tới kiểm soát thực tế: least privilege, logging tập trung, backup định kỳ và drill restore. Xem nhật ký kiểm toán như hồ sơ doanh nghiệp— giới hạn xóa và định nghĩa chính sách retention.

Quy tắc giá: ngày hiệu lực, tiền tệ và đơn vị

Giá hiếm khi là “một con số”. Ứng dụng cần quy tắc rõ ràng để buyer, AP và nhà cung cấp đều có cùng câu trả lời: hôm nay giá cho mục này là bao nhiêu?

Ngày hiệu lực (start/end, giá tương lai, chồng chéo)

Lưu giá dưới dạng record có khoảng thời gian với start date và end date tuỳ chọn. Cho phép dòng có ngày hiệu lực tương lai (ví dụ tăng vào quý sau), và định nghĩa rõ “mở” (thường là: hợp lệ cho tới khi thay thế).

Chồng chéo nên xử lý có chủ ý:

  • Từ chối chồng chéo mặc định khi import (tốt cho governance)
  • Cho phép với thứ tự ưu tiên khi cần (ví dụ giá khuyến mãi), nhưng yêu cầu lý do và phê duyệt

Quy tắc thực tế: một giá cơ bản đang hoạt động cho mỗi supplier-item-currency-unit tại cùng một thời điểm; mọi thứ khác phải được đánh dấu rõ như override.

Định nghĩa “giá hiện tại”

Khi có nhiều ứng viên, định nghĩa thứ tự lựa chọn, ví dụ:

  1. Giá nằm trong hợp đồng (nếu hợp đồng active và item nằm trong scope)
  2. Override đã phê duyệt (promo/exception) trong khoảng date
  3. Bảng giá nhà cung cấp đã được phê duyệt trong khoảng date
  4. Fallback hoặc trạng thái “không có giá” (yêu cầu hành động người dùng)

Nếu có supplier ưu tiên, thêm trường supplier priority dùng khi có nhiều supplier hợp lệ cho cùng item.

Chiến lược đa tiền tệ

Chọn lưu:

  • Tỷ giá lưu trên mỗi record giá (tốt cho truy vết; tái tạo quyết định lịch sử)
  • Quy đổi theo thời gian thực (hữu ích cho dashboard; vẫn lưu tiền tệ gốc)

Nhiều đội làm cả hai: giữ giá nhà cung cấp theo tiền tệ gốc, cộng giá trị đã quy đổi “as-of” cho báo cáo.

Làm tròn và quy đổi đơn vị

Định nghĩa chuẩn hoá đơn vị (ví dụ each vs case vs kg) và giữ hệ số quy đổi có phiên bản. Áp dụng quy tắc làm tròn nhất quán (số thập phân tiền tệ, bước giá tối thiểu), và rõ ràng khi nào làm tròn xảy ra: sau quy đổi đơn vị, sau quy đổi FX, hay tại tổng dòng cuối cùng.

Gia hạn, cảnh báo và dashboard vận hành

Tạo nguyên mẫu quy trình mua sắm
Tạo một nền tảng cơ bản với nhà cung cấp, hợp đồng và quản lý phiên bản bảng giá, rồi lặp với người dùng.
Tạo ứng dụng

Gia hạn là nơi giá trị hợp đồng được bảo vệ hoặc mất đi: bỏ lỡ deadline báo trước, tự động gia hạn không mong muốn, và đàm phán gấp thường dẫn đến điều khoản bất lợi. Ứng dụng nên coi gia hạn như một quy trình được quản lý với ngày mốc, chủ sở hữu chịu trách nhiệm và các hàng đợi vận hành rõ ràng.

Timeline gia hạn và nhắc

Mô hình gia hạn như tập mốc gắn vào mỗi hợp đồng (và tuỳ chọn cho từng phụ lục):

  • End date (hết hạn)
  • Notice period deadline (ngày cuối cùng để huỷ/đàm phán)
  • Renewal window start (khi nên bắt đầu sourcing)

Xây nhắc quanh các mốc này. Mặc định thực tế là cadence 90/60/30 ngày trước deadline quan trọng (thời hạn báo trước thường là then chốt), cộng cảnh báo “ngày-of”.

Kênh thông báo và cách gửi

Bắt đầu với hai kênh:

  • Thông báo trong app cho hàng đợi công việc hàng ngày
  • Email cho nhắc nhở thời nhạy

Tuỳ chọn: hỗ trợ xuất file ICS (mỗi hợp đồng hoặc theo user) để chủ sở hữu subscribe trong Outlook/Google Calendar.

Làm cho thông báo có thể hành động: bao gồm tên hợp đồng, nhà cung cấp, deadline cụ thể và link sâu vào record.

Quyền sở hữu và escalations

Cảnh báo nên gửi tới:

  • Chủ sở hữu hợp đồng (chính)
  • Chủ danh mục (phụ, nếu khác)
  • Chủ dự phòng (để có coverage)

Thêm quy tắc escalate: nếu chủ chính chưa xác nhận trong X ngày, thông báo tới backup hoặc manager. Ghi lại timestamp “đã xác nhận” để cảnh báo không trở thành tiếng ồn nền.

Dashboard vận hành thúc đẩy công việc

Dashboard nên đơn giản, có thể lọc và tuỳ theo vai trò:

  • Hợp đồng sắp hết hạn (theo 30/60/90 ngày, bao gồm deadline báo trước)
  • Hợp đồng có nhiệm vụ gia hạn quá hạn (chưa được xác nhận hoặc quá mốc)
  • Bảng giá đang chờ phê duyệt (tuổi, chủ sở hữu, nhà cung cấp)

Mỗi widget liên kết tới view danh sách lọc có tìm kiếm và xuất, để dashboard là điểm bắt đầu cho hành động—không chỉ báo cáo.

Kế hoạch MVP, kiểm thử và checklist triển khai

MVP cho bảng giá và hợp đồng nhà cung cấp phải chứng minh một điều: các đội có thể tải giá an toàn, tìm hợp đồng đúng, và tin tưởng phê duyệt cùng lịch sử kiểm toán.

Phạm vi MVP (những thứ bắt buộc)

Bắt đầu với một luồng mỏng end-to-end hơn là nhiều tính năng rời rạc:

  • Supplier + item master cơ bản: suppliers, products/services, units, currencies
  • Import bảng giá: một hoặc hai mẫu (CSV/XLSX), xem trước, mapping trường (nếu cần), xác thực và báo lỗi rõ ràng
  • Hồ sơ hợp đồng: trường chính (ngày, loại gia hạn, chủ), tệp đính kèm và liên kết tới supplier và phiên bản bảng giá tương ứng
  • Phê duyệt: một workflow đơn giản (Draft → Review → Approved) với phân quyền và audit log
  • Tìm kiếm + báo cáo: tìm kiếm toàn cục (supplier, SKU, contract ID), và một xuất “giá đã phê duyệt hiện tại”

Nếu muốn nhanh với đội nhỏ, cân nhắc dùng Koder.ai để dựng skeleton sản phẩm ban đầu (frontend React, backend Go, PostgreSQL) và lặp trong “planning mode” với stakeholder procurement/legal. Bạn có thể xác thực workflow (imports → approvals → audit → renewal alerts), rồi xuất mã nguồn khi sẵn sàng hoàn thiện.

Kế hoạch kiểm thử (các lỗi thực tế hay xảy ra)

Tập trung kiểm thử nơi sai sót gây hậu quả:

  • Kiểm thử xác thực import: thiếu cột bắt buộc, tiền tệ/đơn vị không hợp lệ, hàng trùng, chồng chéo ngày, giá âm, thập phân lẫn lộn
  • Kiểm thử quyền: ai được import, phê duyệt, chỉnh sửa sau phê duyệt, xem tài liệu nhạy cảm
  • Kiểm thử workflow: yêu cầu phê duyệt lại khi chỉnh sửa, bắt ghi lý do khi từ chối, tạo entry audit cho mọi thay đổi trạng thái

Triển khai và phát hành

Dùng staging với dữ liệu giống production (đã làm sạch). Yêu cầu checklist: bật backup, rehearsal migration script, và kế hoạch rollback (migration DB versioned + revert deploy).

Thêm giám sát cho lỗi import, truy vấn chậm ở tìm kiếm, và nút thắt phê duyệt.

Lặp sau khi ra mắt

Chạy vòng feedback 2–4 tuần với procurement và finance: lỗi phổ biến khi import, trường thiếu trong hợp đồng, màn hình chậm. Ứng viên tiếp theo: tích hợp ERP, portal nhà cung cấp upload, phân tích về tiết kiệm và tuân thủ.

Suggested internal reads: /pricing and /blog.

Câu hỏi thường gặp

Những vấn đề cốt lõi nào ứng dụng này nên giải quyết trước tiên?

Bắt đầu bằng việc tập trung hai thứ: phiên bản bảng giá và phiên bản hợp đồng.

  • Lưu mọi lần nhập/sửa đổi như một phiên bản mới, chỉ đọc.
  • Thêm bước phê duyệt trước khi bất cứ thứ gì chuyển sang trạng thái Active.
  • Cung cấp tìm kiếm nhanh cho “giá hiện tại theo ngày” và “hợp đồng sắp hết hạn.”
Những gì nên có trong MVP và cái gì để cho các bản phát hành sau?

Trong MVP, bao gồm:

  • Hồ sơ nhà cung cấp + danh mục item/SKU cơ bản
  • Nhập CSV/XLSX với xem trước, xác thực và báo lỗi
  • Hồ sơ hợp đồng với ngày quan trọng (bắt đầu/kết thúc, thời hạn báo trước, loại gia hạn) + tệp đính kèm
  • Một quy trình đơn giản: Draft → Review → Approved
  • Dấu vết kiểm toán (ai/cái gì/khi nào/nguồn)
  • Tìm kiếm + một xuất báo cáo cho “giá đã phê duyệt hiện tại”
Nên chọn modular monolith hay microservices?

Dùng modular monolith cho hầu hết đội (1–6 kỹ sư): một app deployable với các module tách bạch (Suppliers, Price Lists, Contracts, Approvals, Reporting).

Tách các worker nền (imports, xử lý tài liệu, thông báo) khi cần trước khi chuyển sang microservices.

Những thực thể và quan hệ nào trong mô hình dữ liệu quan trọng nhất?

Mô hình tối thiểu:

  • Supplier, Contact
  • Item/SKU
  • PriceList (header/phiên bản) và PriceLine (dòng)
  • Contract và (tuỳ chọn) Terms có cấu trúc
  • Sự kiện phê duyệt và nhật ký kiểm toán

Các liên kết quan trọng:

Làm sao quản lý versioning mà không mất lịch sử?

Không ghi đè lịch sử. Dùng phiên bản hoá:

  • Mỗi lần tải lên tạo một phiên bản PriceList mới (hoặc một record PriceList mới với ID gia đình chung).
  • Mỗi sửa đổi hợp đồng tạo một phiên bản Contract mới với ngày có hiệu lực.

Khi đó “hiện tại” là một truy vấn: phiên bản đã phê duyệt mới nhất có hiệu lực vào ngày người dùng chọn.

Trải nghiệm nhập bảng giá tốt nên như thế nào?

Hướng tới “tải lên dễ chịu, lưu dữ liệu nghiêm ngặt”:

  • Hỗ trợ CSV và XLSX và cung cấp mẫu tải xuống.
  • Xác thực ở cấp hàng (ô/hàng sai) và cấp file (xung đột với dữ liệu hiện có).
  • Dòng chảy Upload → Preview → Fix → Confirm.
  • Cho phép governance chọn: chỉ nhập các hàng hợp lệ hoặc block toàn bộ file cho tới khi sửa xong.

Lưu file thô + mapping + kết quả xác thực để truy vết và xử lý lại.

Những quy tắc xác thực nào ngăn phần lớn dữ liệu giá xấu?

Các quy tắc thường ngăn được nhiều lỗi dữ liệu giá nhất:

  • Bắt buộc: supplier ID, SKU, price, currency, unit, effective start date
  • Tiền tệ: xác thực mã ISO (ví dụ USD, EUR)
  • Ngày: end date phải sau start date; xác định có cho phép trùng lặp hay không
  • Trùng lặp: xác định khóa (ví dụ supplier + SKU + start date + currency + unit) và từ chối trùng lặp mặc định

Nếu cho phép trùng lặp (khuyến mãi/ghi đè), yêu cầu lý do và phê duyệt.

Quy trình phê duyệt và các trạng thái nào hoạt động tốt nhất cho giá và hợp đồng?

Giữ trạng thái rõ ràng và nhất quán:

  • Draft: có thể sửa; không dùng cho mua hàng
  • Review: khoá chỉnh sửa trừ khi có yêu cầu thay đổi
  • Approved: quyết định được ghi nhận; sẵn sàng kích hoạt
  • Active: có hiệu lực để đặt hàng; thay đổi cần phiên bản/phê duyệt mới
  • Expired/Terminated: chỉ đọc; lưu để báo cáo/kiểm toán

Áp dụng cùng mẫu này cho cả bảng giá và phiên bản hợp đồng để người dùng chỉ phải học một quy trình.

Vai trò, quyền và dữ liệu nhạy cảm nên được xử lý ra sao?

Bắt đầu với mô hình vai trò đơn giản và thực thi ở phía server:

  • Viewer: chỉ xem giá đã phê duyệt/hiệu lực
  • Editor: tạo draft, tải tài liệu, xử lý lỗi nhập
  • Approver: phê duyệt/từ chối, khoá ngày hiệu lực
  • Admin: quản lý user/role/dữ liệu tham chiếu

Thêm quyền theo scope (business unit/region/supplier) khi cần, và coi PDF hợp đồng/chi tiết ngân hàng là dữ liệu nhạy cảm hơn với truy cập chặt chẽ hơn.

Làm sao quản lý renewals, thông báo và dashboard vận hành hiệu quả?

Mô hình các mốc chính và làm cho thông báo có thể hành động:

  • Ngày kết thúc, deadline báo trước, ngày bắt đầu cửa sổ gia hạn
  • Nhắc mặc định (ví dụ 90/60/30 ngày + ngày đáo hạn) gửi tới chủ sở hữu hợp đồng và backup/escalation

Các dashboard nên hướng tới hành động:

  • Hợp đồng sắp hết hạn (bao gồm deadline báo trước)
  • Nhiệm vụ gia hạn quá hạn/không được xác nhận
Mục lục
Ứng dụng cần giải quyết gì (và cho ai)Yêu cầu và ánh xạ luồng công việcKiến trúc tổng quan và phân chia moduleMô hình dữ liệu: thực thể, quan hệ và versioningNhập bảng giá: mẫu, xác thực và xử lý lỗiHồ sơ hợp đồng: điều khoản, tài liệu và phụ lụcLuồng phê duyệt và quản trịTrải nghiệm người dùng: màn hình, tìm kiếm và báo cáoBảo mật, quyền truy cập và lịch sử kiểm toánQuy tắc giá: ngày hiệu lực, tiền tệ và đơn vịGia hạn, cảnh báo và dashboard vận hànhKế hoạch MVP, kiểm thử và checklist triển khaiCâu hỏi thường gặp
Chia sẻ
Koder.ai
Build your own app with Koder today!

The best way to understand the power of Koder is to see it for yourself.

Start FreeBook a Demo
  • Supplier → Contracts, Supplier → PriceLists
  • Item → PriceLines
  • Tuỳ chọn: Contract → PriceLists để truy nguyên “giá này được điều chỉnh bởi thỏa thuận nào.”
  • Bảng giá đang chờ phê duyệt (tuổi, chủ sở hữu)
  • Mỗi widget liên kết tới danh sách lọc sẵn có thể xuất.