# Kho hàng

Phân hệ Kho hàng theo dõi hàng hoá ra vào từng kho của công ty. Danh mục hàng hoá không nằm ở đây
mà lấy từ phân hệ nghiệp vụ bạn đang dùng, nên kho làm việc được với sản phẩm, nguyên liệu hay vật
tư tuỳ theo phần mềm của bạn.

## Kho

Vào Kho hàng, chọn Kho để xem danh sách kho. Mỗi kho có một mã ngắn in trên phiếu, ví dụ KHO1, và
một tên đầy đủ.

Một kho nên được đánh dấu là kho mặc định. Khi phân hệ khác chuyển hàng mà không chỉ rõ kho nào,
hàng sẽ vào kho mặc định. Bật kho mặc định cho một kho thì các kho còn lại tự bỏ dấu, mỗi công ty
chỉ có một kho mặc định.

Kho ngừng dùng thì tắt ô Đang dùng, kho đó không còn xuất hiện khi lập phiếu nhưng số liệu cũ vẫn
tra được.

## Phiếu kho

Mọi thay đổi tồn kho đều đi qua một phiếu. Hiện có hai loại:

- Phiếu nhập: hàng vào kho, số phiếu chạy theo dãy PN.
- Phiếu xuất: hàng ra khỏi kho, số phiếu chạy theo dãy PX.

Phiếu mới lập ở trạng thái nháp. Phiếu nháp chưa đụng gì tới tồn kho, bạn sửa thoải mái, thêm bớt
dòng hàng cho tới khi đúng ý.

Bấm Ghi sổ là hàng chạy thật. Từ lúc đó phiếu không sửa được nữa, chỉ huỷ được. Đây là chỗ nhiều
người quen tay hay nhầm, nên hệ thống hỏi lại một lần trước khi ghi sổ.

Nếu kho không đủ hàng cho phiếu xuất, hệ thống chặn lại và nói rõ mặt hàng nào thiếu bao nhiêu.
Phiếu vẫn nằm nguyên ở trạng thái nháp để bạn sửa số lượng hoặc nhập thêm hàng rồi ghi sổ lại.

Mỗi dòng hàng chỉ nhận mặt hàng trong danh mục của chính công ty bạn. Dòng trỏ vào mặt hàng không có
trong danh mục bị từ chối kèm câu báo ở ô Mặt hàng, dù phiếu lập trên màn quản trị, trên web ứng dụng hay
do một phân hệ khác tự sinh. Dòng cũ lưu từ trước vẫn sửa được số lượng và đơn giá như thường.

## Huỷ phiếu

Phiếu đã ghi sổ mà sai thì bấm Huỷ phiếu. Tồn kho trở lại như trước khi ghi sổ.

Hệ thống không xoá dấu vết: dòng sổ cũ vẫn còn nguyên, phần huỷ được ghi thêm thành dòng ngược lại.
Nhờ vậy sau này tra lại vẫn biết ai làm gì vào lúc nào, và sổ sách khớp với thực tế đã xảy ra.

## Sổ kho

Sổ kho là nhật ký từng lần hàng nhúc nhích: thời điểm, phiếu nào, kho nào, mặt hàng gì, tăng hay
giảm bao nhiêu, tồn còn lại sau lần đó, và người thực hiện.

Đây là nơi tra khi số tồn trông lạ. Bảng tồn kho chỉ là con số cộng sẵn cho nhanh, còn sổ kho mới
là bản ghi gốc. Lọc theo kho và theo khoảng ngày để thu hẹp phạm vi cần soi.

## Phân quyền

Phân hệ có các quyền riêng, gán trong Phân quyền của công ty:

- Xem, thêm, sửa, xoá kho.
- Xem, thêm, sửa, xoá phiếu kho.
- Ghi sổ và huỷ phiếu kho, tách riêng khỏi quyền sửa. Người nhập liệu soạn phiếu nháp, người chịu
  trách nhiệm mới chốt cho hàng chạy.
- Xem tồn kho.
- Xem giá vốn, tách riêng khỏi quyền xem tồn. Không có quyền này thì cột Giá vốn bình quân, cột Giá
  trị tồn, ô số Giá trị tồn, hai cột Đơn giá và Thành tiền của Thẻ kho và nút In sổ chi tiết vắng hẳn
  khỏi màn; bảng số lượng còn nguyên, tệp xuất cũng không mang cột tiền.

