You are on page 1of 72

TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT TP.

HỒ CHÍ MINH

KHOA CÔNG NGHỆ THÔNG TIN

BỘ MÔN HỆ THỐNG THÔNG TIN

-----🙞🙞🙞🙞🙞-----

ĐỀ TÀI CUỐI KỲ MÔN HỆ QUẢN TRỊ CSDL

TÊN ĐỀ TÀI:

QUẢN LÝ TÀI KHOẢN TIẾT KIỆM NGÂN HÀNG

GVHD: TS. Nguyễn Thành Sơn

Lớp HP: DBMS330284_22_1_02

Nhóm thực hiện: Nhóm 03

Học kỳ: 1

Năm học: 2022 - 2023

Thành phố Hồ Chí Minh, tháng 11, năm 2022


DANH SÁCH SINH VIÊN NHÓM THỰC HIỆN

HỌC KÌ 1 NĂM HỌC 2022-2023

Nhóm 03

Đề tài: Quản lý tài khoản tiết kiệm ngân hàng

20110248 Lê Thị Kim Lệ


20110335 Nguyễn Thị Bích Liên
20110315 Nguyễn Thị Cẩm Nguyên
20110313 Phùng Thị Thùy Trang

NHẬN XÉT CỦA GV

Tp. Hồ Chí Minh, ngày …., tháng 11, năm 2022

Giảng viên chấm điểm


MỤC LỤC

Contents
LỜI NÓI ĐẦU ................................................................................................................2
CHƯƠNG 1. TỔNG QUAN VỀ HỆ THỐNG ............................................................3
1. Đặc tả đề tài .........................................................................................................3
1.1. Mô tả bài toán ...............................................................................................3
1.2. Nghiệp vụ của bài toán .................................................................................4
1.3. Mô tả các chức năng của bài toán ...............................................................5
1.4. Một số hình thức gửi tiết kiệm ....................................................................6
1.5. Phương pháp tính lãi suất ............................................................................6
1.6. Phương thức tính lãi .....................................................................................7
CHƯƠNG 2. PHÂN TÍCH THIẾT KẾ HỆ THỐNG ................................................9
1. Thiết kế cơ sở dữ liệu mức quan niệm. ...............................................................9
2. Thiết kế cơ sở dữ liệu mức logic. ........................................................................9
3. Các ràng buộc cần có .........................................................................................11
4. Cài đặt CSDL và các ràng buộc ........................................................................11
1.7. 4.1. Tạo bảng và các ràng buộc đơn giản. ................................................11
5. Các ràng buộc khác............................................................................................15
6. Trigger kiểm tra các ràng buộc ..........................................................................15
7. Các view ............................................................................................................18
CHƯƠNG 3. THIẾT KẾ CÁC CHỨC NĂNG .........................................................21
1. Kết nối cơ sở dữ liệu..........................................................................................21
2. Xem thông tin danh mục ...................................................................................21
3. Quản lý nhân viên ..............................................................................................22
4. Quản lý Sổ tiết kiệm ..........................................................................................24
5. Quản lý Giao dịch tiết kiệm...............................................................................25
CHƯƠNG 4. TẠO USER VÀ PHÂN QUYỀN .........................................................45
CHƯƠNG 5. THIẾT KẾ GIAO DIỆN HỆ THỐNG ...............................................47
LỜI CẢM ƠN

Lời đầu tiên, chúng em xin chân thành cảm ơn sự hướng dẫn tận tình của thầy
Nguyễn Thành Sơn đã giúp chúng em hoàn thành bài báo cáo cuối kì bộ môn Hệ quản trị
cơ sở dữ liệu này. Nhờ những kiến thức thầy truyền đạt mà chúng em đã nắm chắc hơn
được những kiến thức căn bản, nền tảng cho việc khi xây dựng một hệ thống quản trị cơ sở
dữ liệu. Thông qua đồ án này, nhóm em xin trình bày lại quá trình phát triển của một hệ
thống quản trị cơ sở dữ liệu, cũng như lập trình một đồ án liên quan.

Trong quá trình thực hiện đồ án môn học, khó tránh khỏi những sai sót. Do đó nhóm
chúng em rất mong sự góp ý đến từ thầy để bài làm của nhóm chúng em được hoàn thiện
hơn, phát triển và đầy đủ hơn. Kính chúc thầy sức khỏe, hạnh phúc thành công trên con
đường sự nghiệp giảng dạy.

Cuối cùng chúng em cũng chân thành cảm ơn các thầy cô và các bạn cùng tham gia
học bộ môn Hệ quản trị sơ sở dữ liệu đã nhiệt tình giúp đỡ động viên chúng em trong trình
thực hiện đồ án cuối kì.

1
|Nhóm 03
LỜI NÓI ĐẦU

Trong nhiều năm trở lại đây, ngành công nghệ thông tin thực sự đã len lỏi vào từng
ngóc ngách của đời sống xã hội. Bất kể một lĩnh vực hay ngành nghề nào cũng đều ứng
dụng các công nghệ thông tin. CNTT đã và đang đóng vai trò quan trọng trong đời sống
kinh tế, xã hội của nhiều quốc gia trên thế giới và Việt Nam cũng vậy, ứng dụng của ngành
này có rất nhiều trong đời sống hằng ngày.

Không thể phủ nhận rằng các hệ thống quản lý dữ liệu, thông tin dần trở thành công
cụ đắc lực của nhiều doanh nghiệp. Đặc biệt phải kể đến lĩnh vực ngân hàng hiện nay trong
công tác quản lý dữ liệu, công nghệ thông tin giúp cho quá trình quản lý dữ liệu đạt hiệu
quả cao trong việc giảm tối thiểu về nhân lực, thời gian cũng như tránh thất lạc, sai sót dữ
liệu thay vì việc quản lý bằng giấy tờ bằng phương pháp cổ truyền như trước đây.

Chính vì những lý do đó, ứng dụng của Công nghệ thông tin đối với công tác quản
lý dữ liệu trong ngân đóng một vai trò hết sức quan trọng. Và để làm rõ hơn về ứng dụng
của Công nghệ thông tin đối với công tác quản lý trong thực tế nhóm chúng em lựa chọn đề
tài “Quản lý tài khoản tiết kiệm Ngân hàng” để nghiên cứu và phát triển ứng dụng của
việc quản lý hệ thống dữ liệu trong môn học Hệ quản trị cơ sở dữ liệu.

2
|Nhóm 03
CHƯƠNG 1. TỔNG QUAN VỀ HỆ THỐNG

1. Đặc tả đề tài
1.1. Mô tả bài toán
Một ngân hàng cần có hệ thống quản lý tài khoản tiết kiệm. Một hệ thống quản lý
tài khoản tiết kiệm cần lưu trữ những dữ liệu như sau:

Ngân hàng quản lý nhiều chi nhánh, mỗi Chi nhánh có Tên chi nhánh, Mã chi nhánh,
Địa chỉ. Mỗi chi nhánh thì có nhiều nhân viên,…

Mỗi nhân viên có các thông tin: Mã nhân viên, Họ tên, Ngày sinh, Địa chỉ, Điện
thoại. Mỗi nhân viên được cấp tên đăng nhập và mật khẩu để đăng nhập vào hệ thống. Mỗi
nhân viên sẽ có chức vụ và quyền hạn khác nhau nên thuộc các nhóm người dùng và có
phân quyền khác nhau.

Thông tin về nhóm người dùng thì gồm có: Mã nhóm người dùng, Tên nhóm người
dùng. Có các nhóm người dùng sau: Nhân viên giao dịch và Giám đốc.

Nhóm người dùng thì được phân chia ra những quyền riêng biệt. Thông tin về nhóm
quyền: Mã quyền, Tên quyền. Các nhóm người dùng được phân cho một hoặc nhiều quyền.

Một Chi nhánh thì quản lý nhiều tài khoản tiết kiệm và điều cần thiết với mỗi sổ là
thông tin Khách hàng gửi tiết kiệm. Thông tin của khách hàng gồm: Mã khách hàng, Tên,
Số điện thoại, Địa chỉ, số CCCD, Nơi cấp, Ngày cấp.

Một khách hàng có thể mở một hoặc nhiều sổ tiết kiệm. Thông tin của mỗi sổ tiết
kiệm: Mã sổ tiết kiệm, Ngày mở sổ, Ngày đến hạn, Ngày tất toán, Loại tiền gửi, Tình trạng.
Tình trạng của sổ có thể là: Còn hiệu lực, Đã tất toán, Phong tỏa.

Mỗi một sổ tiết kiệm sẽ thuộc một loại tiết kiệm duy nhất, phân biệt bởi mã loại tiết
kiệm. Mã loại tiết kiệm qui định hình thức gửi tiết kiệm, kỳ hạn, hình thức trả lãi, lãi suất.

Có các hình thức gửi tiết kiệm sau:

- Tiền gửi tiết kiệm trả lãi định kỳ


- Tiền gửi tiết kiệm trả lãi trước
- Tiền gửi tiết kiệm trả lãi sau
- Tiền gửi tiết kiệm gửi góp
- Tiền gửi tiết kiệm một lần

3
|Nhóm 03
Kỳ hạn: Không kỳ hạn, 1 tháng, 2 tháng, …, 36 tháng.

Lãi suất tiết kiệm được quy định bởi: Hình thức gửi tiết kiệm, Kỳ hạn, Kỳ trả lãi.

Mỗi sổ tiết kiệm sẽ phát sinh một hoặc nhiều phát sinh giao dịch tiết kiệm. Thông
tin của mỗi giao dịch tiết kiệm gồm: Mã số giao dịch, Ngày giao dịch, Mã sổ tiết kiệm, Mã
loại giao dịch, Mã chi nhánh giao dịch, Mã nhân viên giao dịch, Số tiền giao dịch. Mã loại
giao dịch cho biết loại giao dịch nào được thực hiện, có các loại giao dịch sau: Gửi tiền, Rút
tiền lãi, Tất toán, Lãi nhập gốc, Tái ký gửi.

1.2. Nghiệp vụ của bài toán


Gửi tiết kiệm

Khách hàng xuất trình giấy chứng minh. Kế Toán hướng dẫn khách hàng điền đầy
đủ thông tin trên “giấy đề nghị gửi tiền”. Thông tin “giấy đề nghị gửi tiền” gồm có: họ tên,
điện thoại, địa chỉ, số CMND, ngày cấp, nơi cấp, số tiền gửi, kỳ hạn gửi, hình thức rút lãi.
Kế Toán Trưởng kiểm tra các thông tin trên giấy đề nghị của khách hàng, giấy nộp tiền,
phiếu lưu, Sổ tiết kiệm phải khớp nhau và ký tên lên Sổ Tiết Kiệm. Giám Đốc ký tên lên
giấy nộp tiền, Sổ tiết kiệm. Thủ quỹ nhận giấy nộp tiền, Sổ tiết kiệm, phiếu lưu tiền gửi,
chờ Kiểm ngân thu.

Kiểm ngân sau khi thu xong, lập bảng kê nộp tiền, ký tên lên bảng kê nộp và chuyển
bảng kê cho thủ quỹ. Thủ quỹ kiểm tra số tiền trên bảng kê, giấy nộp tiền, phiếu lưu, Sổ tiết
kiệm. Nếu khớp đúng số tiền, ký tên lên giấy nộp tiền và bảng kê nộp, vào sổ theo dõi. Nếu
không khớp đúng số tiền phải báo cho Kế toán biết để điều chỉnh lại. Cho khách hàng ký
tên lên giấy nộp tiền, bảng kê nộp, đăng ký chữ ký mẫu lên phiếu lưu, ký tên lên Sổ Tiết
Kiệm, phiếu lưu (bên phần kiểm soát), ký nhận Sổ Tiết Kiệm. Sau khi xong cho khách hàng
ký nhận sổ và trả sổ cho khách hàng.

Sau đó ký tên lên góc trái chứng từ, đóng dấu đã thu tiền và vào sổ theo dõi thu chi,
giữ lại bảng kê nộp tiền để tổng hợp (cuối ngày giao lại cho Thủ quỹ). Thủ quỹ vào sổ quỹ.
Giấy nộp tiền cuối ngày Thủ quỹ chuyển qua bộ phận kết hợp chứng từ.

Khách hàng

Kiểm tra các yếu tố trên giấy gửi tiền. Ký chữ ký mẫu lên phiếu lưu tiền gửi (hoặc
các ký hiệu khác). Nhân viên ngân hàng in Giấy nộp tiền, Phiếu lưu, Sổ tiền gửi.

Rút tiết kiệm

4
|Nhóm 03
Khách hàng đến rút tiền mang Sổ tiết kiệm, CMND (hộ chiếu) đã đăng ký lúc gửi
tiền và thông báo đến Kế toán số tiền cần rút (vốn, lãi).

Trường hợp rút hoàn toàn: KT sẽ căn cứ vào ngày đáo hạn, số tiền gửi, lãi suất trên
sổ, lập Phiếu tính lãi, in Giấy lãnh tiền, Phiếu chi lãi, in Sổ tiền gửi, ghi Phiếu lưu tiền gửi,
ký tên chuyển qua cho Kế toán Trưởng.

Trường hợp khách hàng gửi lại đúng số tiền và định kỳ trên Sổ tiết kiệm: Kế toán sử
dụng lại Sổ tiết kiệm cũ, Phiếu lưu cũ, lập Giấy nộp tiền, Giấy lĩnh tiền, Phiếu chi lãi, in Sổ
tiết kiệm, ghi Thẻ lưu tài khoản, chuyển cho Kế toán trưởng.

Trường hợp khách hàng gửi lại thay đổi số tiền: Kế toán thực hiện như trường hợp
rút hoàn toàn, sau đó làm giống như trường hợp gửi tiền, chuyển cho Kế toán trưởng

Kế toán trưởng kiểm tra lại ngày đáo hạn, cách tính lãi trên Phiếu tính lãi, Giấy lĩnh
tiền, Phiếu chi lãi, Số dư trên Sổ tiền gửi và Phiếu lưu. Cho khách ký tên lên chứng từ, đối
chiếu chữ ký của khách hàng trên chứng từ Thẻ lưu, nếu đúng chữ ký, khách hàng ký tên
lên Sổ tiết kiệm và Thẻ lưu, chi tiền cho khách hàng và trả Sổ tiết kiệm cho khách hàng,
nếu không đúng phải báo cho Kế toán để kiểm tra lại, chi xong ký tên lên góc trái chứng từ
và đóng dấu “Đã chi tiền” vào Sổ theo dõi, gữi lại Bảng kê để tổng hợp cuối ngày.

1.3. Mô tả các chức năng của bài toán


Đối với Người quản trị:

Thêm quyền, xóa quyền, phân quyền cho nhóm người dùng, xóa quyền khỏi nhóm
người dùng.

Thêm phân nhóm, xóa phân nhóm, Thêm nhân viên vào phân nhóm, xóa nhân viên
khỏi phân nhóm.

Đối với Giao dịch viên – nhân viên ngân hàng:

Thêm khách hàng, chỉnh sửa thông tin khách hàng, thêm đồng sở hữu, mở sổ tiết
kiệm, thực hiện các giao dịch rút, gửi lãi, vốn, tất toán, phong tỏa, xóa sổ, tái ký tục, chuyển
quyền sử dụng sổ.

Tra cứu thông tin khách hàng, sổ tiết kiệm.

Phân quyền: quyền admin toàn quyền với hệ thống. Còn nhân viên không thể tham gia vào
việc quyền của các tài khoản khác.

5
|Nhóm 03
1.4. Một số hình thức gửi tiết kiệm
Đối với hình thức gửi có kỳ hạn

Gửi tiết kiệm hàng tháng (tiết kiệm gửi góp): Hình thức này chỉ có hình thức lãi trả
sau. Như vậy, số tiền gốc sẽ tăng lên sau mỗi kỳ gửi góp, mà không phải là một số cố định
như hình thức tiết kiệm thông thường. Số tiền lãi cũng được tính trên cơ sở số tiền gốc tăng
lên đó. Lãi suất áp dụng cho loại tiền gửi này thấp hơn lãi suất tiền gửi tiết kiệm thông
thường. Quý khách sẽ không được rút tiền trước hạn, khi đến hạn nếu quý khách không đến
rút tiền, số dư không được chuyển thêm kỳ hạn gửi tiếp theo mà được tính lãi với lãi suất
không kỳ hạn.

Đối với hình thức gửi một lần có 3 hình thức trả lãi như: trả trước, trả định kì và trả
sau.

Tiền gửi tiết kiệm trả lãi trước: Quý khách nhận được tiền lãi ngay tại thời điểm gửi
tiền. Lãi suất áp dụng cho hình thức tiền gửi này thấp hơn lãi suất tiền gửi cùng kỳ hạn lĩnh
lãi cuối kỳ. Loại tiền gửi này cũng không hỗ trợ quý khách rút gốc hoặc rút một phần gốc
trước hạn. Tiền gửi khi đến hạn mà quý khách không rút ra sẽ được chuyển thêm kỳ hạn
tiếp theo.

Tiền gửi tiết kiệm trả lãi định kỳ (hàng tháng/ hàng quý): Loại tiền gửi này rất thuận
tiện cho quý khách cần phải dùng tiền lãi thu được từ việc gửi tiền tiết kiệm của mình, để
sử dụng chi tiêu định kỳ hàng tháng, hàng quý…, quý khách không cần chờ khi đến hạn
mới rút được tiền lãi. Các quy định khác cũng giống như tiền gửi tiết kiệm thông thường.

Tiền gửi tiết kiệm trả lãi sau: Nhận tiền lãi khi ngày đến hạn. Hình thức tiền gửi này
cũng được nhập lãi một lần vào cuối kỳ, tự động chuyển thêm một kỳ hạn tiếp theo nếu quý
khách không rút tiền khi đến hạn.

Đối với hình thức gửi tiết kiệm không kỳ hạn (gửi một lần)

Tiền gửi tiết kiệm gửi một lần (rút gốc linh hoạt): Loại tiền gửi tiết kiệm này cũng
được nhập lãi một lần vào cuối kỳ và tự động quay vòng khi đến hạn. Tuy nhiên, trong kỳ
nếu quý khách có nhu cầu rút một phần gốc trước hạn thì phần tiền rút ra được tính lãi suất
không kỳ hạn, phần còn lại gửi tiếp vẫn được áp dụng lãi suất có kỳ hạn kể từ ngày gửi.

1.5. Phương pháp tính lãi suất


Công thức tính lãi cho loại tiết kiệm có kỳ hạn

6
|Nhóm 03
Tiền lãi = Số dư * Số tháng gửi * Lãi suất

VD: Khách hàng gửi 10 triệu với kỳ hạn 2 tháng, lãi suất 1.2%/ tháng.
Tiền lãi = 10000000 * 2* 1.2% = 240000
- Công thức tính lãi cho loại tiết kiệm không kỳ hạn

Tiền lãi = (Số dư * Lãi suất) / 30 * Số ngày

VD: Với số tiền gửi không kỳ hạn là 10 triệu.


Ngày gửi: 1/4/20009, ngày tất toán 6/4/20009.
Giả sử lãi suất trong thời điểm khách hàng rút 0.6%
Tiền lãi = (10000000 * 0.6%) / 30 * 5 = 10000
1.6. Phương thức tính lãi
Tiền gửi không kỳ hạn: Tiền lãi được nhập vào gốc tháng hoặc quý vào ngày đến hạn
(rút hết số tiền gửi) nếu khách hàng không đến lãnh lãi.

Tiền gửi có kỳ hạn: Tiền lãi được trả trước vào ngày khách hàng gửi tiền (đối với loại
tiết kiệm trả lãi trước); hoặc trả lãi định kỳ tháng, quý, 6 tháng, 1 năm (đối với loại tiết kiệm
trả lãi định kỳ); hoặc trả lãi cuối kỳ (đối với loại tiết kiệm trả lãi sau).

Rút vốn trước hạn (áp dụng lãi bậc thang):

Khách hàng gửi tiền có kỳ hạn khi có nhu cầu rút vốn trước hạn được áp dụng lãi suất
ở kỳ hạn tương đương với thời gian gửi thực tế hoặc mức lãi suất ở kỳ hạn ngắn hơn kế
trước (nếu Ngân hàng không huy động loại kỳ hạn tương đương thời gian khách hàng đã
gửi)

VD : Khách hàng gửi 10 triệu loại tiết kiệm kỳ hạn 6 tháng lãnh lãi hàng tháng, lãi suất
1.2%/ tháng.

