-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathBorrowing.sql
More file actions
222 lines (167 loc) · 6.33 KB
/
Borrowing.sql
File metadata and controls
222 lines (167 loc) · 6.33 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
create table Borrowing(
Id int primary key identity (1,1) ,
BookId int not null ,
MemberId int not null ,
IsReturned bit default 0 ,
BorrowDate datetime not null ,
ExpectedReturnDate datetime not null ,
ActualReturnDate datetime null ,
-- when wirte constraint her depend on this column not another can not compare with another column
constraint CK_Expected_After_Borrow check (ExpectedReturnDate>BorrowDate),
constraint CHK_Actual_After_Borrow check (ActualReturnDate >= BorrowDate),-- when i put constraint her
--"on table level" i can compare to column with each other
constraint FK_Borrowing_Book foreign key (BookId) references Book(Id),
constraint FK_Borrowing_Users foreign key (MemberId) references Users(Id)
)
------- Stored procedure
--1 BorrowBook
alter procedure spBorrowBook
@MemberId int , @BookId int , @BorrowDate dateTime , @ExpectedReturnDate datetime,
@BorrowId int OUTPUT
as
begin
set nocount on;
if dbo.fn_IsBookAvailableForRental(@BookId) = 0
begin
set @BorrowId=-1
return
End
if not exists(select 1 from Users where Id=@MemberId)
begin
set @BorrowId=-2
return
End
if (select count(*) from Borrowing where MemberId=@MemberId and IsReturned=0)>=3
begin
set @BorrowId=-3
return
End
IF exists(select 1 from Borrowing where MemberId = @MemberId and BookId = @BookId and IsReturned = 0)
begin
set @BorrowId = -4 -- Member already has this book borrowed
return
end
insert into Borrowing(BookId,MemberId,IsReturned,BorrowDate,ExpectedReturnDate)
values (@BookId,@MemberId,0,@BorrowDate,@ExpectedReturnDate)
set @BorrowId=SCOPE_IDENTITY()
End
-- ReturnBook
alter procedure spReturnBook
@MemberId int, @BookId int, @ActualReturnDate datetime, @updateBorrowId int output
as
begin
declare @result int;
set nocount on;
if not exists(select 1 from Users where Id = @MemberId)
begin
set @updateBorrowId = -2;
return;
end
if not exists(select 1 from Borrowing where BookId = @BookId and MemberId = @MemberId and IsReturned = 0)
begin
set @updateBorrowId = -1;
return;
end
update Borrowing
set IsReturned = 1, ActualReturnDate = @ActualReturnDate
where BookId = @BookId and MemberId = @MemberId and IsReturned = 0;
select @updateBorrowId=Id from Borrowing where BookId = @BookId and MemberId = @MemberId
end
-- GetCurrentBorrowedBooks
alter procedure spGetCurrentBorrowedBooks
@PageNumber int =1 , @PageSize int =20 ,@searchTearm varchar(50) = null , @totalCount int output
as
begin
set nocount on;
select @totalCount= count(*) from Borrowing bo inner join Book b on bo.BookId = b.Id
inner join Users u on u.Id = bo.MemberId
where IsReturned =0 and (@searchTearm is null or b.Name like '%'+@searchTearm+'%'or
u.FullName like '%'+@searchTearm+'%')
select bo.Id as BorrowId, b.Id as BookId, b.Name, bo.BorrowDate,
bo.ExpectedReturnDate, bo.MemberId , u.FullName
from Borrowing bo inner join Book b on bo.BookId = b.Id
inner join Users u on u.Id = bo.MemberId
where IsReturned =0 and (@searchTearm is null or b.Name like '%'+@searchTearm+'%' or
u.FullName like '%'+@searchTearm+'%')
order by b.Id
offset (@PageNumber-1)*@PageSize rows
fetch next @pageSize rows only
end
--- GetOverdueBooks
alter procedure spGetOverdueBooks
@PageNumber int =1 , @PageSize int =20 ,@searchTearm varchar(50) = null , @totalCount int output
as
begin
set nocount on;
declare @Today datetime =GETDATE()
select @totalCount= count(*) from Borrowing bo inner join Book b on bo.BookId = b.Id
inner join Users u on u.Id = bo.MemberId
where IsReturned =0 and @Today >bo.ExpectedReturnDate and
(@searchTearm is null or b.Name like '%'+@searchTearm+'%'
or u.FullName like '%'+@searchTearm+'%')
select bo.Id as BorrowId, b.Id as BookId, b.Name, bo.BorrowDate,
bo.ExpectedReturnDate, bo.MemberId , u.FullName
from Borrowing bo inner join Book b on bo.BookId = b.Id
inner join Users u on u.Id = bo.MemberId
where IsReturned =0 and @Today >bo.ExpectedReturnDate
and (@searchTearm is null or b.Name like '%'+@searchTearm+'%' or u.FullName like '%'+@searchTearm+'%')
order by b.Id
offset (@PageNumber-1)*@PageSize rows
fetch next @pageSize rows only
end
--- GetMemberBorrowingHistory
create procedure spGetMemberBorrowingHistory
@MemberId INT
as
begin
select bo.Id as BorrowId, b.Id as BookId, b.Name, bo.BorrowDate,
bo.ExpectedReturnDate, bo.ActualReturnDate , bo.MemberId , u.FullName
from Borrowing bo inner join Book b on bo.BookId = b.Id
inner join Users u on u.Id = bo.MemberId where MemberId= @MemberId
end
-- GetMostBorrowedBooks
create procedure spGetMostBorrowedBooks
as
begin
select b.Id as BookId,b.Name , COUNT(*) as BorrowedBooks
from Borrowing bo inner join Book b on bo.BookId = b.Id
group by b.Id , b.Name
order by COUNT(*) desc
end
create procedure spCountCurrentBorrows
@MemberId int
as
begin
Declare @BorrowCount int;
select @BorrowCount = dbo.fn_CountCurrentBorrows(@MemberId)
select @BorrowCount
end
create function fn_CountCurrentBorrows(@MemberId INT)
returns int
as
begin
Declare @Count int = 0;
select @Count = count(*) from Borrowing where MemberId = @MemberId and IsReturned = 0;
return @Count;
end
-- GetActiveMembers ////////////
create procedure spGetActiveMembers
@PageNumber int =1 , @PageSize int =20 , @totalCount int output
as
begin
select @totalCount =count(*)
from Borrowing bo inner join Book b on bo.BookId = b.Id
inner join Users u on u.Id = bo.MemberId
where IsReturned =0
select bo.Id as BorrowId, b.Id as BookId, b.Name, bo.BorrowDate,
bo.ExpectedReturnDate, bo.MemberId , u.FullName
from Borrowing bo inner join Book b on bo.BookId = b.Id
inner join Users u on u.Id = bo.MemberId
where IsReturned =0
order by bo.Id
offset (@PageNumber-1)*@PageSize rows
fetch next @pageSize rows only
end
select *from Users
select*from users
select*from Borrowing