Mặc định quản lý có trọn quyền, kế toán xem hết (kể cả giá vốn) mà không tự chốt phiếu, nhân viên
chỉ xem tồn để trả lời khách còn hàng hay hết, không thấy giá vốn.

## Chuyển kho và điều chỉnh

Ngoài phiếu nhập và phiếu xuất, còn hai loại phiếu nữa:

- Phiếu chuyển kho, dãy PC: chuyển hàng từ kho này sang kho khác. Khi chọn loại này, phiếu hiện
  thêm ô Kho nhận, và kho nhận phải khác kho xuất. Ghi sổ một phiếu chuyển kho sinh hai dòng trong
  sổ kho: trừ ở kho xuất, cộng ở kho nhận.
- Phiếu điều chỉnh, dãy PD: dùng sau khi kiểm kê. Ở loại phiếu này, số lượng mang dấu ngay trong ô
  nhập. Kiểm kê thiếu thì nhập số âm, kiểm kê thừa thì nhập số dương.

## Cài đặt kho hàng

Trong Cài đặt của công ty có mục Kho hàng (trên ứng dụng web: màn Cài đặt, nhóm Kho hàng).

Cách tính giá vốn. Mặc định bình quân gia quyền sau mỗi lần nhập, tính riêng từng kho. Chỉ đổi khi
sang năm tài chính và dùng nhất quán cả năm. Nhập trước xuất trước và thực tế đích danh sẽ có khi
kho theo dõi lô và hạn dùng.

Cho phép tồn âm. Mặc định tắt, nghĩa là phiếu xuất bị chặn khi kho không đủ hàng. Chỉ nên bật nếu
công ty thường xuyên xuất hàng trước rồi mới ghi phiếu nhập, vì khi bật thì hệ thống không còn cảnh
báo giúp bạn nữa.

Khuôn số phiếu. Mỗi loại phiếu chạy một dãy số riêng, bạn đổi được tiền tố và số chữ số. Đổi khuôn
chỉ áp cho phiếu lập từ lúc đó về sau, phiếu cũ giữ nguyên số đã cấp, và số thứ tự đang chạy không
bị đặt lại về đầu.

## Tồn kho

Màn Tồn kho cho biết mỗi mặt hàng còn bao nhiêu ở kho nào, gồm ba con số:

- Tồn thực: hàng đang nằm trong kho.
- Đang giữ chỗ: phần đã hứa cho đơn hàng nhưng chưa xuất.
- Khả dụng: phần bán được ngay, bằng tồn thực trừ phần giữ chỗ.

Con số ở đây được cộng sẵn cho nhanh. Bản ghi gốc nằm ở Sổ kho, nghi ngờ số liệu thì soi bên đó.

trên ứng dụng web, màn Tồn kho còn có định mức, giá vốn bình quân và giá trị tồn (với người xem được giá
vốn), dải ba mức Tất cả, Dưới định mức, Hết hàng (tính theo khả dụng), khung lọc nhiều kho có ô tìm,
và nút Xuất tệp theo đúng bộ lọc đang áp. Bấm một dòng mở Thẻ kho của mặt hàng ấy trong kho ấy.

## Lưới tồn theo màu và size

Dòng Tồn kho là một biến thể thì có nút lưới cạnh tên hàng. Bấm nút mở lưới tồn của cả mặt hàng gốc
trong kho ấy: hàng là giá trị thuộc tính thứ nhất (Màu), cột là thuộc tính thứ hai (Size), thuộc tính
thứ ba trở đi (Chất vải) là ô chọn trên thanh, cạnh ô chọn kho. Mỗi ô là tồn khả dụng của một biến thể:
nền cam khi dưới định mức, nền đỏ khi hết hàng; ô gạch mờ là tổ hợp đã tắt hay biến thể chưa từng vào
kho này, không bấm được. Bấm một ô mở Thẻ kho của biến thể ấy. Cột Cộng và dòng Cộng chỉ cộng tổ hợp
đang bán. Lưới chỉ bày giá trị mặt hàng đã chọn, cộng giá trị của biến thể còn tồn ở kho ấy (bỏ chọn
giá trị không giấu hàng còn trong kho). Nút Xuất tệp tải lưới thành tệp CSV. Trên điện thoại, mỗi màu là
một thẻ có hàng ô size.

## Giá vốn bình quân sau mỗi lần nhập

Mỗi dòng sổ kho mang đơn giá, thành tiền và giá trị tồn sau dòng. Luật tính, riêng cho từng kho:

- Phiếu nhập dùng đơn giá ghi trên dòng; phiếu nhập lập tay bắt buộc có đơn giá. Nhận hàng của đơn
  mua dùng giá đã chia chiết khấu và phí vận chuyển.