Ngày gửi : 1/4/2009, ngày hết hạn: 1/10/2009.

Ngày đến rút : 9/8/20009 => thời gian thực gửi là: 4 tháng, 8 ngày. Nếu tại thời điểm đó
Ngân hàng huy động tiết kiệm 3 tháng (Lãi suất: 1.4%/ tháng) và không kỳ hạn lãi suất
0.6%/ tháng, tiết kiệm 1 tháng lãi suất 1.1%/ tháng.

. Trả lãi kỳ hạn 3 tháng : 10000000 * 3 * 1.4% = 420000


. Trả lãi kỳ hạn 1 tháng : 10000000 * 1 * 1.1% = 110000
. Trả lãi không kỳ hạn: (10000000 * 8 * 0.6%) / 30 = 16000
7
|Nhóm 03
Tổng cộng : 420000 + 110000 + 16000 = 546000

8
|Nhóm 03
CHƯƠNG 2. PHÂN TÍCH THIẾT KẾ HỆ THỐNG

1. Thiết kế cơ sở dữ liệu mức quan niệm.


Từ mô tả về dữ liệu cần có ở phần mô tả bài toán, hình thành được sơ đồ thực thể kết hợp
(ERD).

2. Thiết kế cơ sở dữ liệu mức logic.


Từ sơ đồ thực thể kết hợp (ERD), ta có các lược đồ quan hệ:
● CHI_NHANH (MaChiNhanh, TenChiNhanh, DiaChi)
● DANG_NHAP (MaNhanVien, TenDangNhap, MatKhau)
● GIAO_DICH_TIET_KIEM (MaGiaoDich, MaSoTK, SoTienGiaoDich,
NgayGiaoDich, MaNhanVien, MaLoaiGiaoDich, NgayPhatSinhGiaoDich,
DaThanhToan)
● HINH_THUC_GUI (MaHinhThucGui, TenHinhThucGui, HanMucGui)
● HINH_THUC_TRA_LAI (MaHinhThucTraLai, TenHinhThucTraLai)
● KHACH_HANG (MaKhachHang, HoTen, NgaySinh, SDT, MaDinhDanh,
NgayCap, NoiCap, DiaChi, DangSuDung, ChuKy)
● LOAI_GIAO_DICH (MaLoaiGiaoDich, TenLoaiGiaoDich, LienQuanSoDu)
● LOAI_TIEN (MaLoaiTien, LoaiTien, TiGiaVND)
● LOAI_TIET_KIEM (MaLoaiTietKiem, MaHinhThucGui, MaHinhThucTraLai,
KyHan, LaiSuat)
9
|Nhóm 03
● NHAN_VIEN (HoTen, NgaySinh, MaDinhDanh, SDT, MaChiNhanh,
TinhTrangLamViec)
● NHOM_NGUOI_DUNG (MaNhomNguoiDung, TenNhom, TenRole)
● PHAN_NHOM (MaNhanVien, MaNhomNguoiDung)
● SO_DU_TAI_KHOAN (MaSoDu, MaSoTK, NgayGhiNhanSoDu, SoDu)
● SO_HUU (MaSoTK, MaKhachHang)
● TAI_KHOAN_TIET_KIEM (MaSoTK, NgayMoSo, NgayDenHan, NgayTatToan,
MaChiNhanh, MaLoaiTien, MaLoaiTietKiem, NgayLaiNhapGoc, KyTraLai,
HanGuiGop, TinhTrangSuDung, NgayGuiGopTiepTheo,
NgayNhanLaiDinhKyTiepTheo)

10
|Nhóm 03
3. Các ràng buộc cần có
STT TABLE RÀNG BUỘC
1 CHI_NHANH Ràng buộc khoá chính MaChiNhanh
2 DANG_NHAP Ràng buộc khoá ngoại MaNhanVien tham chiếu
đến NHAN_VIEN
3 GIAO_DICH_TIET_KIEM Ràng buộc khoá chính MaGiaoDich, ràng buộc
khoá ngoại MaNhanVien và MaGiaoDich tham
chiếu đến NHAN_VIEN và
LOAI_GIAO_DICH
4 HINH_THUC_GUI Ràng buộc khoá chính MaHinhThucGui
5 HINH_THUC_TRA_LAI Ràng buộc khoá chính MaHinhThucTraLai
6 KHACH_HANG Ràng buộc khoá chính MaKhachHang
7 LOAI_GIAO_DICH Ràng buộc khoá chính MaLoaiGiaoDich
8 LOAI_TIEN Ràng buộc khoá chính MaLoaiTien
9 LOAI_TIET_KIEM Ràng buộc khoá chính MaLoaiTietKiem, ràng
buộc khoá ngoại MaHinhThucGui và
MaHinhThucTraLai tham chiếu tới
HINH_THUC_TRA_LAI và
HINH_THUC_GUI
10 NHAN_VIEN Ràng buộc khoá chính MaNhanVien, ràng buộc
khoá ngoại MaChiNhanh tham chiếu đến
CHI_NHANH
11 NHOM_NGUOI_DUNG Ràng buộc khoá chính MaNhomNguoiDung
12 PHAN_NHOM Ràng buộc khoá ngoại MaNhanVien,
MaNhomNguoiDung tham chiếu đến
NHAN_VIEN và NHOM_NGUOI_DUNG
13 SO_DU_TAI_KHOAN Ràng buộc khoá chính MaSoDu, ràng buộc khoá
ngoại MaSoTK tham chiếu đến
TAI_KHOAN_TIET_KIEM
14 SO_HUU Ràng buộc khoá ngoại MaSoTK, MaKhachHang
tham chiếu đến TAI_KHOAN_TIET_KIEM và
KHACH_KHANG
15 TAI_KHOAN_TIET_KIEM Ràng buộc khoá chính MaSoTK, ràng buộc khoá
ngoại MaChiNhanh, MaLoaiTien,
MaLoaiTietKiem tham chiếu đến
CHI_NHANH, LOAI_TIEN,
LOAI_TIET_KIEM

4. Cài đặt CSDL và các ràng buộc


1.7. 4.1. Tạo bảng và các ràng buộc đơn giản.
Bảng Chi nhánh

CREATE TABLE CHI_NHANH


(
MaChiNhanh varchar(10),
TenChiNhanh nvarchar(50) not null,
DiaChi nvarchar(50) not null,
primary key (MaChiNhanh)
)

11
|Nhóm 03
Bảng Đăng nhập
CREATE TABLE DANG_NHAP
(
MaNhanVien varchar(10) primary key REFERENCES NHAN_VIEN(MaNhanVien),
TenDangNhap nvarchar(30) unique not null,
MatKhau varchar(30) not null check(len(MatKhau)>=6)
)

Bảng Giao dịch tiết kiệm


CREATE TABLE GIAO_DICH_TIET_KIEM
(
MaGiaoDich varchar(10) primary key,
MaSoTK varchar(15) references TAI_KHOAN_TIET_KIEM(MaSoTK),
SoTienGiaoDich money check (SoTienGiaoDich>=0),
NgayGiaoDich date check (DATEDIFF(day, NgayGiaoDich, GETDATE())>=0),
MaNhanVien varchar(10) REFERENCES NHAN_VIEN(MaNhanVien),
MaLoaiGiaoDich varchar(10) REFERENCES LOAI_GIAO_DICH(MaLoaiGiaoDich),
NgayPhatSinhGiaoDich date,
DaThanhToan bit DEFAULT 0 -- Có một số giao dịch sẽ tự động phát sinh khi đến
thời hạn(lãi), giao dịch sẽ được đánh dấu đã thanh toán khi khách hàng đến giao dịch
)

Bảng Hình thức gửi


CREATE TABLE HINH_THUC_GUI
(
MaHinhThucGui varchar(10) primary key,
TenHinhThucGui nvarchar(30) not null,
HanMucGui money --VND
)

Bảng Hình thức trả lãi


CREATE TABLE HINH_THUC_TRA_LAI
(
MaHinhThucTraLai varchar(10) primary key,
TenHinhThucTraLai nvarchar(50),
)

Bảng Khách hàng


CREATE TABLE KHACH_HANG
(
MaKhachHang varchar(10) primary key,
HoTen nvarchar(30) not null,
NgaySinh date check (DATEDIFF(year, NgaySinh, GETDATE())>=15),
SDT varchar(11) not null check(len(SDT)=10),
MaDinhDanh varchar(15) UNIQUE check (len(MaDinhDanh)=9 or
len(MaDinhDanh)=12),
NgayCap date, check (DATEDIFF(year,NgaySinh,NgayCap)>=14),
NoiCap nvarchar(100),
DiaChi nvarchar(100),
DangSuDung bit DEFAULT 1,

12
|Nhóm 03
ChuKy VARBINARY (max) – hình ảnh chữ ký của khách hàng
)

Bảng Loại giao dịch


CREATE TABLE LOAI_GIAO_DICH
(
MaLoaiGiaoDich varchar(10) primary key,
TenLoaiGiaoDich nvarchar(30) not null,
LienQuanSoDu bit
)

Bảng Loại tiền


CREATE TABLE LOAI_TIEN
(
MaLoaiTien varchar(10) primary key,
LoaiTien nvarchar(15) not null,
TiGiaVND money
)

Bảng Loại tiết kiệm


CREATE TABLE LOAI_TIET_KIEM
(
MaLoaiTietKiem varchar(10) primary key,
MaHinhThucGui varchar(10) references HINH_THUC_GUI(MaHinhThucGui),
MaHinhThucTraLai varchar(10) references HINH_THUC_TRA_LAI(MaHinhThucTraLai),
KyHan int check(KyHan>=0 and KyHan<=36),
LaiSuat float check (LaiSuat>0)
)

Bảng Nhân viên


CREATE TABLE NHAN_VIEN
(
MaNhanVien varchar(10) ,
HoTen nvarchar(30)not null,
NgaySinh date not null,
MaDinhDanh varchar(15) check (len(MaDinhDanh)=9 or len(MaDinhDanh)=12),
SDT varchar(11) check (len(SDT)=10),
primary key (MaNhanVien),
MaChiNhanh varchar(10) references CHI_NHANH(MaChiNhanh) ON UPDATE CASCADE,
TinhTrangLamViec bit DEFAULT 1
)

Bảng Nhóm người dùng


CREATE TABLE NHOM_NGUOI_DUNG
(
MaNhomNguoiDung varchar(10),
TenNhom nvarchar(30),
TenRole varchar(20),
primary key (MaNhomNguoiDung)
)

13
|Nhóm 03
Bảng Phân nhóm
CREATE TABLE PHAN_NHOM
(
MaNhanVien varchar(10) primary key references NHAN_VIEN (MaNhanVien),
MaNhomNguoiDung varchar(10) references NHOM_NGUOI_DUNG (MaNhomNguoiDung) ON
DELETE SET NULL
)

Bảng Số dư tài khoản


CREATE TABLE SO_DU_TAI_KHOAN
(
MaSoDu varchar(10),
MaSoTK varchar(15) REFERENCES TAI_KHOAN_TIET_KIEM(MaSoTK),
NgayGhiNhanSoDu date,
SoDu money,
PRIMARY KEY(MaSoDu, MaSoTK),
)

Bảng Sở hữu
CREATE TABLE SO_HUU
(
MaSoTK varchar(15) REFERENCES TAI_KHOAN_TIET_KIEM(MaSoTK),
MaKhachHang varchar(10) references KHACH_HANG(MaKhachHang),
PRIMARY KEY (MaSoTK, MaKhachHang)
)

Bảng Tài khoản tiết kiệm


CREATE TABLE TAI_KHOAN_TIET_KIEM
(
MaSoTK varchar(15) PRIMARY KEY,
NgayMoSo date,
NgayDenHan date, -- Ngày Đến Hạn của sổ là ngày cuối sổ được tính lãi (Ngày
Khách hàng được rút tiền gốc và đúng lãi)
NgayTatToan date, -- Ngày khách hàng đến rút tất cả tiền lãi lần tiền gốc
MaChiNhanh varchar(10) references CHI_NHANH(MaChiNhanh), --Mã chi nhánh mở sổ
MaLoaiTien varchar(10) references LOAI_TIEN(MaLoaiTien), -- Mã loại tiền gửi
MaLoaiTietKiem varchar(10) references LOAI_TIET_KIEM(MaLoaiTietKiem), --Mã
loại tiết kiệm
NgayLaiNhapGoc date, -- Nếu trường hợp khách hàng không tất toán sổ sau ngày
đến hạn thì tự động gia hạn sổ với tiền gốc mới = gốc cũ + lãi, loại tiết kiệm giữ
nguyên.
KyTraLai int, -- Nếu trường hợp khách hàng chọn trả lãi đinh kỳ thì cần qui
định thêm kỳ trả lãi (< kỳ hạn)
HanGuiGop int, -- Nếu trường hợp khách hàng chọn gửi góp thì cần qui định
thêm hạn gửi định kỳ (< kỳ hạn)
TinhTrangSuDung bit DEFAULT 1,
NgayGuiGopTiepTheo date, -- Ngày gửi góp tiếp theo nếu gửi góp
NgayNhanLaiDinhKyTiepTheo date, -- Ngày nhận lãi định kỳ tiếp theo nếu gửi
lấy lãi định kỳ.
)

14
|Nhóm 03
5. Các ràng buộc khác
Ràng buộc mã khách hàng khi thêm khách hàng
-- Đặt ràng buộc mã khách hàng được tạo tự động.
USE QUANLYTAIKHOANTIETKIEM
CREATE TABLE KHACH_HANG
ADD CONSTRAINT AUTO_IDKHACHHANG
DEFAULT DBO.AUTO_IDCustomer() FOR MaKhachHang;
GO

Ràng buộc mã sổ khi thêm sổ

-- Đặt ràng buộc mã sổ được tạo tự động.


USE QUANLYTAIKHOANTIETKIEM
CREATE TABLE TAI_KHOAN_TIET_KIEM
ADD CONSTRAINT AUTO_IDSTKs
DEFAULT DBO.AUTO_IDSTK() FOR MaSoTK;
GO

6. Trigger kiểm tra các ràng buộc


Trigger kiểm tra và điều chỉnh một số ràng buộc liên quan đến loại tiết kiệm của sổ
-- Trigger kiểm tra và điều chỉnh một số ràng buộc liên quan đến loại tiết kiệm của sổ
CREATE TRIGGER Them_LTK ON LOAI_TIET_KIEM
AFTER INSERT
AS
DECLARE @maLoaiTK varchar(10), @maHinhthucgui varchar(10), @maHinhthuctralai varchar(10), @kyHan int
SELECT @maLoaiTK=nl.MaLoaiTietKiem, @maHinhthucgui=nl.MaHinhThucGui,
@maHinhthuctralai=nl.MaHinhThucTraLai, @kyHan=nl.KyHan
FROM inserted nl
BEGIN
if @maHinhthucgui='HTG_G'
BEGIN
--Với hình thức gửi góp thì hình thức trả lãi mặc định là trả sau và kỳ hạn phải trên
6 tháng
UPDATE LOAI_TIET_KIEM SET MaHinhThucTraLai='HTTL_S' WHERE MaLoaiTietKiem=@maLoaiTK;
if @kyHan<6
UPDATE LOAI_TIET_KIEM SET KyHan=6 WHERE MaLoaiTietKiem=@maLoaiTK;
END
if @kyHan=0
-- Nếu kỳ hạn là 0 thì đây là hình thức gửi không kỳ hạn
UPDATE LOAI_TIET_KIEM SET MaHinhThucTraLai='HTTL_S' WHERE MaLoaiTietKiem=@maLoaiTK;
END
GO

Trigger khi xóa nhân viên thì sẽ đánh dấu nhân viên nghỉ và xóa tài khoản đăng
nhập của người đó khỏi hệ thống
-- Trigger khi xóa nhân viên thì sẽ đánh dấu nhân viên nghỉ và xóa tài khoản đăng nhập của người đó
khỏi hệ thống
CREATE TRIGGER XoaNhanVien ON NHAN_VIEN
INSTEAD OF DELETE
AS
DECLARE @maNV varchar(10)
SELECT @maNV=ol.MaNhanVien
FROM deleted ol
SET XACT_ABORT ON
BEGIN TRAN
BEGIN TRY
-- Cập nhật tình trạng tình việc của nhân viên là đã nghỉ
UPDATE NHAN_VIEN SET TinhTrangLamViec=0 WHERE MaNhanVien=@maNV;

DECLARE @tenUser varchar(15);

15
|Nhóm 03
SELECT @tenUser=TenDangNhap FROM DANG_NHAP WHERE MaNhanVien=@maNV

-- Xóa user của nhân viên


DECLARE @sql varchar(100)
SET @sql = 'DROP USER '+ @tenUser
exec @sql

-- Xóa nhân viên khỏi phân nhóm


DELETE FROM PHAN_NHOM WHERE MaNhanVien=@maNV;

-- Xóa tài khoản login của nhân viên khỏi server


SET @sql = 'DROP LOGIN '+ @tenUser
exec @sql

-- Xóa tài khoản đăng nhập của nhân viên khỏi bảng Đăng nhập
DELETE FROM DANG_NHAP WHERE MaNhanVien=@maNV;
COMMIT TRAN
END TRY
BEGIN CATCH
ROLLBACK
END CATCH
GO