- Hàng vào không có đơn giá (điều chỉnh tăng, sản phẩm nhập mà không kèm giá) lấy bình quân đang có
  của kho ấy, chưa có thì bằng 0.
- Xuất lấy bình quân lúc xuất, tròn tới đồng. Xuất hết số còn lại thì lấy trọn giá trị còn lại, nên
  tồn về 0 thì giá trị cũng về 0.
- Chuyển kho: kho đi xuất theo bình quân của kho đi, kho đến nhập đúng số tiền ấy rồi tự tính lại
  bình quân của mình.
- Huỷ phiếu ghi dòng ngược đúng thành tiền của dòng gốc.

Bình quân giữ số lẻ, mọi số tiền tròn tới đồng. Nghi số tiền trên bảng tồn lệch với sổ thì chạy lệnh
`php artisan saas-inventory:rebuild-costs` (thêm `--company=<mã>` để chỉ dựng lại một công ty): lệnh
dựng lại tiền của cả sổ theo đúng thứ tự ghi, không đổi số lượng, không thêm dòng sổ.

## Thẻ kho và hai bản in

Thẻ kho là mọi lần tăng giảm của một mặt hàng trong một kho, theo kỳ (mặc định đầu tháng tới hôm
nay), có dòng đầu kỳ, dòng cuối kỳ và bốn ô số Tồn đầu kỳ, Nhập trong kỳ, Xuất trong kỳ, Tồn cuối
kỳ. Số chứng từ bấm được, mở đúng phiếu đã sinh dòng. Đổi kho ngay trên đầu thẻ.

Hai bản in A4 lấy đúng kỳ đang xem: thẻ kho (chỉ số lượng, mọi người xem được tồn đều in được) và
sổ chi tiết vật liệu, dụng cụ, sản phẩm, hàng hoá (có đơn giá và thành tiền, khổ ngang, chỉ người
xem được giá vốn). Tờ in chưa ghi mã mẫu sổ: Thông tư 99/2025/TT-BTC thay Thông tư 200 từ
01/01/2026 và cho doanh nghiệp tự thiết kế sổ; mã mẫu sẽ in theo chế độ kế toán công ty chọn.

## Biến thể hàng

Công ty khai thuộc tính hàng một lần ở Quản trị, mục Thuộc tính hàng: tên thuộc tính (Loại, Chất
vải, Màu, Size) và danh sách giá trị có thứ tự, mỗi giá trị có thể có mã ngắn dùng cho mã SKU.

Bảng Thuộc tính hàng bày mỗi thuộc tính một dòng: tên, các giá trị (quá sáu thì ghi *và N giá trị
khác*), số mặt hàng đang dùng. Bấm bút chì mở khay sửa: kéo tay sáu chấm để xếp thứ tự giá trị (thứ
tự ấy là thứ tự trên mọi màn, kể cả lưới tồn), gõ rồi Enter để thêm giá trị. Giá trị còn biến thể dùng
thì nút bỏ thành hình khoá kèm câu nói còn bao nhiêu biến thể. Đổi chữ một giá trị thì tên các biến thể
dùng nó đổi theo, mã SKU giữ nguyên. Xoá thuộc tính ở ba chấm cuối dòng, và chỉ xoá được khi không còn
mặt hàng nào dùng.

Dưới danh sách giá trị có hàng chip **Không ghi vào tên hàng**, dùng cho giá trị mang nghĩa không có
như *Không in*, *Không thêu*. Bấm chip nào thì giá trị ấy vẫn chọn được ở ô chọn biến thể, nhưng tên
biến thể bỏ nó đi: báo giá, đơn hàng, hoá đơn ghi *Áo thun cổ tròn, Trắng, M* chứ không ghi *Áo thun
cổ tròn, Không in, Trắng, M*. Mặc định chưa chip nào được bấm. Bấm hay bỏ bấm thì tên các biến thể đang
dùng giá trị ấy đổi theo ngay, mã SKU giữ nguyên.

**Tắt thuộc tính, tắt giá trị.** Cột **Đang dùng** của bảng có công tắc cho từng thuộc tính (trong khay
sửa cũng có). Tắt thuộc tính thì mặt hàng thôi thấy nó khi chọn thuộc tính; mặt hàng đang dùng vẫn bán
như cũ, Tuệ Trân Mall và kênh bán khác không đổi gì. Trong khay sửa, hàng chip **Ngừng bán giá trị**:
bấm chip nào là tắt giá trị ấy, mọi biến thể mang giá trị ấy thôi bán ở mọi nơi (ô chọn hàng, khối biến
thể, kênh bán như Tuệ Trân Mall). Bật lại giá trị là các biến thể ấy bán lại, trừ biến thể bạn tự tắt từ
trước. Trên bảng, giá trị đã tắt gạch chữ.

Mặt hàng của sản phẩm cho phép biến thể thì chọn thuộc tính dùng **và giá trị nó có ở từng thuộc tính**:
vải này có đúng hai màu thì chỉ chọn hai màu, ba size thì chọn ba size. Phần mềm chỉ ghép tổ hợp từ giá
trị đã chọn, mỗi tổ hợp là một biến thể có tên ghép (Áo thun cổ tròn, Thun lạnh, Trắng, M), mã SKU tự
sinh, tồn và giữ chỗ riêng, giá bán riêng tuỳ chọn (trống thì theo giá mặt hàng gốc). Tổ hợp mới bật
bán ngay. Bỏ chọn một giá trị (hay bỏ một thuộc tính) thì tổ hợp của nó tắt chứ không xoá, vì sổ kho
cũ còn trỏ vào; chọn lại là bán lại. Công ty thêm giá trị mới ở Thuộc tính hàng thì mặt hàng không tự
có tổ hợp mới, tới khi mặt hàng chọn giá trị ấy. Giá trị còn biến thể dùng thì không xoá được.

Mỗi biến thể là một mặt hàng của kho: Tồn kho, Thẻ kho, Sổ kho, phiếu kho và đơn mua bày biến thể
bằng tên ghép và SKU, giá vốn tính riêng từng biến thể trong từng kho.

Khối Biến thể trên trang mặt hàng: chip thuộc tính kèm số giá trị mặt hàng đã chọn (Chất vải 1, Màu
4, Size 5), bảng biến thể gom theo thuộc tính đầu (nhóm đầu mở, nhóm sau gập, đầu nhóm ghi số tổ hợp và
tổng khả dụng), ô tìm theo tên ghép hay SKU, SKU và giá riêng sửa ngay trên dòng, công tắc Đang bán.
Tổ hợp ngoài lựa chọn hiện tại dồn vào nhóm Tổ hợp cũ cuối bảng. Tổ hợp mang giá trị đã tắt thì chỗ
công tắc là dấu khoá *Giá trị tắt*. Người không sửa được mặt hàng chỉ xem: không có công tắc, nút và ô
sửa, cột giá đọc là Giá bán.

Nút **Chọn thuộc tính** mở khay: tích thuộc tính theo thứ tự ghép tên, thuộc tính đã tích mở hàng chip
giá trị để bấm chọn (tích mới thì chưa chọn giá trị nào, nút Chọn hết chọn đủ). Chân khay nói sẽ có bao
nhiêu tổ hợp; nút Lưu chỉ bấm được khi mọi thuộc tính đã tích có ít nhất một giá trị. Lưu xong khối báo
thêm bao nhiêu tổ hợp mới, bán lại bao nhiêu, tắt bao nhiêu.

Cho dev sản phẩm: nhúng khối bằng `TueTranShell.ui.VariantBlock` với `bridge` của màn và `item` là khoá
hàng `<tên gọn>:<mã>` (ví dụ `crm_item:9`); khối tự hỏi cửa `/{web}/shared/inventory/variants`. Quyền
sửa biến thể là quyền sửa mặt hàng của sản phẩm: khai `'variants_permission' => '<khoá quyền>'` cho loại
hàng ở móc, không khai thì theo quyền sửa kho.

Khai `'variants' => true` (và `'price'` là cột giá bán) cho loại hàng ở móc
`saas_inventory_stockables`; gọi `VariantCatalog::sync($matHang, [$thuocTinh...], [$thuocTinh => [$giaTri...]])`
(vắng giá trị của một thuộc tính thì giữ giá trị mặt hàng đã chọn, thuộc tính mặt hàng chưa dùng thì lấy
mọi giá trị), đọc `VariantCatalog::selection()`, `variantsOf()`, `unitPrice()`, `surcharge()`. Mọi lối
bán đọc `is_active` của biến thể nên tắt giá trị là thôi bán ở mọi nơi mà sản phẩm không phải sửa gì; biến
thể đổi công tắc, giá, tên, SKU thì mốc sửa của mặt hàng gốc đổi theo, để kênh bán kéo phần đổi thấy. Dời tồn từ mã hàng cũ sang biến thể thì
gọi `SaasInventory::reclassify()`: xuất mã cũ theo bình quân, nhập mã mới đúng số tiền ấy.