Trigger tạo một user trên SQL khi thêm một nhân viên
CREATE TRIGGER CreateSQLAccount ON DANG_NHAP
AFTER INSERT
AS
DECLARE @userName nvarchar(30), @passWord nvarchar(10)
SELECT @userName=nl.TenDangNhap, @passWord=nl.MatKhau
FROM inserted nl
BEGIN
DECLARE @sqlString nvarchar(2000)
-- Tạo tài khoản login cho nhân viên, tên người dùng và mật khẩu là tài khoản được tạo trên
bảng Đăng nhập
SET @sqlString= 'CREATE LOGIN [' + @userName +'] WITH PASSWORD='''+ @passWord +''',
DEFAULT_DATABASE=[QUANLYTAIKHOANTIETKIEM], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF'
EXEC (@sqlString)

-- Tạo tài khoản người dùng đối với nhân viên đó trên database (tên người dùng trùng với tên
login)
SET @sqlString= 'CREATE USER ' + @userName +' FOR LOGIN '+ @userName
EXEC (@sqlString)
END
GO

Trigger kiểm tra và điều chỉnh một số ràng buộc liên quan đến loại tiết kiệm của sổ
CREATE TRIGGER Them_LTK ON LOAI_TIET_KIEM
AFTER INSERT
AS
DECLARE @maLoaiTK varchar(10), @maHinhthucgui varchar(10), @maHinhthuctralai varchar(10), @kyHan int
SELECT @maLoaiTK=nl.MaLoaiTietKiem, @maHinhthucgui=nl.MaHinhThucGui,
@maHinhthuctralai=nl.MaHinhThucTraLai, @kyHan=nl.KyHan
FROM inserted nl
BEGIN
if @maHinhthucgui='HTG_G'
BEGIN
--Với hình thức gửi góp thì hình thức trả lãi mặc định là trả sau và kỳ hạn phải trên
6 tháng
UPDATE LOAI_TIET_KIEM SET MaHinhThucTraLai='HTTL_S' WHERE MaLoaiTietKiem=@maLoaiTK;
if @kyHan<6
UPDATE LOAI_TIET_KIEM SET KyHan=6 WHERE MaLoaiTietKiem=@maLoaiTK;
END
if @kyHan=0
-- Nếu kỳ hạn là 0 thì đây là hình thức gửi không kỳ hạn
UPDATE LOAI_TIET_KIEM SET MaHinhThucTraLai='HTTL_S' WHERE MaLoaiTietKiem=@maLoaiTK;
END
GO

Trigger Kiểm tra các thông tin về sổ tiết kiệm trước khi thêm một sổ mới.
CREATE TRIGGER THEM_TAI_KHOAN_TIET_KIEM ON TAI_KHOAN_TIET_KIEM

16
|Nhóm 03
AFTER INSERT
AS
DECLARE @maTK varchar(15), @maLoaiTK varchar(10), @kyTralai int, @hanGuigop int, @kyHanso int
SELECT @maTK=nl.MaSoTK, @maLoaiTK=nl.MaLoaiTietKiem, @kyTralai=nl.KyTraLai, @hanGuigop=nl.HanGuiGop
FROM inserted nl
BEGIN
BEGIN TRAN
BEGIN TRY
DECLARE @kyHan int, @maHinhthuctralai varchar(10), @maHinhthucgui varchar(10);
SET @kyHan= (SELECT KyHan from LOAI_TIET_KIEM where MaLoaiTietKiem=@maLoaiTK);

UPDATE TAI_KHOAN_TIET_KIEM SET NgayLaiNhapGoc=NgayMoSo where MaSoTK=@maTK;


if @kyHan=0
UPDATE TAI_KHOAN_TIET_KIEM SET NgayDenHan=null, NgayTatToan=null, KyTraLai=null,
HanGuiGop=null where MaSoTK=@maTK;
else
-- Đối với sổ có kỳ hạn
BEGIN
-- Tính ngày đến hạn của sổ
UPDATE TAI_KHOAN_TIET_KIEM SET NgayDenHan=DATEADD(day, 30*@kyHan, NgayMoSo) where
MaSoTK=@maTK;
SET @maHinhthuctralai= (SELECT MaHinhThucTraLai from LOAI_TIET_KIEM WHERE
MaLoaiTietKiem=@maLoaiTK);
SET @maHinhthucgui= (SELECT MaHinhThucGui from LOAI_TIET_KIEM WHERE
MaLoaiTietKiem=@maLoaiTK);

if @maHinhthucgui='HTG_1L'
BEGIN
-- Đối với gửi lãi trả trước hoặc trả sau:
if (@maHinhthuctralai='HTTL_S') OR (@maHinhthuctralai='HTTL_T')
UPDATE TAI_KHOAN_TIET_KIEM SET KyTraLai=@kyHan where MaSoTK=@maTK;
else
-- Đối với trả lãi định kỳ
if (@kyTralai>@kyHan) or (@kyHan % @kyTralai !=0) or (@kyTralai=null)
UPDATE TAI_KHOAN_TIET_KIEM SET KyTraLai=1 where MaSoTK=@maTK;
-- Tính ngày lấy lãi đầu tiên của sổ tiết kiệm định kỳ
UPDATE TAI_KHOAN_TIET_KIEM SET NgayNhanLaiDinhKyTiepTheo=DATEADD(day,
30*@kyTralai, NgayMoSo), NgayGuiGopTiepTheo=null where MaSoTK=@maTK;
END
else
BEGIN
if (@hanGuigop>@kyHan) or (@kyHan % @hanGuigop !=0) or (@hanGuigop=null)
UPDATE TAI_KHOAN_TIET_KIEM SET HanGuiGop=1 where
MaSoTK=@maTK;
-- Tính ngày gửi góp tiếp theo của sổ gửi góp
UPDATE TAI_KHOAN_TIET_KIEM SET NgayGuiGopTiepTheo=DATEADD(day, 30*@hanGuigop,
NgayMoSo), NgayNhanLaiDinhKyTiepTheo=null where MaSoTK=@maTK;
END
END
COMMIT TRAN
END TRY
BEGIN CATCH
ROLLBACK
END CATCH

END
GO

Trigger Kiểm tra khi một sổ tiết kiệm đã tất toán (đóng sổ) thì sẽ đóng tình trạng sử
dụng của chủ sổ (nếu chỉ có 1 sổ)
CREATE TRIGGER DongSo ON TAI_KHOAN_TIET_KIEM
AFTER UPDATE
AS
DECLARE @maSo varchar(15), @trangThai bit
SELECT @maSo=nl.MaSoTK, @trangThai=nl.TinhTrangSuDung
FROM inserted nl
BEGIN
DECLARE @num_Chu int, @index int=1, @TEMP varchar(10);
if (@trangThai=0)
BEGIN
DECLARE @chuMaso TABLE (Id int not null primary key identity(1,1), ChuSo varchar(10),
SoSo int);
INSERT INTO @chuMaso (ChuSo, SoSo) SELECT * FROM LAY_CHU_SO(@maSo) WHERE SoLuongSo=1;
SET @num_Chu = @@ROWCOUNT;
WHILE @index<=@num_Chu -- Countdown
BEGIN
SELECT @TEMP= ChuSo FROM @chuMaso WHERE Id=@index;
UPDATE KHACH_HANG SET DangSuDung=0 WHERE MaKhachHang=@TEMP;
SET @index = @index + 1;
END
END
17
|Nhóm 03
END
GO

7. Các view
a. View Thông tin chi tiết về chủ sổ và Thông tin của sổ
CREATE VIEW [dbo].[CHI_TIET_SO] AS

SELECT Chu.MaKhachHang, Chu.DiaChi, Chu.HoTen, Chu.MaDinhDanh, Chu.NgaySinh, Chu.SDT


,So.* FROM
(SELECT KHACH_HANG.*, SO_HUU.MaSoTK
FROM KHACH_HANG join SO_HUU on KHACH_HANG.MaKhachHang=SO_HUU.MaKhachHang) Chu
JOIN
(SELECT TAI_KHOAN_TIET_KIEM.MaSoTK, TAI_KHOAN_TIET_KIEM.NgayMoSo,
TAI_KHOAN_TIET_KIEM.NgayDenHan, TAI_KHOAN_TIET_KIEM.TinhTrangSuDung, CHI_NHANH.TenChiNhanh,
LOAI_TIEN.MaLoaiTien, hinhthuc.KyHan, TAI_KHOAN_TIET_KIEM.KyTraLai,
TAI_KHOAN_TIET_KIEM.NgayLaiNhapGoc, hinhthuc.tenHinhThucTraLai,
TAI_KHOAN_TIET_KIEM.NgayNhanLaiDinhKyTiepTheo, hinhthuc.LaiSuat,
hinhthuc.TenHinhThucGui, DBO.LaySoDu(TAI_KHOAN_TIET_KIEM.MaSoTK) AS SoDu
FROM TAI_KHOAN_TIET_KIEM
JOIN CHI_NHANH on TAI_KHOAN_TIET_KIEM.MaChiNhanh=CHI_NHANH.MaChiNhanh
JOIN LOAI_TIEN on TAI_KHOAN_TIET_KIEM.MaLoaiTien=LOAI_TIEN.MaLoaiTien
JOIN
(SELECT LOAI_TIET_KIEM.*, HINH_THUC_GUI.TenHinhThucGui,
HINH_THUC_TRA_LAI.TenHinhThucTraLai FROM
LOAI_TIET_KIEM JOIN HINH_THUC_GUI ON
LOAI_TIET_KIEM.MaHinhThucGui=HINH_THUC_GUI.MaHinhThucGui
JOIN HINH_THUC_TRA_LAI ON
LOAI_TIET_KIEM.MaHinhThucTraLai=HINH_THUC_TRA_LAI.MaHinhThucTraLai) hinhthuc ON
TAI_KHOAN_TIET_KIEM.MaLoaiTietKiem=hinhthuc.MaLoaiTietKiem
) So
ON Chu.MaSoTK=So.MaSoTK
GO

b. View Danh sách khách hàng còn đang sử dụng sổ tiết kiệm
CREATE VIEW [dbo].[DS_KhachHang] AS
SELECT *
FROM KHACH_HANG
WHERE DangSuDung=1;
GO
c. View Thông tin chi tiết của Nhân viên còn làm việc

CREATE VIEW [dbo].[DS_NhanVien] AS


SELECT temp1.HoTen, temp1.MaDinhDanh, temp1.MaNhanVien, temp1.NgaySinh,
temp1.SDT, temp1.TenChiNhanh, temp2.TenNhom FROM
(SELECT NHAN_VIEN.*, CHI_NHANH.TenChiNhanh
FROM NHAN_VIEN JOIN CHI_NHANH ON NHAN_VIEN.MaChiNhanh=CHI_NHANH.MaChiNhanh
where TinhTrangLamViec=1) temp1 JOIN
(SELECT PHAN_NHOM.MaNhanVien,NHOM_NGUOI_DUNG.TenNhom FROM
PHAN_NHOM JOIN NHOM_NGUOI_DUNG ON
PHAN_NHOM.MaNhomNguoiDung=NHOM_NGUOI_DUNG.MaNhomNguoiDung
) temp2 ON temp1.MaNhanVien=temp2.MaNhanVien
GO

d. View danh sách sổ gửi góp 1 lần

CREATE VIEW [dbo].[DS_SoGui1Lan] AS


SELECT MaSoTK FROM TAI_KHOAN_TIET_KIEM A JOIN LOAI_TIET_KIEM B ON
A.MaLoaiTietKiem=B.MaLoaiTietKiem
WHERE B.MaHinhThucGui='HTG_1L' and TinhTrangSuDung=1
GO

18
|Nhóm 03
e. View danh sách sổ gửi góp

CREATE VIEW [dbo].[DS_SoGuiGop] AS


SELECT MaSoTK FROM TAI_KHOAN_TIET_KIEM A JOIN LOAI_TIET_KIEM B ON
A.MaLoaiTietKiem=B.MaLoaiTietKiem
WHERE B.MaHinhThucGui='HTG_G' and TinhTrangSuDung=1
GO

f. View danh sách sổ trả lãi định kỳ

CREATE VIEW [dbo].[DS_SoTraLaiDinhKy]


AS
SELECT A.MaSoTK
FROM dbo.TAI_KHOAN_TIET_KIEM AS A INNER JOIN
dbo.LOAI_TIET_KIEM AS B ON A.MaLoaiTietKiem = B.MaLoaiTietKiem
WHERE (B.MaHinhThucTraLai = 'HTTL_DK') AND (A.TinhTrangSuDung = 1)
GO

g. View danh sách sổ trả lãi sau

CREATE VIEW [dbo].[DS_SoTraLaiSau]


AS
SELECT A.MaSoTK
FROM dbo.TAI_KHOAN_TIET_KIEM AS A INNER JOIN
dbo.LOAI_TIET_KIEM AS B ON A.MaLoaiTietKiem = B.MaLoaiTietKiem
WHERE (B.MaHinhThucTraLai = 'HTTL_S') AND (A.TinhTrangSuDung = 1)
GO

h. View danh sách sổ trả lãi trước

CREATE VIEW [dbo].[DS_SoTraLaiTruoc]


AS
SELECT A.MaSoTK
FROM dbo.TAI_KHOAN_TIET_KIEM AS A INNER JOIN
dbo.LOAI_TIET_KIEM AS B ON A.MaLoaiTietKiem = B.MaLoaiTietKiem
WHERE (B.MaHinhThucTraLai = 'HTTL_T') AND (A.TinhTrangSuDung = 1)
GO

i. View danh sách gửi tiết kiệm một lần

CREATE VIEW [dbo].[DS_TietKiemGui1Lan] AS


SELECT *
FROM LOAI_TIET_KIEM
WHERE MaHinhThucGui='HTG_1L'
GO

j. View danh sách gửi tiết kiệm gửi góp

CREATE VIEW [dbo].[DS_TietKiemGuiGop] AS


SELECT *
FROM LOAI_TIET_KIEM
WHERE MaHinhThucGui='HTG_G'
GO

19
|Nhóm 03
k. View tên hình thức gửi

CREATE VIEW [dbo].[TenHinhThuc]


as (
SELECT TenHinhThucGui as 'TenHinhThuc' FROM HINH_THUC_GUI
UNION
SELECT TenHinhThucTraLai from HINH_THUC_TRA_LAI
)
GO

20
|Nhóm 03
CHƯƠNG 3. THIẾT KẾ CÁC CHỨC NĂNG

1. Kết nối cơ sở dữ liệu


public class DB_Connect
{
SqlConnection link = null;
public SqlCommand comm = null;
SqlDataAdapter da = null;
string connectString;
public DB_Connect()
{
connectString = "Data Source=.;Initial
Catalog=QUANLYTAIKHOANTIETKIEMNGANHANG;Integrated Security=True";
link = new SqlConnection(connectString);
comm = link.CreateCommand();
}

2. Xem thông tin danh mục


2.1 Danh mục Chi nhánh
- View lấy danh sách danh mục chi nhánh và số nhân viên của chi nhánh đó

Create view DM_ChiNhanh AS


SELECT CHI_NHANH.MaChiNhanh,TenChiNhanh,DiaChi, SoLuong
From CHI_NHANH,SLNV
WHere CHI_NHANH.MaChiNhanh = SLNV.MaChiNhanh

2.2 Danh mục Loại tiết kiệm

- View lấy danh sách loại tiết kiệm

Create view DM_LOAI_TIET_KIEM AS


Select
MaLoaiTietKiem,HINH_THUC_GUI.TenHinhThucGui,HINH_THUC_TRA_LAI.TenHinhThucTraLai,KyHa
n,LaiSuat
FROM LOAI_TIET_KIEM,HINH_THUC_GUI,HINH_THUC_TRA_LAI
where LOAI_TIET_KIEM.MaHinhThucGui=HINH_THUC_GUI.MaHinhThucGui
and LOAI_TIET_KIEM.MaHinhThucTraLai =
HINH_THUC_TRA_LAI.MaHinhThucTraLai

2.3 Danh mục Loại giao dịch

- View danh sách loại giao dịch

CREATE VIEW DM_LOAI_GIAO_DICH AS


SELECT * FROM LOAI_GIAO_DICH

21
|Nhóm 03
2.4 Danh mục Loại tiền
- View danh mục loại tiền

CREATE VIEW DM_LOAI_TIEN AS


SELECT * FROM LOAI_TIEN

3. Quản lý nhân viên


3.1. Hiển thị danh sách nhân viên

- Lấy danh sách nhân viên đang làm việc


CREATE FUNCTION [dbo].[LAY_DSNHANVIEN]()
RETURNS TABLE
AS
RETURN
SELECT temp1.HoTen, temp1.MaDinhDanh, temp1.MaNhanVien, temp1.NgaySinh,
temp1.SDT,temp1.MaChiNhanh, temp1.TenChiNhanh, temp2.TenNhom FROM
(SELECT NHAN_VIEN.*, CHI_NHANH.TenChiNhanh
FROM NHAN_VIEN JOIN CHI_NHANH ON NHAN_VIEN.MaChiNhanh=CHI_NHANH.MaChiNhanh where
TinhTrangLamViec=1) temp1 left JOIN
(SELECT PHAN_NHOM.MaNhanVien,NHOM_NGUOI_DUNG.TenNhom FROM
PHAN_NHOM LEFT JOIN NHOM_NGUOI_DUNG ON
PHAN_NHOM.MaNhomNguoiDung=NHOM_NGUOI_DUNG.MaNhomNguoiDung
) temp2 ON temp1.MaNhanVien=temp2.MaNhanVien
GO

3.2. Thêm sửa xoá thông tin nhân viên


- Thêm Nhân viên vào bảng
Thêm thông tin của nhân viên vào bảng NHAN_VIEN đồng thời gọi thực thi
Procedure GanQuyenNhanVien
-- Procedure Thêm Nhân viên vào bảng
CREATE PROCEDURE [dbo].[ThemNhanVien] (@hoTen nvarchar(30), @ngaySinh date, @maDinhDanh
varchar(15), @SDT varchar(11), @maChiNhanh varchar(10), @maNhom varchar(10))
AS
BEGIN
SET XACT_ABORT ON
BEGIN TRAN
BEGIN TRY
DECLARE @maNV varchar(15)
SET @maNV = DBO.AUTO_IDNV()
INSERT INTO NHAN_VIEN(HoTen, NgaySinh, MaDinhDanh, SDT, MaChiNhanh) VALUES
(@hoTen, @ngaySinh, @maDinhDanh, @SDT, @maChiNhanh);
EXEC DBO.GanQuyenNhanVien @maNV , @maNhom
COMMIT TRAN
END TRY
BEGIN CATCH
ROLLBACK
DECLARE @err varchar(MAX)
SELECT @err = 'Lỗi: ' + ERROR_MESSAGE()
RAISERROR(@err, 16,1)
END CATCH
END

GO

22
|Nhóm 03
Procdure GanQuyenNhanVien sẽ thêm người dùng vào role tương ứng Staff
hoặc Manager sau đó ghi nhận mã nhân viên vào bảng PHAN_NHOM

--procedure gán quyền nhân viên


CREATE PROCEDURE [dbo].[GanQuyenNhanVien] (@maNhanVien varchar(10), @maNhomNguoiDung varchar(10))
AS
BEGIN
SET XACT_ABORT ON
BEGIN TRAN
BEGIN TRY
DECLARE @quyen varchar(15), @tenUser varchar(15),@sqlString varchar(1000);
SELECT @quyen=TenRole FROM NHOM_NGUOI_DUNG WHERE
MaNhomNguoiDung=@maNhomNguoiDung
SELECT @tenUser=TenDangNhap FROM DANG_NHAP WHERE MaNhanVien=@maNhanVien

-- Add người dùng vào role tương ứng (Staff hoặc Manager(sysadmin))
if (@quyen='sysadmin')
SET @sqlString = 'ALTER SERVER ROLE '+@quyen +' ADD MEMBER ' +
@tenUser;
else
BEGIN
SET @sqlString = 'ALTER ROLE '+ @quyen +' ADD MEMBER ' + @tenUser;
exec (@sqlString)
SET @sqlString = 'ALTER SERVER ROLE [BULKADMIN] ADD MEMBER' +
@tenUser;
exec (@sqlString)
END
-- Ghi nhận vào bảng phân nhóm
INSERT INTO PHAN_NHOM VALUES (@maNhanVien, @maNhomNguoiDung)
COMMIT TRAN
END TRY
BEGIN CATCH
ROLLBACK
DECLARE @err varchar(MAX)
SELECT @err = 'Lỗi: ' + ERROR_MESSAGE()
RAISERROR(@err, 16,1)
END CATCH
END
GO

- Sửa nhân viên

CREATE PROCEDURE [dbo].[SuaNhanVien] (@maNV varchar (10),@hoTen nvarchar(30),


@ngaySinh date, @maDinhDanh varchar(15), @SDT varchar(11), @maChiNhanh varchar(10))
AS
BEGIN
UPDATE NHAN_VIEN
SET HoTen=@hoTen,NgaySinh=@ngaySinh,
MaDinhDanh=@maDinhDanh,SDT=@SDT,MaChiNhanh=@maChiNhanh
where MaNhanVien=@maNV
END
GO

- Xóa nhân viên


Khi thực hiện xóa nhân viên trigger XoaNhanVien được thực thi đảm bảo trong bảng
NHAN_VIEN vẫn còn nhân viên đó nhưng tình trạng làm việc được cập nhật là đã nghỉ,
đồng thời xóa nhân viên ra khỏi nhóm trong bảng PHAN_NHOM và xóa user, tài khoản
đăng nhập của nhân viên ra khỏi cơ sở dữ liệu.
23
|Nhóm 03
CREATE TRIGGER [dbo].[XoaNhanVien] ON [dbo].[NHAN_VIEN]
INSTEAD OF DELETE
AS
DECLARE @maNV varchar(10)
SELECT @maNV=ol.MaNhanVien
FROM deleted ol
BEGIN
-- Cập nhật tình trạng tình việc của nhân viên là đã nghỉ
UPDATE NHAN_VIEN SET TinhTrangLamViec=0 WHERE MaNhanVien=@maNV;

DECLARE @tenUser varchar(15);


SELECT @tenUser=TenDangNhap FROM DANG_NHAP WHERE MaNhanVien=@maNV

-- Xóa user của nhân viên


DECLARE @sql varchar(100)
SET @sql = 'DROP USER '+ @tenUser
exec (@sql)

-- Xóa nhân viên khỏi phân nhóm


DELETE FROM PHAN_NHOM WHERE MaNhanVien=@maNV;

-- Xóa tài khoản login của nhân viên khỏi server


SET @sql = 'DROP LOGIN '+ @tenUser
exec (@sql)

-- Xóa tài khoản đăng nhập của nhân viên khỏi bảng Đăng nhập
DELETE FROM DANG_NHAP WHERE MaNhanVien=@maNV;
END
GO

4. Quản lý Sổ tiết kiệm


3.3. Tìm kiếm sổ tiết kiệm
- Phân loại hình thức để tìm kiếm loại tiết kiệm theo hình thức gửi và hình thức
trả lãi (view TEN_HINH_THUC)
- Hiển thị chi tiết danh sách sổ (view CHI_TIET_SO)
3.4. Tìm kiếm chủ sở hữu của sổ tiết kiệm
- Tìm kiếm chủ sở hữu của sổ tiết kiệm dùng function TIM_KIEM_SO_HUU
tìm kiếm chủ sở hữu sổ từ tên khách hàng

CREATE FUNCTION [dbo].[TIM_KIEM_SO_HUU](@HoTen nvarchar(40))


RETURNS TABLE
RETURN(
select *
from TAI_KHOAN_TIET_KIEM
where MaSoTK in (
SELECT TK.MaSoTK
FROM TAI_KHOAN_TIET_KIEM as TK, CHI_TIET_SO as So
where TK.MaSoTK = So.MaSoTK and So.HoTen = @HoTen
)
)
3.5. Thêm đồng sở hữu sổ tiết kiệm
- Sử dụng procedure DongSoHuu để thêm đồng sở cho sổ tiết kiệm

24
|Nhóm 03
CREATE PROCEDURE [dbo].[DongSoHuu] (@maSoTK NVARCHAR(10), @ngayPhatSinhGiaoDich date, @maNhanVien
varchar(10),
@hoTen NVARCHAR(30),@ngaySinh Date, @sdt
varchar(11), @maDinhDanh varchar(15),
@ngayCap Date, @noiCap nvarchar(100), @diaChi
nvarchar(100), @imageFolderPath nvarchar(1000)
)

AS
BEGIN
SET XACT_ABORT ON
BEGIN TRAN
BEGIN TRY
-- Thêm khách hàng mới
DECLARE @maKhachHang varchar(10)
BEGIN
SET @maKhachHang = DBO.AUTO_IDCustomer();
exec DBO.ThemKhachHang @hoTen, @ngaySinh, @sdt, @maDinhDanh, @ngayCap,
@noiCap, @diaChi, @imageFolderPath
END
-- Ghi nhận đồng sở hữu
INSERT INTO SO_HUU VALUES(@maKhachHang, @maSoTK)

-- Ghi nhận giao dịch Thêm chủ sở hữu


INSERT INTO GIAO_DICH_TIET_KIEM(MaSoTK, SoTienGiaoDich, NgayGiaoDich,
MaNhanVien, MaLoaiGiaoDich, NgayPhatSinhGiaoDich, DaThanhToan) VALUES (@maSoTK, 0 ,
@ngayPhatSinhGiaoDich, @maNhanvien, 'GD_DSH', @ngayPhatSinhGiaoDich, 1)
COMMIT TRAN
END TRY
BEGIN CATCH
ROLLBACK
END CATCH
END

5. Quản lý Giao dịch tiết kiệm


3.6. Mở sổ

Mở sổ thực hiện đồng thời thêm thông tin sổ tiết kiệm vào bảng
TAI_KHOAN_TIET_KIEM, thêm thông tin khách hàng vào bảng KHACH_HANG và
thiết lập mỗi quan hệ giữa khách hàng với sổ tại bảng SO_HUU.

- Thêm sổ gửi tiết kiệm một lần


CREATE PROCEDURE [dbo].[ThemSoGui1Lan] (@maKhachHang NVARCHAR(10), @tenKhachHang NVARCHAR(30),@ngaySinh
Date, @sdt varchar(11), @cccd varchar(15), @ngayCap Date, @noiCap nvarchar(100), @diaChi nvarchar(100),
@imageFolderPath nvarchar(1000), @khoanGui money,@maNhanvien varchar(10),
@ngayMoSo Date,@maLoaiTien varchar(10),
@kyHan int, @maHinhThucTraLai varchar(10), @kyTraLai int, @err nvarchar(MAX) out)
AS
BEGIN
SET XACT_ABORT ON
BEGIN TRAN
BEGIN TRY
DECLARE @maKhach varchar(10)
SET @maKhach=@maKhachHang
IF (@maKhach = 'none')
BEGIN
SET @maKhach = DBO.AUTO_IDCustomer();
exec DBO.ThemKhachHang @tenKhachHang, @ngaySinh, @sdt, @cccd,
@ngayCap, @noiCap, @diaChi, @imageFolderPath
END
DECLARE @maLoaiTK varchar(10), @maSomoi varchar(15), @maChiNhanh varchar(10);
SET @maSomoi= DBO.AUTO_IDSTK()
SET @maLoaiTK= (SELECT MaLoaiTietKiem FROM DS_TietKiemGui1Lan WHERE
KyHan=@kyHan and MaHinhThucTraLai= @maHinhThucTraLai)
SELECT @maChiNhanh=MaChiNhanh FROM NHAN_VIEN WHERE MaNhanVien=@maNhanvien
-- Thêm sổ mới

25
|Nhóm 03
INSERT INTO TAI_KHOAN_TIET_KIEM(NgayMoSo, MaChiNhanh, MaLoaiTien,
MaLoaiTietKiem, KyTraLai) VALUES (@ngayMoSo, @maChiNhanh, @maLoaiTien, @maLoaiTK, @kyTraLai)
--Xác nhận sở hữu vào bảng sở hữu.
INSERT INTO SO_HUU VALUES(@maSomoi, @maKhach)
-- Ghi nhận giao dịch và số dư của sổ
exec dbo.GiaoDichGuiLanDau @maSomoi, @khoanGui, @ngayMoSo, @maNhanvien

-- Phát sinh giao dịch lấy lãi trước nếu là sổ gửi góp
if @maHinhThucTraLai='HTTL_T'
exec dbo.PhatSinhLaiTruoc @maSomoi

COMMIT TRAN
END TRY
BEGIN CATCH
ROLLBACK
SELECT @err = 'Lỗi: ' + ERROR_MESSAGE()
END CATCH
END

- Thêm sổ gửi góp


CREATE PROCEDURE [dbo].[ThemSoGuiGop] (@maKhachHang NVARCHAR(10), @tenKhachHang NVARCHAR(30),@ngaySinh
Date, @sdt varchar(11), @cccd varchar(15), @ngayCap Date, @noiCap nvarchar(100), @diaChi nvarchar(100),
@imageFolderPath nvarchar(1000), @khoanGui money, @maNhanvien varchar(10),
@ngayMoSo Date, @maLoaiTien varchar(10),
@kyHan int, @hanGuiGop int, @err nvarchar(MAX) out)
AS
BEGIN
SET XACT_ABORT ON
BEGIN TRAN
BEGIN TRY
IF (@maKhachHang = 'none')
BEGIN
SET @maKhachHang = DBO.AUTO_IDCustomer();
exec DBO.ThemKhachHang @tenKhachHang, @ngaySinh, @sdt, @cccd,
@ngayCap, @noiCap, @diaChi, @imageFolderPath

END

DECLARE @maLoaiTK varchar(10), @maSomoi varchar(15), @maChiNhanh varchar(10)


SET @maSomoi= DBO.AUTO_IDSTK()
SET @maLoaiTK= (SELECT MaLoaiTietKiem FROM DS_TietKiemGuiGop WHERE
KyHan=@kyHan)
SELECT @maChiNhanh=MaChiNhanh FROM NHAN_VIEN WHERE MaNhanVien=@maNhanvien
-- Thêm sổ mới
INSERT INTO TAI_KHOAN_TIET_KIEM(NgayMoSo, MaChiNhanh, MaLoaiTien,
MaLoaiTietKiem, HanGuiGop) VALUES (@ngayMoSo, @maChiNhanh, @maLoaiTien, @maLoaiTK, @hanGuiGop)

--Xác nhận sở hữu vào bảng sở hữu.


INSERT INTO SO_HUU VALUES(@maSomoi, @maKhachHang)

-- Ghi nhận giao dịch và số dư của sổ


exec dbo.GiaoDichGuiLanDau @maSomoi, @khoanGui, @ngayMoSo, @maNhanvien
COMMIT TRAN
END TRY
BEGIN CATCH
ROLLBACK
SELECT @err = 'Lỗi: ' + ERROR_MESSAGE()
END CATCH
END

- Thêm khách hàng

-- Procedure thêm khách hàng


CREATE PROCEDURE [dbo].[ThemKhachHang] (@tenKhachHang NVARCHAR(30),@ngaySinh
varchar(15), @sdt varchar(11), @cccd varchar(15), @ngayCap varchar(15),
@noiCap nvarchar(100), @diaChi nvarchar(100), @imageFolderPath
nvarchar(1000))
AS
BEGIN

26
|Nhóm 03
DECLARE @tsql NVARCHAR(2000);
SET @tsql= 'INSERT INTO KHACH_HANG (HoTen, NgaySinh, SDT, MaDinhDanh,
NgayCap, NoiCap, DiaChi, ChuKy)' +
' SELECT ' + 'N''' + @tenKhachHang + '''' + ',' + '''' + @ngaySinh + '''' +
',' + '''' + @sdt + '''' + ',' + '''' + @cccd + '''' + ',' + '''' + @ngayCap
+ '''' + ',' + 'N''' + @noiCap + '''' + ',' + 'N''' + @diaChi + '''' + ',
* '+
'FROM Openrowset( Bulk ' + '''' + @imageFolderPath + '''' + ', Single_Blob)
as img'
EXEC (@tsql)
- END
- GO

3.7. Quản lý giao dịch tiết kiệm

* Hiển thị danh sách sổ, chi thiết thông tin của sổ theo chủ sổ

ALTER FUNCTION [dbo].[LayChiTietThongTinSo](@maDinhDanh varchar(15))


RETURNS TABLE
AS
RETURN (SELECT * FROM DBO.CHI_TIET_SO() WHERE MaDinhDanh=@maDinhDanh)

* Hiển thị lịch sử giao dịch của sổ

ALTER FUNCTION [dbo].[LayGiaoDichSoTK](@maSo varchar(15))


RETURNS @dsGiaoDich TABLE (MaGiaoDich varchar(10), MaLoaiGiaoDich varchar(10),
NgayPhatSinhGiaoDich date, NgayGiaoDich date, SoTienGiaoDich money, DaThanhToan bit,
TenLoaiGiaoDich nvarchar(50), HoTenNhanVienGiaoDich nvarchar(50))
AS
BEGIN
INSERT INTO @dsGiaoDich
SELECT a.MaGiaoDich, a.MaLoaiGiaoDich, a.NgayPhatSinhGiaoDich, a.NgayGiaoDich,
a.SoTienGiaoDich, a.DaThanhToan, b.TenLoaiGiaoDich, (SELECT NHAN_VIEN.HoTen FROM
NHAN_VIEN WHERE MaNhanVien=a.MaNhanVien)
FROM GIAO_DICH_TIET_KIEM a
join LOAI_GIAO_DICH b on a.MaLoaiGiaoDich=b.MaLoaiGiaoDich
WHERE MaSoTK=@maSo
RETURN
END

* Các function liên quan đến lấy thông tin chi tiết của các giao dịch sổ
- Lấy chi tiết giao dịch gửi tiền vào sổ tiết kiệm

27
|Nhóm 03
ALTER FUNCTION [dbo].[LayGiaoDichGuiLanDau](@maGiaoDich varchar(10))
RETURNS TABLE
AS
RETURN (SELECT b.HoTen as HoTenKH, b.MaDinhDanh, a.MaSoTK,a.SoTienGiaoDich,
d.MaLoaiTien, c.HoTen as HoTenNV, c.MaNhanVien
FROM GIAO_DICH_TIET_KIEM a
join KHACH_HANG b on a.MaKhachHangGiaoDich=b.MaKhachHang
join TAI_KHOAN_TIET_KIEM d on a.MaSoTK=d.MaSoTK
join NHAN_VIEN c on c.MaNhanVien=a.MaNhanVien
WHERE MaGiaoDich=@maGiaoDich)
-

- Lấy chi tiết giao dịch rút lãi

ALTER FUNCTION [dbo].[LayGiaoDichRutLaiDinhKy](@maGiaoDich varchar(10))


RETURNS @thongtin TABLE (HoTenKH nvarchar(50), MaDinhDanh varchar(15), MaSoTK varchar(15),
MaKH varchar(10), SoDu money, SoTienLai money, MaLoaiTien varchar(10),
HoTenNV nvarchar(50), MaNhanVien varchar(10),
LaiSuatTK float, KyHan int, KyTraLai int, tinhTrang bit, ngayGiaoDich date)
AS
BEGIN

DECLARE @tinhTrang bit;


INSERT INTO @thongtin
SELECT
(SELECT HoTen FROM KHACH_HANG WHERE MaKhachHang=a.MaKhachHangGiaoDich),
(SELECT MaDinhDanh FROM KHACH_HANG WHERE MaKhachHang=a.MaKhachHangGiaoDich),
a.MaSoTK, a.MaKhachHangGiaoDich, DBO.LaySoDu(a.MaSoTK, a.NgayPhatSinhGiaoDich)
,a.SoTienGiaoDich, d.MaLoaiTien,
(SELECT HoTen as HoTenNV FROM NHAN_VIEN WHERE MaNhanVien=a.MaNhanVien),
(SELECT MaNhanVien as HoTenNV FROM NHAN_VIEN WHERE MaNhanVien=a.MaNhanVien),
(SELECT LaiSuat FROM DBO.CHI_TIET_SO() e WHERE a.MaSoTK=e.MaSoTK),
(SELECT KyHan FROM DBO.CHI_TIET_SO() e WHERE a.MaSoTK=e.MaSoTK),
(SELECT KyTraLai FROM DBO.CHI_TIET_SO() e WHERE a.MaSoTK=e.MaSoTK),
a.DaThanhToan, a.NgayGiaoDich
FROM GIAO_DICH_TIET_KIEM a
join TAI_KHOAN_TIET_KIEM d on a.MaSoTK=d.MaSoTK
WHERE MaGiaoDich=@maGiaoDich
RETURN;
END

- Lấy chi tiết giao dịch tất toán đúng hạn

ALTER FUNCTION [dbo].[LayGiaoDichTatToanDungHan](@maGiaoDich varchar(10))


RETURNS @thongtin TABLE (HoTenKH nvarchar(50), MaDinhDanh varchar(15), MaSoTK varchar(15),
MaKH varchar(10), SoDu money, MaLoaiTien varchar(10),
HoTenNV nvarchar(50), MaNhanVien varchar(10),
tinhTrang bit, ngayGiaoDich date)
AS
BEGIN
INSERT INTO @thongtin
SELECT
(SELECT HoTen FROM KHACH_HANG WHERE MaKhachHang=a.MaKhachHangGiaoDich),
(SELECT MaDinhDanh FROM KHACH_HANG WHERE MaKhachHang=a.MaKhachHangGiaoDich),
a.MaSoTK, a.MaKhachHangGiaoDich, a.SoTienGiaoDich , d.MaLoaiTien,
(SELECT HoTen FROM NHAN_VIEN WHERE MaNhanVien=a.MaNhanVien),
(SELECT MaNhanVien FROM NHAN_VIEN WHERE MaNhanVien=a.MaNhanVien),

28
|Nhóm 03
a.DaThanhToan, a.NgayGiaoDich
FROM GIAO_DICH_TIET_KIEM a
join TAI_KHOAN_TIET_KIEM d on a.MaSoTK=d.MaSoTK
WHERE MaGiaoDich=@maGiaoDich
RETURN;
END

- Lấy chi tiết giao dịch tất toán trước hạn

ALTER FUNCTION [dbo].[LayGiaoDichTatToanTruocHan_So1Lan](@maGiaoDich varchar(10))


RETURNS @thongtin TABLE (HoTenKH nvarchar(50), MaDinhDanh varchar(15), MaSoTK
varchar(15), MaKH varchar(10), SoDu money, KhauTru money, MaLoaiTien varchar(10),
HoTenNV nvarchar(50), MaNhanVien
varchar(10), TongTien money, tinhTrang bit, ngayGiaoDich date)
AS
BEGIN
DECLARE @soDu money, @khauTru money, @soTK varchar(15), @thucTe money
SELECT @soDu=DBO.LaySoDu(B.MaSoTK, a.NgayPhatSinhGiaoDich),
@thucTe=a.SoTienGiaoDich FROM GIAO_DICH_TIET_KIEM A JOIN TAI_KHOAN_TIET_KIEM B ON
A.MaSoTK=B.MaSoTK WHERE MaGiaoDich=@maGiaoDich
SET @khauTru= @soDu - @thucTe
INSERT INTO @thongtin
SELECT
b.HoTen as HoTenKH, b.MaDinhDanh, a.MaSoTK, a.MaKhachHangGiaoDich, @soDu ,
@khauTru, d.MaLoaiTien, c.HoTen as HoTenNV, c.MaNhanVien,
a.SoTienGiaoDich ,a.DaThanhToan, a.NgayGiaoDich
FROM GIAO_DICH_TIET_KIEM a
join KHACH_HANG b on a.MaKhachHangGiaoDich=b.MaKhachHang
join TAI_KHOAN_TIET_KIEM d on a.MaSoTK=d.MaSoTK
join NHAN_VIEN c on c.MaNhanVien=a.MaNhanVien
WHERE MaGiaoDich=@maGiaoDich
RETURN;
END

- Lấy chi tiết giao dịch Gia hạn sổ:

-- Lấy giao dịch gia hạn sổ


ALTER FUNCTION [dbo].[LayGiaoDichGiaHanSo](@maGiaoDich varchar(10))
RETURNS @thongtin TABLE (MaSoTK varchar(15), LaiSuat float, KyHan int, LoaiTien varchar(10),
ngayNhapGocCu date, ngayDenHanCu date, SoDuCu money, ngayNhapGocMoi date, ngayDenHanMoi date, SoDuMoi
money)

AS
BEGIN
INSERT INTO @thongtin
SELECT a.MaSoTK,
(SELECT LaiSuat FROM LOAI_TIET_KIEM WHERE MaLoaiTietKiem=d.MaLoaiTietKiem),
(SELECT KyHan FROM LOAI_TIET_KIEM WHERE MaLoaiTietKiem=d.MaLoaiTietKiem),
(SELECT LoaiTien FROM LOAI_TIEN WHERE MaLoaiTien=d.MaLoaiTien),
(SELECT MAX(NgayGhiNhanSoDu) FROM SO_DU_TAI_KHOAN WHERE NgayGhiNhanSoDu<d.NgayLaiNhapGoc),
d.NgayLaiNhapGoc, DBO.LaySoDu(a.MaSoTK, DATEADD(DAY, -1, d.NgayLaiNhapGoc)),
d.NgayLaiNhapGoc, d.NgayDenHan, a.SoTienGiaoDich
FROM GIAO_DICH_TIET_KIEM a
join TAI_KHOAN_TIET_KIEM d on a.MaSoTK=d.MaSoTK
WHERE MaGiaoDich=@maGiaoDich
RETURN;
END

29
|Nhóm 03
* Các Procedure liên quan đến thao tác thực hiện xác nhận thanh toán giao dịch
của nhân viên
- Procedure xác nhận giao dịch rút lãi

ALTER procedure [dbo].[LayLaiDinhKy] (@maSoTK varchar(15), @maNhanvien varchar(10),


@ngaylaylai date, @maKhachHang varchar(10), @err nvarchar(MAX) out)
as
BEGIN

DECLARE @ngayNhanLaiTiepTheo date, @kytralai int, @ngayLaiNhapGoc date,


@ngayDenHan date
select @kytralai=KyTraLai FROM TAI_KHOAN_TIET_KIEM WHERE MaSoTK= @maSoTK
-- Tính ngày lấy lãi tiếp theo dựa trên ngày thực tế lấy lãi của khách hàng

SELECT @ngayLaiNhapGoc=NgayLaiNhapGoc, @ngayDenHan=NgayDenHan FROM


TAI_KHOAN_TIET_KIEM WHERE MaSoTK=@maSoTK
SET @ngayNhanLaiTiepTheo = DATEADD(day, 30*@kytralai, @ngaylaylai)
DECLARE @maGiaoDich varchar(10), @ngayPhatSinh date
SELECT @maGiaoDich=MaGiaoDich, @ngayPhatSinh=NgayPhatSinhGiaoDich FROM
GIAO_DICH_TIET_KIEM A JOIN TAI_KHOAN_TIET_KIEM B ON A.MaSoTK= B.MaSoTK WHERE
B.MaSoTK=@maSoTK AND A.MaLoaiGiaoDich='GD_RLDK' AND A.DaThanhToan=0

SET XACT_ABORT ON
BEGIN TRAN
BEGIN TRY
if (@ngayPhatSinh>@ngayLaiNhapGoc and @ngayPhatSinh!=@ngayDenHan)
-- Phát sinh kỳ nhận lãi định kỳ mới
UPDATE TAI_KHOAN_TIET_KIEM SET
NgayNhanLaiDinhKyTiepTheo=@ngayNhanLaiTiepTheo,NgayDenHan=DATEADD(day,DATEDIFF(day,@ngayP
hatSinh,@ngaylaylai),NgayDenHan) where MaSoTK=@maSoTK;
-- Xác nhận thanh toán
UPDATE GIAO_DICH_TIET_KIEM SET MaNhanVien=@maNhanvien,
NgayGiaoDich=@ngaylaylai, MaKhachHangGiaoDich=@maKhachHang, DaThanhToan=1 where
MaGiaoDich=@maGiaoDich
COMMIT TRAN
END TRY
BEGIN CATCH
ROLLBACK
SELECT @err = 'Lỗi: ' + ERROR_MESSAGE()
END CATCH
END

- Procedure xác nhận giao dịch tất toán đúng hạn

-- Procedure Tất toán sổ gửi đúng thời hạn (bao gồm cả tất toán sổ không kỳ hạn)
ALTER PROCEDURE [dbo].[TatToanDungHan] (@maSoTK NVARCHAR(10), @ngayGiaoDich date,
@maNhanvien varchar(10), @maKhachHang varchar(10))
AS
BEGIN
SET XACT_ABORT ON
BEGIN TRAN
BEGIN TRY
DECLARE @type varchar(10), @count1 int, @count2 int,
@soTienPhatSinh money, @hinhThucTraLai varchar(10)
SET @type= (SELECT MaLoaiTietKiem FROM TAI_KHOAN_TIET_KIEM WHERE
MaSoTK=@maSoTK)

SET @count1 = (SELECT COUNT(*) FROM DS_TietKiemGuiGop WHERE


MaLoaiTietKiem=@type)

30
|Nhóm 03
SET @count2 = (SELECT COUNT(*) FROM DS_TietKiemGui1Lan WHERE
MaLoaiTietKiem=@type)
if (@count1!=0)
-- Đối với gửi góp, khách hàng đến tất toán sẽ nhận được tiền gốc
đã gửi và tiền lãi kép tính theo ngày
-- Giao dịch này tự động phát sinh khi sổ gửi góp đến Ngày đến hạn
BEGIN
--Xác nhận tất toán sổ
UPDATE GIAO_DICH_TIET_KIEM SET MaNhanVien=@maNhanvien,
MaKhachHangGiaoDich=@maKhachHang, DaThanhToan=1, NgayGiaoDich=@ngayGiaoDich WHERE
MaSoTK=@maSoTK and MaLoaiGiaoDich='GD_TTDH'
END
else
-- Đối với gửi một lần
BEGIN
DECLARE @laisuat float, @kyhan int
SET @hinhThucTraLai = (SELECT MaHinhThucTraLai FROM
DS_TietKiemGui1Lan WHERE MaLoaiTietKiem=@type)
SET @laisuat = (SELECT LaiSuat FROM
DS_TietKiemGui1Lan WHERE MaLoaiTietKiem=@type)
SET @kyhan = (SELECT KyHan FROM DS_TietKiemGui1Lan
WHERE MaLoaiTietKiem=@type)
-- Nhân viên thực hiện các giao dịch rút lãi (nếu
có) và thực hiện tất toán tiền gốc của sổ.
--Lấy số tiền gốc của sổ
DECLARE @tiengoc money
select @tiengoc =DBO.LaySoDu(@maSoTK, GETDATE())
--Đánh dấu tất toán sổ
UPDATE TAI_KHOAN_TIET_KIEM SET
NgayTatToan=@ngayGiaoDich, TinhTrangSuDung=0 where MaSoTK=@maSoTK;
-- Ghi nhận giao dịch tất toán
INSERT INTO GIAO_DICH_TIET_KIEM(MaSoTK,
SoTienGiaoDich, NgayGiaoDich, MaNhanVien, MaLoaiGiaoDich, NgayPhatSinhGiaoDich,
MaKhachHangGiaoDich, DaThanhToan) VALUES (@maSoTK, @tiengoc, @ngayGiaoDich, @maNhanvien,
'GD_TTDH', @ngayGiaoDich,@maKhachHang,1)
END
COMMIT TRAN
END TRY
BEGIN CATCH
ROLLBACK
DECLARE @err varchar(MAX)
SELECT @err = 'Lỗi: ' + ERROR_MESSAGE()
RAISERROR(@err, 16, 1)
END CATCH
END

- Procedure xác nhận giao dịch tất toán trước hạn

-- Procedure Tất toán trước hạn


ALTER PROCEDURE [dbo].[TatToanTruocHan] (@maSoTK NVARCHAR(10), @ngayGiaoDich date,
@maNhanvien varchar(10), @maKhachHang varchar(10))

AS
BEGIN
SET XACT_ABORT ON
BEGIN TRAN
BEGIN TRY
DECLARE @hinhThucGui varchar(10)
SET @hinhThucGui= (SELECT MaHinhThucGui FROM
TAI_KHOAN_TIET_KIEM A JOIN LOAI_TIET_KIEM B ON A.MaLoaiTietKiem=B.MaLoaiTietKiem
WHERE MaSoTK=@maSoTK)
if (@hinhThucGui = 'HTG_1L')
-- Đối với gửi 1 lần
31
|Nhóm 03
BEGIN
DECLARE @type varchar(10), @soTienPhatSinh money,
@hinhThucTraLai varchar(10), @tienlaithucte money, @tiengoc money
SET @type= (SELECT MaLoaiTietKiem FROM
TAI_KHOAN_TIET_KIEM WHERE MaSoTK=@maSoTK)
SET @hinhThucTraLai= (SELECT MaHinhThucTraLai FROM
LOAI_TIET_KIEM WHERE MaLoaiTietKiem=@type)
Select @tiengoc=SoDu from SO_DU_TAI_KHOAN where MaSoTK=
@maSoTK and NgayGhiNhanSoDu=(SELECT MAX(NgayGhiNhanSoDu) FROM SO_DU_TAI_KHOAN WHERE
MaSoTK=@maSoTK)

-- Phát sinh giao dịch nhận lãi trước hạn


EXEC DBO.NhanLaiTruocHan @maSoTK, @tienlaithucte out,
@ngayGiaoDich, @maNhanvien, @maKhachHang

if (@hinhThucTraLai='HTTL_S')
-- Đối với hình thức trả sau, khách hàng đến tất toán sẽ
nhận được tiền gốc và lãi tính theo mức lãi gửi tiết kiệm không kỳ han
BEGIN
-- Khách hàng sẽ nhận lại được toàn bộ tiền gốc
và tiền lãi đã phát sinh trong giao dịch nhận lãi
SET @soTienPhatSinh = @tiengoc
END
else if (@hinhThucTraLai='HTTL_T')
--Tất toán đối với hình thức trả lãi trước, khách hàng
sẽ phải hoàn lại ngân hàng khoản chênh giữa tiền lãi đã nhận và tiền lãi tính theo
mức lãi không thời hạn, khoảng này sẽ được khấu trừ vào tiền gốc khách hàng nhận lại
BEGIN
DECLARE @soTienDaNhan money,
@soTienLaiThucTe money, @maGiaoDich varchar(10)
-- Xem tiền lãi đã được nhận chưa
SELECT @maGiaoDich=MaGiaoDich,
@soTienDaNhan=SoTienGiaoDich FROM GIAO_DICH_TIET_KIEM A JOIN TAI_KHOAN_TIET_KIEM B
ON A.MaSoTK= B.MaSoTK WHERE B.MaSoTK=@maSoTK AND A.MaLoaiGiaoDich='GD_RLT' AND
A.DaThanhToan=1
if (@maGiaoDich is NULL) SET
@soTienDaNhan=0
--Tính tổng số tiền khách hàng sẽ nhận
SET @soTienPhatSinh = @tiengoc +
(@tienlaithucte-@soTienDaNhan)
END
else
-- Với hình thức gửi lấy lãi định kỳ, khách hàng cũng sẽ
phải trả lại khoản chênh lệch giữa tiền đã nhận định kỳ và tiền lãi tính theo mức
lãi không thời hạn
BEGIN
DECLARE @daNhan money
SET @daNhan= (SELECT SUM(SoTienGiaoDich)
FROM
GIAO_DICH_TIET_KIEM A JOIN TAI_KHOAN_TIET_KIEM B ON A.MaSoTK=B.MaSoTK
WHERE A.MaSoTK=@maSoTK
and MaLoaiGiaoDich='GD_RLDK' and DATEDIFF(DAY, NgayGiaoDich, NgayLaiNhapGoc)<0 and
DaThanhToan=1)
SET @soTienPhatSinh = @tiengoc + (@tienlaithucte-
@DaNhan)
END
--Đánh dấu tất toán sổ
UPDATE TAI_KHOAN_TIET_KIEM SET
NgayTatToan=@ngayGiaoDich, TinhTrangSuDung=0 where MaSoTK=@maSoTK;
-- Ghi nhận giao dịch tất toán
INSERT INTO GIAO_DICH_TIET_KIEM(MaSoTK, SoTienGiaoDich,
NgayGiaoDich, MaNhanVien, MaLoaiGiaoDich, NgayPhatSinhGiaoDich,MaKhachHangGiaoDich,
DaThanhToan) VALUES (@maSoTK, @soTienPhatSinh, @ngayGiaoDich, @maNhanvien,
'GD_TTTH', @ngayGiaoDich, @maKhachHang,1)

32
|Nhóm 03
END
else
BEGIN
-- Đối với sổ gửi góp, giao dịch tất toán có thể phát sinh
trước khi khách hàng yêu cầu giao dịch tất toán (do gửi góp quá trễ),
-- Nên việc đánh dấu sổ đóng đã được thực hiện khi giao dịch
tất toán được phát sinh, khi khách hàng đến tất toán
-- chỉ cần đánh dấu giao dịch rút lãi trước hạn đã thực hiện
DECLARE @maGD1 varchar(10), @maGD2 varchar(10);
SELECT @maGD1=MaGiaoDich FROM GIAO_DICH_TIET_KIEM WHERE
MaSoTK=@maSoTK AND MaLoaiGiaoDich='GD_TTTH' and DaThanhToan=0
if (@maGD1 is null)
-- Phát sinh giao dịch tất toán nếu chưa có
exec dbo.NhanLaiTruocHanGuiGop @maSoTk,
@ngayGiaoDich
SELECT @maGD1=MaGiaoDich FROM GIAO_DICH_TIET_KIEM WHERE
MaSoTK=@maSoTK AND MaLoaiGiaoDich='GD_TTTH' and DaThanhToan=0
SELECT @maGD2=MaGiaoDich FROM GIAO_DICH_TIET_KIEM WHERE
MaSoTK=@maSoTK AND MaLoaiGiaoDich='GD_RLTH' and DaThanhToan=0
-- Đánh dấu xác nhận đã thực hiện giao dịch lấy lãi
trước hạn
UPDATE GIAO_DICH_TIET_KIEM SET DaThanhToan=1,
MaNhanVien=@maNhanvien, NgayGiaoDich=@ngayGiaoDich, MaKhachHangGiaoDich=@maKhachHang
WHERE MaGiaoDich=@maGD2
-- Đánh dấu xác nhận đã thực hiện giao dịch tất toán
UPDATE GIAO_DICH_TIET_KIEM SET DaThanhToan=1,
MaNhanVien=@maNhanvien, NgayGiaoDich=@ngayGiaoDich, MaKhachHangGiaoDich=@maKhachHang
WHERE MaGiaoDich=@maGD1
END
COMMIT TRAN
END TRY
BEGIN CATCH
ROLLBACK
DECLARE @err varchar(MAX)
SELECT @err = ERROR_MESSAGE()
RAISERROR(@err, 16, 1);
END CATCH
END

- Procedure ghi nhận giao dịch gửi góp

-- Procedure Gửi góp (Khi gửi góp thêm, hệ thống tính lãi kép theo ngày kỳ trước,
cho ra số dư mới, rồi cộng với khoản gửi thêm, cho ra số dư hiện tại)
ALTER PROCEDURE [dbo].[GuiGop] (@maSoTK NVARCHAR(10), @soTien money, @ngayGiaoDich
date, @maNhanvien varchar(10),@maKhachHang varchar(10), @maGiaoDich varchar(10) out)

AS
BEGIN
SET XACT_ABORT ON
BEGIN TRAN
BEGIN TRY
DECLARE @soducuoi money, @tienlaiKytruoc money,@kyHan int,
@tongTien money, @kyGuiGop int, @ngayDenHan date, @ngayGuiGop date
-- Ghi nhận số dư mới = gốc + lãi kép theo ngày của kỳ trước +
số tiền gửi thêm.
SET @soducuoi = DBO.LaySoDu(@maSoTK, DATEADD(DAY, -1,
@ngayGiaoDich))
SET @tienlaiKytruoc = DBO.TinhLaiKepGuiGop(@maSoTK,
@ngayGiaoDich)
SET @tongTien = @soducuoi + @tienlaiKytruoc+@soTien

33
|Nhóm 03
EXEC DBO.GhiNhanSoDu @maSoTK, @tongTien, @ngayGiaoDich
-- Ghi nhận giao dịch
SET @maGiaoDich = DBO.AUTO_IDGD();
INSERT INTO GIAO_DICH_TIET_KIEM(MaSoTK, SoTienGiaoDich,
NgayGiaoDich, MaNhanVien, MaLoaiGiaoDich,NgayPhatSinhGiaoDich, MaKhachHangGiaoDich,
DaThanhToan) VALUES (@maSoTK, @soTien, @ngayGiaoDich, @maNhanvien, 'GD_GG',
@ngayGiaoDich, @maKhachHang, 1)
-- Phát sinh thời điểm gửi góp tiếp theo
SELECT @kyGuiGop=HanGuiGop, @ngayDenHan=NgayDenHan,
@ngayGuiGop=NgayGuiGopTiepTheo FROM TAI_KHOAN_TIET_KIEM WHERE MaSoTK=@maSoTK
if (DATEADD(DAY,@kyGuiGop*30, @ngayGuiGop)<@ngayDenHan)
UPDATE TAI_KHOAN_TIET_KIEM SET
NgayGuiGopTiepTheo=DATEADD(DAY, @kyGuiGop*30, NgayGuiGopTiepTheo) where
MaSoTK=@maSoTK;
COMMIT TRAN
END TRY
BEGIN CATCH
ROLLBACK
DECLARE @err varchar(MAX)
SELECT @err = 'Lỗi: ' + ERROR_MESSAGE()
SELECT @err
END CATCH
END

4. Quản lý Khách hàng


4.1. Tìm kiếm khách hàng

CREATE FUNCTION [dbo].[TIM_KIEM_KHACH_HANG](@maDinhDanh nvarchar(40))


RETURNS TABLE
RETURN(
SELECT*
FROM KHACH_HANG
WHERE MADINHDANH = @maDinhDanh
)

4.2. Sửa thông tin khách hàng

CREATE PROCEDURE [dbo].[SuaKhachHang] (


@maKhachHang nvarchar(10),@hoTen NVARCHAR(30),@ngaySinh varchar(15), @sdt varchar(11), @maDinhDanh
varchar(15),
@ngayCap varchar(15), @noiCap nvarchar(100), @diaChi nvarchar(100), @imageFolderPath nvarchar(max))
AS
BEGIN
UPDATE KHACH_HANG
SET
HoTen = @hoTen,
NgaySinh = @ngaySinh,
SDT = @sdt,
MaDinhDanh = @maDinhDanh,
NgayCap = @ngayCap,
NoiCap = @noiCap,
DiaChi = @diaChi
WHERE
MaKhachHang = @maKhachHang
IF NOT (@imageFolderPath = N'')
BEGIN
DECLARE @tsql NVARCHAR(2000);
SET @tsql= 'UPDATE KHACH_HANG ' +
'SET ChuKy = (SELECT *FROM Openrowset( Bulk ' + '''' + @imageFolderPath + ''''
+ ', Single_Blob) as img)'
+ 'WHERE MaKhachHang = ''' + @maKhachHang+ ''''

34
|Nhóm 03
EXEC (@tsql)
select(@tsql)
END
END

5. Các Procedure liên quan khác

5.1. Thủ tục liên quan đến giao dịch ngân hàng

- Thủ tục ghi nhận số dư mới của sổ: được thực hiện trong chức năng
gia hạn
ALTER PROCEDURE [dbo].[GhiNhanSoDu] (@maSoTK NVARCHAR(10), @soDu money, @ngayGhiNhan date)

AS
BEGIN
DECLARE @ID varchar(5);
SET @ID = (SELECT DBO.AUTO_IDSDTK(@maSoTK))
INSERT INTO SO_DU_TAI_KHOAN(MaSoDu,MaSoTK, NgayGhiNhanSoDu, SoDu) VALUES (@ID, @maSoTK,
@ngayGhiNhan, @soDu);
END

- Procedure Giao dịch gửi tiết kiệm lần đầu

ALTER PROCEDURE [dbo].[GiaoDichGuiLanDau] (@maSoTK NVARCHAR(10), @soTien money,


@ngayGiaoDich date, @maNhanvien varchar(10))
AS
BEGIN
exec DBO.GhiNhanSoDu @maSoTK, @soTien, @ngayGiaoDich
INSERT INTO GIAO_DICH_TIET_KIEM(MaSoTK, SoTienGiaoDich, NgayGiaoDich, MaNhanVien,
MaLoaiGiaoDich, NgayPhatSinhGiaoDich ,DaThanhToan) VALUES (@maSoTK, @soTien, @ngayGiaoDich,
@maNhanvien, 'GD_GTTK',@ngayGiaoDich, 1);
END

- Procedure Sổ gửi góp


Procedure Gửi góp (Khi gửi góp thêm, hệ thống tính lãi kép theo ngày kỳ trước, cho ra
số dư mới, rồi cộng với khoản gửi thêm, cho ra số dư hiện tại)
ALTER PROCEDURE [dbo].[GuiGop] (@maSoTK NVARCHAR(10), @soTien money, @ngayGiaoDich date, @maNhanvien
varchar(10), @err nvarchar(MAX) out)
AS
BEGIN
SET XACT_ABORT ON
BEGIN TRAN
BEGIN TRY
DECLARE @soducuoi money, @kyTruoc date, @tienlaiKytruoc money, @lai float,
@type varchar(10), @kyHan int, @tongTien money
SET @soducuoi = (SELECT MAX(SoDu) FROM SO_DU_TAI_KHOAN WHERE MaSoTK=@maSoTK)
SET @kyTruoc = (SELECT NgayGhiNhanSoDu FROM SO_DU_TAI_KHOAN WHERE
MaSoTK=@maSoTK AND SoDu=@soducuoi)
SET @type= (SELECT MaLoaiTietKiem FROM TAI_KHOAN_TIET_KIEM WHERE
MaSoTK=@maSoTK)
SET @lai = (SELECT LaiSuat FROM DS_TietKiemGuiGop WHERE MaLoaiTietKiem=@type)
SET @kyHan = (SELECT KyHan FROM DS_TietKiemGuiGop WHERE MaLoaiTietKiem=@type)
SET @tienlaiKytruoc = (SELECT DBO.TINH_LAI_KEP(@kyTruoc, @ngayGiaoDich,
@soducuoi, @lai, @kyHan))
-- Ghi nhận số dư mới = gốc + lãi kép theo ngày của kỳ trước + số tiền gửi
thêm.
SET @tongTien = @soducuoi + @tienlaiKytruoc+@soTien
EXEC DBO.GhiNhanSoDu @maSoTK, @ngayGiaoDich, @tongTien
-- Ghi nhận giao dịch
35
|Nhóm 03
INSERT INTO GIAO_DICH_TIET_KIEM(MaSoTK, SoTienGiaoDich, NgayGiaoDich,
MaNhanVien, MaLoaiGiaoDich) VALUES (@maSoTK, @soTien, @ngayGiaoDich, @maNhanvien, 'GD_GG')
COMMIT TRAN
END TRY
BEGIN CATCH
ROLLBACK
SELECT @err = 'Lỗi: ' + ERROR_MESSAGE()
END CATCH
END

- Phát sinh giao dịch

ALTER PROCEDURE [dbo].[PhatSinhGiaoDich] (@today date)


AS
BEGIN
SET XACT_ABORT ON
BEGIN TRAN
BEGIN TRY
-- Duyệt trong danh sách sổ, có sổ nào tới ngày phát sinh giao dịch không, nếu đúng ngày thì
gọi hàm phát sinh giao dịch
DECLARE @index INT, @max INT, @maSo varchar(15), @ngayDenHan date,
@ngayNhanLai date, @ngayGuiGop date, @hinhThucGuiLai varchar(10),
@tinhTrangSo bit
set @index=1
-- set @index = CONVERT(INT, (SELECT (RIGHT(MaSoTK, 3)) FROM TAI_KHOAN_TIET_KIEM))
SELECT @max= COUNT(*) FROM TAI_KHOAN_TIET_KIEM
WHILE @index <= @max
BEGIN
-- Lấy từng sổ trong danh sách
SELECT @maSo=MaSoTK, @tinhTrangSo=TinhTrangSuDung FROM TAI_KHOAN_TIET_KIEM WHERE
RIGHT(MaSoTK,3)=@index
if @tinhTrangSo=1
BEGIN
-- Đối với các sổ gửi một lần
if @maSo IN (SELECT MaSoTK FROM DS_SoGui1Lan)
BEGIN
SELECT @maSo=MaSoTK FROM DS_SoGui1Lan WHERE RIGHT(MaSoTK,3)=@index
SELECT @hinhThucGuiLai=B.MaHinhThucTraLai FROM TAI_KHOAN_TIET_KIEM A
JOIN LOAI_TIET_KIEM B ON A.MaLoaiTietKiem=B.MaLoaiTietKiem WHERE A.MaSoTK=@maSo
SELECT @ngayDenHan=NgayDenHan, @ngayNhanLai=NgayNhanLaiDinhKyTiepTheo
FROM TAI_KHOAN_TIET_KIEM WHERE MaSoTK=@maSo

-- Nếu đến hạn nhận lãi định kỳ, phát sinh giao dịch lãi
if @hinhThucGuiLai='HTTL_DK' and @ngayNhanLai=@today
exec dbo.PhatSinhLaiDinhKy @maSo

-- Nếu là sổ nhận lãi sau, phát sinh lãi vào ngày đến hạn
if @hinhThucGuiLai='HTTL_S' and @ngayDenHan=@today
exec dbo.PhatSinhLaiSau @maSo

-- Nếu sổ quá ngày đến hạn thì phát sinh gia hạn sổ
if @ngayDenHan < @today
exec dbo.GiaHanSo @maSo, @today
END
ELSE
BEGIN
-- Đối với sổ gửi góp
-- Kiểm tra nếu sổ đóng trễ hạn quá 20 ngày thì tất toán và đóng sổ.
SELECT @ngayGuiGop=NgayGuiGopTiepTheo FROM TAI_KHOAN_TIET_KIEM WHERE
MaSoTK=@maSo
IF (@ngayGuiGop < @today)
BEGIN
DECLARE @ngayTre int
SET @ngayTre= DATEDIFF(DAY, @ngayGuiGop, @today)
if (@ngayTre>20)
exec dbo.NhanLaiTruocHanGuiGop @maSo, @today
END
END
END
SET @index = @index + 1;
END
COMMIT TRAN
END TRY

36
|Nhóm 03
BEGIN CATCH
ROLLBACK
END CATCH
END

5.2. Thủ tục các giao dịch tự động phát sinh


- Procedure Gia hạn sổ
(Trường hợp khách hàng không muốn tất toán sổ, ngân hàng sẽ gia hạn thêm kỳ hạn mới
như kỳ cũ, lãi được nhập vào gốc, Không áp dụng đối với sổ gửi góp)
ALTER PROCEDURE [dbo].[GiaHanSo] (@maSoTK NVARCHAR(10), @ngayPhatSinhGiaoDich date, @err nvarchar(MAX)
out)
AS
BEGIN
SET XACT_ABORT ON
BEGIN TRAN
BEGIN TRY
DECLARE @kyHan int, @hinhThucTraLai varchar(10), @tienGoc money, @tienPhatSinh
money
SELECT @kyHan=KyHan, @hinhThucTraLai=B.MaHinhThucTraLai FROM
TAI_KHOAN_TIET_KIEM A JOIN LOAI_TIET_KIEM B ON A.MaLoaiTietKiem=B.MaLoaiTietKiem WHERE MaSoTK=@maSoTK

Select @tienGoc=SoDu from SO_DU_TAI_KHOAN where MaSoTK= @maSoTK and


NgayGhiNhanSoDu=(SELECT MAX(NgayGhiNhanSoDu) FROM SO_DU_TAI_KHOAN WHERE MaSoTK=@maSoTK)
SET @tienPhatSinh=@tienGoc
-- Gia hạn thêm Ngày Đến hạn, ghi nhận Ngày lãi nhập gốc
UPDATE TAI_KHOAN_TIET_KIEM SET NgayDenHan=DATEADD(DAY, 30*@kyHan,
NgayLaiNhapGoc), NgayLaiNhapGoc=@ngayPhatSinhGiaoDich WHERE MaSoTK=@maSoTK

-- Ghi nhận số dư (Các hoạt động xác nhận ý kiến khách hàng có rút lãi hay
không được thực hiện trước khi gọi hàm này)

IF (@hinhThucTraLai='HTTL_S')
-- Nếu khách hàng không rút gốc và lãi, lãi sẽ được cộng vào gốc của kỳ sau.
BEGIN
DECLARE @laiKyTruoc money
SET @laiKyTruoc = (SELECT SoTienGiaoDich FROM
GIAO_DICH_TIET_KIEM WHERE MaSoTK=@maSoTK and DaThanhToan=0)
IF (@laiKyTruoc=NULL) SET @laiKyTruoc=0
SET @tienPhatSinh= @tienGoc+ @laiKyTruoc
INSERT INTO SO_DU_TAI_KHOAN(MaSoTK, NgayGhiNhanSoDu, SoDu)
VALUES (@maSoTK, @ngayPhatSinhGiaoDich, @tienPhatSinh)
END
else if (@hinhThucTraLai='HTTL_DK')
-- Tiền lãi của định kỳ cuối nếu khách hàng chưa lên nhận thì ngân hàng sẽ giữ
hộ, và sẽ gia hạn sổ với tiền gốc.
INSERT INTO SO_DU_TAI_KHOAN(MaSoTK, NgayGhiNhanSoDu, SoDu)
VALUES (@maSoTK, @ngayPhatSinhGiaoDich, @tienGoc)
else
-- Với hình thức gửi lấy lãi trước, nếu đến ngày đến hạn thì ngân hàng sẽ giữ
hộ phần lãi được phát sinh trong kỳ mới,
-- Nếu qua ngày đến hạn của kỳ sau mà khách hàng vẫn chưa nhận lãi của kỳ
trước thì sẽ được nhập vào gốc cho kỳ sau, đồng thời phát sinh tính lãi cho kỳ sau với gốc mới.
BEGIN
DECLARE @tienChuaNhan money
SELECT @tienChuaNhan=SoTienGiaoDich FROM GIAO_DICH_TIET_KIEM A JOIN
TAI_KHOAN_TIET_KIEM B ON A.MaSoTK= B.MaSoTK WHERE B.MaSoTK=@maSoTK AND A.MaLoaiGiaoDich='GD_RLT' AND
A.DaThanhToan=0
if (@tienChuaNhan=null) SET @tienChuaNhan=0
-- Ghi nhận số dư như số dư gốc
INSERT INTO SO_DU_TAI_KHOAN(MaSoTK, NgayGhiNhanSoDu, SoDu) VALUES
(@maSoTK, @ngayPhatSinhGiaoDich, @tienGoc+ @tienChuaNhan)
EXEC DBO.PhatSinhLaiTruoc @maSoTK, @tienGoc
END
INSERT INTO GIAO_DICH_TIET_KIEM(MaSoTK, SoTienGiaoDich, NgayGiaoDich,
MaLoaiGiaoDich, NgayPhatSinhGiaoDich, DaThanhToan) VALUES (@maSoTK, @tiengoc, @ngayPhatSinhGiaoDich,
'GD_GH', @ngayPhatSinhGiaoDich, 1)
COMMIT TRAN
END TRY
BEGIN CATCH
ROLLBACK
SELECT @err = 'Lỗi: ' + ERROR_MESSAGE()

37
|Nhóm 03
END CATCH
END

- Procedure phát sinh các giao dịch tính lãi


+ Tính lãi định kỳ
-- Procedure Phát sinh lãi định kỳ (sẽ tự phát sinh khi đến ngày lấy lãi định kỳ của
sổ, kỳ mới sẽ đc phát sinh sau khi khách hàng đến nhận lãi kỳ trước
ALTER procedure [dbo].[PhatSinhLaiDinhKy](@maSoTK varchar(15))
as
declare @Laisuat float,@kytralai int,@maLoaiTK varchar(10),@tiengoc money
BEGIN
-- Phát sinh khi khách hàng đến rút lãi kỳ trước
declare @soTienPhatSinh money, @ngayPhatSinh date
select @tiengoc=dbo.LaySoDu(@maSoTK, GETDATE())
select @maLoaiTK=MaLoaiTietKiem,
@kytralai=KyTraLai,@ngayPhatSinh=NgayNhanLaiDinhKyTiepTheo FROM TAI_KHOAN_TIET_KIEM
WHERE MaSoTK= @maSoTK
-- Tính số tiền lãi nhận được định kỳ
SET @soTienPhatSinh= (SELECT DBO.TIEN_LAI_DINH_KY(@tiengoc, @maLoaiTK,
@kytralai))
-- Cập nhật giao dịch
INSERT INTO GIAO_DICH_TIET_KIEM(MaSoTK, SoTienGiaoDich, MaLoaiGiaoDich,
NgayPhatSinhGiaoDich) VALUES (@maSoTK, @soTienPhatSinh,'GD_RLDK', @ngayPhatSinh);
END

+ Tính lãi trước


-- Procedure Phát sinh lãi lấy trước đối với sổ gửi lấy lãi trước khi mới gửi, hoặc
qua một kỳ hạn mới.

ALTER PROCEDURE [dbo].[PhatSinhLaiTruoc] (@maSoTK NVARCHAR(10))

AS
BEGIN
DECLARE @ngaybatdau date, @ngayketthuc date, @maLoaiTK varchar(10), @tienlai
money, @goc money, @laisuat float, @kyHan int, @ngayPhatSinh date
Select @goc=DBO.LaySoDu(@maSoTK, GETDATE())
SELECT @ngaybatdau=NgayLaiNhapGoc, @ngayketthuc=NgayDenHan,
@maLoaiTK=MaLoaiTietKiem, @ngayPhatSinh=NgayLaiNhapGoc FROM TAI_KHOAN_TIET_KIEM
WHERE MaSoTK=@maSoTK
SELECT @laisuat=LaiSuat, @kyHan=KyHan FROM LOAI_TIET_KIEM WHERE
MaLoaiTietKiem=@maLoaiTK
--Tính tiền lãi
SET @tienlai= (SELECT DBO.TINH_LAI_DON(@ngaybatdau, @ngayketthuc, @goc,
@laisuat, @kyHan))
-- Ghi nhận giao dịch lấy lãi trước
SELECT @ngaybatdau, @ngayketthuc
INSERT INTO GIAO_DICH_TIET_KIEM(MaSoTK, SoTienGiaoDich, MaLoaiGiaoDich,
NgayPhatSinhGiaoDich) VALUES (@maSoTK, @tienlai, 'GD_RLT', @ngayPhatSinh);
UPDATE TAI_KHOAN_TIET_KIEM SET NgayNhanLaiDinhKyTiepTheo=NgayLaiNhapGoc
END

+ Tính lãi sau:


-- Procedure Phát sinh trả sau đối với sổ gửi lấy sau khi đến hạn.
ALTER PROCEDURE [dbo].[PhatSinhLaiSau] (@maSoTK NVARCHAR(10))

AS
BEGIN

38
|Nhóm 03
DECLARE @ngaybatdau date, @ngayketthuc date, @maLoaiTK varchar(10), @tienlai
money, @goc money, @laisuat float, @kyHan int, @ngayPhatSinh date
SELECT @goc=SoDu from SO_DU_TAI_KHOAN where MaSoTK=@maSoTK and
NgayGhiNhanSoDu=(SELECT MAX(NgayGhiNhanSoDu) FROM SO_DU_TAI_KHOAN WHERE
MaSoTK=@maSoTK)
SELECT @ngaybatdau=NgayLaiNhapGoc, @ngayketthuc=NgayDenHan,
@maLoaiTK=MaLoaiTietKiem, @ngayPhatSinh=NgayDenHan FROM TAI_KHOAN_TIET_KIEM WHERE
MaSoTK=@maSoTK
SELECT @laisuat=LaiSuat, @kyHan=KyHan FROM LOAI_TIET_KIEM WHERE
MaLoaiTietKiem=@maLoaiTK
-- Tính tiền lãi
SET @tienlai= (SELECT DBO.TINH_LAI_DON(@ngaybatdau, @ngayketthuc, @goc,
@laisuat, @kyHan))
-- Ghi nhận giao dịch lấy lãi sau
INSERT INTO GIAO_DICH_TIET_KIEM(MaSoTK, SoTienGiaoDich, MaLoaiGiaoDich,
NgayPhatSinhGiaoDich) VALUES (@maSoTK, @tienlai, 'GD_RLS', @ngayPhatSinh);
END

- Procedure Phát sinh giao dịch nhận lãi trước hạn đối với sổ gửi 1 lần

ALTER PROCEDURE [dbo].[NhanLaiTruocHan] (@maSoTK NVARCHAR(10), @soTien money out, @ngayGiaoDich date)

AS
BEGIN
DECLARE @tiengoc money, @ngayNhapGoc date
Select @tiengoc=SoDu from SO_DU_TAI_KHOAN where MaSoTK= @maSoTK and NgayGhiNhanSoDu=(SELECT
MAX(NgayGhiNhanSoDu) FROM SO_DU_TAI_KHOAN WHERE MaSoTK=@maSoTK)
SET @ngayNhapgoc = (SELECT NgayLaiNhapGoc FROM TAI_KHOAN_TIET_KIEM WHERE MaSoTK= @maSoTK)
SET @soTien= (SELECT DBO.TIEN_LAI_TAT_TOAN_TRUOC_HAN(@tiengoc, @ngayNhapGoc, @ngayGiaoDich))
INSERT INTO GIAO_DICH_TIET_KIEM(MaSoTK, SoTienGiaoDich,NgayGiaoDich, MaLoaiGiaoDich,
NgayPhatSinhGiaoDich, DaThanhToan) VALUES (@maSoTK, @soTien, @ngayGiaoDich , 'GD_RLTH', @ngayGiaoDich,
1);
END

- Giao dịch tự động tất toán sổ gửi góp nếu khách hàng gửi góp quá trễ hạn

ALTER PROCEDURE [dbo].[NhanLaiTruocHanGuiGop] (@maSoTK NVARCHAR(10), @ngayPhatSinh


date)
AS
BEGIN
DECLARE @tongTien money, @ngayBatDau date, @lai money;
SELECT @tongTien= SUM(SoTienGiaoDich) FROM GIAO_DICH_TIET_KIEM WHERE
MaSoTK=@maSoTK
SET @lai = DBO.TIEN_LAI_TAT_TOAN_TRUOC_HAN_GUI_GOP(@maSoTK, @ngayPhatSinh)

-- Phát sinh giao dịch tính lãi trước hạn


INSERT INTO GIAO_DICH_TIET_KIEM(MaSoTK, SoTienGiaoDich,MaLoaiGiaoDich,
NgayPhatSinhGiaoDich) VALUES (@maSoTK, @lai,'GD_RLTH', @ngayPhatSinh);
-- Đánh dấu tất toán sổ
UPDATE TAI_KHOAN_TIET_KIEM SET NgayTatToan=@ngayPhatSinh, TinhTrangSuDung=0
where MaSoTK=@maSoTK;
-- Phát sinh giao dịch tất toán, nhưng chưa thanh toán.
INSERT INTO GIAO_DICH_TIET_KIEM(MaSoTK, SoTienGiaoDich, MaLoaiGiaoDich,
NgayPhatSinhGiaoDich) VALUES (@maSoTK, @tongTien,'GD_TTTH', @ngayPhatSinh)

END

39
|Nhóm 03
6. Các function liên quan khác
6.1. Hàm đọc bảng
- Function kiểm tra khách hàng mới hay cũ
CREATE FUNCTION [dbo].[KIEM_TRA_KH] (@MaDinhDanh varchar(15))
RETURNS table AS
RETURN
(
SELECT *
FROM
KHACH_HANG
WHERE KHACH_HANG.MaDinhDanh=@MaDinhDanh
)

- Function lấy chủ sở hữu từ mã sổ


CREATE FUNCTION [dbo].[LAY_CHU_SO] (@MaSo varchar(15))
RETURNS TABLE AS
RETURN
(
SELECT Chu_So.MaKhachHang, Count(Chu_So.MaKhachHang) as SoLuongSo
FROM
(SELECT MaKhachHang
FROM SO_HUU
WHERE MaSoTK=@MaSo) Chu_So LEFT JOIN SO_HUU ON
Chu_So.MaKhachHang=SO_HUU.MaKhachHang
GROUP BY Chu_So.MaKhachHang
)

- Function lấy sổ tiết kiệm từ mã định danh khách hàng


CREATE FUNCTION [dbo].[LAY_SOTK] (@MaDinhDanh varchar(15))
RETURNS TABLE AS
RETURN
(
SELECT MaSoTK FROM
KHACH_HANG JOIN SO_HUU ON KHACH_HANG.MaKhachHang=SO_HUU.MaKhachHang
WHERE KHACH_HANG.MaDinhDanh=@MaDinhDanh
)

- Function lấy thông tin chi tiết sổ tiết kiệm


CREATE FUNCTION [dbo].[LayChiTietThongTinSo](@maDinhDanh varchar(15))
RETURNS TABLE
AS
RETURN (SELECT * FROM CHI_TIET_SO WHERE MaDinhDanh=@maDinhDanh)

6.2. Hàm đơn trị tự động tạo id

- Hàm tự động tạo mã khách hàng khi thêm mới khách hàng

CREATE FUNCTION [dbo].[AUTO_IDCustomer]()


RETURNS VARCHAR(10)
AS
BEGIN

40
|Nhóm 03
DECLARE @ID VARCHAR(5)
IF (SELECT COUNT(*) FROM KHACH_HANG) = 0
SET @ID = '0'
ELSE
SELECT @ID = MAX(RIGHT(MaKhachHang, 3)) FROM KHACH_HANG
SELECT @ID = CASE
WHEN @ID >= 0 and @ID < 9 THEN 'KH00' + CONVERT(CHAR, CONVERT(INT,
@ID) + 1)
WHEN @ID >= 9 THEN 'KH0' + CONVERT(CHAR, CONVERT(INT, @ID) + 1)
END
RETURN @ID
END

- Hàm tạo mã giao dịch tự động

CREATE FUNCTION [dbo].[AUTO_IDGD]()


RETURNS VARCHAR(10)
AS
BEGIN
DECLARE @ID VARCHAR(5)
IF (SELECT COUNT(*) FROM GIAO_DICH_TIET_KIEM) = 0
SET @ID = '0'
ELSE
SELECT @ID = MAX(RIGHT(MaGiaoDich, 3)) FROM GIAO_DICH_TIET_KIEM
SELECT @ID = CASE
WHEN @ID >= 0 and @ID < 9 THEN 'GD00' + CONVERT(CHAR, CONVERT(INT,
@ID) + 1)
WHEN @ID >= 9 THEN 'GD0' + CONVERT(CHAR, CONVERT(INT, @ID) + 1)
END
RETURN @ID
END

- Function tự động tạo mã nhân viên khi thêm nhân viên

CREATE FUNCTION [dbo].[AUTO_IDNV]()


RETURNS VARCHAR(10)
AS
BEGIN
DECLARE @ID VARCHAR(5)
IF (SELECT COUNT(*) FROM NHAN_VIEN) = 0
SET @ID = '0'
ELSE
SELECT @ID = MAX(RIGHT(MaNhanVien, 3)) FROM NHAN_VIEN
SELECT @ID = CASE
WHEN @ID >= 0 and @ID < 9 THEN 'NV00' + CONVERT(CHAR, CONVERT(INT,
@ID) + 1)
WHEN @ID >= 9 THEN 'NV0' + CONVERT(CHAR, CONVERT(INT, @ID) + 1)
END
RETURN @ID
END

- Hàm tạo mã số dư tự động

CREATE FUNCTION [dbo].[AUTO_IDSDTK](@maSo varchar(15))


RETURNS VARCHAR(10)
AS
BEGIN
DECLARE @ID VARCHAR(5)

41
|Nhóm 03
IF (SELECT COUNT(*) FROM SO_DU_TAI_KHOAN where MaSoTK=@maSo)=0
SET @ID = '0'
ELSE
SELECT @ID = MAX(RIGHT(MaSoDu, 3)) FROM SO_DU_TAI_KHOAN
SELECT @ID = CASE
WHEN @ID >= 0 and @ID < 9 THEN 'SD00' + CONVERT(CHAR, CONVERT(INT,
@ID) + 1)
WHEN @ID >= 9 THEN 'SD0' + CONVERT(CHAR, CONVERT(INT, @ID) + 1)
END
RETURN @ID
END

- Hàm tự động tạo mã sổ khi thêm mới sổ

CREATE FUNCTION [dbo].[AUTO_IDSTK]()


RETURNS VARCHAR(15)
AS
BEGIN
DECLARE @ID VARCHAR(6)
IF (SELECT COUNT(*) FROM TAI_KHOAN_TIET_KIEM) = 0
SET @ID = '0'
ELSE
SELECT @ID = MAX(RIGHT(MaSoTK, 3)) FROM TAI_KHOAN_TIET_KIEM
SELECT @ID = CASE
WHEN @ID >= 0 and @ID < 9 THEN 'STK00' + CONVERT(CHAR,
CONVERT(INT, @ID) + 1)
WHEN @ID >= 9 THEN 'STK0' + CONVERT(CHAR, CONVERT(INT, @ID) + 1)
END
RETURN @ID
END

6.3. Hàm đơn trị tính lãi

- Function Tính tiền lãi đơn

CREATE FUNCTION [dbo].[TINH_LAI_DON](@dayStart date, @dayEnd date, @goc money, @lai


float, @kyHan int)
RETURNS MONEY
AS
BEGIN
return (DATEDIFF(DAY, @dayStart, @dayEnd))*(@lai/(@kyHan*30*100))*@goc
END

- Function Tính tiền lãi kép

CREATE FUNCTION [dbo].[TINH_LAI_KEP](@dayStart date, @dayEnd date, @goc money, @lai


float, @kyHan int)
RETURNS MONEY
AS
BEGIN
DECLARE @dis int, @count int =0, @total money=@goc, @laisuat float, @temp
money=0;
SET @dis = DATEDIFF(DAY, @dayStart, @dayEnd);
SET @laisuat= @lai/(@kyHan*30*100)
while (@count<@dis)
BEGIN
SET @temp= @total*@laisuat
42
|Nhóm 03
SET @total=@total+@temp;
SET @count=@count+1
END
return @total-@goc
END

- Function tính tiền lãi định kỳ

CREATE FUNCTION [dbo].[TIEN_LAI_DINH_KY](@tienGoc money, @maLoaiTK varchar(10),


@kyNhanLai int)
RETURNS MONEY
AS
BEGIN
DECLARE @laisuat float, @kyHanGui int
SELECT @laisuat=LaiSuat, @kyHanGui=KyHan FROM LOAI_TIET_KIEM WHERE
MaLoaiTietKiem=@maLoaiTK
RETURN @tiengoc*(@laisuat/(100*@kyHanGui)*@kyNhanLai)
END

- Function tính tiền lãi nếu tất toán sổ trước hạn

CREATE FUNCTION [dbo].[TIEN_LAI_TAT_TOAN_TRUOC_HAN](@tienGoc money, @ngaybatdau date,


@ngaytattoan date)
RETURNS MONEY
AS
BEGIN
DECLARE @laikoDinhKy float
SET @laikoDinhKy = (SELECT LaiSuat FROM LOAI_TIET_KIEM WHERE KyHan=0)
RETURN (SELECT DBO.TINH_LAI_DON(@ngaybatdau, @ngaytattoan,@tienGoc,
@laikoDinhKy,12))
END

6.4. Hàm đơn trị khác

- Function bỏ dấu cho chuỗi tiếng việt.


Dùng cho Trigger khi thêm một nhân viên thì tự động tạo tài khoản đăng nhập
database cho nhân viên với tên đăng nhập là chữ cái viết tắt của họ lót và tên, Mật khẩu
là chuỗi ngẫu nhiên 6 ký tự
CREATE FUNCTION [dbo].[BODAU](@strInput NVARCHAR(30))
RETURNS NVARCHAR(30)
AS
BEGIN
IF @strInput IS NULL RETURN @strInput
IF @strInput = '' RETURN @strInput
DECLARE @RT NVARCHAR(30)
DECLARE @SIGN_CHARS NCHAR(136)
DECLARE @UNSIGN_CHARS NCHAR (136)
SET @SIGN_CHARS = N'ăâđêôơưàảãạáằẳẵặắầẩẫậấèẻẽẹéềểễệế
ìỉĩịíòỏõọóồổỗộốờởỡợớùủũụúừửữựứỳỷỹỵý
ĂÂĐÊÔƠƯÀẢÃẠÁẰẲẴẶẮẦẨẪẬẤÈẺẼẸÉỀỂỄỆẾÌỈĨỊÍ
ÒỎÕỌÓỒỔỖỘỐỜỞỠỢỚÙỦŨỤÚỪỬỮỰỨỲỶỸỴÝ'
+NCHAR(272)+ NCHAR(208)
SET @UNSIGN_CHARS = N'aadeoouaaaaaaaaaaaaaaaeeeeeeeeee
iiiiiooooooooooooooouuuuuuuuuuyyyyy

43
|Nhóm 03
AADEOOUAAAAAAAAAAAAAAAEEEEEEEEEEIIIII
OOOOOOOOOOOOOOOUUUUUUUUUUYYYYYDD'
DECLARE @COUNTER int
DECLARE @COUNTER1 int
SET @COUNTER = 1
WHILE (@COUNTER <=LEN(@strInput))
BEGIN
SET @COUNTER1 = 1
WHILE (@COUNTER1 <=LEN(@SIGN_CHARS)+1)
BEGIN
IF UNICODE(SUBSTRING(@SIGN_CHARS, @COUNTER1,1))
= UNICODE(SUBSTRING(@strInput,@COUNTER ,1) )
BEGIN
IF @COUNTER=1
SET @strInput = SUBSTRING(@UNSIGN_CHARS, @COUNTER1,1)
+ SUBSTRING(@strInput, @COUNTER+1,LEN(@strInput)-1)
ELSE
SET @strInput = SUBSTRING(@strInput, 1, @COUNTER-1)
+SUBSTRING(@UNSIGN_CHARS, @COUNTER1,1)
+ SUBSTRING(@strInput, @COUNTER+1,LEN(@strInput)-@COUNTER)
BREAK
END
SET @COUNTER1 = @COUNTER1 +1
END
SET @COUNTER = @COUNTER +1
END
--SET @strInput = replace(@strInput,' ','-')
RETURN @strInput
END

- Function lấy số dư

CREATE FUNCTION [dbo].[LaySoDu](@maSo varchar(15))


RETURNS MONEY
AS
BEGIN
return (SELECT SoDu FROM SO_DU_TAI_KHOAN WHERE MaSoTK=@maSo AND MaSoDu=(SELECT
MAX(MaSoDu) FROM SO_DU_TAI_KHOAN WHERE MaSoTK=@maSo))
END

44
|Nhóm 03
CHƯƠNG 4. TẠO USER VÀ PHÂN QUYỀN

Ứng với hai nhóm người dùng (Nhân viên giao dịch và quản lý) là các role riêng
+ Đối với Role Staff (dành cho nhân viên giao dịch): Tạo mới Database Role Staff và
gán các quyền cần thiết cho role.

CREATE ROLE Staff


--Gán các quyền trên table cho role Staff
GRANT SELECT, REFERENCES ON CHI_NHANH TO Staff
GRANT SELECT, REFERENCES ON DANG_NHAP TO Staff
GRANT SELECT, INSERT, UPDATE, REFERENCES ON GIAO_DICH_TIET_KIEM TO Staff
GRANT SELECT, REFERENCES ON HINH_THUC_GUI TO Staff
GRANT SELECT, REFERENCES ON HINH_THUC_TRA_LAI TO Staff
GRANT SELECT, INSERT, DELETE, UPDATE, REFERENCES ON KHACH_HANG TO Staff
GRANT SELECT, REFERENCES ON LOAI_GIAO_DICH TO Staff
GRANT SELECT, REFERENCES ON LOAI_TIEN TO Staff
GRANT SELECT, REFERENCES ON LOAI_TIET_KIEM TO Staff
GRANT SELECT, REFERENCES ON NHAN_VIEN TO Staff
GRANT SELECT, REFERENCES ON NHOM_NGUOI_DUNG TO Staff
GRANT SELECT, REFERENCES ON PHAN_NHOM TO Staff
GRANT SELECT, INSERT, UPDATE, REFERENCES ON SO_DU_TAI_KHOAN TO Staff
GRANT SELECT, INSERT, UPDATE, REFERENCES ON SO_HUU TO Staff
GRANT SELECT, INSERT, UPDATE, REFERENCES ON TAI_KHOAN_TIET_KIEM TO Staff
-- Gán quyền thực thi trên các procedure, function cho role Staff
GRANT EXECUTE TO Staff
GRANT SELECT TO Staff

DENY UPDATE, INSERT ON NHAN_VIEN to Staff;


DENY EXECUTE ON SuaNhanVien to Staff;
DENY EXECUTE ON ThemNhanVien to Staff;

+ Đối với Role Manager, yêu cần cần có quyền gán quyền cho nhân viên, sử dụng server
role sysadmin cho Manager.
Với mỗi nhân viên được thêm vào, ta tạo một tài khoản login được ghi nhận trên table
database và tạo một tài khoản login tương ứng trên server cùng một tài khoản user trong
database. Sau đó thêm user vào role tương ứng.
- Trigger tạo tài khoản login và user khi tài khoản được tạo trên bảng DANG_NHAP

ALTER TRIGGER [dbo].[CreateSQLAccount] ON [dbo].[DANG_NHAP]


AFTER INSERT
AS
DECLARE @userName nvarchar(30), @passWord nvarchar(10)
SELECT @userName=nl.TenDangNhap, @passWord=nl.MatKhau
FROM inserted nl
BEGIN
DECLARE @sqlString nvarchar(2000)

45
|Nhóm 03
-- Tạo tài khoản login cho nhân viên, tên người dùng và mật khẩu là tài khoản
được tạo trên bảng Đăng nhập
SET @sqlString= 'CREATE LOGIN [' + @userName +'] WITH PASSWORD='''+ @passWord
+''', DEFAULT_DATABASE=[QUANLYSOTIETKIEMNGANHANG], CHECK_EXPIRATION=OFF,
CHECK_POLICY=OFF'
EXEC (@sqlString)

-- Tạo tài khoản người dùng đối với nhân viên đó trên database (tên người
dùng trùng với tên login)
SET @sqlString= 'CREATE USER ' + @userName +' FOR LOGIN '+ @userName
EXEC (@sqlString)
END

- Procedure thêm user nhân viên vào một nhóm người dùng

ALTER PROCEDURE [dbo].[GanQuyenNhanVien] (@maNhanVien varchar(10), @maNhomNguoiDung varchar(10), @err


nvarchar(MAX) out)
AS
BEGIN
SET XACT_ABORT ON
BEGIN TRAN
BEGIN TRY
DECLARE @quyen varchar(15), @tenUser varchar(15),@sqlString varchar(1000);
SELECT @quyen=TenRole FROM NHOM_NGUOI_DUNG WHERE
MaNhomNguoiDung=@maNhomNguoiDung
SELECT @tenUser=TenDangNhap FROM DANG_NHAP WHERE MaNhanVien=@maNhanVien

-- Add người dùng vào role tương ứng (Staff hoặc Manager(sysadmin))
if (@quyen='sysadmin')
SET @sqlString = 'ALTER SERVER ROLE '+@quyen +' ADD MEMBER ' +
@tenUser;
else
SET @sqlString = 'ALTER ROLE '+ @quyen +' ADD MEMBER ' + @tenUser;
exec (@sqlString)
-- Ghi nhận vào bảng phân nhóm
INSERT INTO PHAN_NHOM VALUES (@maNhanVien, @maNhomNguoiDung)
COMMIT TRAN
END TRY
BEGIN CATCH
ROLLBACK
SELECT @err = 'Lỗi: ' + ERROR_MESSAGE()
SELECT @err ,@maNhanVien, @maNhomNguoiDung
END CATCH
END

46
|Nhóm 03
CHƯƠNG 5. THIẾT KẾ GIAO DIỆN HỆ THỐNG

Môi trường cài đặt và công nghệ sử dụng

- Hệ cơ sở dữ liệu Microsoft SQL Server Management Studio 18.

- Chương trình Winform được viết bằng Microsoft Visual Studio 2022 - trên nền tảng
ASP.NET Web Application (.NET Framework) C#.

Giao diện và chức năng của chương trình:

1. Form Home

2. Form Đăng nhập

47
|Nhóm 03
Hệ thống sẽ sử dụng username và password nhân viên nhập vào để login vào
database
Tiến hành mở kết nối tới SQL
public DB_Connect(string username, string password)
{
connectString = "Data Source=tcp:DESKTOP-SH243I1;Initial
Catalog=QUANLYSOTIETKIEMNGANHANG;User ID=" + username+";Password="+password;
link = new SqlConnection(connectString);
comm = link.CreateCommand();
}

3. Form Thông tin cá nhân của người đăng nhập

48
|Nhóm 03
Dựa vào mã nhân viên lấy được thông qua đăng nhập, thực hiện lấy các thông tin của
nhân viên.

public DataSet LayHoTen()


{
db.new_comm();
var MaNV = AppSettingSingleton.getSetting().CurrentMaNhanVien;
var userName = AppSettingSingleton.getSetting().CurrentTenDangNhap;
string sql = " select * From LayHoTen('" + userName + "','" + MaNV + "')";

return db.ExecuteQueryDataSet(sql, CommandType.Text);


}
public DataSet LayNgaySinh()
{
db.new_comm();
var MaNV = AppSettingSingleton.getSetting().CurrentMaNhanVien;
var userName = AppSettingSingleton.getSetting().CurrentTenDangNhap;
string sql = " select * From LayNgaySinh('" + userName + "','" + MaNV + "')";

return db.ExecuteQueryDataSet(sql, CommandType.Text);


}
public DataSet LayMaDinhDanh()
{
db.new_comm();
var MaNV = AppSettingSingleton.getSetting().CurrentMaNhanVien;
var userName = AppSettingSingleton.getSetting().CurrentTenDangNhap;
string sql = " select * From LayMaDinhDanh('" + userName + "','" + MaNV +
"')";

return db.ExecuteQueryDataSet(sql, CommandType.Text);


}
public DataSet LaySDT()
{
db.new_comm();
var MaNV = AppSettingSingleton.getSetting().CurrentMaNhanVien;
var userName = AppSettingSingleton.getSetting().CurrentTenDangNhap;
string sql = " select * From LaySDT('" + userName + "','" + MaNV + "')";

return db.ExecuteQueryDataSet(sql, CommandType.Text);


}
49
|Nhóm 03
public DataSet LayChiNhanh()
{
db.new_comm();
var MaNV = AppSettingSingleton.getSetting().CurrentMaNhanVien;
var userName = AppSettingSingleton.getSetting().CurrentTenDangNhap;
string sql = " select * From LayChiNhanh('" + userName + "','" + MaNV + "')";

return db.ExecuteQueryDataSet(sql, CommandType.Text);


}

public DataSet LayChucVu(string maNhanVien)


{
db.new_comm();
string sql = "select * From LayChucVu(@MaNhanVien)";
db.comm.Parameters.AddWithValue("@MaNhanVien", maNhanVien);
return db.ExecuteQueryDataSet(sql, CommandType.Text);
}

4. Các Form Danh mục

- Các hàm, trigger, view, thủ tục liên quan được gọi từ bên sql qua c#

public DataSet LayHoTen()


{
db.new_comm();
var MaNV = AppSettingSingleton.getSetting().CurrentMaNhanVien;
var userName = AppSettingSingleton.getSetting().CurrentTenDangNhap;
string sql = " select * From LayHoTen('" + userName + "','" + MaNV + "')";

return db.ExecuteQueryDataSet(sql, CommandType.Text);


}
public DataSet LayNgaySinh()
{
db.new_comm();
var MaNV = AppSettingSingleton.getSetting().CurrentMaNhanVien;
var userName = AppSettingSingleton.getSetting().CurrentTenDangNhap;
string sql = " select * From LayNgaySinh('" + userName + "','" + MaNV + "')";

return db.ExecuteQueryDataSet(sql, CommandType.Text);


}
public DataSet LayMaDinhDanh()
{
db.new_comm();
var MaNV = AppSettingSingleton.getSetting().CurrentMaNhanVien;
var userName = AppSettingSingleton.getSetting().CurrentTenDangNhap;
string sql = " select * From LayMaDinhDanh('" + userName + "','" + MaNV + "')";

return db.ExecuteQueryDataSet(sql, CommandType.Text);


}
public DataSet LaySDT()
{
db.new_comm();
var MaNV = AppSettingSingleton.getSetting().CurrentMaNhanVien;
var userName = AppSettingSingleton.getSetting().CurrentTenDangNhap;
string sql = " select * From LaySDT('" + userName + "','" + MaNV + "')";

return db.ExecuteQueryDataSet(sql, CommandType.Text);


}
public DataSet LayChiNhanh()
{
db.new_comm();
var MaNV = AppSettingSingleton.getSetting().CurrentMaNhanVien;
var userName = AppSettingSingleton.getSetting().CurrentTenDangNhap;
string sql = " select * From LayChiNhanh('" + userName + "','" + MaNV + "')";

return db.ExecuteQueryDataSet(sql, CommandType.Text);


}

public DataSet LayChucVu(string maNhanVien)

50
|Nhóm 03
{
db.new_comm();
string sql = "select * From LayChucVu(@MaNhanVien)";
db.comm.Parameters.AddWithValue("@MaNhanVien", maNhanVien);
return db.ExecuteQueryDataSet(sql, CommandType.Text);
}

4.1. Danh mục Chi nhánh

4.2. Danh mục Loại tiết kiệm

4.3. Danh mục Loại giao dịch

51
|Nhóm 03
4.4. Danh mục Loại tiền

1. Quản lý nhân viên

- Form quản lý danh sách nhân viên

52
|Nhóm 03
1.1. Hiển thị thông tin nhân viên đang làm việc

- Hiển thị danh sách nhân viên


public DataSet Get_DSSinhVien()
{

string sqlString = "SELECT * from dbo.LAY_DSNHANVIEN()";


db.new_comm();
DataSet dts = db.ExecuteQueryDataSet(sqlString, CommandType.Text);
return dts;
}

- Hiển thị mã nhân viên lên


public string get_MaNV()
{
string sqlString = "SELECT dbo.AUTO_IDNV()";
db.new_comm();

string kq = db.ExecuteQueryScalar<string>(sqlString, CommandType.Text);


return kq;
}
- Hiển thị chi nhánh
public DataSet get_MaChiNhanh()
{
string sqlString = "SELECT * from CHI_NHANH";
db.new_comm();
DataSet dts = db.ExecuteQueryDataSet(sqlString, CommandType.Text);
return dts;
}

- Hiển thị chức vụ


public DataSet get_ChucVu()
{
string sqlString = "SELECT * FROM NHOM_NGUOI_DUNG";
db.new_comm();
DataSet dts = db.ExecuteQueryDataSet(sqlString, CommandType.Text);
return dts;
}

1.2. Thêm, sửa, xoá, tìm kiếm thông tin nhân viên

- Thêm nhân viên

53
|Nhóm 03
public bool ThemNhanVien(string hoten,string ngaysinh,string madinhdanh,string sdt,
string machinhanh, string maNhom ,ref string err)
{
string sqlString = "ThemNhanVien";
db.new_comm();
db.comm.Parameters.Add("@hoTen", SqlDbType.NVarChar).Value = hoten;
db.comm.Parameters.Add("@ngaySinh", SqlDbType.Date).Value =
DateTime.Parse(ngaysinh);
db.comm.Parameters.Add("@SDT", SqlDbType.VarChar).Value = sdt;
db.comm.Parameters.Add("@maDinhDanh", SqlDbType.VarChar).Value =
madinhdanh;
db.comm.Parameters.Add("@maChiNhanh", SqlDbType.VarChar).Value =
machinhanh;
db.comm.Parameters.Add("@maNhom", SqlDbType.VarChar).Value = maNhom;
return db.MyExecuteNonQuery(sqlString, CommandType.StoredProcedure, ref
err);
}

- Sửa nhân viên


public bool SuaNhanVien(string MaNV,string hoten, string ngaysinh, string
madinhdanh, string sdt, string machinhanh, ref string err)
{
string sqlString = "SuaNhanVien";
db.new_comm();
db.comm.Parameters.Add("@maNV", SqlDbType.VarChar).Value = MaNV;
db.comm.Parameters.Add("@hoTen", SqlDbType.NVarChar).Value = hoten;
db.comm.Parameters.Add("@ngaySinh", SqlDbType.Date).Value =
DateTime.Parse(ngaysinh);
db.comm.Parameters.Add("@SDT", SqlDbType.VarChar).Value = sdt;
db.comm.Parameters.Add("@maDinhDanh", SqlDbType.VarChar).Value =
madinhdanh;
db.comm.Parameters.Add("@maChiNhanh", SqlDbType.VarChar).Value =
machinhanh;
return db.MyExecuteNonQuery(sqlString, CommandType.StoredProcedure, ref
err);
}

- Xóa nhân viên


public bool XoaNhanVien(string MaNV, ref string err)
{
string sqlString = "DELETE FROM NHAN_VIEN WHERE MaNhanVien='"+ MaNV+"'";
db.new_comm();
return db.MyExecuteNonQuery(sqlString, CommandType.Text, ref err);
}

- Tìm kiếm nhân viên theo chi nhánh


public DataSet get_TimKiem(string machinhanh)
{
string sqlString = "SELECT * FROM (SELECT * from dbo.LAY_DSNHANVIEN())Q
WHERE Q.MachiNhanh='"+machinhanh+"'";
db.new_comm();
DataSet dts = db.ExecuteQueryDataSet(sqlString, CommandType.Text);
return dts;
}

2. Quản lý sổ tiết kiệm

54
|Nhóm 03
- Form Danh sách sổ tiết kiệm

- Form tác vụ sổ tiết kiệm

2.1. Tìm kiếm sổ tiết kiệm


Trong form danh sách sổ có tìm kiếm sổ theo 3 kiểu:
- Tìm kiếm theo loại sổ: gửi góp, gửi 1 lần, trả lãi trước, trả lãi định kì, trả lãi sau

public DataSet TimKiemTheoHinhThucTK(string tenHinhThuc)


{
DB_Connect conn = new DB_Connect();
string sql = "select * from TAI_KHOAN_TIET_KIEM RIGHT join " +
tenHinhThuc

55
|Nhóm 03
+ " on TAI_KHOAN_TIET_KIEM.MaSoTK = " + tenHinhThuc +
".MaSoTK";

DataSet ds = conn.ExecuteQueryDataSet(sql, CommandType.Text);


return ds;
}

- Tìm kiếm theo mã sổ

public DataSet TimKiemMaSoTK(string maSoTK)


{
DB_Connect conn = new DB_Connect();
string sql = "SELECT* FROM TAI_KHOAN_TIET_KIEM WHERE MaSoTK LIKE '%'
+ @MaSoTK+ '%'";
DataSet ds = conn.ExecuteQueryDataSet(sql, CommandType.Text, new
SqlParameter("@MaSoTK", maSoTK));
return ds;
}

- Tìm kiếm theo tên chủ sở hữu

public DataSet TimKiemSoHuu(string hoTen)


{
DB_Connect conn = new DB_Connect();
string sql = "select * from TIM_KIEM_SO_HUU(@HoTen)";
DataSet ds = conn.ExecuteQueryDataSet(sql, CommandType.Text, new
SqlParameter("@HoTen", hoTen));
return ds;
}

2.2. Tìm kiếm chủ sở hữu của sổ tiết kiệm

public DataSet LayDanhSachChuSoHuu(string maSoTK)


{
db.new_comm();
string sql = "select MaKhachHang, HoTen, MaDinhDanh from CHI_TIET_SO
where MaSoTK = @MaSoTK";
return db.ExecuteQueryDataSet(sql, CommandType.Text, new
SqlParameter("@MaSoTK", maSoTK));
}

2.3. Thêm đồng sở hữu sổ tiết kiệm

public bool ThemNguoiDongSoHuu(string maSoTK , DateTime ngayPhatSinhGiaoDich , string


maNhanVien ,
string hoTen, DateTime ngaySinh, string sdt,string
maDinhDanh,
DateTime ngayCap, string noiCap, string diaChi, string
image)
{
string sqlString = "DongSoHuu";
db.new_comm();
db.comm.Parameters.Add("@maSoTK", SqlDbType.NVarChar).Value = maSoTK;
db.comm.Parameters.Add("@ngayPhatSinhGiaoDich", SqlDbType.Date).Value =
ngayPhatSinhGiaoDich;
db.comm.Parameters.Add("@maNhanVien", SqlDbType.VarChar).Value = maNhanVien;

56
|Nhóm 03
db.comm.Parameters.Add("@hoTen", SqlDbType.NVarChar).Value = hoTen;
db.comm.Parameters.Add("@ngaySinh", SqlDbType.Date).Value = ngaySinh;
db.comm.Parameters.Add("@sdt", SqlDbType.Char).Value = sdt;
db.comm.Parameters.Add("@maDinhDanh", SqlDbType.VarChar).Value = maDinhDanh;
db.comm.Parameters.Add("@ngayCap", SqlDbType.Date).Value = ngayCap;
db.comm.Parameters.Add("@noiCap", SqlDbType.NVarChar).Value = noiCap;
db.comm.Parameters.Add("@diaChi", SqlDbType.NVarChar).Value = diaChi;
db.comm.Parameters.Add("@imageFolderPath", SqlDbType.NVarChar).Value = image;
return db.MyExecuteNonQuery(sqlString, CommandType.StoredProcedure, ref err);
}

3. Quản lý Giao dịch tiết kiệm


3.1. Mở sổ
7.1.1 . Mở sổ tiết kiệm gửi một lần

- Form mở sổ tiết kiệm gửi một lần

57
|Nhóm 03
- Thêm sổ tiết kiệm gửi một lần
public bool ThemSoTK1L(string MaKH, string TenKH, string ngaysinh, string SDT,
string MaDinhDanh, string ngaycap, string noicap, string diachi, string
imageFolderPath,
float khoanGui, string maNhanvien, string ngayMoSo, string maLoaiTien, int
kyHan, string maHinhThucTraLai, int kyTraLai, string error, ref string err)
{

string sqlString = "ThemSoGui1Lan";


db.new_comm();

db.comm.Parameters.Add("@maKhachHang", SqlDbType.NVarChar).Value = MaKH;


db.comm.Parameters.Add("@tenKhachHang", SqlDbType.NVarChar).Value =
TenKH;
db.comm.Parameters.Add("@ngaySinh", SqlDbType.Date).Value =
DateTime.Parse(ngaysinh);
db.comm.Parameters.Add("@sdt", SqlDbType.VarChar).Value = SDT;
db.comm.Parameters.Add("@cccd", SqlDbType.VarChar).Value = MaDinhDanh;
db.comm.Parameters.Add("@ngaycap", SqlDbType.Date).Value =
DateTime.Parse(ngaycap);
db.comm.Parameters.Add("@noiCap", SqlDbType.NVarChar).Value = noicap;
db.comm.Parameters.Add("@diaChi", SqlDbType.NVarChar).Value = diachi;
db.comm.Parameters.Add("@imageFolderPath", SqlDbType.NVarChar).Value =
imageFolderPath;
db.comm.Parameters.Add("@khoanGui", SqlDbType.Money).Value = khoanGui;
db.comm.Parameters.Add("@maNhanvien", SqlDbType.NVarChar).Value =
maNhanvien;
db.comm.Parameters.Add("@ngayMoSo", SqlDbType.Date).Value =
DateTime.Parse(ngayMoSo);
db.comm.Parameters.Add("@maLoaiTien", SqlDbType.NVarChar).Value =
maLoaiTien;
db.comm.Parameters.Add("@KyHan", SqlDbType.Int).Value = kyHan;
db.comm.Parameters.Add("@maHinhThucTraLai", SqlDbType.NVarChar).Value =
maHinhThucTraLai;
db.comm.Parameters.Add("@kyTraLai", SqlDbType.Int).Value = kyTraLai;
db.comm.Parameters.Add("@err", SqlDbType.NVarChar).Value = error;

58
|Nhóm 03
return db.MyExecuteNonQuery(sqlString, CommandType.StoredProcedure, ref
err);

7.1.2. Mở sổ tiết kiệm gửi góp

- Form mở sổ tiết kiệm gửi góp

- Hiện ngày gửi góp tiếp theo


public DataSet get_NgayGGTiepTheo(string MASTK)
{

string sqlString = "SELECT * from dbo.LAYNGAYGGTIEPTHEO(@MASTK)";


db.new_comm();
db.comm.Parameters.AddWithValue("@MASTK", MASTK);
DataSet dts = db.ExecuteQueryDataSet(sqlString, CommandType.Text);
return dts;
}

- Thêm sổ gửi góp


public bool ThemSoTKGuiGop(string MaKH, string TenKH, string ngaysinh, string SDT,
string MaDinhDanh, string ngaycap, string noicap, string diachi, string
imageFolderPath,
float khoanGui, string maNhanvien, string ngayMoSo, string maLoaiTien, int
kyHan,int hanguigop, string error, ref string err)
{

59
|Nhóm 03
string sqlString = "ThemSoGuiGop";
db.new_comm();

db.comm.Parameters.Add("@maKhachHang", SqlDbType.NVarChar).Value = MaKH;


db.comm.Parameters.Add("@tenKhachHang", SqlDbType.NVarChar).Value = TenKH;
db.comm.Parameters.Add("@ngaySinh", SqlDbType.Date).Value =
DateTime.Parse(ngaysinh);
db.comm.Parameters.Add("@sdt", SqlDbType.VarChar).Value = SDT;
db.comm.Parameters.Add("@cccd", SqlDbType.VarChar).Value = MaDinhDanh;
db.comm.Parameters.Add("@ngaycap", SqlDbType.Date).Value =
DateTime.Parse(ngaycap);
db.comm.Parameters.Add("@noiCap", SqlDbType.NVarChar).Value = noicap;
db.comm.Parameters.Add("@diaChi", SqlDbType.NVarChar).Value = diachi;
db.comm.Parameters.Add("@imageFolderPath", SqlDbType.NVarChar).Value =
imageFolderPath;
db.comm.Parameters.Add("@khoanGui", SqlDbType.Money).Value = khoanGui;
db.comm.Parameters.Add("@maNhanvien", SqlDbType.NVarChar).Value =
maNhanvien;
db.comm.Parameters.Add("@ngayMoSo", SqlDbType.Date).Value =
DateTime.Parse(ngayMoSo);
db.comm.Parameters.Add("@maLoaiTien", SqlDbType.NVarChar).Value =
maLoaiTien;
db.comm.Parameters.Add("@KyHan", SqlDbType.Int).Value = kyHan;
db.comm.Parameters.Add("@hanGuiGop", SqlDbType.Int).Value = hanguigop;
db.comm.Parameters.Add("@err", SqlDbType.NVarChar).Value = error;
return db.MyExecuteNonQuery(sqlString, CommandType.StoredProcedure, ref
err);

7.1.3. Hiển thị thông tin chung khi mở sổ

- Hiện thông tin khác hàng theo mã định danh


public DataSet LaySoTheoMaDinhDanh(string MaDinhDanh)
{

string sqlString = "SELECT * from dbo.KIEM_TRA_KH (@MaDinhDanh)";


db.new_comm();
db.comm.Parameters.AddWithValue("@MaDinhDanh", MaDinhDanh);
DataSet dts = db.ExecuteQueryDataSet(sqlString, CommandType.Text);
return dts;
}

- Hiển thị mã khách hàng


public string get_MaSo()
{
string sqlString = "SELECT dbo.AUTO_IDSTK()";
db.new_comm();

string kq = db.ExecuteQueryScalar<string>(sqlString, CommandType.Text);


return kq;
}
- Hiển thị loại tiền
public DataSet get_LoaiTien()
{
string sqlString = "SELECT * from LOAI_TIEN";
db.new_comm();
DataSet dts = db.ExecuteQueryDataSet(sqlString, CommandType.Text);

60
|Nhóm 03
return dts;
}
- Hiển thị các hình thức trả lãi
public DataSet get_HinhThucTraLai()
{
string sqlString = "SELECT * from HINH_THUC_TRA_LAI";
db.new_comm();
DataSet dts = db.ExecuteQueryDataSet(sqlString, CommandType.Text);
return dts;
}
- Hiển thị ngày đến hạn
public DataSet get_NgayDenHan(string MASTK)
{

string sqlString = "SELECT * from dbo.LAYNGAYDENHAN(@MASTK)";


db.new_comm();
db.comm.Parameters.AddWithValue("@MASTK", MASTK);
DataSet dts = db.ExecuteQueryDataSet(sqlString, CommandType.Text);
return dts;
}
- Hiển thị kỳ hạn
public DataSet get_KyHan(string mahtg, string maHTTraLai)
{
string sqlString = "SELECT * from dbo.LAYKYHAN(@MAHTGUI,@MAHTTRALAI)";
db.new_comm();
db.comm.Parameters.AddWithValue("@MAHTTRALAI", maHTTraLai);
db.comm.Parameters.AddWithValue("@MAHTGUI", mahtg);
DataSet dts = db.ExecuteQueryDataSet(sqlString, CommandType.Text);
return dts;
}

- Hiển thị lãi suất


public DataSet get_KyHan(string mahtg, string maHTTraLai)
{
string sqlString = "SELECT * from dbo.LAYKYHAN(@MAHTGUI,@MAHTTRALAI)";
db.new_comm();
db.comm.Parameters.AddWithValue("@MAHTTRALAI", maHTTraLai);
db.comm.Parameters.AddWithValue("@MAHTGUI", mahtg);
DataSet dts = db.ExecuteQueryDataSet(sqlString, CommandType.Text);
return dts;
}

3.2. Quản lý giao dịch

Hiện danh sách sổ theo chủ sổ

61
|Nhóm 03
Thực hiện gọi hàm lấy danh sách sổ
public DataSet get_DS_So(string MaDinhDanh)
{
db.new_comm();
string sqlString = "SELECT * from
dbo.LayChiTietThongTinSo(@maDinhDanh)";
db.comm.Parameters.AddWithValue("@maDinhDanh", MaDinhDanh);
DataSet dts = db.ExecuteQueryDataSet(sqlString, CommandType.Text);
return dts;
}

Hiển thị chi tiết sổ và lịch sử giao dịch của sổ:

+ Gọi hàm lấy lịch sủ giao dịch sổ


public DataSet get_DS_GiaoDich(string MaSo)
{
db.new_comm();
string sqlString = "SELECT * from dbo.LayGiaoDichSoTK(@maSo)";
62
|Nhóm 03
db.comm.Parameters.AddWithValue("@maSo", MaSo);
DataSet dts = db.ExecuteQueryDataSet(sqlString, CommandType.Text);
return dts;
}

- Xem chi tiết các giao dịch

Gọi hàm lấy chi tiết giao dịch:


public DataSet get_Chitiet_GiaoDichGuiTK(string MaGiaoDich)
{
db.new_comm();
string sqlString = "SELECT * from
dbo.LayGiaoDichGuiLanDau(@maGiaoDich)";
db.comm.Parameters.AddWithValue("@maGiaoDich", MaGiaoDich);
DataSet dts = db.ExecuteQueryDataSet(sqlString, CommandType.Text);
return dts;
}

Thực hiện xác nhận giao dịch

63
|Nhóm 03
+ Gọi hàm xác nhận từ C#
public bool ThanhToanTKT(string maSo, string maNhanVien, string ngaygiaodich, string
maKhachHang, ref string err)
{

string sqlString = "RutLaiTruoc";


db.new_comm();
db.comm.Parameters.Add("@maSoTK", SqlDbType.VarChar).Value = maSo;
db.comm.Parameters.Add("@ngayGiaoDich", SqlDbType.Date).Value =
DateTime.Parse(ngaygiaodich);
db.comm.Parameters.Add("@maNhanVien", SqlDbType.VarChar).Value = maNhanVien;
db.comm.Parameters.Add("@maKhachHang", SqlDbType.VarChar).Value =
maKhachHang;
return db.MyExecuteNonQuery(sqlString, CommandType.StoredProcedure, ref err);
}

Thực hiện thao tác tất toán sổ

64
|Nhóm 03
+ Gọi hàm tất toán từ C#
public bool TatToanSoCoHan(string maSo, string ngayGiaoDich, string maNhanVien, string
maKhachHang, ref string err, bool DungHan=true)
{
string sqlString = null;
if (DungHan)
sqlString = "TatToanDungHan";
else
sqlString = "TatToanTruocHan";

db.new_comm();
db.comm.Parameters.Add("@maSoTK", SqlDbType.VarChar).Value = maSo;
db.comm.Parameters.Add("@ngayGiaoDich", SqlDbType.Date).Value =
DateTime.Parse(ngayGiaoDich);
db.comm.Parameters.Add("@maNhanVien", SqlDbType.VarChar).Value = maNhanVien;
db.comm.Parameters.Add("@maKhachHang", SqlDbType.VarChar).Value =
maKhachHang;
return db.MyExecuteNonQuery(sqlString, CommandType.StoredProcedure, ref err);
}

65
|Nhóm 03
Thực hiện giao dịch gửi góp

+ Gọi hàm thực hiện gửi góp


public string GiaoDichGuiGop(string maSoTK, string soTien, string ngayGiaoDich, string
maNhanvien, string maKhachHang, ref string err)
{

string sqlString = "GuiGop";


db.new_comm();
db.comm.Parameters.Add("@maSoTK", SqlDbType.VarChar).Value = maSoTK;
db.comm.Parameters.Add("@soTien", SqlDbType.Money).Value =
Decimal.Parse(soTien);
66
|Nhóm 03
db.comm.Parameters.Add("@ngayGiaoDich", SqlDbType.Date).Value =
DateTime.Parse(ngayGiaoDich);
db.comm.Parameters.Add("@maNhanVien", SqlDbType.VarChar).Value = maNhanvien;
db.comm.Parameters.Add("@maKhachHang", SqlDbType.VarChar).Value =
maKhachHang;
SqlParameter retval = db.comm.Parameters.Add("@maGiaoDich",
SqlDbType.VarChar, 10);
retval.Direction = ParameterDirection.Output;
bool thuchien;
thuchien= db.MyExecuteNonQuery(sqlString, CommandType.StoredProcedure, ref
err);
if (thuchien)
return (string)db.comm.Parameters["@maGiaoDich"].Value;
else
return null;
}

4. Quản lý Khách hàng


- Form Danh sách khách hàng

- Form Tác vụ khách hàng

67
|Nhóm 03
4.1. Tìm kiếm khách hàng
Tìm kiếm khách hàng trong form danh sách khách hàng theo 3 loại: tìm kiếm
theo mã khách hàng, theo tên khách hàng và theo mã định danh.

public DataSet TimKiem(string loaiTK, string maKH)


{
DB_Connect conn = new DB_Connect();
string temp = "SELECT* FROM KHACH_HANG WHERE " + loaiTK + " LIKE '%" + maKH +
"%'";
DataSet ds = conn.ExecuteQueryDataSet(temp, CommandType.Text);
return ds;
}

public DataSet TimKiemMaDinhDanh(string maDinhDanh)


{
DB_Connect conn = new DB_Connect();
string temp = "SELECT* FROM KHACH_HANG WHERE MADINHDANH = @mdd";
DataSet ds = null;
ds = conn.ExecuteQueryDataSet(temp, CommandType.Text,
new SqlParameter("@mdd", maDinhDanh));
return ds;
}

4.2. Sửa thông tin khách hàng

public bool SuaKhachHang(string maKhachHang, string hoTen, string sdt,string diaChi, string
maDinhDanh,
string noiCap, string ngaySinh,string ngayCap, string
image)
{
string sqlString = "SuaKhachHang";
db.new_comm();
db.comm.Parameters.Add("@maKhachHang", SqlDbType.VarChar).Value = maKhachHang;
db.comm.Parameters.Add("@hoTen", SqlDbType.NVarChar).Value = hoTen;
db.comm.Parameters.Add("@ngaySinh", SqlDbType.VarChar).Value = ngaySinh;
db.comm.Parameters.Add("@sdt", SqlDbType.Char).Value = sdt;
db.comm.Parameters.Add("@maDinhDanh", SqlDbType.VarChar).Value = maDinhDanh;

68
|Nhóm 03
db.comm.Parameters.Add("@ngayCap", SqlDbType.VarChar).Value = ngayCap;
db.comm.Parameters.Add("@noiCap", SqlDbType.NVarChar).Value = noiCap;
db.comm.Parameters.Add("@diaChi", SqlDbType.NVarChar).Value = diaChi;
db.comm.Parameters.Add("@imageFolderPath", SqlDbType.NVarChar).Value = image;
var result = db.MyExecuteNonQuery(sqlString, CommandType.StoredProcedure, ref
err);
return result;
}

69
|Nhóm 03

You might also like