## Mặt hàng còn tồn thì không xoá được

Mặt hàng, biến thể còn tồn ở bất kỳ kho nào (kể cả tồn âm) thì không xoá được, dù xoá ở màn nào.
Câu báo nói rõ còn bao nhiêu ở kho nào, ví dụ: *Kho chính 12, Kho quầy 3*. Mặt hàng có biến thể thì
tính cả tồn của các biến thể.

Muốn bỏ mặt hàng ấy thì xuất hết hoặc lập phiếu điều chỉnh đưa tồn về 0 rồi mới xoá. Nếu chỉ muốn
thôi bán, hãy tắt mặt hàng thay vì xoá: tồn và lịch sử vẫn còn nguyên.

Mặt hàng gốc đã xoá thì các biến thể của nó cũng thôi hiện trong ô chọn hàng khi lập phiếu kho mới.

## Xuất huỷ tồn của hàng đã xoá

Hàng đã xoá khỏi danh mục từ trước khi có quy định trên mà còn tồn thì số ấy vẫn nằm trong kho, vẫn
cộng vào giá trị tồn. Màn Tồn kho gắn chữ *Đã xoá* lên những dòng ấy, và với người có quyền ghi sổ
phiếu kho thì đầu màn có dải nhắc: còn bao nhiêu dòng, tổng bao nhiêu, ở mấy kho.

Bấm **Xuất huỷ** trên dải nhắc, xác nhận một lần:

- Mỗi kho có tồn của hàng đã xoá được lập một phiếu *Xuất huỷ hàng đã xoá* (số phiếu mặc định `XH-`,
  đổi được ở Cài đặt, Đánh số chứng từ), ghi sổ ngay.
- Giá vốn tính như một lần xuất kho thường: xuất hết thì lấy trọn giá trị còn lại.
- Phiếu ghi người bấm là người lập và người ghi sổ.
- Mặt hàng lỡ tay xoá thì khôi phục trước khi bấm, tồn của nó được giữ nguyên.
- Lỡ tay huỷ nhầm thì mở phiếu ấy ở màn Phiếu kho, bấm Huỷ phiếu: tồn quay lại như cũ.

Dòng của hàng đã xoá mà tồn đã về 0 thì màn Tồn kho thôi bày. Sổ kho vẫn giữ trọn lịch sử.
Phiếu xuất huỷ chỉ nhận hàng đã xoá, nên biểu mẫu lập phiếu kho không có loại này.

## Tự dọn giữ chỗ của chứng từ đã xoá

Mỗi đêm máy soát phần Đang giữ chỗ. Dòng giữ chỗ nào trỏ về một chứng từ đã bị xoá (chứng từ không
còn, hoặc đã vào thùng rác) thì máy nhả dòng ấy và tính lại con số Đang giữ chỗ, để hàng không bị
treo mãi cho một đơn không còn.

- Máy chỉ gỡ phần giữ chỗ. Tồn thực, phiếu kho và Sổ kho giữ nguyên.
- Mỗi lần nhả, máy ghi một dòng vào Nhật ký hệ thống của công ty: Nhả giữ chỗ kho của chứng từ đã xoá.
- Chứng từ thuộc một phân hệ đang tắt thì máy không đụng tới, vì chứng từ vẫn còn, bật phân hệ lại
  là đơn còn nguyên.

## Định mức tồn tối thiểu

Bấm Đặt định mức trên một dòng để khai mức tồn thấp nhất bạn muốn giữ cho mặt hàng đó tại kho đó.
Mỗi kho đặt một mức riêng.

Khi tồn chạm hoặc xuống dưới mức đã đặt, con số khả dụng chuyển sang màu đỏ ngay trên bảng, và mặt
hàng xuất hiện trong ô Mặt hàng đã chạm định mức trên Bảng điều khiển. Bộ lọc So với định mức giúp
bạn xem riêng nhóm đã chạm mức hoặc nhóm còn dư.

Bỏ trống ô định mức là thôi theo dõi mặt hàng đó.

## Kho có sẵn khi mở công ty

Công ty vừa tạo đã có sẵn một kho mang mã KHO1 và được đánh dấu là kho mặc định, để phân hệ khác
chuyển hàng được ngay mà không phải khai kho trước. Bạn đổi tên, đổi mã hoặc thêm kho khác tuỳ ý.
