Compare commits
903 Commits
v2.0-pre-b
...
v2.0.5
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1fe5bd3770 | ||
|
|
2b26fd7e20 | ||
|
|
7a0598dfc3 | ||
|
|
5ebb267a53 | ||
|
|
21a280676b | ||
|
|
7e8a0af6e5 | ||
|
|
b210d90148 | ||
|
|
2afc252549 | ||
|
|
aa05d041bd | ||
|
|
bbe0189be2 | ||
|
|
a0599712a6 | ||
|
|
1a4926ce13 | ||
|
|
3c8959e92d | ||
|
|
ab3871f678 | ||
|
|
7297a6031e | ||
|
|
75bd29b027 | ||
|
|
b77b9c0434 | ||
|
|
b9c36f8638 | ||
|
|
90009db1b5 | ||
|
|
d7f8d0fc04 | ||
|
|
effad46cc0 | ||
|
|
4509631921 | ||
|
|
d1a306cfd8 | ||
|
|
2de4741170 | ||
|
|
fc609ece12 | ||
|
|
ecfd1b2693 | ||
|
|
a8da68d3fd | ||
|
|
69970d1296 | ||
|
|
ef7c7da4e5 | ||
|
|
306d8ebaf7 | ||
|
|
250880c6f3 | ||
|
|
9f43b6af9f | ||
|
|
a47a4e83e2 | ||
|
|
ca1384504a | ||
|
|
fc6bb7f056 | ||
|
|
62cee46a83 | ||
|
|
c94ece2925 | ||
|
|
5d5882ea5b | ||
|
|
61fc912c47 | ||
|
|
e54bbcd37f | ||
|
|
c1961c0e40 | ||
|
|
11c2fcd094 | ||
|
|
b856e7f2c6 | ||
|
|
7a84d1061b | ||
|
|
56b50468d2 | ||
|
|
c7057f550f | ||
|
|
037cda36b2 | ||
|
|
f3de39efd6 | ||
|
|
af5c221385 | ||
|
|
feb74806a8 | ||
|
|
14ba5a3b77 | ||
|
|
bc8c8e4225 | ||
|
|
dc64ad55ee | ||
|
|
7e2b4183f6 | ||
|
|
0a843fa856 | ||
|
|
5a687f280f | ||
|
|
4b2e7b9b06 | ||
|
|
1ac41a72ec | ||
|
|
6e117efebd | ||
|
|
17207ddea1 | ||
|
|
130b1b4f4a | ||
|
|
8a7981a4ae | ||
|
|
90513b06f5 | ||
|
|
750fc84592 | ||
|
|
2a43491792 | ||
|
|
f4331f4498 | ||
|
|
0d1544c3d6 | ||
|
|
958672dfd3 | ||
|
|
7355fd9ebe | ||
|
|
5df26f9b0a | ||
|
|
a587b72c71 | ||
|
|
0b0b55619b | ||
|
|
a760a7575a | ||
|
|
a86f0e6178 | ||
|
|
577c193661 | ||
|
|
f147a0ff02 | ||
|
|
0745ec1502 | ||
|
|
5bed0482b6 | ||
|
|
9731727095 | ||
|
|
769fb13282 | ||
|
|
a9e1283a17 | ||
|
|
5bb94c4b4e | ||
|
|
67a113cbf4 | ||
|
|
d0eed67c42 | ||
|
|
9cc542aea9 | ||
|
|
725ca04ac8 | ||
|
|
e07dcf2598 | ||
|
|
712e415f4d | ||
|
|
c8551367cb | ||
|
|
5c820d49a6 | ||
|
|
9f12b6a084 | ||
|
|
187ab53c18 | ||
|
|
e35de90806 | ||
|
|
800100c0cc | ||
|
|
fbd79fc943 | ||
|
|
7e6d142c1f | ||
|
|
da17603be1 | ||
|
|
34530b209f | ||
|
|
760e2fca01 | ||
|
|
d1e977b85a | ||
|
|
21cc1e9aec | ||
|
|
346090ebff | ||
|
|
40ca02481d | ||
|
|
b39944b2d7 | ||
|
|
e0fccc8fc9 | ||
|
|
76968f7d48 | ||
|
|
5436d54aa0 | ||
|
|
b6f4080b97 | ||
|
|
09bcb137c4 | ||
|
|
8ec6b7e03a | ||
|
|
efddda8665 | ||
|
|
48e6ebe306 | ||
|
|
eb1335405b | ||
|
|
8a1ffb9014 | ||
|
|
ec4b2f114d | ||
|
|
9a5edb3db7 | ||
|
|
f0557f8e1c | ||
|
|
2953b395f2 | ||
|
|
e9050826ec | ||
|
|
20e7888bd9 | ||
|
|
e93b53ad4c | ||
|
|
0a3843393d | ||
|
|
60f403f555 | ||
|
|
cf49920564 | ||
|
|
aaf2c6fbce | ||
|
|
9a63cbbd6c | ||
|
|
0aeab1ab7e | ||
|
|
4c3a5a99df | ||
|
|
60370b9627 | ||
|
|
df986c7cfe | ||
|
|
a3f5dc331d | ||
|
|
af6a3dcccd | ||
|
|
7901b49503 | ||
|
|
8ea40d4e6d | ||
|
|
1bdd5886e6 | ||
|
|
9c71d34761 | ||
|
|
79a69d7633 | ||
|
|
27799dc78a | ||
|
|
4cb19d1aae | ||
|
|
c91113ac95 | ||
|
|
eb5649d0b3 | ||
|
|
f06af97364 | ||
|
|
b1d5812ae2 | ||
|
|
2e044bf0a3 | ||
|
|
bd418d1422 | ||
|
|
440bc1a4b4 | ||
|
|
dba7983189 | ||
|
|
5ff75e7f42 | ||
|
|
69c95f1f73 | ||
|
|
30bbc9ad46 | ||
|
|
059993b064 | ||
|
|
ed612287ee | ||
|
|
ba7b56f5d7 | ||
|
|
5b5d262d3c | ||
|
|
9d6608c8f1 | ||
|
|
28fcd2b8ab | ||
|
|
7087e86ca5 | ||
|
|
bf32e89e0c | ||
|
|
7a306cd0f0 | ||
|
|
95b033bdb8 | ||
|
|
ea4dfdd50c | ||
|
|
0b87357f3b | ||
|
|
9c914e7ef5 | ||
|
|
68e7941c21 | ||
|
|
f761b2e953 | ||
|
|
e03f07bb44 | ||
|
|
0c830fa564 | ||
|
|
8ad220701e | ||
|
|
7087a191c6 | ||
|
|
d1192095d0 | ||
|
|
348a566f89 | ||
|
|
9724d118e6 | ||
|
|
b18be5aee8 | ||
|
|
7dc0039c3b | ||
|
|
218c76592c | ||
|
|
b5b8865b36 | ||
|
|
a896bb0eff | ||
|
|
36a3d655ad | ||
|
|
e12e2f2c7c | ||
|
|
cab5dba7c2 | ||
|
|
b25b3321f9 | ||
|
|
4e3c196664 | ||
|
|
27735a8821 | ||
|
|
6800559596 | ||
|
|
47d6682098 | ||
|
|
def6b4ff50 | ||
|
|
d9ea718d51 | ||
|
|
cf7571d3a6 | ||
|
|
21982a1d51 | ||
|
|
87adb5e0ca | ||
|
|
dfca1386ac | ||
|
|
1d12104eef | ||
|
|
03e36736c2 | ||
|
|
644cfee086 | ||
|
|
c346dbaff6 | ||
|
|
fc458e571b | ||
|
|
d61983efdf | ||
|
|
07f1c5774e | ||
|
|
f96e4ebd4c | ||
|
|
de0e1627c7 | ||
|
|
46a02b25da | ||
|
|
3095af4a8e | ||
|
|
a90f7218de | ||
|
|
84c12e5f01 | ||
|
|
8f02e0e26f | ||
|
|
50abb87276 | ||
|
|
ca625418fe | ||
|
|
4beb3b024d | ||
|
|
b39e617e96 | ||
|
|
93bd9120cc | ||
|
|
2171e668fe | ||
|
|
103c61d936 | ||
|
|
f4d882606a | ||
|
|
b56aba3cc2 | ||
|
|
377e4c06a1 | ||
|
|
58911cd10e | ||
|
|
9264e7bdc4 | ||
|
|
78143cbd1c | ||
|
|
01f00cfe51 | ||
|
|
b492ac4950 | ||
|
|
03daecdfed | ||
|
|
2dcb59dd8f | ||
|
|
e7f14f66dc | ||
|
|
d0aab3e2c7 | ||
|
|
58f323721c | ||
|
|
923d1d34de | ||
|
|
cf767d255d | ||
|
|
daa6943cfc | ||
|
|
707e5c50e4 | ||
|
|
a7ea98ad93 | ||
|
|
52a60bd6a5 | ||
|
|
e75cebafeb | ||
|
|
26c0e96e56 | ||
|
|
58c497adb7 | ||
|
|
d0ebaf3cb9 | ||
|
|
c4f85fb74d | ||
|
|
71b85732b0 | ||
|
|
0db075cb13 | ||
|
|
a6586b5919 | ||
|
|
485b34b66e | ||
|
|
e9e04e86da | ||
|
|
66fd0c2315 | ||
|
|
73d4c65daf | ||
|
|
0287821d44 | ||
|
|
00b93883e4 | ||
|
|
89816d90b4 | ||
|
|
4f74ad077a | ||
|
|
75af50def1 | ||
|
|
ec80c99a48 | ||
|
|
f6b57adda3 | ||
|
|
76dc518846 | ||
|
|
d149fb1a0f | ||
|
|
3ecfff94ef | ||
|
|
d15ef5c79d | ||
|
|
10909a21cd | ||
|
|
141c77fed7 | ||
|
|
9027ed8864 | ||
|
|
4c662b7136 | ||
|
|
9ba2779e5f | ||
|
|
6500af5125 | ||
|
|
ff6fe331f3 | ||
|
|
567cd4847b | ||
|
|
97d0d789f0 | ||
|
|
ba9f00365a | ||
|
|
6f6427a298 | ||
|
|
b943ace21b | ||
|
|
4abe93ae2e | ||
|
|
64c5ea033c | ||
|
|
bedb97c0d8 | ||
|
|
586c04354e | ||
|
|
e13bbb1b6b | ||
|
|
999b237ed7 | ||
|
|
505d46d49f | ||
|
|
515e70b97c | ||
|
|
53b5ec64e0 | ||
|
|
2df8c6a3d1 | ||
|
|
49a20c75ed | ||
|
|
49a8b7b83c | ||
|
|
6bfa5837c5 | ||
|
|
d41c3fde10 | ||
|
|
8fcf907050 | ||
|
|
0cb4b9e00b | ||
|
|
7a57fd73e5 | ||
|
|
41b3f5b5c8 | ||
|
|
fbbe24f197 | ||
|
|
9b0495453d | ||
|
|
0511b0777f | ||
|
|
fe765b3c9c | ||
|
|
740967e4f2 | ||
|
|
cffd87c5a3 | ||
|
|
c8526a6be0 | ||
|
|
abd0acbe9d | ||
|
|
3719f9a5a8 | ||
|
|
f9dc5766a7 | ||
|
|
c6b6ccc814 | ||
|
|
bd7a043ab0 | ||
|
|
611da2ffbd | ||
|
|
911e9092f9 | ||
|
|
06c9076c2f | ||
|
|
b8fa5abadf | ||
|
|
dac2747c01 | ||
|
|
db44430870 | ||
|
|
c12139e624 | ||
|
|
a2f6d8f72e | ||
|
|
39f82e546f | ||
|
|
6e6661a72b | ||
|
|
d79e2a0864 | ||
|
|
0110cd3c55 | ||
|
|
3b359d7c6e | ||
|
|
3da5c15249 | ||
|
|
fcec12f3b2 | ||
|
|
924c23b5ae | ||
|
|
d70aa42cc9 | ||
|
|
aecc98b8a3 | ||
|
|
2c54c93859 | ||
|
|
b6b0a5ac58 | ||
|
|
2291dda425 | ||
|
|
b402a68bc2 | ||
|
|
97ecdba262 | ||
|
|
8c2ee9e96c | ||
|
|
e05baf1df4 | ||
|
|
141bba490f | ||
|
|
416be43061 | ||
|
|
2c89d05156 | ||
|
|
680b189709 | ||
|
|
29d5682956 | ||
|
|
32604f0715 | ||
|
|
d1fc48d82e | ||
|
|
650f86406d | ||
|
|
9b353ae0d8 | ||
|
|
cbcc43828e | ||
|
|
c59122a125 | ||
|
|
6a08ee1597 | ||
|
|
7bd5ddc516 | ||
|
|
ed05a32f0b | ||
|
|
f3e7f06dc5 | ||
|
|
780226a612 | ||
|
|
ca37c63649 | ||
|
|
c3e4b579d3 | ||
|
|
217caf3002 | ||
|
|
c870933125 | ||
|
|
3698b107d6 | ||
|
|
703fd9ba8f | ||
|
|
9107784746 | ||
|
|
b1776a2816 | ||
|
|
9f993fa16c | ||
|
|
7555b97f80 | ||
|
|
784238f2de | ||
|
|
0d76ea5050 | ||
|
|
3199dfd1d8 | ||
|
|
ceac5a59ff | ||
|
|
309ce7d0bd | ||
|
|
129e45c817 | ||
|
|
e8f3b27141 | ||
|
|
2eb64b3105 | ||
|
|
c48ae56e2f | ||
|
|
8d5033c4e5 | ||
|
|
fd78fd8d24 | ||
|
|
1f6874f0af | ||
|
|
fdde048f11 | ||
|
|
8fd50e9524 | ||
|
|
f836f88e38 | ||
|
|
775239e2ed | ||
|
|
16d1875157 | ||
|
|
af6d9b462b | ||
|
|
bfeb4560ca | ||
|
|
194e43d206 | ||
|
|
13830b5c09 | ||
|
|
855a155178 | ||
|
|
3975555503 | ||
|
|
b1d6d4da37 | ||
|
|
be402a9d7d | ||
|
|
00aba507f7 | ||
|
|
0cadab8fc6 | ||
|
|
cc14eee161 | ||
|
|
9d4f7193ae | ||
|
|
2f62925d85 | ||
|
|
f40d4dfbf4 | ||
|
|
fd9f6f615f | ||
|
|
c7618bd31e | ||
|
|
4e831a6396 | ||
|
|
0492fad3ab | ||
|
|
1db2a84dcb | ||
|
|
913e7f7803 | ||
|
|
da10a9a2aa | ||
|
|
cf7ef5e8b0 | ||
|
|
3f08258bf0 | ||
|
|
f7ce7060eb | ||
|
|
6e13da6293 | ||
|
|
dd2b9e15a6 | ||
|
|
49e898fd26 | ||
|
|
1927f131aa | ||
|
|
d3bcf727fb | ||
|
|
a4a29be868 | ||
|
|
0074e1abcc | ||
|
|
3f5dad7789 | ||
|
|
a365cdc2cc | ||
|
|
2e7fd02f42 | ||
|
|
1d9bf26194 | ||
|
|
7a813b2a45 | ||
|
|
da6770c9d9 | ||
|
|
7dd2b3d580 | ||
|
|
e5b80ab423 | ||
|
|
27efae93ac | ||
|
|
960be7c5ae | ||
|
|
0b5f83fc56 | ||
|
|
89564b3d2a | ||
|
|
610392777b | ||
|
|
e916fdcc89 | ||
|
|
70f7f65394 | ||
|
|
9904f664be | ||
|
|
8892feea62 | ||
|
|
41c257829e | ||
|
|
cf649fcd12 | ||
|
|
4ac79f5e12 | ||
|
|
c7b0ecfac8 | ||
|
|
7b0fd2c8f4 | ||
|
|
a2bd4250cf | ||
|
|
d47198086f | ||
|
|
89f7f50901 | ||
|
|
2aac977d57 | ||
|
|
8339dd3db2 | ||
|
|
e63d62d2c8 | ||
|
|
45c4624d5f | ||
|
|
a27a98f4b3 | ||
|
|
70a7a11324 | ||
|
|
e8f11919f7 | ||
|
|
1d976ff926 | ||
|
|
5aff3d9380 | ||
|
|
a1c6ea798a | ||
|
|
e0bf6ee390 | ||
|
|
93fe9a2799 | ||
|
|
611f59b507 | ||
|
|
899e543173 | ||
|
|
132f17b0af | ||
|
|
5568f7fc5f | ||
|
|
d35f8e6244 | ||
|
|
6a2016685e | ||
|
|
567ad6c3bb | ||
|
|
4a086cecfd | ||
|
|
890ef1eb1d | ||
|
|
94e8b5f783 | ||
|
|
21bb2f8b44 | ||
|
|
aae7d4523f | ||
|
|
f7cc9036ea | ||
|
|
26ede441a4 | ||
|
|
afac18ea1b | ||
|
|
da187ff07a | ||
|
|
9849bbec70 | ||
|
|
3aaed2600e | ||
|
|
8e316611c0 | ||
|
|
0a97135578 | ||
|
|
1bed711f0e | ||
|
|
1f1c1cb546 | ||
|
|
f2e7af498e | ||
|
|
afdb958955 | ||
|
|
06966d52bf | ||
|
|
723a6260f5 | ||
|
|
a98a0a2f77 | ||
|
|
59e755c5df | ||
|
|
55b2fce876 | ||
|
|
1fadabaf2f | ||
|
|
33178adeed | ||
|
|
46fb12f5dc | ||
|
|
12e6a721f0 | ||
|
|
0cbc9d266e | ||
|
|
7dd50eddfa | ||
|
|
c1642e3fe9 | ||
|
|
2036402742 | ||
|
|
e9e62fbfaf | ||
|
|
e49cfb4bde | ||
|
|
db8ea88207 | ||
|
|
729795364b | ||
|
|
ee46b223c9 | ||
|
|
e7d7cc6fc2 | ||
|
|
23bde13665 | ||
|
|
3dfbd8a4f0 | ||
|
|
80fb7a4c13 | ||
|
|
b8ef6dfba4 | ||
|
|
a57a465147 | ||
|
|
e14ebd0daa | ||
|
|
676bedc9be | ||
|
|
6b85bbfe65 | ||
|
|
b629fd36a0 | ||
|
|
260abfc2d7 | ||
|
|
eb7017d5cb | ||
|
|
4e86b590d4 | ||
|
|
95af577353 | ||
|
|
c4ba69b4b6 | ||
|
|
67e0e14a12 | ||
|
|
920708fb6c | ||
|
|
4b59a6cb5a | ||
|
|
229432af5e | ||
|
|
43efe4e80b | ||
|
|
286df911c0 | ||
|
|
54d95c510b | ||
|
|
61a4b03aba | ||
|
|
bebd569490 | ||
|
|
470b543910 | ||
|
|
07171498a9 | ||
|
|
2dbeb1aeb5 | ||
|
|
4fcf70872f | ||
|
|
ac7b5da711 | ||
|
|
1fc83443db | ||
|
|
c17bbe9dfe | ||
|
|
59617083c9 | ||
|
|
d167f31af0 | ||
|
|
1343c09cd7 | ||
|
|
8e6621f332 | ||
|
|
34b14f67c6 | ||
|
|
5574ea89bb | ||
|
|
d780f0f3cf | ||
|
|
03f5af29f2 | ||
|
|
a531ea34bb | ||
|
|
aa72b9c107 | ||
|
|
176469294b | ||
|
|
afd94ff52a | ||
|
|
b2c2c1ee15 | ||
|
|
b004a7448b | ||
|
|
c5e5930c1b | ||
|
|
ed2d7310f8 | ||
|
|
547de2b9e3 | ||
|
|
58abd15d93 | ||
|
|
dd60976d51 | ||
|
|
07b045007b | ||
|
|
1f7e0a2893 | ||
|
|
1159cdeab2 | ||
|
|
7f3ceea77b | ||
|
|
1d89b78315 | ||
|
|
463469e7c7 | ||
|
|
c839f0cbc8 | ||
|
|
a832346bfb | ||
|
|
3d77666ad1 | ||
|
|
6ad7a9bb70 | ||
|
|
7fa9e49880 | ||
|
|
e2e070d5e1 | ||
|
|
9f4fca4238 | ||
|
|
b366dec983 | ||
|
|
e91c1942f8 | ||
|
|
6f6b74b82c | ||
|
|
315f02905a | ||
|
|
738e253375 | ||
|
|
358cd1eaf9 | ||
|
|
e4284d20f3 | ||
|
|
f7874ec106 | ||
|
|
ad802cfead | ||
|
|
41838f1e89 | ||
|
|
8624931a88 | ||
|
|
8840e57ae7 | ||
|
|
16cb4f6d05 | ||
|
|
aa304375a6 | ||
|
|
b22789aa59 | ||
|
|
f93e140ce1 | ||
|
|
de238f1551 | ||
|
|
4247904f19 | ||
|
|
75852bdb8b | ||
|
|
5cc1e7d3fe | ||
|
|
a98f4883be | ||
|
|
d5a709a836 | ||
|
|
4243270e7d | ||
|
|
b576fce1f7 | ||
|
|
d7313543ef | ||
|
|
2636474120 | ||
|
|
0c3b55a8b5 | ||
|
|
d7dd35a2f2 | ||
|
|
0c8e3809f2 | ||
|
|
4538bca29f | ||
|
|
eeda4366a3 | ||
|
|
fc31a828bc | ||
|
|
88e10516a9 | ||
|
|
481b905331 | ||
|
|
959df613ae | ||
|
|
c476eda868 | ||
|
|
b3249dcf48 | ||
|
|
242e6ff030 | ||
|
|
f026f886ae | ||
|
|
936d7dab1b | ||
|
|
ccc20cbf18 | ||
|
|
38d774eb6a | ||
|
|
d363a0deec | ||
|
|
3ebbd030e7 | ||
|
|
7ae226635f | ||
|
|
afbe23c214 | ||
|
|
7f91f6e349 | ||
|
|
6db7001dd5 | ||
|
|
9a763db2d9 | ||
|
|
99a591c970 | ||
|
|
fd9cf29459 | ||
|
|
b9e3dd10b4 | ||
|
|
9540db424a | ||
|
|
84d81184fa | ||
|
|
3c0cc94652 | ||
|
|
5dcc795aa2 | ||
|
|
85a64f9dfd | ||
|
|
106ed6a9a0 | ||
|
|
daff0dbccb | ||
|
|
56f490cef9 | ||
|
|
145cf1093c | ||
|
|
336858e4ed | ||
|
|
e3c1a9f80c | ||
|
|
66991ea663 | ||
|
|
e253d611b4 | ||
|
|
7e76d8858e | ||
|
|
dc265ba2a8 | ||
|
|
eb00acddfd | ||
|
|
449ad4f86b | ||
|
|
77bff707fa | ||
|
|
183f8ae1bf | ||
|
|
fda6d60225 | ||
|
|
3c730c691b | ||
|
|
cf4f178485 | ||
|
|
b20fecc2de | ||
|
|
03e294b6d0 | ||
|
|
85ba7c3a15 | ||
|
|
889fa6b74d | ||
|
|
e63a07800f | ||
|
|
4082957c85 | ||
|
|
24edf81b27 | ||
|
|
03818adc14 | ||
|
|
b195934a4a | ||
|
|
82a80b9ac8 | ||
|
|
7c7edcd191 | ||
|
|
794dc5998a | ||
|
|
a2aa05fcf9 | ||
|
|
8f68bdb318 | ||
|
|
239f438a98 | ||
|
|
41127bf5dd | ||
|
|
64bff852bd | ||
|
|
d0a8dda14f | ||
|
|
cc5bec07ea | ||
|
|
e560cc2ee2 | ||
|
|
37d4a0105e | ||
|
|
c74c89a171 | ||
|
|
3bb296db78 | ||
|
|
305c22f72d | ||
|
|
9f81792e70 | ||
|
|
57e21193c9 | ||
|
|
ce9d728c2d | ||
|
|
6bc2128c3e | ||
|
|
78835a8b1f | ||
|
|
5297d699b3 | ||
|
|
75c073ee51 | ||
|
|
0fcf33ed8c | ||
|
|
39da217a9e | ||
|
|
0cf3ae95d4 | ||
|
|
78e0af383d | ||
|
|
8bedaf7439 | ||
|
|
032d79593a | ||
|
|
f152841e81 | ||
|
|
e66ea4dcd1 | ||
|
|
c513007b36 | ||
|
|
948c443829 | ||
|
|
1a3bf10753 | ||
|
|
7876ae462c | ||
|
|
8fbc77a844 | ||
|
|
87c493bf12 | ||
|
|
8c30c5d879 | ||
|
|
d8df6a0982 | ||
|
|
d6382fb4a3 | ||
|
|
9772039c4f | ||
|
|
ad6cec080c | ||
|
|
028cde8738 | ||
|
|
20f94ce418 | ||
|
|
cced7a93a5 | ||
|
|
6430f7a4a7 | ||
|
|
1fff9f6048 | ||
|
|
85a9f1b71f | ||
|
|
dfa0ddb49f | ||
|
|
43af451709 | ||
|
|
480fd78c51 | ||
|
|
0c9018289b | ||
|
|
65bf156da1 | ||
|
|
9122b49ecc | ||
|
|
35f97cceb7 | ||
|
|
a8624a736d | ||
|
|
c1ae844308 | ||
|
|
6c3d9048cf | ||
|
|
2507c1aa70 | ||
|
|
bb450e6bb6 | ||
|
|
20eb2df9be | ||
|
|
1e38ced885 | ||
|
|
fe2fb63007 | ||
|
|
b79841d481 | ||
|
|
679b9f6def | ||
|
|
87cd77b4df | ||
|
|
e4ad1011da | ||
|
|
d235ae19dc | ||
|
|
de8180ec70 | ||
|
|
ed02d7daae | ||
|
|
a28481cd8f | ||
|
|
5455abfd16 | ||
|
|
4af635df28 | ||
|
|
a6d4b30df8 | ||
|
|
4a51ff9ba5 | ||
|
|
22be076504 | ||
|
|
b85e9bb97f | ||
|
|
5eedd7810f | ||
|
|
1ba798a35d | ||
|
|
fc22c3884b | ||
|
|
0dc2a0ffac | ||
|
|
ae91f829e1 | ||
|
|
80145c699e | ||
|
|
f99cafc101 | ||
|
|
4014f5e15b | ||
|
|
3460016c94 | ||
|
|
e49c33b56b | ||
|
|
fdb31ac19e | ||
|
|
9184dd5303 | ||
|
|
26e081a2cb | ||
|
|
66a198a175 | ||
|
|
7aba5f3a84 | ||
|
|
78dcdb4dce | ||
|
|
3fdafe30c1 | ||
|
|
39022c9766 | ||
|
|
e3a9145459 | ||
|
|
8d48fddac4 | ||
|
|
8b101b10ec | ||
|
|
8b5de894df | ||
|
|
5781a01311 | ||
|
|
de1adf227b | ||
|
|
5e7bfe314a | ||
|
|
08ce08db62 | ||
|
|
56504e07c9 | ||
|
|
a901a648af | ||
|
|
a099d16714 | ||
|
|
464c83599b | ||
|
|
c78355e39a | ||
|
|
bc7c456f99 | ||
|
|
4f07818a2d | ||
|
|
979212b2ed | ||
|
|
b32e3a3475 | ||
|
|
67e18cb110 | ||
|
|
28304556a9 | ||
|
|
6a5777816c | ||
|
|
2b2e6a8829 | ||
|
|
5701b4d38e | ||
|
|
23866bce26 | ||
|
|
ac5dd0dbf9 | ||
|
|
0f0dab556d | ||
|
|
6dea227c3e | ||
|
|
cf3619d766 | ||
|
|
59b739c1c4 | ||
|
|
59963b88f5 | ||
|
|
7d67b6a9ae | ||
|
|
e944b2d1c3 | ||
|
|
442db4b5c8 | ||
|
|
991a364a3d | ||
|
|
eaf077f807 | ||
|
|
fbb55c14d6 | ||
|
|
e4bee3d372 | ||
|
|
42694f2e9f | ||
|
|
2835905398 | ||
|
|
f9c7022bcc | ||
|
|
60d05e1ae1 | ||
|
|
b918ea88cc | ||
|
|
e8c8509ed3 | ||
|
|
42e101291e | ||
|
|
00bcae7feb | ||
|
|
6d96d6cba4 | ||
|
|
e3f0815012 | ||
|
|
f154692dad | ||
|
|
b4e79592c4 | ||
|
|
e779bf52d1 | ||
|
|
d62d6ebf05 | ||
|
|
e4277b47e8 | ||
|
|
fd9e8b712b | ||
|
|
0de1d45492 | ||
|
|
fdee3ee93e | ||
|
|
ef045c61ca | ||
|
|
212800b074 | ||
|
|
6d1197a144 | ||
|
|
a5b2dbfaf0 | ||
|
|
e455b2af6e | ||
|
|
d26c40b26e | ||
|
|
8ba55b4bf2 | ||
|
|
4f1f21287c | ||
|
|
878a163d11 | ||
|
|
dea23bef45 | ||
|
|
d12d1f161f | ||
|
|
7afcd09651 | ||
|
|
4375d66d09 | ||
|
|
e2bb6cf6c6 | ||
|
|
2e11a68c0d | ||
|
|
27fe904970 | ||
|
|
130a041be0 | ||
|
|
a7a2f5f974 | ||
|
|
e47146faee | ||
|
|
d1d6fe26a6 | ||
|
|
3df0550b19 | ||
|
|
6eb296303f | ||
|
|
5a2ca33d0f | ||
|
|
215c21891b | ||
|
|
4c37dcf5bb | ||
|
|
2457003deb | ||
|
|
5ee4eb5871 | ||
|
|
c253000af1 | ||
|
|
f0d9ba89df | ||
|
|
05219e69c4 | ||
|
|
c3439b41b8 | ||
|
|
e479575825 | ||
|
|
0282169703 | ||
|
|
0da0998e44 | ||
|
|
60d3af7bb7 | ||
|
|
8ddf035a9b | ||
|
|
0f5b8b5a90 | ||
|
|
69a5c99396 | ||
|
|
3aa3d67675 | ||
|
|
cf46e322b9 | ||
|
|
3a3c021a6a | ||
|
|
4b3267649a | ||
|
|
1c4190bf22 | ||
|
|
3e2bd02ce5 | ||
|
|
2f83f2aa52 | ||
|
|
914b1cb628 | ||
|
|
6dae07be7d | ||
|
|
c683c1c57e | ||
|
|
775a38880e | ||
|
|
9d949a5b89 | ||
|
|
01c2968388 | ||
|
|
41b711740a | ||
|
|
0d0589800a | ||
|
|
2f0f2c5002 | ||
|
|
abfb5bcd2e | ||
|
|
5ff84d80b4 | ||
|
|
e29ab6b0d6 | ||
|
|
89df6fc6da | ||
|
|
78a45d72d7 | ||
|
|
abb970fe39 | ||
|
|
f8ecbed829 | ||
|
|
9ac093e0be | ||
|
|
38c9d8d6ca | ||
|
|
4557502b1d | ||
|
|
55309bfaef | ||
|
|
0c842fc772 | ||
|
|
5210d7621e | ||
|
|
b85d972488 | ||
|
|
919df7ed56 | ||
|
|
de62db5e18 | ||
|
|
24b0d83387 | ||
|
|
dec3f290d0 | ||
|
|
190b4cd010 | ||
|
|
61e16a4668 | ||
|
|
e447159d4a | ||
|
|
b191406a0c | ||
|
|
d732b60a38 | ||
|
|
ba94a57e08 | ||
|
|
1fcd36e4ac | ||
|
|
31362f3e07 | ||
|
|
0fbccef759 | ||
|
|
2659521dc9 | ||
|
|
0f489b34b5 | ||
|
|
0642b4b830 | ||
|
|
8b77be9da3 | ||
|
|
56345b5743 | ||
|
|
f09ee24975 | ||
|
|
aed7036595 | ||
|
|
9fbb9746bc | ||
|
|
0154f240f3 | ||
|
|
dacbdd9aa5 | ||
|
|
a7abea692d | ||
|
|
f04b3f9b09 | ||
|
|
2841eadc91 | ||
|
|
616af831a7 | ||
|
|
1e730078c1 | ||
|
|
e1eb2da5f3 | ||
|
|
0132360e49 | ||
|
|
1c2a409e6a | ||
|
|
15e1774a13 | ||
|
|
16b49c25e1 | ||
|
|
c61adc7041 | ||
|
|
6524ac3678 | ||
|
|
8335f10f8c | ||
|
|
518680f23c | ||
|
|
38c36699a7 | ||
|
|
f363e742e6 | ||
|
|
1b423f5b54 | ||
|
|
269f73205a | ||
|
|
8147e64c48 | ||
|
|
d321dcf20b | ||
|
|
59e72cd1c2 | ||
|
|
d67fe22b8d | ||
|
|
b2847811ef | ||
|
|
b7f050aa3b | ||
|
|
cc67569425 | ||
|
|
7657d8680e | ||
|
|
26927907cf | ||
|
|
e406dd02ed | ||
|
|
c90ea92a4e | ||
|
|
c28feb56a8 | ||
|
|
78f1c0f11f | ||
|
|
95f8e9fbe8 | ||
|
|
1befbfee6f | ||
|
|
9316b2bed0 | ||
|
|
58ce44c935 | ||
|
|
c59c5e35f8 | ||
|
|
90da6ba364 | ||
|
|
0f190e094d | ||
|
|
0c63dac5e7 | ||
|
|
3a86c53b49 | ||
|
|
a5292d4b71 | ||
|
|
cd7a7fa3d2 | ||
|
|
255a492db6 | ||
|
|
6cff270d3d |
10
.gitignore
vendored
10
.gitignore
vendored
@@ -10,6 +10,7 @@ composer.phar
|
||||
/app/config/*/session.php
|
||||
/app/config/*/database.php
|
||||
/app/config/*/app.php
|
||||
/app/config/*/ldap.php
|
||||
public/packages/*
|
||||
public/uploads/models/*
|
||||
public/uploads/avatars/*
|
||||
@@ -23,6 +24,9 @@ public/uploads/logo.gif
|
||||
public/uploads/logo.png
|
||||
.siteflow
|
||||
public/assets/.siteflow
|
||||
.settings/settings.json
|
||||
|
||||
|
||||
app/config/local/session.php
|
||||
.couscous
|
||||
app/storage/dumps/*
|
||||
tests/_support/_generated/*
|
||||
tests/_data/scenarios
|
||||
public/uploads/assets/*
|
||||
|
||||
38
.travis.yml
38
.travis.yml
@@ -1,6 +1,7 @@
|
||||
addons:
|
||||
hosts:
|
||||
- AlisonMBP
|
||||
hosts:
|
||||
- localhost
|
||||
sudo: false
|
||||
|
||||
# see http://about.travis-ci.org/docs/user/languages/php/ for more hints
|
||||
language: php
|
||||
@@ -13,28 +14,39 @@ php:
|
||||
|
||||
# optionally specify a list of environments, for example to test different RDBMS
|
||||
env:
|
||||
- DB=mysql
|
||||
- DB=mysql APP_ENV=travis-ci
|
||||
|
||||
# execute any number of scripts before the test run, custom env's are available as variables
|
||||
before_script:
|
||||
- if [[ "$DB" == "mysql" ]]; then mysql -e "create database IF NOT EXISTS snipeit_laravel;" -utravis; fi
|
||||
- hostname
|
||||
- if [[ "$DB" == "mysql" ]]; then mysql -e "create database IF NOT EXISTS snipeit_unit;" -utravis; fi
|
||||
- curl -s http://getcomposer.org/installer | php
|
||||
- cp app/config/testing/app.example.php app/config/testing/app.php
|
||||
- cp app/config/testing/database.example.php app/config/testing/database.php
|
||||
- cp app/config/testing/mail.example.php app/config/testing/mail.php
|
||||
- cp app/config/travis-ci/app.example.php app/config/travis-ci/app.php
|
||||
- cp app/config/travis-ci/database.example.php app/config/travis-ci/database.php
|
||||
- cp app/config/travis-ci/mail.example.php app/config/travis-ci/mail.php
|
||||
- composer self-update
|
||||
- composer install --prefer-source --no-interaction
|
||||
- php artisan key:generate --env=testing
|
||||
- php artisan migrate:install --env=testing --no-interaction -vvv
|
||||
- php artisan migrate --package cartalyst/sentry --env=testing --no-interaction -vvv
|
||||
- php artisan migrate --env=testing --no-interaction -vvv
|
||||
- php artisan db:seed --env=testing --no-interaction -vvv
|
||||
- php artisan key:generate
|
||||
- php artisan migrate:install --no-interaction -vvv
|
||||
- php artisan migrate --package cartalyst/sentry --no-interaction -vvv
|
||||
- php artisan migrate --no-interaction -vvv
|
||||
- php artisan db:seed --no-interaction -vvv
|
||||
- ./vendor/bin/codecept build
|
||||
- APP_ENV=travis-ci php artisan serve --port=8007 &
|
||||
- sleep 5
|
||||
|
||||
# omitting "script:" will default to phpunit
|
||||
# use the $DB env variable to determine the phpunit.xml to use
|
||||
script: phpunit
|
||||
script: ./vendor/bin/codecept run --env travis-ci -vvv
|
||||
|
||||
# configure notifications (email, IRC, campfire etc)
|
||||
notifications:
|
||||
email: false
|
||||
slack:
|
||||
secure: vv9we1RxB9RsrMbomSdq6D7vz/okobw87pEkgIZjB+hj1QpQ2by90gsPsOa+NgsJEFaEP7e4KlT6SH8kK+zhbmuKaUd3d1//XdcancE22LZXi6tkiB5yuR/Jhhb1LLDqyGJTB4D92hMnnCPiUjpxNA3r437ttNeYRdYIEEP3drA=
|
||||
webhooks:
|
||||
urls:
|
||||
- https://webhooks.gitter.im/e/5e136eb0c1965f3918d0
|
||||
on_success: change # options: [always|never|change] default: always
|
||||
on_failure: change # options: [always|never|change] default: always
|
||||
on_start: false # default: false
|
||||
|
||||
648
CHANGELOG.md
648
CHANGELOG.md
@@ -1,5 +1,423 @@
|
||||
|
||||
|
||||
### v2.0.5-pre - Released Nov 04, 2015 11:42:37
|
||||
#### This is a pre-release
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/679b9f6def461ae5e2c0fa1223368d5838ac2945">view</a> • Small EOL fix
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/35f97cceb72f20ff104252066e92324cd5691827">view</a> • Fix missing lists causing modal errors
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/f152841e817ab6e9571eaad56d30fd5fc7e2715a">view</a> • quick fix $inout/$action issue
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/032d79593aac47c1516061e30882784fd64fd342">view</a> • quick fix $inout/$action issue
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/78e0af383d729718aa525cdd8fb382600c5fe2ad">view</a> • Fix user firstname/lastname search
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/67e0e14a12d49fc190daae553332a6c008f89314">view</a> • License importer, small fixes for asset imporer
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/e9e04e86da8d49d35c958cde2445499aae3f34ac">view</a> • added fixed width for navbar icons (fa-fw)
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/485b34b66e9570d40376f33c28a802e276476074">view</a> • fixed layout and added branding option
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/0db075cb13eb045ed863411a8f5801a980db481a">view</a> • fixes lang option for remote script
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/9264e7bdc4db61076180414c47fed866db02376f">view</a> • Fixed missing limit
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/cf7571d3a6e796a8f5cf15536ed18fabf07b939e">view</a> • Fixed inline display od checkboxes
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/68005595967bdee3efbf35cec26154e5b40dc6a8">view</a> • Fixed dumb braces
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/b25b3321f9dc06fcdf912fefa99d70c4878ab1b6">view</a> • Fixes skip/offset for #1266
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/7dc0039c3b1d794b2a4706d9e16389b55c2ee1d0">view</a> • Fixed parent relationship
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/b18be5aee8a5d2d7003f847d780917ecee7c5411">view</a> • Fixed relationshop again?
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/348a566f894d568d8ce9d1b58ffe6ce03cfb7e65">view</a> • More responsive fixes
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/d1192095d03584644fb1a8e26d5830383631cc11">view</a> • Fix for showing deleted items
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/8ad220701eed66b49173a9e12e2883e7d355fbf7">view</a> • Fixes Purchase Cost not showing up on custom reports
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/28fcd2b8abcee12f08095781aee6d6701d451c73">view</a> • Fixed indenting
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/440bc1a4b446695dc8613a2f31f024b15fbdfebb">view</a> • Fixes bug in people display
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/2e044bf0a3031c8620280654bc88f67cffb12461">view</a> • Fixed category bug
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/b1d5812ae275095f8d50057e61276025aa529b0a">view</a> • Fixed categorys page
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/8ea40d4e6d8e440158d3271f859dac167182b4c9">view</a> • Fixes default value for strict mode
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/a3f5dc331d55afdea0b427b055e95bb4ef379e95">view</a> • Fixes #1007 and #1053
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/cf49920564367b153181974f1b1b3b10a6f02e84">view</a> • Fixes #1235 - 24 hour format for log
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/0a3843393ddf1fe0b5c5ce3f92a9f4820d13cd3f">view</a> • Addec expected_checkout, fixed language calls to use blade syntax
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/20e7888bd9636856758e25efbe7d347fd2afd900">view</a> • Fixed expected checkin on view
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/efddda8665e2c20f60dde40ca23294fa76506957">view</a> • Fixed expected_checkin error on asset view
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/09bcb137c4f85e24f2127f24ce509caa7e5a060a">view</a> • Ugly fix for preventing errors if there is an invalid model (therefore no category)
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/b6f4080b97f71bba58787a1e02e198878fd576dc">view</a> • Fixes consumable detail view
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/5436d54aa0d9d52131ef89ad804034fe67e95011">view</a> • Fixes #1290 - datatable broken for assets in model
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/76968f7d48a4558105cc52231726475e626f0a2b">view</a> • Fixes asset model table sorting
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/e0fccc8fc978ca36512f77d32032e3329f52cb48">view</a> • Possible fix for #1296? Can't reproduce locally
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/5c820d49a606f596cdaf905b6b63ae05f16e3356">view</a> • Fixes #1305
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/d0eed67c42334c094eefe65eb900d2fa8efaf93c">view</a> • Fixed relationship to return actual assets
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/0745ec1502865b3be6bab65d48d12188a8ddc77e">view</a> • Fixed scope for users
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/f147a0ff02e69ee5b99be4b58cf867bc39ac3505">view</a> • Fixed user table name
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/577c1936612a3a9a36cd2968d7511adf6fba3fde">view</a> • Fixed bug in location import
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/0b0b55619b0e3b8b370fce65ece340430fe889dd">view</a> • Fixes #1291 - Use current currency, or sane fallback
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/a587b72c710244a279b974991809d0350896a878">view</a> • Fixed dumb indenting
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/f4331f4498b5c3c537b8f33b4f8a34fdf94ae3ec">view</a> • Fixes #1291 - use location currency and fall back to defaul currency for asset maintenances
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/2a43491792877bd8a9ed47282eb3059c4d2c7ed0">view</a> • Fixes #1291 on the asset view as well
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/17207ddea115bd9956b695470a539c8cc1a41391">view</a> • Fixed table cookie name
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/6e117efebd9c89d145b7ace71014d242c8eda3b7">view</a> • Fixed dumb indenting
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/4b2e7b9b069a98668f028e5c5851d64ed1364967">view</a> • Fixes #1013 - show location name on asset view page
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/dc64ad55ee38be414ce32d5de8b4021897c7a1ce">view</a> • Fixed link to manufacturers view
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/bc8c8e422504ac92bc20801e6f68883d79933dce">view</a> • Fixes #1012 - more consistency in manufacturer view
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/14ba5a3b77e894ae82c73607f39e30bbce9895af">view</a> • Fixes #1310 - adds version hash to table name to prevent cookie issues for folks who pull from dev
|
||||
|
||||
|
||||
### v2.0.4 - Released Oct 21, 2015 07:40:18
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/0cb4b9e00bdd8b5f795b8ce6fbb594f5a01df8ff">view</a> • Fixes #1181 - add title to maintenances in asset view
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/49a20c75ed4b0f9d3a66ddf6bd33d8c24bc571c0">view</a> • Fix for #1052 - hopefully make it less brittle in future as well.
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/2df8c6a3d198f3eb3098783b16fc977a9599c7fe">view</a> • Merge pull request #1186 from snipe/docker_fix2
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/53b5ec64e0668db8ffea99e3af83df1a3e60200c">view</a> • Fixes #514 - adds RM as currency
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/505d46d49f0d6c60ea94234a4d1d45ba66c1afb9">view</a> • Fixed typo
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/b943ace21b420a726477a892be6c08d2549d2a87">view</a> • Fixed wrong model type reference
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/4c662b713605e161696c7e0faa8977dc59f82d45">view</a> • Fixes #1196 - added licensed to name and email in list view
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/141c77fed7ff996e9d9efb803c454f3e3225ce56">view</a> • Fixed #1205 set default nullable in purchase order for strict mode
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/10909a21cde3a11ed6c06d7ace7af35f315d281b">view</a> • Fixes #1206 - updated seeder with is_warranty value
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/f6b57adda30a415f7a67d5e45be76ca7bb5e5764">view</a> • Fixes #1211 and duplicate column in view
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/ec80c99a48a7e19a5775352ee818f3c9f36a9f44">view</a> • Fixes #1204
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/75af50def159da0e03ac41b5c91ab8e074bce7ef">view</a> • Accessories fix for #1204
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/4f74ad077a43651708c3759e91c571e7aa0e90d4">view</a> • Fixes #1136 - allow consumables to be deleted, even if they have been assigned
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/66fd0c231597e2472e32165ab728d84f15d858a5">view</a> • Fixes #1232 - adds category to accessory listing view
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/e7f14f66dc94fe1e38b92ff8b4ccf8306d5743cc">view</a> • Fixes #1260 - removed domain from cli list
|
||||
|
||||
|
||||
### v2.0.3 - Released Sep 21, 2015 01:11:08
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/39f82e546fd0ecbac14f79780c9c3b4020d943f0">view</a> • Fixes #1174 - broken migration if asset_logs table has uploads
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/cffd87c5a37d55156c7c05a8795d75ef36f6470d">view</a> • Fix user display if no location was provided
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/fe765b3c9c086687a9f1cdd5a696e48664520a32">view</a> • Fixed not found error message string
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/fbbe24f19703b2fdab14be13b10a167c2eaf46c3">view</a> • Fixes #1184 because package authors can't seem to keep their stuff from breaking
|
||||
|
||||
|
||||
### v2.0.2 - Released Sep 11, 2015 11:14:20
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/9b353ae0d892a65cc328ec885e48aa58106992f0">view</a> • Fixes #1150 - added note about lowercasing
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/32604f0715d29290f3c63735d2b72f9f4aba06c0">view</a> • Fixes #1154 - DL CVS string
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/680b189709a9f23e059ee93d89edf7d98692a55f">view</a> • Fixes #1151 - additional LDAP option
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/e05baf1df4134a84296fc8fcd60e9be534ddb24b">view</a> • Fixed language strings for accessories
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/8c2ee9e96c9d819bdd808af029c98a54db133c22">view</a> • Fixes #1167 - don't allow double checkin
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/2c54c93859ad73c3fe8fb8452be70ce3cf0c4467">view</a> • Fixes #1170 - barcode alternative
|
||||
|
||||
|
||||
### v2.0.1 - Released Sep 04, 2015 02:24:22
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/67e0e14a12d49fc190daae553332a6c008f89314">view</a> • License importer, small fixes for asset imporer
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/46fb12f5dcd5a37e8aecdf585ee892c6816f2bb0">view</a> • Fixed acceptance suite yaml to make it work for travis-ci as well as local testing
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/33178adeedb37773c7b830582b167d1b5063127c">view</a> • Fixed issue in travis yaml file
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/1fadabaf2f4a15ffdd26d426fb814d970b7e62f4">view</a> • Fixed stupid mistake in the travis yaml file
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/1927f131aa1e59f81caf35999eaaab2bd0dc1f14">view</a> • Fix broken Docker build
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/49e898fd263cc1fb7fb80dcb7aa11058c305ed21">view</a> • Merge pull request #1122 from irasnyd/docker-fixes
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/dd2b9e15a60c402be914747979e27ca8a7c1c496">view</a> • Fix #1109 - Asset names are missing when viewing user history
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/6e13da6293db3347e62363c448a35b502f8c8379">view</a> • Fix #1123 - fix new lines in serial not being recognised
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/cf7ef5e8b0c3e6a376614486e590ef2d25d5145e">view</a> • Merge pull request #1131 from irasnyd/docker-fixes
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/da10a9a2aa2c2995ca81e8e1ad9e0117de058eb8">view</a> • Fixes #1130 - don't try to send email if email is not provided with the user
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/00aba507f7a4f5daaa57b9ccd5e7730bb5e9f63d">view</a> • Fixed acceptance suite yaml to make it work for travis-ci as well as local testing
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/be402a9d7d3d039666f1c8110b8d1e1697d28092">view</a> • Fixed issue in travis yaml file
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/b1d6d4da3777505d51310780fe393a874a24358e">view</a> • Fixed stupid mistake in the travis yaml file
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/7bd5ddc516cc3130f4eb5e7ac53a7c9d4e67be87">view</a> • Fixes incorrect title for unaccepted assets report
|
||||
|
||||
|
||||
### v2.0 - Released Aug 26, 2015 02:40:08
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/8892feea62d8966dbfa4c1bab6c4f0ac25929504">view</a> • Fixed typo
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/70f7f653948dfb40e62b1e699ae30e2eca31c085">view</a> • Fixed path for windows
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/e916fdcc8925b0d997b77c8ce167eb91948ee883">view</a> • Fixes #1092, setting LDAP_OPT_REFERRALS to 0 for Active Directory
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/610392777b68ef0d3488db7cd7fabfacc2514046">view</a> • fix
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/89564b3d2ad14150ea1c64604a4dcd29efc0e688">view</a> • Merge pull request #1099 from kobie-chasehansen/fix-for-#1098
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/7dd2b3d580b939436c1ff68674db5f160e275a1f">view</a> • Fixes #1104
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/da6770c9d967d177af6cb36af6a92f0bdae1800a">view</a> • Fixes #1102 - default currency stored as htmlentities in the DB
|
||||
|
||||
|
||||
### v2.0-RC-1 - Released Aug 20, 2015 12:53:11
|
||||
#### This is a pre-release
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/94e8b5f783c3b03c062c0d82d3d166d770ec8e6f">view</a> • Fixed bug in expected checkin
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/890ef1eb1d6a7ed3845554f40c641585c61dd2f2">view</a> • Fixes #1038 - clickable links in dashboard
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/1d976ff926197a9dd592b8dd9c6e2da97a16cebe">view</a> • Fixes #1078
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/e8f11919f74340db6175873abb27a59671556c26">view</a> • Fixes #1077 - ordering of dropdown menus
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/a27a98f4b3d6ac980eb4c00c14e966534024ae56">view</a> • Fixes #1081- include asset name on checkout
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/45c4624d5fcb082aed9b2fe0f08eb8b31c783b88">view</a> • Fixes #1081
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/e63d62d2c83d82fc9eb1e2ba00e6939210166837">view</a> • Fixes #1083
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/8339dd3db29bca3e04273a0336f90283b9cfbf64">view</a> • Fixes #1089 - checkout button on accessory view page
|
||||
|
||||
|
||||
### v2.0-pre-beta2 - Released Aug 15, 2015 05:20:22
|
||||
#### This is a pre-release
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/c8870ddcab0b521c9682cd8c5ab6fd56ee01753a">view</a> • Fixes #736 - more fields in bulk edit
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/5e7a4e8193b26875729089b36b28adca1644cb8d">view</a> • Fixes #599 - show groups in user list
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/f463cd6c8d72d9d28cd984ccad08fc596edbdaac">view</a> • Fixes for #759 - location heirarchy
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/51eeee09d72148d4dae629744753a96e51c1b8ae">view</a> • Fixes bug in #736 for new fields
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/3881e2e83eb72c1567db6c45afa40d7f79330bb3">view</a> • Fixes #784 - add "create accessory" to topnav
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/aab52d08506f5bc1fd0fcf35229e04b0cb5883bb">view</a> • Fix for strict mode with location parent
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/2f52369d075d6f95cd188acf14a23fcd9d431213">view</a> • Fixed location string
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/139dd1339271351714623e53d323cce5356618de">view</a> • Super janky miulti-level menu on create - TODO: Fix this ish.
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/2d7a348ab705fbca6f432f7adf0861085ab836c5">view</a> • Fixed multi-level array nesting for locations
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/95279f885b231eda371835b9eeb998c683cfbfd3">view</a> • Fixes #759 - populate form with parent location info
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/8cdea8a38404ed2187fa59f8e7f9198cb9ce94bb">view</a> • Fix for location totals
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/496a768013c759a4e3fa190f5970bbb865cebd62">view</a> • Fixes #795 - add model name if no asset name
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/7c95f4231e3281ca99744aa3ba8e530cf746c6ba">view</a> • Fixes #799 - missing text in file delete confirmation
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/212f09dd310ba54f6b513ff867e7641bdc8cb3f1">view</a> • Fixes #806
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/2540ac09ec9aa9d0e461be52fe117379a21474e0">view</a> • Fixes #822
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/766b4b901f8dbefe4e052d1927f274a0ace4d7d3">view</a> • Fixes #822 - make user notes field nullable default null
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/fdef26608971b747ca3ac9ada87f295311543892">view</a> • Addresses #577 and fixes #165 - switch from email to username
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/f42540fedf92a315614c6c1dfacd31879fef2a78">view</a> • More fixes for #165 - added username field
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/3d4607ebd3e7f6494912f38be40945eb4aa6a57b">view</a> • Fixes #858 - find admin group by name instead of ID for consideration of clustered DBs
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/10135802367f015e0b91329d692e3358ef7ffeae">view</a> • Fixed typo
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/bf6674f6a0252abf51977a355cadc6fccbde7cd7">view</a> • Added table prefix for raw queries
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/ea0f2c5f347d31a1543b7b3c980c9909a3e2403d">view</a> • Fixes #833 - remove status label field if asset is checked out
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/edddf6ae80cfa60af17544ed06c1b7c5883afe7a">view</a> • Fixes #833 - remove status label field if asset is checked out
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/2e585f9cd205e7fad93559281ac92b0fb09f816e">view</a> • Fixes #839 - bad seed data
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/75b9b70a8632f10c7c55b6a62e8d19e6f8b4ebe8">view</a> • Fix email field so it's nullable, fix app command to add user
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/94f8c6172042899f5f28723ceed2b562a5dca912">view</a> • Fixes #280, #64 and #860 - added license expiration alert
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/85d6b062f3b2a4da6171d8e026f4077fa3cf4c39">view</a> • Fixed checkbox alignment
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/f2e1ec092830822150d463d969ece2ce2f4795d4">view</a> • Fixed QR simple view route
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/8ef3d00f2264d5338043887f6d23bb5c0b5cc508">view</a> • Fixed language string for users
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/84e130d6aa4a53aea8fc75679ca270b25509a9a9">view</a> • Fixes #869 - compatibility mode for IE
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/a5292d4b71e479cf87b7729b66e61fbf0f856520">view</a> • Fixed issue with migration that left off the deleted_at field
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/0f190e094d5d084e853f7134ba917a73dd9e5f01">view</a> • One last fix to the migration to add the supplier relationship
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/c59c5e35f8f32710f98e37c77f55adf1f963830e">view</a> • Fixed the need to only be a date instead of a date time
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/58ce44c93548adb11fe78291fcb10142548f3664">view</a> • Fixed the datetime fields to be date fields only
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/9316b2bed07d5153ebf78a237f42c7e1d5a3a659">view</a> • Needed to fix nullable issues
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/b7f050aa3bd426c235732c924f63827ee74b8586">view</a> • Update the migration to fix an issue with the improvement_time so it would be an integer Created the view for improvements Updated messages in language pack for additional items needed Updated the asset view and supplier view to fix an issue
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/b2847811efdfaa172b07206af24cf3c183c39879">view</a> • Fixed issue found with date being handled incorrectly Updated multiple views to reflect this issue
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/d4af197b0e8ecde9a36e2417fe7dd2fb7c5c28ec">view</a> • Merge pull request #886 from madd15/Fix---Edit-user
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/1b423f5b542ac56d5836b8aa1a8c4a93927eeae1">view</a> • Fixed all issues that were reported by @leobg Also, renamed and fixed items of concern by @snipe Renamed Improvements to Asset Maintenances
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/e714def74aa6aeada6716ef091e599c5ebf9f8a1">view</a> • Fix Reports showing class="active"
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/4a5066054b1bb75222c6765675366405a4f70b73">view</a> • Display bugfixes for #819
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/7e5f32c9d85cc9a28976732d6232632e1cf0314a">view</a> • Merge pull request #898 from madd15/Default-Layout-fix
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/c61adc7041f919c156188b12de4bcb2a66a54419">view</a> • Partial fix for #851 datatables. Because clear error reporting is apparently for suckers
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/0154f240f3d20be2c4a94bf5fab582f91d0eabea">view</a> • Fixes JavaScript for edited assets
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/56345b5743a930e18fcbcbf7140d8199c9731b7e">view</a> • Fixes #909 - expired licenses showing in email report
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/24b0d83387efc38340ae2678d220cdaef0bfad5a">view</a> • Fixes #912 - added clon button to list view
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/de62db5e18c5661595ab17b1c2c74907a00f07f1">view</a> • Fixes #901 - added notes field to list view
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/0c842fc772d4b82c1cb3148a230342fe852c5ad3">view</a> • Fixes #863 - clickable order number in asset view
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/01c29683880856e3e17a05e9fde91da18bb95b57">view</a> • Revert "Fixes #863 - clickable order number in asset view"
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/3e2bd02ce55a677ee50e5a46d225d0fc6aa51f6f">view</a> • Fixed issue with migration that left off the deleted_at field
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/3a3c021a6a34f9860bf5dc0075e9f3edb60d1248">view</a> • One last fix to the migration to add the supplier relationship
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/3aa3d67675043eec504b979a16a21146bad5635d">view</a> • Fixed the need to only be a date instead of a date time
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/69a5c9939637aee96ea16c05431c1aaec5288f25">view</a> • Fixed the datetime fields to be date fields only
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/0f5b8b5a908d4b7e64241972c53fef473c6c6c6f">view</a> • Needed to fix nullable issues
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/5ee4eb5871dd05cbf372093cb3f5fe1c0f1047bd">view</a> • Update the migration to fix an issue with the improvement_time so it would be an integer Created the view for improvements Updated messages in language pack for additional items needed Updated the asset view and supplier view to fix an issue
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/2457003debb0c2a406d1220874e667f26c298f40">view</a> • Fixed issue found with date being handled incorrectly Updated multiple views to reflect this issue
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/d1d6fe26a6302c37b85c541a7622698ead235648">view</a> • Fixed all issues that were reported by @leobg Also, renamed and fixed items of concern by @snipe Renamed Improvements to Asset Maintenances
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/8ba55b4bf241254cb06205523576999b30409a11">view</a> • Fix missing checkedout_at
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/6d1197a144aa0cd2479791190a9b46f480ba7d68">view</a> • Fix edit model cat list showing deleted categories
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/28359053986cf75a82c48b5b7c9bd9302f7c85ac">view</a> • Fix dup file uploads and layout
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/e4bee3d3729196abd43f10a0de7ce5bf1c9f3458">view</a> • Merge pull request #951 from madd15/fixes-1
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/eaf077f8076183d65032c7b1f495385d8d261bb7">view</a> • Fixes #946 - navbar custom color not working in FF
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/e944b2d1c3aaa286f39dbe979b55beb39b320733">view</a> • Fixed blade path
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/7d67b6a9ae6898cd0cf1f4b42613eeadd4466075">view</a> • Fixed forgotten password
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/59963b88f5857240b060bb227fb125fad695e3c3">view</a> • Fixes #941 - looser restrictions on alpha_space custom validator
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/59b739c1c4ae3f11f6a36e7968f504d0e8322b76">view</a> • Fixes #902 - redirect to group listing page after group create
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/cf3619d7666b0f0f4693769a06232db1ad0d5874">view</a> • Fixes #937 - bug in which type of asset
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/6dea227c3e5123319263890cc6ddccda3fd6223c">view</a> • Fixes #851 - bulk user delete
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/0f0dab556d7920c87a456356e415b515b3ea8b1a">view</a> • Fixes #807 - bad link for subfolders
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/a901a648af4c383281ca6f36b5887f49604cf917">view</a> • Fixes #875 - allow user to decline asset and check asset back in if declined
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/5e7bfe314a06d0caa370ddfc2c166988ef54a7e3">view</a> • Fix missing ]
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/26e081a2cbd90b2a4c3443a8b60c8e86c0daab41">view</a> • Fixes #909 again, because math is super hard
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/9184dd5303985af7ecf467bb57814b77bfb77077">view</a> • Fix for sad action column with button wrapping
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/f99cafc101267d524c994f14f8f0470f3583aead">view</a> • Fix for 0000-00-00 purchase date
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/b79841d481c5e3c3febddcc2e083614643fa967f">view</a> • Fix for @uberbrady's missing route on inline adding
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/20eb2df9be6ae00f560f91d191b2f7ee9854f8ef">view</a> • Fix to nicen up the layout for the inline-adding and Bootstrapify it.
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/bb450e6bb662c526581cefa08e63735b21b4dbb8">view</a> • Merge pull request #980 from snipe/inline_layout_fix
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/c1ae844308a879fe9cb4d7999ddabba4bfa5fe9d">view</a> • Fix #972 - Change back button to work
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/0c9018289b3fed49154e2d7138d4b760ce7d2752">view</a> • Fixes #970
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/8c30c5d879ed1ebfcc23bf82cbf9bb0e247e1b5f">view</a> • Fixed issue in routes file
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/948c443829f20f26c9a76af2f63bd48b7d363e5f">view</a> • Fix for edit/clone
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/39da217a9ea1f300bc14f1615b2365027dab72dc">view</a> • Fixed table nane for asset_logs in migration
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/3bb296db789db166faf11d1a0b8289a44d592271">view</a> • Fixed language string for notes (when the hell did THAT break?)
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/c74c89a17124857e3f25d33f6d0a00f6eaf07861">view</a> • Fixed the migration for adding thread_id to correct the table name and make thread_id nullable
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/37d4a0105eb2a361b493ab504b22383d400d4356">view</a> • Fix for strict mode
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/a2aa05fcf95cf8cf4e9baa7cb3ab24a222a545fe">view</a> • Fixed the migration for adding thread_id to correct the table name and make thread_id nullable
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/3c730c691b32dc7ccf26458929444a721ed1393f">view</a> • Fixes #1010 - better errors on large file uploads
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/449ad4f86b03aac25891867067d9faa223cd7b5a">view</a> • Fixes #1014 - error if no assets are unaccepted
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/eb00acddfdf12ed1bb41d0a07741927964614d17">view</a> • Trying to fix the broken migration
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/dc265ba2a8abf9d0856728e6f6df79d4d89214a8">view</a> • Fixed back button on user create
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/e253d611b4b36bc00bc9ae49fb2ba4e48d882805">view</a> • Merge pull request #1027 from balticer/fix-validation-ampersand-and-sharp-s
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/66991ea66340ef7068f825da9fa505ee6b60b955">view</a> • Fixes #1018 - allow name re-use if deleted
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/5dcc795aa298246e26cfba6c17422825db43f870">view</a> • Fixes #1024 - delete option added to user dropdown
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/3c0cc946525c635e5703407672b30d433bf66af6">view</a> • Fixed route
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/84d81184faffd53bbc348b3ceac3d416e0bdeab4">view</a> • Fixes #1009 - Add MAC address to search
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/9540db424aabcd6747058f48e9ff766747749553">view</a> • Fixes #948 - validate on model name+modelno+manufacturer combination
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/3ebbd030e7aff31b2844b92800e78575d28916b2">view</a> • Fixed issue with Asset model
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/d363a0deec644443a94ff05aef8f5113817513ae">view</a> • Merge branch 'feature/865_fixIssuesFromSnipe' of github.com:vsposato/snipe-it into feature/865_fixIssuesFromSnipe
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/38d774eb6a16cdde0b30190060c0723c8d6405f1">view</a> • Merge pull request #1033 from vsposato/feature/865_fixIssuesFromSnipe
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/936d7dab1b67eccf8b0158d4ee2fe2d80afd24e6">view</a> • Fixes #1043
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/c476eda868de0cb2deb068a0b49bfe7bfc14aa12">view</a> • Removed link on location until location view is fixed
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/481b905331d361e6eaec5972bc5038862932b778">view</a> • Fixes #1045 - allow 0 value for accessories
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/e4284d20f3b19fc7b685b8b13fcc74c6663bb802">view</a> • Fixed error reporting
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/738e2533750e1455ded2df8b8e41fb97c2ebf45b">view</a> • Fixed Slack notifier
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/b366dec983217e7fec13c8640951acddee915778">view</a> • Fix display for NULL entries created by previous model modal
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/9f4fca4238ee3838b263e13a77a4647dab6ea8b8">view</a> • Fixes #522
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/ed2d7310f8a4c6c7e7e41b0a587a0db6b8ea11c7">view</a> • Fixed unsuspend icon
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/34b14f67c617957370fd2f6e875daf9dc0c5da1b">view</a> • Fixed the formatting
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/d167f31af0f2fc595673cc4637ce9bd6e4bc5a75">view</a> • Fixed indents
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/59617083c94cdf58d03b378d67b151c7d3055606">view</a> • Fixed the break portion
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/4fcf70872f89f3d11b3779546b2398afbdfea592">view</a> • Fixes #1054
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/67e0e14a12d49fc190daae553332a6c008f89314">view</a> • License importer, small fixes for asset imporer
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/80fb7a4c13b3df18ea73a1360e98217876753439">view</a> • Fixed author's name :P
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/e49cfb4bdef65fce08086dec4200d91a9ee90209">view</a> • Fixed validation on LDAP
|
||||
|
||||
|
||||
### v1.2.11 - Released Aug 14, 2015 09:18:51
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/67e0e14a12d49fc190daae553332a6c008f89314">view</a> • License importer, small fixes for asset imporer
|
||||
|
||||
|
||||
### v1.2.10 - Released Aug 06, 2015 11:00:46
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/5455abfd16b45561bda3077f58032652d8e660ad">view</a> • Fix for importer
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/5297d699b3f28704156a076d684210eb522919a0">view</a> • Fix logo url
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/336858e4ed786f7cdbd147db8b04430e95a548bf">view</a> • Fix #1022 - Missing Lang on viewing deleted user
|
||||
|
||||
|
||||
### v1.2.9 - Released Jul 23, 2015 07:33:26
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/c8870ddcab0b521c9682cd8c5ab6fd56ee01753a">view</a> • Fixes #736 - more fields in bulk edit
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/5e7a4e8193b26875729089b36b28adca1644cb8d">view</a> • Fixes #599 - show groups in user list
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/f463cd6c8d72d9d28cd984ccad08fc596edbdaac">view</a> • Fixes for #759 - location heirarchy
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/51eeee09d72148d4dae629744753a96e51c1b8ae">view</a> • Fixes bug in #736 for new fields
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/3881e2e83eb72c1567db6c45afa40d7f79330bb3">view</a> • Fixes #784 - add "create accessory" to topnav
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/aab52d08506f5bc1fd0fcf35229e04b0cb5883bb">view</a> • Fix for strict mode with location parent
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/2f52369d075d6f95cd188acf14a23fcd9d431213">view</a> • Fixed location string
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/139dd1339271351714623e53d323cce5356618de">view</a> • Super janky miulti-level menu on create - TODO: Fix this ish.
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/2d7a348ab705fbca6f432f7adf0861085ab836c5">view</a> • Fixed multi-level array nesting for locations
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/95279f885b231eda371835b9eeb998c683cfbfd3">view</a> • Fixes #759 - populate form with parent location info
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/8cdea8a38404ed2187fa59f8e7f9198cb9ce94bb">view</a> • Fix for location totals
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/496a768013c759a4e3fa190f5970bbb865cebd62">view</a> • Fixes #795 - add model name if no asset name
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/7c95f4231e3281ca99744aa3ba8e530cf746c6ba">view</a> • Fixes #799 - missing text in file delete confirmation
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/212f09dd310ba54f6b513ff867e7641bdc8cb3f1">view</a> • Fixes #806
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/2540ac09ec9aa9d0e461be52fe117379a21474e0">view</a> • Fixes #822
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/766b4b901f8dbefe4e052d1927f274a0ace4d7d3">view</a> • Fixes #822 - make user notes field nullable default null
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/fdef26608971b747ca3ac9ada87f295311543892">view</a> • Addresses #577 and fixes #165 - switch from email to username
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/f42540fedf92a315614c6c1dfacd31879fef2a78">view</a> • More fixes for #165 - added username field
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/3d4607ebd3e7f6494912f38be40945eb4aa6a57b">view</a> • Fixes #858 - find admin group by name instead of ID for consideration of clustered DBs
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/10135802367f015e0b91329d692e3358ef7ffeae">view</a> • Fixed typo
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/bf6674f6a0252abf51977a355cadc6fccbde7cd7">view</a> • Added table prefix for raw queries
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/ea0f2c5f347d31a1543b7b3c980c9909a3e2403d">view</a> • Fixes #833 - remove status label field if asset is checked out
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/edddf6ae80cfa60af17544ed06c1b7c5883afe7a">view</a> • Fixes #833 - remove status label field if asset is checked out
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/2e585f9cd205e7fad93559281ac92b0fb09f816e">view</a> • Fixes #839 - bad seed data
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/75b9b70a8632f10c7c55b6a62e8d19e6f8b4ebe8">view</a> • Fix email field so it's nullable, fix app command to add user
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/94f8c6172042899f5f28723ceed2b562a5dca912">view</a> • Fixes #280, #64 and #860 - added license expiration alert
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/85d6b062f3b2a4da6171d8e026f4077fa3cf4c39">view</a> • Fixed checkbox alignment
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/f2e1ec092830822150d463d969ece2ce2f4795d4">view</a> • Fixed QR simple view route
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/8ef3d00f2264d5338043887f6d23bb5c0b5cc508">view</a> • Fixed language string for users
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/84e130d6aa4a53aea8fc75679ca270b25509a9a9">view</a> • Fixes #869 - compatibility mode for IE
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/d4af197b0e8ecde9a36e2417fe7dd2fb7c5c28ec">view</a> • Merge pull request #886 from madd15/Fix---Edit-user
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/e714def74aa6aeada6716ef091e599c5ebf9f8a1">view</a> • Fix Reports showing class="active"
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/4a5066054b1bb75222c6765675366405a4f70b73">view</a> • Display bugfixes for #819
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/7e5f32c9d85cc9a28976732d6232632e1cf0314a">view</a> • Merge pull request #898 from madd15/Default-Layout-fix
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/d26c40b26e3daf0ac47eb0064a6d5c88dedd1ec8">view</a> • Fixed issue where email not saved on edit
|
||||
|
||||
|
||||
### v2.0-pre-beta - Released Jul 09, 2015 08:24:43
|
||||
#### This is a pre-release
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/c8870ddcab0b521c9682cd8c5ab6fd56ee01753a">view</a> • Fixes #736 - more fields in bulk edit
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/5e7a4e8193b26875729089b36b28adca1644cb8d">view</a> • Fixes #599 - show groups in user list
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/f463cd6c8d72d9d28cd984ccad08fc596edbdaac">view</a> • Fixes for #759 - location heirarchy
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/51eeee09d72148d4dae629744753a96e51c1b8ae">view</a> • Fixes bug in #736 for new fields
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/3881e2e83eb72c1567db6c45afa40d7f79330bb3">view</a> • Fixes #784 - add "create accessory" to topnav
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/aab52d08506f5bc1fd0fcf35229e04b0cb5883bb">view</a> • Fix for strict mode with location parent
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/2f52369d075d6f95cd188acf14a23fcd9d431213">view</a> • Fixed location string
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/139dd1339271351714623e53d323cce5356618de">view</a> • Super janky miulti-level menu on create - TODO: Fix this ish.
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/2d7a348ab705fbca6f432f7adf0861085ab836c5">view</a> • Fixed multi-level array nesting for locations
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/95279f885b231eda371835b9eeb998c683cfbfd3">view</a> • Fixes #759 - populate form with parent location info
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/8cdea8a38404ed2187fa59f8e7f9198cb9ce94bb">view</a> • Fix for location totals
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/496a768013c759a4e3fa190f5970bbb865cebd62">view</a> • Fixes #795 - add model name if no asset name
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/7c95f4231e3281ca99744aa3ba8e530cf746c6ba">view</a> • Fixes #799 - missing text in file delete confirmation
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/212f09dd310ba54f6b513ff867e7641bdc8cb3f1">view</a> • Fixes #806
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/2540ac09ec9aa9d0e461be52fe117379a21474e0">view</a> • Fixes #822
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/766b4b901f8dbefe4e052d1927f274a0ace4d7d3">view</a> • Fixes #822 - make user notes field nullable default null
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/fdef26608971b747ca3ac9ada87f295311543892">view</a> • Addresses #577 and fixes #165 - switch from email to username
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/f42540fedf92a315614c6c1dfacd31879fef2a78">view</a> • More fixes for #165 - added username field
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/3d4607ebd3e7f6494912f38be40945eb4aa6a57b">view</a> • Fixes #858 - find admin group by name instead of ID for consideration of clustered DBs
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/10135802367f015e0b91329d692e3358ef7ffeae">view</a> • Fixed typo
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/bf6674f6a0252abf51977a355cadc6fccbde7cd7">view</a> • Added table prefix for raw queries
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/ea0f2c5f347d31a1543b7b3c980c9909a3e2403d">view</a> • Fixes #833 - remove status label field if asset is checked out
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/edddf6ae80cfa60af17544ed06c1b7c5883afe7a">view</a> • Fixes #833 - remove status label field if asset is checked out
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/2e585f9cd205e7fad93559281ac92b0fb09f816e">view</a> • Fixes #839 - bad seed data
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/75b9b70a8632f10c7c55b6a62e8d19e6f8b4ebe8">view</a> • Fix email field so it's nullable, fix app command to add user
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/94f8c6172042899f5f28723ceed2b562a5dca912">view</a> • Fixes #280, #64 and #860 - added license expiration alert
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/85d6b062f3b2a4da6171d8e026f4077fa3cf4c39">view</a> • Fixed checkbox alignment
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/f2e1ec092830822150d463d969ece2ce2f4795d4">view</a> • Fixed QR simple view route
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/8ef3d00f2264d5338043887f6d23bb5c0b5cc508">view</a> • Fixed language string for users
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/84e130d6aa4a53aea8fc75679ca270b25509a9a9">view</a> • Fixes #869 - compatibility mode for IE
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/95920be8ea5608f0b3da831f3bac369b05d5aafe">view</a> • Fixed weird commenting
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/d4af197b0e8ecde9a36e2417fe7dd2fb7c5c28ec">view</a> • Merge pull request #886 from madd15/Fix---Edit-user
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/a22687abc5cc913d5f83ecbac4046ba05353d30e">view</a> • Fix #896 - Only show Checkout/Checkin if deployable
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/e714def74aa6aeada6716ef091e599c5ebf9f8a1">view</a> • Fix Reports showing class="active"
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/05f0b94bf6b3e746093b45a1ecb6f432e6901880">view</a> • Fixed language string
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/de23ec57851f6c5a25b288919d82175dacc27426">view</a> • Fixes #544 - disable checking an asset out to a user if it is not a deployable status
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/fd59ca0802998f9d24e3b682182ccea0652b9c6d">view</a> • Fixed spacing
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/c2d63915c3ed7e87fcc0b62c0171f6326d15f624">view</a> • Fixed insecure font call
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/4a5066054b1bb75222c6765675366405a4f70b73">view</a> • Display bugfixes for #819
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/f8be47dfbf567ab75657e02a4e75661a12381a8f">view</a> • Fixes #903 - adds config variable for multi_login, overrides Sentry method
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/e9443a244cdf7f9495d1b780ae6478204988f207">view</a> • Small fix to config value
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/7e5f32c9d85cc9a28976732d6232632e1cf0314a">view</a> • Merge pull request #898 from madd15/Default-Layout-fix
|
||||
|
||||
|
||||
### v1.2.8 - Released Jun 19, 2015 04:16:08
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/a8a0a59982e6f956662b6ff53a1a8c02802b54e2">view</a> • Fixes #825 - title bar spacing issue
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/5939e46eeeeb6b1c54cc241ea8e85e358bc21d40">view</a> • Bumped version for fixed 1.2.7
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/c69038d3ae7eeb36c3d3f8552092774bdff5340c">view</a> • Fixes #836
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/5a6fe6ccf8aa9af8ab09f0cb2fa79130b8ab81ee">view</a> • Fixes #806
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/7820efc12127068dff9e1c7a8c97cc2cf939d976">view</a> • Fixes #822 and #847 - added notes field on import for MySQL strict mode
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/c3c4e9def212b8bc5a36526bbfff8b1939c01464">view</a> • Fixes #852 - localized string for file types, added zip and rar for asset upload
|
||||
|
||||
|
||||
### v1.2.7-master - Released May 27, 2015 06:45:44
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/73a08c031c2ff48bbe7e2886dd986a4566f14908">view</a> • Fixes #818, and randomizes password for dummy user
|
||||
|
||||
|
||||
### v1.2.7 - Released May 02, 2015 07:28:34
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/9f9a9a51b36f19969497b196c8dbbeec08f7bdde">view</a> • Fixes #774 - layout issue on profiles
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/c95af8445298f3de326f3b3535a62ad2b772c1cb">view</a> • Fixes #750 because @uberbrady can't code
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/77d1d93ebcc4867066a1dee5bd049378a1255436">view</a> • Fixes #729 - CSS wordwrap for long licenses
|
||||
|
||||
|
||||
### v1.2.7-beta - Released Apr 30, 2015 01:01:43
|
||||
#### This is a pre-release
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/62d5ed48f087d6e1e4f486e59039d2f87619b056">view</a> • Fixes #645 - added zip/rar to filetypes
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/fc81e404cabb734ab90b8fd69ba33e78d2c89157">view</a> • Fix #652 - Change UX of signin form
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/5cfb2d5f6a424b7f2d71cc488d76ebcfdf6f802e">view</a> • Fixed modal delete in ajax tables
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/6f38f76e4a1c09a3dcbfa6db6dcb56f03f083c12">view</a> • Haha - TOTALLY cheated. But it works. Fixed ordering for linked names
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/69b80dc9c6dc4acf7cfad5f61da326b203dad1f8">view</a> • Fixed Sorting
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/958a7298fe905e933c1e68f65d22dfa20875ee8a">view</a> • Fix excludes
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/bb7d3d1a8515684e646255584bd977e706b75c6f">view</a> • Fix button layouts
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/46c1f2a28bb141b65f362936c59779376ba0ce3e">view</a> • Server side datatables for user view - needs fix for deleted users
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/0ffb5df40b1983527efabad44e6c32fe0af3141f">view</a> • Fixed changelog order
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/3da652216bca192c16783fa52eb83ac650c7fba5">view</a> • Possible fix for #652 - need to test mobile and Cinema display
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/e01b1b3935786c7263a7e6fd4913bf1ffaf99965">view</a> • Fix scopeGetDeleted - Missing withTrashed()
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/c00086c7407e885219ec18339b0a328652f006ce">view</a> • Fix eager loading for user throttle
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/4c3033d414c30da9db73318edce6d75e3ebe2fec">view</a> • Fix spacing between Create and Import
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/176264b3178fca6de30a0c5d18b6ac00e6b703b1">view</a> • Fix title for deleted
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/4f18a71124bcf93943ae972ca4080a4943166003">view</a> • Fix space in title
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/519575893d800790a3455ee263777cc675c49ad9">view</a> • Fix JS modal error
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/9edcc39de244c76ae2b8f8df473aa891996cd53d">view</a> • Fix restore button now showing
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/c14761b9a1af093c748c2bfa19b38a38c200502e">view</a> • Re-fix button not showing
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/c8bf26a3b3d29f44f6b45dfbbda5a33985ae076d">view</a> • Fix layout of loading box
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/4aa4e7c9fc831f151e4fd4a2676b7f8e1b845841">view</a> • Fix error if user is not in throttle table
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/3782531f57b79a9877107ddee16c77e01e142cfd">view</a> • Fix missing </div>
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/2d9e49f245565e7236145981163af64cc20233c4">view</a> • Fix #682 - Updated buttons and data loading
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/c79fd5ed304915450109652d4d4cb13b322f90d2">view</a> • Fix showAll on Print
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/da983af2cb05901ecc22fbc9691f3dff9e23a5e8">view</a> • Fix #683 - Use sAjaxSource, change to processing
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/86623822f5d0641764913a9db51cda0ecc79dfd5">view</a> • Trying to fix the build
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/35bbea30521984cf9038244b52deab97a8565f5a">view</a> • Fixes #688 - show model if no asset name
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/faa999ab2b471fed92062d738f695cdc0c0985c8">view</a> • Fix incorrect values
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/66d187223041093f9e75190cf6e7c54586ec885d">view</a> • Fix button spacing
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/a9f15fbcaef14ae1f78f08da632032c41074c0f9">view</a> • Convert Categories View to use Datatables, and fix Model View missing comma
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/d9b92240450f559d60b811d6ab6be948995de9e5">view</a> • Fix mobile unable to click sign in
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/7f2ccc860b5af8effdadff91119d5d9ffe9c0584">view</a> • Remove forgot password link and fix save icon
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/d952a1199b285dd2c7de3567ea6f4d006c489920">view</a> • Remove forgot password link and fix save icon
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/b32379393f7572fe0199920ec6453ca4bc05aab6">view</a> • Fix missed hardware statuses
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/06b3d6e5cef265546ae457d6088324bff6a97440">view</a> • Fix saveState, change chumper defaults
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/7d35fae0f499f4f4e4453e74e3b144a4ca2f4f5c">view</a> • Fix processing stuck on exit print view
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/5d946b19cb9a00676fb5d40e7d15238bbb8aec86">view</a> • Fixed checkmodel at route level
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/0c827b318bfe6d4e5ac28c0cee133e5c625abf57">view</a> • Default location fix
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/b0886f970acffdec302bd6836157c9f7dacfdee0">view</a> • Fix link to the demo
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/ff23616bb56cdc83e0f3aadc97ab6288c42ee42e">view</a> • Fix #712 - Change RTD to Deployed if checkedout
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/92a4f025d83e1aed2cdd041296f5d46fc61c39eb">view</a> • Fixes #718 - uppercase state/country abbreviations
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/46781c94cd9bcc49e7cc1e1fb9be309d4d690f0d">view</a> • Fix #715 - Missing $modelCheck api call
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/6b853750e59eacbb13ab3ef7ed403be4702e701c">view</a> • Fix for strict mode app install
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/e4b45231ecfa34b4f504db42f3f18c4440f0085a">view</a> • Fix for bad seed data if Jon Doe doesn't get created
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/33e7ce67616e8153785516ceca7423257bca9718">view</a> • Fixes for #722 localization
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/c88ce0d14d605d74b297f18bf55533218ed445bf">view</a> • Fixes for #722 datatables
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/efba1b90386b6481b9679a2ec8ddc85d1bd6d7d3">view</a> • Fix update button to goto right group
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/9de083afa78d5e76e289007423cb74b05371efc9">view</a> • Merge pull request #734 from snipe/depreciation_fix2
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/1a4f148318ca325bad1e042aeb7514933faeff7a">view</a> • Fix #737 -Only display comma & address2 if not Null
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/ba58e718b4af2e2f60138e0b6fb3f6f6985f30e0">view</a> • Resolved some deps from vendor changes
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/1c2e5ecc0f9460bc23f3c0e6ee44774263d08bd6">view</a> • Remove space after concat to fix SQL FUNCTION CONCAT NOT EXIST error
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/564d5fcb31689ab22405cd56ff402af097e1af7a">view</a> • Merge pull request #770 from southwolf/fix-concat-space
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/b4b273fc43a0e1a6d6b5bc128b42fe0f093735f1">view</a> • Fixed typo
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/6a7fcd5c40b201cc0744eab8b73bd66bfa8e33aa">view</a> • Fixes #769 - set sort order for Accessory Category
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/d61506fcf7d8e368febb9bfbc3a404fde6374ca8">view</a> • Fixes for #766 - add activity report
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/9841dbbbc42c182f98d561cc319175973a55b789">view</a> • Fixed HTML so settings are saved correctly
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/a0fce2e0fb9f005c1dcdccccfb346ca1da72640a">view</a> • Fixes #766
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/3b491d4a6bc02b3a0b46e8eae6804879a119f56e">view</a> • Fixes #757 - use showAssetName method
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/767e2c69f324d32e0a49e0a386bd14640ad0304e">view</a> • Fixes #751 - ignore whether depreciation was selected or not to display purchase cost
|
||||
|
||||
|
||||
### v1.2.6.1 - Released Mar 12, 2015 08:25:28
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/7047af44f6544d2eeed0f0fcefdbdd44489f189a">view</a> • Fixed layout for remember me button
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/4502582beb064ffeee4a1cdf892f513e58534014">view</a> • Trying to fix pre-commit hook :(
|
||||
@@ -205,148 +623,6 @@
|
||||
|
||||
### v0.3.11-alpha - Released Jul 19, 2014 05:16:53
|
||||
#### This is a pre-release
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/ac4c905c42d920d2cf8455d644f4c65332a81d0d">view</a> • Fixed #140
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/4a13cded607415d749151cef495332c48c58cf86">view</a> • Fixed path for Travis composer
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/ddf946ad5eb6dd8480eeaa709f82af75e0c61444">view</a> • Tried to fix failing build caused by travis composer
|
||||
|
||||
|
||||
### v0.3.10-alpha - Released Jul 17, 2014 05:54:10
|
||||
#### This is a pre-release
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/89a8f3c277d2482b2cd04c4c5c582c9e507770f8">view</a> • Fixes #183 - added employee number to users
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/a7b809cb91f49fb2c8eaecc67822fa155a0f20ce">view</a> • Updated title/header for users, additional fixes for #151
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/5266d9a30a9663fa80ff764b25ff71726e5c4f4c">view</a> • Fixed title tag for user list view
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/43485e1a51330ef585a65b469d7eb85ae7bde13a">view</a> • Fixed language definition
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/6b5a552d95ff6f6d5567275b50fcd487fb793820">view</a> • Fixed #186 - Bug with select box not retaining selections on edit screen
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/90eb883b671919ea360122c2bf44433995a12144">view</a> • Fixed #187 - replaced dummy site name with site name from admin panel preferences
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/f22f23f21dc11d393854849580f0c1229cec9827">view</a> • Fixed button label on forgotten password page
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/2b9494ed8271254f8f84e016f238d518e6109842">view</a> • Fixed inconsistent password requirements across admin user creation, user profile and forgotten password
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/9dc40a3a9c161267fd8c88aacc1fbf536c1ec2de">view</a> • Fixed a few CSS quirks
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/99003e126a8fd0ad9aaea5a550e0af5e306fc1bb">view</a> • Fixed bug with edit (supplier_id), added requestable field for assets
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/21251b462308f2d783b83be1a331a0faf0813d16">view</a> • Fixed #190, where depreciation on licenses would not be saved
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/89000440f344f766a31adc69718d7f66df235abf">view</a> • Added admin ability to unsuspend locked accounts #changelog
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/e203fc516fadf6218f5ce87c070d0cdba9fca188">view</a> • Fixes #194
|
||||
|
||||
|
||||
### v0.3.9-alpha - Released Jul 03, 2014 02:08:38
|
||||
#### This is a pre-release
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/2825bcb4310899e89ccbc73dfa8b59ade28018da">view</a> • Fixed #179 - account page to show assets checked out to the logged in user
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/c782f29f5aae752a6246be9778d418df172dd4f6">view</a> • Pulled account sub-nav into top menu to free up UI space. #changelog
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/fad2ec66fa9abe0b34baf16cce453a7e9fc9e4d4">view</a> • More README fixes and refinement
|
||||
|
||||
|
||||
### v0.3.8-alpha - Released Jun 27, 2014 09:28:22
|
||||
#### This is a pre-release
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/3e7a9e45d1954531bbc3b73f2ed59dd16d59c657">view</a> • Fixes PR #168 and #167
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/945cb3253f1349e30aafa4e7cb57bb507a2ea0cc">view</a> • Fix #117
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/6f42b3045e2a65cdf98ec1038284cc2ecf01fa5d">view</a> • Resolves #155
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/380417953b6b67a506f0cc395fd2dfb744cf26cd">view</a> • Fixed missing string
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/b09aec67f1ab76ff0435a2e1e49b179c3d73bc12">view</a> • Fixes #155
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/124acc89c4027e346daf54c62cb38b85586de870">view</a> • Resolves #174
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/afabd2814205fdcd83b7bf9ce9095aa367b08311">view</a> • Additional fixes for #167
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/a170efae2796314896d548d86b79d89d859c37d2">view</a> • fix for #167
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/ec9eab81bfb3b35bfe7ad06008b26f19009e6638">view</a> • Closes #177 - change log file added, needs refining
|
||||
|
||||
|
||||
### v.0.3.5-alpha - Released Jun 20, 2014 02:23:09
|
||||
#### This is a pre-release
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/d1499deecdff3c7a4235ffdfad5adbddc1a5098f">view</a> • Provisions for strict mode, fixed license deletion bug
|
||||
|
||||
|
||||
### v.0.3.4-alpha - Released Jun 19, 2014 10:27:59
|
||||
#### This is a pre-release
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/08d05b481f6366ad48fcdce72a8df53755f5dee8">view</a> • Fixes #158
|
||||
|
||||
|
||||
### v.0.3.3-alpha - Released Jun 18, 2014 08:04:46
|
||||
#### This is a pre-release
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/3518ab9f55f7992d6d4f886389d67b062a02f2d8">view</a> • Fixes #139
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/ad9b1fc446ab15157502fe7c52ddbda455e3ea8f">view</a> • Fixes #139
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/dfa5d1c64205b23c4c3d16190d1478da8aa0edbb">view</a> • Fixes #136
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/9714178ce1fa1e2814389e4b6b82eb596a650084">view</a> • Fixes #141
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/607484b29407718238571eb5269c9c27830338f7">view</a> • Fixes #141 for mysql with strict mode enabled
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/cbc945299e7f67f5f10dfdc6a875e5c53ac8440a">view</a> • Fixes #148
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/dc256583d410cb09253e30b075149c79fb4864e5">view</a> • Fixes #144
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/610c405aa50118163ad5d26d43e4bf6c2456f624">view</a> • More fixes for #151
|
||||
|
||||
|
||||
### v.0.3.2-alpha - Released May 06, 2014 08:26:21
|
||||
#### This is a pre-release
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/f4c5da57d0397877d90aa398267e59fcffee7b47">view</a> • Fixed auth error when user isn't logged in
|
||||
|
||||
|
||||
### v.0.3.1-alpha - Released May 06, 2014 04:48:09
|
||||
#### This is a pre-release
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/efad5db082d1461ea26556fad2f1671a49dc1480">view</a> • Fix for broken datatables in upgrading to v2.2
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/5690e9ce1f178486179ce6cdfb00ca417acd87dd">view</a> • Fixed code indentation for Apache virtualhost example
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/67aba76d3f83c5f374c05fe07d52eebd81d13278">view</a> • Fixing this change from #109 that somehow got reverted
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/06067fc19c0127fdcbb78541e7cdc8e77f5444ac">view</a> • Fixed CSV rexport
|
||||
|
||||
|
||||
### v0.3.0-alpha - Released Jan 29, 2014 01:28:31
|
||||
#### This is a pre-release
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/d91d75abe4df19dd6cd54705ba9967295973ced0">view</a> • Fixing JSON parse errors from #97
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/baab758377e117a86c3273dd1d6e03e66b02dc8b">view</a> • Fixed language support
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/a678ec41714f5d7f77418b5933bc112aa67eae9c">view</a> • Fixed Gravatar Hash
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/c08d672e4923b12972eae76d0699e6a301f911cd">view</a> • Fixes mail config documentation
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/fba853a6a7a2f8166265cac2e99a526fd9b88c7b">view</a> • Fixes composer formatting issues
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/c11510fdcac2b2de09ae9e241c846426bdf0b187">view</a> • Removes sorting from actions column. Fixes #56
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/ae05f2701559a841cb8d9bc8767e6d7a56dcd93c">view</a> • Fixed depreciation bug
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/d591c1ea0495de091eb0f71daa8572929096c897">view</a> • Fixed bug where RTD = 1 instead of 0
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/e49420f62d26405b2fa0385f0ae7b3009b3beeaf">view</a> • Fixed bug in depreciation display
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/1dc7fd1bdf8852fed6d886938f632c8ea69d4798">view</a> • Fixed depreciation display on asset view
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/211a527ae176df667f6f8fbc95901c53a368d8e2">view</a> • Fixed FK
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/aaebaa8d36158aafc61988a6370239e85f2e75e5">view</a> • Bugfix to put custom title in the page title
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/194150bbf0493512018390d011e8d88d144e9763">view</a> • Hacky shit to fix pagination weirdness - will come back to this
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/5fb649b59e76aa9db6e433ad8c9fc75b4b8d5fc2">view</a> • Fixed error message layout
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/7bc9a53b133895206a3df230baca50d3879abbe5">view</a> • Fixed error when user is invalid
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/82de635a75aba376209b741ce1ed4497b91e65e0">view</a> • Fixed invalid seed data
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/b697c77cd85416ca502ec3bb28c990099c7faae3">view</a> • Fixing error when no depreciation
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/432f44118f46381bdaa44daf61dfa35677aba0ee">view</a> • Fixed FK in licenses model
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/4468cbd096e9990300240205baf7139eafbc423c">view</a> • Fixes #112
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/cd62be0de03da071f344c8f66730cbc9e1475fb7">view</a> • Minor div fix
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/9c369d72e1e7e29f3c205586c916b2f42b250047">view</a> • Fixed typo
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/60d94eea04d1ebb93704e6a0d20621ff18708272">view</a> • Changes serial to text area, allow new lines. Fixes #118
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/580590b4c0b4a2f76ef8edfe02de986267fc7395">view</a> • Fixed === to == (PHP is loosely typed)
|
||||
|
||||
|
||||
### v0.2.0-alpha - Released Nov 29, 2013 10:09:07
|
||||
#### This is a pre-release
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/06cbd0723e415d81ea12aa48f2c37188741b2dbc">view</a> • Fixes #93
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/e305099b45401c871f16fec23c200080830fcd5d">view</a> • Fixed model view
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/7003eff42ca0e0ea2b9070187c0afd8ba1a8d8b0">view</a> • More fixes for #88
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/567f395afaa19335671f366ce889630426f33273">view</a> • More fixes for #88
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/02f1977d301cd449aa806e02e8a829516d436ef7">view</a> • Fixed error message
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/11c657ffa4c3bdd01cd04b81d01980b2d795107c">view</a> • Fixes #36
|
||||
|
||||
|
||||
### v0.1.2-alpha - Released Nov 29, 2013 01:59:05
|
||||
#### This is a pre-release
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/b1aa67ddb72158513f0a706996c8c1f5b3609aa5">view</a> • Fixes #69
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/aa38d83ba6369215451d905e599492214e9f4b8b">view</a> • Fixes #63 and #70
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/65cd28aad3903e11879e01faba382454dec7e75c">view</a> • Fixes #14
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/6552401fd869fd285aef5e217438f4f055b53ab6">view</a> • Fixes #77
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/012a889444fa25b174a5fb2c67e89c8c5fcf09aa">view</a> • Corrected license seat count associated with license. Fixes #75
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/9e189aa309750c221c27352f35e2ca1f5fab9173">view</a> • Fixes #80, also prevents the user from checking out an asset that is undeployable, etc
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/8680d98bc36bffa08f87020300b315d26be09928">view</a> • Fixed status display bug
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/4fcdf72ab6505625f244a6e6ee8683204fb81ccd">view</a> • Responsive design bug fixes, placeholder code for #64 (commented out)
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/d9a37f38228d55bb6265efc626e3ab7919013362">view</a> • Fixes #88
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/5858bfb99b2144fbc805ec62cc90e6aaaf019f77">view</a> • Fixed language file paths caused by #88
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/9f7cbc8a4f01ddf2596e831f658c9a8c321b2f46">view</a> • Another fix related to #88, also accounts for users with invalid location_ids
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/1b56c31a22afd39a875677714b9c07e96876b8df">view</a> • Fixed relationship between users/locations because fuck you ORM
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/f0f07b578b2439a627e5e946df0849d88d8526cf">view</a> • Fixing pivot for users
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/9fa826b2e77ce22d25a8b3094bc825802d25be85">view</a> • Fixed assigned to id
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/839d01a3af08d780be4152bc02b33bff1a7d7f20">view</a> • Fixed relationship method because fuck you ORM
|
||||
|
||||
|
||||
### v0.1.1-alpha - Released Nov 26, 2013 11:11:00
|
||||
#### This is a pre-release
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/1527b88fd671a20c879c9b2061ae95f3b386ba27">view</a> • Fixes #61
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/4c0af1eae1031c2630f6e29cc73f8a9dfac1081c">view</a> • Fixed typo causing failure with mysql strict
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/0e3bcfecd05a39bfea6fc7ba11cb24d9d49e6d86">view</a> • Should be final fixes for mysql strict mode
|
||||
|
||||
|
||||
### Initial alpha - Released Nov 26, 2013 09:01:13
|
||||
#### This is a pre-release
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/14972f894bb0e761e2d0170a2c93c9aac4edfca6">view</a> • fixed typo
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/79da13dff767d57f6f4fbb12f195e25f409ee5ec">view</a> • Fixed layout for category view
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/0e4e26206bdcc164e5df586368ed45edd45b9a74">view</a> • fixed broken redirect route
|
||||
@@ -404,3 +680,91 @@
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/dc5ad876863a1e17babce06adfb365f38c30ca59">view</a> • Fixes #59
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/d7a8cac1dc6158983673688c2e48e9a48217b6f2">view</a> • Fixed validation
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/196710dac807d48f6c73b02c2444a5b8d301b8a6">view</a> • Fixed bug in error validation display
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/1527b88fd671a20c879c9b2061ae95f3b386ba27">view</a> • Fixes #61
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/4c0af1eae1031c2630f6e29cc73f8a9dfac1081c">view</a> • Fixed typo causing failure with mysql strict
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/0e3bcfecd05a39bfea6fc7ba11cb24d9d49e6d86">view</a> • Should be final fixes for mysql strict mode
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/b1aa67ddb72158513f0a706996c8c1f5b3609aa5">view</a> • Fixes #69
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/aa38d83ba6369215451d905e599492214e9f4b8b">view</a> • Fixes #63 and #70
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/65cd28aad3903e11879e01faba382454dec7e75c">view</a> • Fixes #14
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/6552401fd869fd285aef5e217438f4f055b53ab6">view</a> • Fixes #77
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/012a889444fa25b174a5fb2c67e89c8c5fcf09aa">view</a> • Corrected license seat count associated with license. Fixes #75
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/9e189aa309750c221c27352f35e2ca1f5fab9173">view</a> • Fixes #80, also prevents the user from checking out an asset that is undeployable, etc
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/8680d98bc36bffa08f87020300b315d26be09928">view</a> • Fixed status display bug
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/4fcdf72ab6505625f244a6e6ee8683204fb81ccd">view</a> • Responsive design bug fixes, placeholder code for #64 (commented out)
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/d9a37f38228d55bb6265efc626e3ab7919013362">view</a> • Fixes #88
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/5858bfb99b2144fbc805ec62cc90e6aaaf019f77">view</a> • Fixed language file paths caused by #88
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/9f7cbc8a4f01ddf2596e831f658c9a8c321b2f46">view</a> • Another fix related to #88, also accounts for users with invalid location_ids
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/f0f07b578b2439a627e5e946df0849d88d8526cf">view</a> • Fixing pivot for users
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/9fa826b2e77ce22d25a8b3094bc825802d25be85">view</a> • Fixed assigned to id
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/06cbd0723e415d81ea12aa48f2c37188741b2dbc">view</a> • Fixes #93
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/e305099b45401c871f16fec23c200080830fcd5d">view</a> • Fixed model view
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/7003eff42ca0e0ea2b9070187c0afd8ba1a8d8b0">view</a> • More fixes for #88
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/567f395afaa19335671f366ce889630426f33273">view</a> • More fixes for #88
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/02f1977d301cd449aa806e02e8a829516d436ef7">view</a> • Fixed error message
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/11c657ffa4c3bdd01cd04b81d01980b2d795107c">view</a> • Fixes #36
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/d91d75abe4df19dd6cd54705ba9967295973ced0">view</a> • Fixing JSON parse errors from #97
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/baab758377e117a86c3273dd1d6e03e66b02dc8b">view</a> • Fixed language support
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/a678ec41714f5d7f77418b5933bc112aa67eae9c">view</a> • Fixed Gravatar Hash
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/c08d672e4923b12972eae76d0699e6a301f911cd">view</a> • Fixes mail config documentation
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/fba853a6a7a2f8166265cac2e99a526fd9b88c7b">view</a> • Fixes composer formatting issues
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/c11510fdcac2b2de09ae9e241c846426bdf0b187">view</a> • Removes sorting from actions column. Fixes #56
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/ae05f2701559a841cb8d9bc8767e6d7a56dcd93c">view</a> • Fixed depreciation bug
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/d591c1ea0495de091eb0f71daa8572929096c897">view</a> • Fixed bug where RTD = 1 instead of 0
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/e49420f62d26405b2fa0385f0ae7b3009b3beeaf">view</a> • Fixed bug in depreciation display
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/1dc7fd1bdf8852fed6d886938f632c8ea69d4798">view</a> • Fixed depreciation display on asset view
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/211a527ae176df667f6f8fbc95901c53a368d8e2">view</a> • Fixed FK
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/aaebaa8d36158aafc61988a6370239e85f2e75e5">view</a> • Bugfix to put custom title in the page title
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/194150bbf0493512018390d011e8d88d144e9763">view</a> • Hacky shit to fix pagination weirdness - will come back to this
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/5fb649b59e76aa9db6e433ad8c9fc75b4b8d5fc2">view</a> • Fixed error message layout
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/7bc9a53b133895206a3df230baca50d3879abbe5">view</a> • Fixed error when user is invalid
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/82de635a75aba376209b741ce1ed4497b91e65e0">view</a> • Fixed invalid seed data
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/b697c77cd85416ca502ec3bb28c990099c7faae3">view</a> • Fixing error when no depreciation
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/432f44118f46381bdaa44daf61dfa35677aba0ee">view</a> • Fixed FK in licenses model
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/4468cbd096e9990300240205baf7139eafbc423c">view</a> • Fixes #112
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/cd62be0de03da071f344c8f66730cbc9e1475fb7">view</a> • Minor div fix
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/9c369d72e1e7e29f3c205586c916b2f42b250047">view</a> • Fixed typo
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/60d94eea04d1ebb93704e6a0d20621ff18708272">view</a> • Changes serial to text area, allow new lines. Fixes #118
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/580590b4c0b4a2f76ef8edfe02de986267fc7395">view</a> • Fixed === to == (PHP is loosely typed)
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/efad5db082d1461ea26556fad2f1671a49dc1480">view</a> • Fix for broken datatables in upgrading to v2.2
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/5690e9ce1f178486179ce6cdfb00ca417acd87dd">view</a> • Fixed code indentation for Apache virtualhost example
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/67aba76d3f83c5f374c05fe07d52eebd81d13278">view</a> • Fixing this change from #109 that somehow got reverted
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/06067fc19c0127fdcbb78541e7cdc8e77f5444ac">view</a> • Fixed CSV rexport
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/f4c5da57d0397877d90aa398267e59fcffee7b47">view</a> • Fixed auth error when user isn't logged in
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/3518ab9f55f7992d6d4f886389d67b062a02f2d8">view</a> • Fixes #139
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/ad9b1fc446ab15157502fe7c52ddbda455e3ea8f">view</a> • Fixes #139
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/dfa5d1c64205b23c4c3d16190d1478da8aa0edbb">view</a> • Fixes #136
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/9714178ce1fa1e2814389e4b6b82eb596a650084">view</a> • Fixes #141
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/607484b29407718238571eb5269c9c27830338f7">view</a> • Fixes #141 for mysql with strict mode enabled
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/cbc945299e7f67f5f10dfdc6a875e5c53ac8440a">view</a> • Fixes #148
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/dc256583d410cb09253e30b075149c79fb4864e5">view</a> • Fixes #144
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/610c405aa50118163ad5d26d43e4bf6c2456f624">view</a> • More fixes for #151
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/08d05b481f6366ad48fcdce72a8df53755f5dee8">view</a> • Fixes #158
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/d1499deecdff3c7a4235ffdfad5adbddc1a5098f">view</a> • Provisions for strict mode, fixed license deletion bug
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/3e7a9e45d1954531bbc3b73f2ed59dd16d59c657">view</a> • Fixes PR #168 and #167
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/945cb3253f1349e30aafa4e7cb57bb507a2ea0cc">view</a> • Fix #117
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/6f42b3045e2a65cdf98ec1038284cc2ecf01fa5d">view</a> • Resolves #155
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/380417953b6b67a506f0cc395fd2dfb744cf26cd">view</a> • Fixed missing string
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/b09aec67f1ab76ff0435a2e1e49b179c3d73bc12">view</a> • Fixes #155
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/124acc89c4027e346daf54c62cb38b85586de870">view</a> • Resolves #174
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/afabd2814205fdcd83b7bf9ce9095aa367b08311">view</a> • Additional fixes for #167
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/a170efae2796314896d548d86b79d89d859c37d2">view</a> • fix for #167
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/ec9eab81bfb3b35bfe7ad06008b26f19009e6638">view</a> • Closes #177 - change log file added, needs refining
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/2825bcb4310899e89ccbc73dfa8b59ade28018da">view</a> • Fixed #179 - account page to show assets checked out to the logged in user
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/c782f29f5aae752a6246be9778d418df172dd4f6">view</a> • Pulled account sub-nav into top menu to free up UI space. #changelog
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/fad2ec66fa9abe0b34baf16cce453a7e9fc9e4d4">view</a> • More README fixes and refinement
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/89a8f3c277d2482b2cd04c4c5c582c9e507770f8">view</a> • Fixes #183 - added employee number to users
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/a7b809cb91f49fb2c8eaecc67822fa155a0f20ce">view</a> • Updated title/header for users, additional fixes for #151
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/5266d9a30a9663fa80ff764b25ff71726e5c4f4c">view</a> • Fixed title tag for user list view
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/43485e1a51330ef585a65b469d7eb85ae7bde13a">view</a> • Fixed language definition
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/6b5a552d95ff6f6d5567275b50fcd487fb793820">view</a> • Fixed #186 - Bug with select box not retaining selections on edit screen
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/90eb883b671919ea360122c2bf44433995a12144">view</a> • Fixed #187 - replaced dummy site name with site name from admin panel preferences
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/f22f23f21dc11d393854849580f0c1229cec9827">view</a> • Fixed button label on forgotten password page
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/2b9494ed8271254f8f84e016f238d518e6109842">view</a> • Fixed inconsistent password requirements across admin user creation, user profile and forgotten password
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/9dc40a3a9c161267fd8c88aacc1fbf536c1ec2de">view</a> • Fixed a few CSS quirks
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/99003e126a8fd0ad9aaea5a550e0af5e306fc1bb">view</a> • Fixed bug with edit (supplier_id), added requestable field for assets
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/21251b462308f2d783b83be1a331a0faf0813d16">view</a> • Fixed #190, where depreciation on licenses would not be saved
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/89000440f344f766a31adc69718d7f66df235abf">view</a> • Added admin ability to unsuspend locked accounts #changelog
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/e203fc516fadf6218f5ce87c070d0cdba9fca188">view</a> • Fixes #194
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/ac4c905c42d920d2cf8455d644f4c65332a81d0d">view</a> • Fixed #140
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/4a13cded607415d749151cef495332c48c58cf86">view</a> • Fixed path for Travis composer
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/ddf946ad5eb6dd8480eeaa709f82af75e0c61444">view</a> • Tried to fix failing build caused by travis composer
|
||||
|
||||
33
Dockerfile
33
Dockerfile
@@ -4,6 +4,8 @@ MAINTAINER Brady Wetherington <uberbrady@gmail.com>
|
||||
RUN apt-get update && apt-get install -y \
|
||||
apache2-bin \
|
||||
libapache2-mod-php5 \
|
||||
php5-curl \
|
||||
php5-ldap \
|
||||
php5-mysql \
|
||||
php5-mcrypt \
|
||||
php5-gd \
|
||||
@@ -31,36 +33,13 @@ RUN a2enmod rewrite
|
||||
|
||||
############ INITIAL APPLICATION SETUP #####################
|
||||
|
||||
COPY docker/app_start.patch /tmp/app_start.patch
|
||||
|
||||
WORKDIR /var/www/html
|
||||
|
||||
#Patch bootstrap file
|
||||
RUN patch -p1 < /tmp/app_start.patch
|
||||
#Append to bootstrap file (less brittle than 'patch')
|
||||
RUN sed -i 's/return $app;/$env="production";\nreturn $app;/' bootstrap/start.php
|
||||
|
||||
#DB create?
|
||||
# mysqladmin -u root create snipeit_laravel
|
||||
|
||||
#DB create user, grant access to new DB?
|
||||
# grant all privileges on snipeit_laravel.* TO snipeit;
|
||||
|
||||
#DB config file init? (NEVER overwrite!)
|
||||
#RUN cp -n /var/www/html/app/config/production/database.example.php /var/www/html/app/config/production/database.php
|
||||
COPY docker/database.php /var/www/html/app/config/production/database.php
|
||||
|
||||
COPY docker/mail.php /var/www/html/app/config/production/mail.php
|
||||
|
||||
#change DB file user
|
||||
#RUN sed -i s/travis/snipe_it/ /var/www/html/app/config/production/database.php
|
||||
|
||||
#init app config file (DO NOT overwrite!)
|
||||
RUN cp -n /var/www/html/app/config/production/app.example.php /var/www/html/app/config/production/app.php
|
||||
|
||||
# Change default hostname to blank...I guess?
|
||||
RUN sed -i s%http://staging.yourserver.com%% /var/www/html/app/config/production/app.php
|
||||
|
||||
# turn off the toolbar
|
||||
RUN sed -i 's%\x27debug\x27 => true%\x27debug\x27 => false%' /var/www/html/app/config/production/app.php
|
||||
#copy all configuration files
|
||||
COPY docker/*.php /var/www/html/app/config/production/
|
||||
|
||||
RUN chown -R docker /var/www/html
|
||||
|
||||
|
||||
52
README.md
52
README.md
@@ -9,18 +9,23 @@ This is a FOSS project for asset management in IT Operations. Knowing who has wh
|
||||
|
||||
It is built on [Laravel 4.2](http://laravel.com) and uses the [Sentry 2](https://github.com/cartalyst/sentry) package.
|
||||
|
||||
This project is being actively developed and we're [releasing quite frequently](https://github.com/snipe/snipe-it/releases). ([Check out the live demo here](http://snipeitapp.com/demo/).)
|
||||
This project is being actively developed and we're [releasing quite frequently](https://github.com/snipe/snipe-it/releases). ([Check out the live demo here](https://snipeitapp.com/demo/).)
|
||||
|
||||
__This is web-based software__. This means there there is no executable file (aka no .exe files), and it must be run on a web server and accessed through a web browser. It runs on any Mac OSX, flavor of Linux, as well as Windows.
|
||||
|
||||
-----
|
||||
### Documentation & Installation
|
||||
|
||||
__Installation and configuration documentation for this project has been moved to http://snipeitapp.com/documentation/.__
|
||||
### Installation
|
||||
|
||||
We'll be adding a long-overdue user's manual soon as well.
|
||||
__Installation and configuration documentation for this project has been moved to http://docs.snipeitapp.com.__
|
||||
|
||||
__To deploy on Ubuntu using Ansible and Vagrant, be sure to check out the [Snipe-IT Installation scripts](https://github.com/GR360RY/snipeit-ansible) created by [@GR360RY](https://github.com/GR360RY/).__
|
||||
#### Server Requirements
|
||||
Please see the [requirements documentation](http://docs.snipeitapp.com/requirements.html) for full requirements.
|
||||
|
||||
|
||||
To deploy on Ubuntu using Ansible and Vagrant, check out the [Snipe-IT Installation scripts](https://github.com/GR360RY/snipeit-ansible) created by [@GR360RY](https://github.com/GR360RY/).
|
||||
|
||||
To deploy on a fresh Ubuntu / CentOS install that will be dedicated to Snipe-It, run the "install.sh". Make sure to chmod +x install.sh and run as sudo on Ubuntu systems (or equivalent on CentOS.)
|
||||
|
||||
-----
|
||||
### Bug Reports & Feature Requests
|
||||
@@ -29,44 +34,31 @@ Feel free to check out the [GitHub Issues for this project](https://github.com/s
|
||||
|
||||
We use Waffle.io to help better communicate our roadmap with users. Our [project page there](http://waffle.io/snipe/snipe-it) will show you the backlog, what's ready to be worked on, what's in progress, and what's completed.
|
||||
|
||||
[](http://waffle.io/snipe/snipe-it)
|
||||
If you're having trouble with the installation, please check the [Common Issues](http://docs.snipeitapp.com/common-issues.html) and [Getting Help](http://docs.snipeitapp.com/getting-help.html) documentation.
|
||||
|
||||
-----
|
||||
|
||||
### Upgrading
|
||||
|
||||
Please see the [upgrading documentation](http://docs.snipeitapp.com/upgrading.html) for instructions on upgrading Snipe-IT.
|
||||
|
||||
------
|
||||
### Announcement List
|
||||
|
||||
To be notified of important news (such as new releases, security advisories, etc), [sign up for our list](http://eepurl.com/XyZKz). We'll never sell or give away your info, and we'll only email you when it's important.
|
||||
|
||||
------
|
||||
|
||||
### Translations!
|
||||
|
||||
If you're not a coder but want to give back to the project and you're fluent in other languages, consider helping out with the translations. We use [CrowdIn](https://crowdin.com) to manage translations, and it makes it super-simple for you to add translations to the project without messing with code. Check out [the Snipe-IT CrowdIn translation project here](https://crowdin.com/project/snipe-it/).
|
||||
|
||||
We currently have English, Chinese, Finnish, Malay, Romanian and Spanish completed, and are looking for lots more!
|
||||
|
||||
-----
|
||||
## Requirements
|
||||
|
||||
- PHP 5.4 or later
|
||||
- MCrypt PHP Extension
|
||||
- Fileinfo Extension
|
||||
|
||||
And _one_ of the following image libraries (for QR codes, asset model image and user avatar image uploads).
|
||||
|
||||
- GD Library (>=2.0) … or …
|
||||
- Imagick PHP extension (>=6.3.8)
|
||||
Please see the [translations documentation](http://docs.snipeitapp.com/translations.html) for information about available languages and how to add translations to Snipe-IT.
|
||||
|
||||
-----
|
||||
|
||||
## Important Notes on Updating
|
||||
### Contributing
|
||||
|
||||
Whenever you pull down a new version from master or develop, when you grab the [latest official release](https://github.com/snipe/snipe-it/releases), make sure to run the following commands via command line:
|
||||
Please see the documentation on [contributing and developing for Snipe-IT](http://docs.snipeitapp.com/contributing.html).
|
||||
|
||||
php composer.phar dump-autoload
|
||||
php artisan migrate
|
||||
|
||||
Forgetting to do this can mean your DB might end up out of sync with the new files you just pulled, or you may have some funky cached autoloader values. It's a good idea to get into the habit of running these every time you pull anything new down. If there are no database changes to migrate, it won't hurt anything to run migrations anyway.
|
||||
|
||||
## Contributor Code of Conduct
|
||||
[](http://waffle.io/snipe/snipe-it)
|
||||
|
||||
Please note that this project is released with a [Contributor Code of Conduct](CODE_OF_CONDUCT.md). By participating in this project you agree to abide by its terms.
|
||||
|
||||
|
||||
@@ -32,7 +32,7 @@ class AppCommand extends Command
|
||||
'password' => null
|
||||
);
|
||||
|
||||
protected $dummyData = true;
|
||||
protected $dummyData = false;
|
||||
|
||||
/**
|
||||
* Create a new command instance.
|
||||
@@ -67,6 +67,7 @@ class AppCommand extends Command
|
||||
$this->askUserFirstName();
|
||||
$this->askUserLastName();
|
||||
$this->askUserUsername();
|
||||
$this->askUserEmail();
|
||||
$this->askUserPassword();
|
||||
|
||||
$this->askUserDummyData();
|
||||
@@ -89,10 +90,10 @@ class AppCommand extends Command
|
||||
$this->call('migrate:install');
|
||||
|
||||
// Run the Sentry Migrations
|
||||
$this->call('migrate', array('--package' => 'cartalyst/sentry'));
|
||||
$this->call('migrate', array('--package' => 'cartalyst/sentry','--force'=>true));
|
||||
|
||||
// Run the Migrations
|
||||
$this->call('migrate');
|
||||
$this->call('migrate', array('--force'=>true));
|
||||
|
||||
// Create the default user and default groups.
|
||||
$this->sentryRunner();
|
||||
@@ -221,12 +222,23 @@ class AppCommand extends Command
|
||||
{
|
||||
do {
|
||||
// Ask the user to input the user password
|
||||
$password = $this->ask('Please enter your user password (at least 8 characters): ');
|
||||
$password = $this->secret('Please enter your user password (at least 8 characters): ');
|
||||
$password1 = $this->secret('Please confirm your user password: ');
|
||||
|
||||
// Check if password is valid
|
||||
if ($password == '') {
|
||||
if ($password == '' || $password1 == '') {
|
||||
// Return an error message
|
||||
$this->error('Password is invalid. Please try again.');
|
||||
$password = '';
|
||||
$password1 = '';
|
||||
}
|
||||
else{
|
||||
// Verify the user password
|
||||
if ($password != $password1){
|
||||
$this->error('Password do not match. Please try again.');
|
||||
$password = '';
|
||||
$password1 = '';
|
||||
}
|
||||
}
|
||||
|
||||
// Store the password
|
||||
@@ -234,19 +246,19 @@ class AppCommand extends Command
|
||||
} while( ! $password);
|
||||
}
|
||||
|
||||
/**
|
||||
* Asks the user to create dummy data
|
||||
*
|
||||
* @return void
|
||||
* @todo Use the Laravel Validator
|
||||
*/
|
||||
protected function askUserDummyData()
|
||||
{
|
||||
// Ask the user to input the user password
|
||||
$dummydata = $this->ask('Do you want to seed your database with dummy data? Y/n (default is yes): ');
|
||||
/**
|
||||
* Asks the user to create dummy data
|
||||
*
|
||||
* @return void
|
||||
* @todo Use the Laravel Validator
|
||||
*/
|
||||
protected function askUserDummyData()
|
||||
{
|
||||
// Ask the user to input the user password
|
||||
$dummydata = $this->ask('Do you want to seed your database with dummy data? y/N (default is no): ');
|
||||
|
||||
$this->dummyData = ( strstr($dummydata, 'Y' ) || empty($dummydata) ) ? true : false;
|
||||
}
|
||||
$this->dummyData = ( strstr($dummydata, 'N' ) || empty($dummydata) ) ? true : false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Runs all the necessary Sentry commands.
|
||||
|
||||
412
app/commands/AssetImportCommand.php
Normal file
412
app/commands/AssetImportCommand.php
Normal file
@@ -0,0 +1,412 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Console\Command;
|
||||
use Symfony\Component\Console\Input\InputOption;
|
||||
use Symfony\Component\Console\Input\InputArgument;
|
||||
use League\Csv\Reader;
|
||||
|
||||
class AssetImportCommand extends Command {
|
||||
|
||||
/**
|
||||
* The console command name.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $name = 'asset-import:csv';
|
||||
|
||||
/**
|
||||
* The console command description.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $description = 'Import Assets from CSV';
|
||||
|
||||
/**
|
||||
* Create a new command instance.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct();
|
||||
}
|
||||
|
||||
/**
|
||||
* Execute the console command.
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public function fire()
|
||||
{
|
||||
$filename = $this->argument('filename');
|
||||
|
||||
|
||||
if (!$this->option('testrun')=='true') {
|
||||
$this->comment('======= Importing Assets from '.$filename.' =========');
|
||||
} else {
|
||||
$this->comment('====== TEST ONLY Asset Import for '.$filename.' ====');
|
||||
$this->comment('============== NO DATA WILL BE WRITTEN ==============');
|
||||
}
|
||||
|
||||
if (! ini_get("auto_detect_line_endings")) {
|
||||
ini_set("auto_detect_line_endings", '1');
|
||||
}
|
||||
|
||||
$csv = Reader::createFromPath($this->argument('filename'));
|
||||
$csv->setNewline("\r\n");
|
||||
$csv->setOffset(1);
|
||||
$duplicates = '';
|
||||
|
||||
// Loop through the records
|
||||
$nbInsert = $csv->each(function ($row) use ($duplicates) {
|
||||
$status_id = 1;
|
||||
|
||||
// Let's just map some of these entries to more user friendly words
|
||||
|
||||
// User's name
|
||||
if (array_key_exists('0',$row)) {
|
||||
$user_name = trim($row[0]);
|
||||
} else {
|
||||
$user_name = '';
|
||||
}
|
||||
|
||||
// User's email
|
||||
if (array_key_exists('1',$row)) {
|
||||
$user_email = trim($row[1]);
|
||||
} else {
|
||||
$user_email = '';
|
||||
}
|
||||
|
||||
// User's email
|
||||
if (array_key_exists('2',$row)) {
|
||||
$user_username = trim($row[2]);
|
||||
} else {
|
||||
$user_username = '';
|
||||
}
|
||||
|
||||
// Asset Name
|
||||
if (array_key_exists('3',$row)) {
|
||||
$user_asset_asset_name = trim($row[3]);
|
||||
} else {
|
||||
$user_asset_asset_name = '';
|
||||
}
|
||||
|
||||
// Asset Category
|
||||
if (array_key_exists('4',$row)) {
|
||||
$user_asset_category = trim($row[4]);
|
||||
} else {
|
||||
$user_asset_category = '';
|
||||
}
|
||||
|
||||
// Asset Name
|
||||
if (array_key_exists('5',$row)) {
|
||||
$user_asset_name = trim($row[5]);
|
||||
} else {
|
||||
$user_asset_name = '';
|
||||
}
|
||||
|
||||
// Asset Manufacturer
|
||||
if (array_key_exists('6',$row)) {
|
||||
$user_asset_mfgr = trim($row[6]);
|
||||
} else {
|
||||
$user_asset_mfgr = '';
|
||||
}
|
||||
|
||||
// Asset model number
|
||||
if (array_key_exists('7',$row)) {
|
||||
$user_asset_modelno = trim($row[7]);
|
||||
} else {
|
||||
$user_asset_modelno = '';
|
||||
}
|
||||
|
||||
// Asset serial number
|
||||
if (array_key_exists('8',$row)) {
|
||||
$user_asset_serial = trim($row[8]);
|
||||
} else {
|
||||
$user_asset_serial = '';
|
||||
}
|
||||
|
||||
// Asset tag
|
||||
if (array_key_exists('9',$row)) {
|
||||
$user_asset_tag = trim($row[9]);
|
||||
} else {
|
||||
$user_asset_tag = '';
|
||||
}
|
||||
|
||||
// Asset location
|
||||
if (array_key_exists('10',$row)) {
|
||||
$user_asset_location = trim($row[10]);
|
||||
} else {
|
||||
$user_asset_location = '';
|
||||
}
|
||||
|
||||
// Asset notes
|
||||
if (array_key_exists('11',$row)) {
|
||||
$user_asset_notes = trim($row[11]);
|
||||
} else {
|
||||
$user_asset_notes = '';
|
||||
}
|
||||
|
||||
// Asset purchase date
|
||||
if (array_key_exists('12',$row)) {
|
||||
if ($row[12]!='') {
|
||||
$user_asset_purchase_date = date("Y-m-d 00:00:01", strtotime($row[12]));
|
||||
} else {
|
||||
$user_asset_purchase_date = '';
|
||||
}
|
||||
} else {
|
||||
$user_asset_purchase_date = '';
|
||||
}
|
||||
|
||||
// Asset purchase cost
|
||||
if (array_key_exists('13',$row)) {
|
||||
if ($row[13]!='') {
|
||||
$user_asset_purchase_cost = trim($row[13]);
|
||||
} else {
|
||||
$user_asset_purchase_cost = '';
|
||||
}
|
||||
} else {
|
||||
$user_asset_purchase_cost = '';
|
||||
}
|
||||
|
||||
// A number was given instead of a name
|
||||
if (is_numeric($user_name)) {
|
||||
$this->comment('User '.$user_name.' is not a name - assume this user already exists');
|
||||
$user_username = '';
|
||||
|
||||
// No name was given
|
||||
} elseif ($user_name=='') {
|
||||
$this->comment('No user data provided - skipping user creation, just adding asset');
|
||||
$first_name = '';
|
||||
$last_name = '';
|
||||
$user_username = '';
|
||||
|
||||
} else {
|
||||
$user_email_array = User::generateFormattedNameFromFullName($this->option('email_format'), $user_name);
|
||||
$first_name = $user_email_array['first_name'];
|
||||
$last_name = $user_email_array['last_name'];
|
||||
|
||||
if ($user_email=='') {
|
||||
$user_email = $user_email_array['username'].'@'.Config::get('app.domain');
|
||||
}
|
||||
|
||||
if ($user_username=='') {
|
||||
if ($this->option('username_format')=='email') {
|
||||
$user_username = $user_email;
|
||||
} else {
|
||||
$user_name_array = User::generateFormattedNameFromFullName($this->option('username_format'), $user_name);
|
||||
$user_username = $user_name_array['username'];
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
$this->comment('Full Name: '.$user_name);
|
||||
$this->comment('First Name: '.$first_name);
|
||||
$this->comment('Last Name: '.$last_name);
|
||||
$this->comment('Username: '.$user_username);
|
||||
$this->comment('Email: '.$user_email);
|
||||
$this->comment('Category Name: '.$user_asset_category);
|
||||
$this->comment('Item: '.$user_asset_name);
|
||||
$this->comment('Manufacturer ID: '.$user_asset_mfgr);
|
||||
$this->comment('Model No: '.$user_asset_modelno);
|
||||
$this->comment('Serial No: '.$user_asset_serial);
|
||||
$this->comment('Asset Tag: '.$user_asset_tag);
|
||||
$this->comment('Location: '.$user_asset_location);
|
||||
$this->comment('Purchase Date: '.$user_asset_purchase_date);
|
||||
$this->comment('Purchase Cost: '.$user_asset_purchase_cost);
|
||||
$this->comment('Notes: '.$user_asset_notes);
|
||||
|
||||
$this->comment('------------- Action Summary ----------------');
|
||||
|
||||
if ($user_username!='') {
|
||||
if ($user = User::MatchEmailOrUsername($user_username, $user_email)
|
||||
->whereNotNull('username')->first()) {
|
||||
$this->comment('User '.$user_username.' already exists');
|
||||
} else {
|
||||
// Create the user
|
||||
$user = Sentry::createUser(array(
|
||||
'first_name' => $first_name,
|
||||
'last_name' => $last_name,
|
||||
'email' => $user_email,
|
||||
'username' => $user_username,
|
||||
'password' => substr(str_shuffle("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, 12),
|
||||
'activated' => true,
|
||||
'permissions' => array(
|
||||
'admin' => 0,
|
||||
'user' => 1,
|
||||
),
|
||||
'notes' => 'User imported through asset importer'
|
||||
));
|
||||
|
||||
// Find the group using the group id
|
||||
$userGroup = Sentry::findGroupById(3);
|
||||
|
||||
// Assign the group to the user
|
||||
$user->addGroup($userGroup);
|
||||
$this->comment('User '.$first_name.' created');
|
||||
}
|
||||
} else {
|
||||
$user = new User;
|
||||
}
|
||||
|
||||
// Check for the location match and create it if it doesn't exist
|
||||
if ($location = Location::where('name', $user_asset_location)->first()) {
|
||||
$this->comment('Location '.$user_asset_location.' already exists');
|
||||
} else {
|
||||
|
||||
$location = new Location();
|
||||
|
||||
if ($user_asset_location!='') {
|
||||
|
||||
|
||||
$location->name = e($user_asset_location);
|
||||
$location->address = '';
|
||||
$location->city = '';
|
||||
$location->state = '';
|
||||
$location->country = '';
|
||||
$location->user_id = 1;
|
||||
|
||||
if (!$this->option('testrun')=='true') {
|
||||
|
||||
if ($location->save()) {
|
||||
$this->comment('Location '.$user_asset_location.' was created');
|
||||
} else {
|
||||
$this->comment('Something went wrong! Location '.$user_asset_location.' was NOT created');
|
||||
}
|
||||
|
||||
} else {
|
||||
$this->comment('Location '.$user_asset_location.' was (not) created - test run only');
|
||||
}
|
||||
} else {
|
||||
$this->comment('No location given, so none created.');
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// Check for the category match and create it if it doesn't exist
|
||||
if ($category = Category::where('name', $user_asset_category)->where('category_type', 'asset')->first()) {
|
||||
$this->comment('Category '.$user_asset_category.' already exists');
|
||||
} else {
|
||||
$category = new Category();
|
||||
$category->name = e($user_asset_category);
|
||||
$category->category_type = 'asset';
|
||||
$category->user_id = 1;
|
||||
|
||||
if ($category->save()) {
|
||||
$this->comment('Category '.$user_asset_category.' was created');
|
||||
} else {
|
||||
$this->comment('Something went wrong! Category '.$user_asset_category.' was NOT created');
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// Check for the manufacturer match and create it if it doesn't exist
|
||||
if ($manufacturer = Manufacturer::where('name', $user_asset_mfgr)->first()) {
|
||||
$this->comment('Manufacturer '.$user_asset_mfgr.' already exists');
|
||||
} else {
|
||||
$manufacturer = new Manufacturer();
|
||||
$manufacturer->name = e($user_asset_mfgr);
|
||||
$manufacturer->user_id = 1;
|
||||
|
||||
if ($manufacturer->save()) {
|
||||
$this->comment('Manufacturer '.$user_asset_mfgr.' was created');
|
||||
} else {
|
||||
$this->comment('Something went wrong! Manufacturer '.$user_asset_mfgr.' was NOT created');
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// Check for the asset model match and create it if it doesn't exist
|
||||
if ($asset_model = Model::where('name', $user_asset_name)->where('modelno', $user_asset_modelno)->where('category_id', $category->id)->where('manufacturer_id', $manufacturer->id)->first()) {
|
||||
$this->comment('The Asset Model '.$user_asset_name.' with model number '.$user_asset_modelno.' already exists');
|
||||
} else {
|
||||
$asset_model = new Model();
|
||||
$asset_model->name = e($user_asset_name);
|
||||
$asset_model->manufacturer_id = $manufacturer->id;
|
||||
$asset_model->modelno = e($user_asset_modelno);
|
||||
$asset_model->category_id = $category->id;
|
||||
$asset_model->user_id = 1;
|
||||
|
||||
if ($asset_model->save()) {
|
||||
$this->comment('Asset Model '.$user_asset_name.' with model number '.$user_asset_modelno.' was created');
|
||||
} else {
|
||||
$this->comment('Something went wrong! Asset Model '.$user_asset_name.' was NOT created');
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// Check for the asset match and create it if it doesn't exist
|
||||
|
||||
$asset = new Asset();
|
||||
$asset->name = e($user_asset_asset_name);
|
||||
if ($user_asset_purchase_date!='') {
|
||||
$asset->purchase_date = $user_asset_purchase_date;
|
||||
} else {
|
||||
$asset->purchase_date = NULL;
|
||||
}
|
||||
if ($user_asset_purchase_cost!='') {
|
||||
$asset->purchase_cost = ParseFloat(e($user_asset_purchase_cost));
|
||||
} else {
|
||||
$asset->purchase_cost = 0.00;
|
||||
}
|
||||
$asset->serial = e($user_asset_serial);
|
||||
$asset->asset_tag = e($user_asset_tag);
|
||||
$asset->model_id = $asset_model->id;
|
||||
$asset->assigned_to = $user->id;
|
||||
$asset->rtd_location_id = $location->id;
|
||||
$asset->user_id = 1;
|
||||
$asset->status_id = $status_id;
|
||||
if ($user_asset_purchase_date!='') {
|
||||
$asset->purchase_date = $user_asset_purchase_date;
|
||||
} else {
|
||||
$asset->purchase_date = NULL;
|
||||
}
|
||||
$asset->notes = e($user_asset_notes);
|
||||
|
||||
if ($asset->save()) {
|
||||
$this->comment('Asset '.$user_asset_name.' with serial number '.$user_asset_serial.' was created');
|
||||
} else {
|
||||
$this->comment('Something went wrong! Asset '.$user_asset_name.' was NOT created');
|
||||
}
|
||||
|
||||
|
||||
$this->comment('=====================================');
|
||||
|
||||
return true;
|
||||
|
||||
});
|
||||
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the console command arguments.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function getArguments()
|
||||
{
|
||||
return array(
|
||||
array('filename', InputArgument::REQUIRED, 'File for the CSV import.'),
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the console command options.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function getOptions()
|
||||
{
|
||||
return array(
|
||||
array('email_format', null, InputOption::VALUE_REQUIRED, 'The format of the email addresses that should be generated. Options are firstname.lastname, firstname, filastname', null),
|
||||
array('username_format', null, InputOption::VALUE_REQUIRED, 'The format of the username that should be generated. Options are firstname.lastname, firstname, filastname, email', null),
|
||||
array('testrun', null, InputOption::VALUE_REQUIRED, 'Test the output without writing to the database or not.', null),
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -1,275 +0,0 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Console\Command;
|
||||
use Symfony\Component\Console\Input\InputOption;
|
||||
use Symfony\Component\Console\Input\InputArgument;
|
||||
use League\Csv\Reader;
|
||||
|
||||
class ImportCommand extends Command {
|
||||
|
||||
/**
|
||||
* The console command name.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $name = 'import:csv';
|
||||
|
||||
/**
|
||||
* The console command description.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $description = 'Import from CSV';
|
||||
|
||||
/**
|
||||
* Create a new command instance.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct();
|
||||
}
|
||||
|
||||
/**
|
||||
* Execute the console command.
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public function fire()
|
||||
{
|
||||
$filename = $this->argument('filename');
|
||||
|
||||
|
||||
if (!$this->option('testrun')=='true') {
|
||||
$this->comment('======= Importing '.$filename.' =========');
|
||||
} else {
|
||||
$this->comment('====== TEST ONLY Import for '.$filename.' ====');
|
||||
$this->comment('============== NO DATA WILL BE WRITTEN ==============');
|
||||
}
|
||||
|
||||
if (! ini_get("auto_detect_line_endings")) {
|
||||
ini_set("auto_detect_line_endings", '1');
|
||||
}
|
||||
|
||||
$csv = Reader::createFromPath($this->argument('filename'));
|
||||
$csv->setNewline("\r\n");
|
||||
$csv->setOffset(1);
|
||||
$duplicates = '';
|
||||
|
||||
// Loop through the records
|
||||
$nbInsert = $csv->each(function ($row) use ($duplicates) {
|
||||
$status_id = 1;
|
||||
|
||||
if (is_numeric($row[0])) {
|
||||
$this->comment('User '.$row[0].' is not a name - assume this user already exists');
|
||||
} elseif ($row[0]=='') {
|
||||
$this->comment('No user data provided - skipping user creation, just adding asset');
|
||||
} else {
|
||||
|
||||
// Generate an email based on their name
|
||||
$name = explode(" ", $row[0]);
|
||||
$first_name = $name[0];
|
||||
$last_name = '';
|
||||
$email_last_name = '';
|
||||
|
||||
if ($first_name=='Unknown') {
|
||||
$status_id = 7;
|
||||
}
|
||||
|
||||
if (!array_key_exists(1, $name)) {
|
||||
$last_name='';
|
||||
$email_last_name = $last_name;
|
||||
$email_prefix = $first_name;
|
||||
} else {
|
||||
// Loop through the rest of the explode so you don't truncate
|
||||
for ($x=0; $x < count($name); $x++) {
|
||||
if (($x > 0) && ($name[$x]!='')) {
|
||||
$last_name.=' '.$name[$x];
|
||||
$email_last_name.=$name[$x];
|
||||
}
|
||||
}
|
||||
$email_prefix = $first_name[0].$email_last_name;
|
||||
}
|
||||
|
||||
$email = strtolower(str_replace('.','',$email_prefix)).'@'.$this->option('domain');
|
||||
$email = str_replace("'",'',$email);
|
||||
|
||||
$this->comment('Full Name: '.$row[0]);
|
||||
$this->comment('First Name: '.$first_name);
|
||||
$this->comment('Last Name: '.$last_name);
|
||||
$this->comment('Email: '.$email);
|
||||
$this->comment('Category Name: '.$row[1]);
|
||||
$this->comment('Item: '.$row[2]);
|
||||
$this->comment('Manufacturer ID: '.$row[3]);
|
||||
$this->comment('Model No: '.$row[4]);
|
||||
$this->comment('Serial No: '.$row[5]);
|
||||
$this->comment('Asset Tag: '.$row[6]);
|
||||
$this->comment('Location: '.$row[7]);
|
||||
}
|
||||
|
||||
$this->comment('------------- Action Summary ----------------');
|
||||
|
||||
if (isset($email)) {
|
||||
if ($user = User::where('email', $email)->first()) {
|
||||
$this->comment('User '.$email.' already exists');
|
||||
} else {
|
||||
// Create the user
|
||||
$user = Sentry::createUser(array(
|
||||
'first_name' => $first_name,
|
||||
'last_name' => $last_name,
|
||||
'email' => $email,
|
||||
'password' => substr(str_shuffle("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, 10),
|
||||
'activated' => true,
|
||||
'permissions' => array(
|
||||
'admin' => 0,
|
||||
'user' => 1,
|
||||
),
|
||||
'notes' => 'Imported user'
|
||||
));
|
||||
|
||||
// Find the group using the group id
|
||||
$userGroup = Sentry::findGroupById(3);
|
||||
|
||||
// Assign the group to the user
|
||||
$user->addGroup($userGroup);
|
||||
$this->comment('User '.$first_name.' created');
|
||||
}
|
||||
} else {
|
||||
$user = new User;
|
||||
}
|
||||
|
||||
// Check for the location match and create it if it doesn't exist
|
||||
if ($location = Location::where('name', $row[7])->first()) {
|
||||
$this->comment('Location '.$row[7].' already exists');
|
||||
} else {
|
||||
$location = new Location();
|
||||
$location->name = e($row[7]);
|
||||
$location->address = '';
|
||||
$location->city = '';
|
||||
$location->state = '';
|
||||
$location->country = '';
|
||||
$location->user_id = 1;
|
||||
|
||||
if (!$this->option('testrun')=='true') {
|
||||
|
||||
if ($location->save()) {
|
||||
$this->comment('Location '.$row[7].' was created');
|
||||
} else {
|
||||
$this->comment('Something went wrong! Location '.$row[1].' was NOT created');
|
||||
}
|
||||
|
||||
} else {
|
||||
$this->comment('Location '.$row[7].' was (not) created - test run only');
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// Check for the category match and create it if it doesn't exist
|
||||
if ($category = Category::where('name', $row[1])->where('category_type', 'asset')->first()) {
|
||||
$this->comment('Category '.$row[1].' already exists');
|
||||
} else {
|
||||
$category = new Category();
|
||||
$category->name = e($row[1]);
|
||||
$category->category_type = 'asset';
|
||||
$category->user_id = 1;
|
||||
|
||||
if ($category->save()) {
|
||||
$this->comment('Category '.$row[1].' was created');
|
||||
} else {
|
||||
$this->comment('Something went wrong! Category '.$row[1].' was NOT created');
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// Check for the manufacturer match and create it if it doesn't exist
|
||||
if ($manufacturer = Manufacturer::where('name', $row[3])->first()) {
|
||||
$this->comment('Manufacturer '.$row[3].' already exists');
|
||||
} else {
|
||||
$manufacturer = new Manufacturer();
|
||||
$manufacturer->name = e($row[3]);
|
||||
$manufacturer->user_id = 1;
|
||||
|
||||
if ($manufacturer->save()) {
|
||||
$this->comment('Manufacturer '.$row[3].' was created');
|
||||
} else {
|
||||
$this->comment('Something went wrong! Manufacturer '.$row[3].' was NOT created');
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// Check for the asset model match and create it if it doesn't exist
|
||||
if ($asset_model = Model::where('name', $row[2])->where('modelno', $row[4])->where('category_id', $category->id)->where('manufacturer_id', $manufacturer->id)->first()) {
|
||||
$this->comment('The Asset Model '.$row[2].' with model number '.$row[4].' already exists');
|
||||
} else {
|
||||
$asset_model = new Model();
|
||||
$asset_model->name = e($row[2]);
|
||||
$asset_model->manufacturer_id = $manufacturer->id;
|
||||
$asset_model->modelno = e($row[4]);
|
||||
$asset_model->category_id = $category->id;
|
||||
$asset_model->user_id = 1;
|
||||
|
||||
if ($asset_model->save()) {
|
||||
$this->comment('Asset Model '.$row[2].' with model number '.$row[4].' was created');
|
||||
} else {
|
||||
$this->comment('Something went wrong! Asset Model '.$row[2].' was NOT created');
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// Check for the asset match and create it if it doesn't exist
|
||||
|
||||
$asset = new Asset();
|
||||
$asset->name = e($row[2]);
|
||||
$asset->serial = e($row[5]);
|
||||
$asset->asset_tag = e($row[6]);
|
||||
$asset->model_id = $asset_model->id;
|
||||
$asset->assigned_to = $user->id;
|
||||
$asset->rtd_location_id = $location->id;
|
||||
$asset->user_id = 1;
|
||||
$asset->status_id = $status_id;
|
||||
|
||||
if ($asset->save()) {
|
||||
$this->comment('Asset '.$row[2].' with serial number '.$row[5].' was created');
|
||||
} else {
|
||||
$this->comment('Something went wrong! Asset '.$row[5].' was NOT created');
|
||||
}
|
||||
|
||||
|
||||
$this->comment('=====================================');
|
||||
|
||||
return true;
|
||||
|
||||
});
|
||||
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the console command arguments.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function getArguments()
|
||||
{
|
||||
return array(
|
||||
array('filename', InputArgument::REQUIRED, 'File for the CSV import.'),
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the console command options.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function getOptions()
|
||||
{
|
||||
return array(
|
||||
array('domain', null, InputOption::VALUE_REQUIRED, 'Email domain for generated email addresses.', null),
|
||||
array('testrun', null, InputOption::VALUE_REQUIRED, 'Test the output without writing to the database or not.', null),
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
381
app/commands/LicenseImportCommand.php
Normal file
381
app/commands/LicenseImportCommand.php
Normal file
@@ -0,0 +1,381 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Console\Command;
|
||||
use Symfony\Component\Console\Input\InputOption;
|
||||
use Symfony\Component\Console\Input\InputArgument;
|
||||
use League\Csv\Reader;
|
||||
|
||||
class LicenseImportCommand extends Command {
|
||||
|
||||
/**
|
||||
* The console command name.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $name = 'license-import:csv';
|
||||
|
||||
/**
|
||||
* The console command description.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $description = 'Import Licenses from CSV';
|
||||
|
||||
/**
|
||||
* Create a new command instance.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct();
|
||||
}
|
||||
|
||||
/**
|
||||
* Execute the console command.
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public function fire()
|
||||
{
|
||||
$filename = $this->argument('filename');
|
||||
|
||||
|
||||
if (!$this->option('testrun')=='true') {
|
||||
$this->comment('======= Importing Licenses from '.$filename.' =========');
|
||||
} else {
|
||||
$this->comment('====== TEST ONLY License Import for '.$filename.' ====');
|
||||
$this->comment('============== NO DATA WILL BE WRITTEN ==============');
|
||||
}
|
||||
|
||||
if (! ini_get("auto_detect_line_endings")) {
|
||||
ini_set("auto_detect_line_endings", '1');
|
||||
}
|
||||
|
||||
$csv = Reader::createFromPath($this->argument('filename'));
|
||||
$csv->setNewline("\r\n");
|
||||
$csv->setOffset(1);
|
||||
$duplicates = '';
|
||||
|
||||
// Loop through the records
|
||||
$nbInsert = $csv->each(function ($row) use ($duplicates) {
|
||||
$status_id = 1;
|
||||
|
||||
// Let's just map some of these entries to more user friendly words
|
||||
|
||||
if (array_key_exists('0',$row)) {
|
||||
$user_name = trim($row[0]);
|
||||
} else {
|
||||
$user_name = '';
|
||||
}
|
||||
|
||||
if (array_key_exists('1',$row)) {
|
||||
$user_email = trim($row[1]);
|
||||
} else {
|
||||
$user_email = '';
|
||||
}
|
||||
|
||||
if (array_key_exists('2',$row)) {
|
||||
$user_username = trim($row[2]);
|
||||
} else {
|
||||
$user_username = '';
|
||||
}
|
||||
|
||||
if (array_key_exists('3',$row)) {
|
||||
$user_license_name = trim($row[3]);
|
||||
} else {
|
||||
$user_license_name = '';
|
||||
}
|
||||
|
||||
if (array_key_exists('4',$row)) {
|
||||
$user_license_serial = trim($row[4]);
|
||||
} else {
|
||||
$user_license_serial = '';
|
||||
}
|
||||
|
||||
if (array_key_exists('5',$row)) {
|
||||
$user_licensed_to_name = trim($row[5]);
|
||||
} else {
|
||||
$user_licensed_to_name = '';
|
||||
}
|
||||
|
||||
if (array_key_exists('6',$row)) {
|
||||
$user_licensed_to_email = trim($row[6]);
|
||||
} else {
|
||||
$user_licensed_to_email = '';
|
||||
}
|
||||
|
||||
if (array_key_exists('7',$row)) {
|
||||
$user_license_seats = trim($row[7]);
|
||||
} else {
|
||||
$user_license_seats = '';
|
||||
}
|
||||
|
||||
if (array_key_exists('8',$row)) {
|
||||
$user_license_reassignable = trim($row[8]);
|
||||
if ($user_license_reassignable!='') {
|
||||
if ((strtolower($user_license_reassignable)=='yes') || (strtolower($user_license_reassignable)=='true') || ($user_license_reassignable=='1')) {
|
||||
$user_license_reassignable = 1;
|
||||
}
|
||||
} else {
|
||||
$user_license_reassignable = 0;
|
||||
}
|
||||
} else {
|
||||
$user_license_reassignable = 0;
|
||||
}
|
||||
|
||||
if (array_key_exists('9',$row)) {
|
||||
$user_license_supplier = trim($row[9]);
|
||||
} else {
|
||||
$user_license_supplier = '';
|
||||
}
|
||||
|
||||
if (array_key_exists('10',$row)) {
|
||||
$user_license_maintained = trim($row[10]);
|
||||
|
||||
if ($user_license_maintained!='') {
|
||||
if ((strtolower($user_license_maintained)=='yes') || (strtolower($user_license_maintained)=='true') || ($user_license_maintained=='1')) {
|
||||
$user_license_maintained = 1;
|
||||
}
|
||||
} else {
|
||||
$user_license_maintained = 0;
|
||||
}
|
||||
|
||||
|
||||
} else {
|
||||
$user_license_maintained = '';
|
||||
}
|
||||
|
||||
if (array_key_exists('11',$row)) {
|
||||
$user_license_notes = trim($row[11]);
|
||||
} else {
|
||||
$user_license_notes = '';
|
||||
}
|
||||
|
||||
if (array_key_exists('12',$row)) {
|
||||
if ($row[12]!='') {
|
||||
$user_license_purchase_date = date("Y-m-d 00:00:01", strtotime($row[12]));
|
||||
} else {
|
||||
$user_license_purchase_date = '';
|
||||
}
|
||||
} else {
|
||||
$user_license_purchase_date = 0;
|
||||
}
|
||||
|
||||
// A number was given instead of a name
|
||||
if (is_numeric($user_name)) {
|
||||
$this->comment('User '.$user_name.' is not a name - assume this user already exists');
|
||||
$user_username = '';
|
||||
// No name was given
|
||||
|
||||
} elseif ($user_name=='') {
|
||||
$this->comment('No user data provided - skipping user creation, just adding license');
|
||||
$first_name = '';
|
||||
$last_name = '';
|
||||
$user_username = '';
|
||||
|
||||
} else {
|
||||
|
||||
$name = explode(" ", $user_name);
|
||||
$first_name = $name[0];
|
||||
$email_last_name = '';
|
||||
$email_prefix = $first_name;
|
||||
|
||||
if (!array_key_exists(1, $name)) {
|
||||
$last_name='';
|
||||
$email_last_name = $last_name;
|
||||
$email_prefix = $first_name;
|
||||
} else {
|
||||
$last_name = str_replace($first_name,'',$user_name);
|
||||
|
||||
if ($this->option('email_format')=='filastname') {
|
||||
$email_last_name.=str_replace(' ','',$last_name);
|
||||
$email_prefix = $first_name[0].$email_last_name;
|
||||
|
||||
} elseif ($this->option('email_format')=='firstname.lastname') {
|
||||
$email_last_name.=str_replace(' ','',$last_name);
|
||||
$email_prefix = $first_name.'.'.$email_last_name;
|
||||
|
||||
} elseif ($this->option('email_format')=='firstname') {
|
||||
$email_last_name.=str_replace(' ','',$last_name);
|
||||
$email_prefix = $first_name;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
$user_username = $email_prefix;
|
||||
|
||||
// Generate an email based on their name if no email address is given
|
||||
if ($user_email=='') {
|
||||
if ($first_name=='Unknown') {
|
||||
$status_id = 7;
|
||||
}
|
||||
$email = strtolower($email_prefix).'@'.$this->option('domain');
|
||||
$user_email = str_replace("'",'',$email);
|
||||
}
|
||||
}
|
||||
|
||||
$this->comment('Full Name: '.$user_name);
|
||||
$this->comment('First Name: '.$first_name);
|
||||
$this->comment('Last Name: '.$last_name);
|
||||
$this->comment('Username: '.$user_username);
|
||||
$this->comment('Email: '.$user_email);
|
||||
$this->comment('License Name: '.$user_license_name);
|
||||
$this->comment('Serial No: '.$user_license_serial);
|
||||
$this->comment('Licensed To Name: '.$user_licensed_to_name);
|
||||
$this->comment('Licensed To Email: '.$user_licensed_to_email);
|
||||
$this->comment('Seats: '.$user_license_seats);
|
||||
$this->comment('Reassignable: '.$user_license_reassignable);
|
||||
$this->comment('Supplier: '.$user_license_supplier);
|
||||
$this->comment('Maintained: '.$user_license_maintained);
|
||||
$this->comment('Notes: '.$user_license_notes);
|
||||
$this->comment('Purchase Date: '.$user_license_purchase_date);
|
||||
|
||||
$this->comment('------------- Action Summary ----------------');
|
||||
|
||||
if ($user_username!='') {
|
||||
if ($user = User::where('username', $user_username)->whereNotNull('username')->first()) {
|
||||
$this->comment('User '.$user_username.' already exists');
|
||||
} else {
|
||||
// Create the user
|
||||
$user = Sentry::createUser(array(
|
||||
'first_name' => $first_name,
|
||||
'last_name' => $last_name,
|
||||
'email' => $user_email,
|
||||
'username' => $user_username,
|
||||
'password' => substr(str_shuffle("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, 10),
|
||||
'activated' => true,
|
||||
'permissions' => array(
|
||||
'admin' => 0,
|
||||
'user' => 1,
|
||||
),
|
||||
'notes' => 'User importerd through license importer'
|
||||
));
|
||||
|
||||
// Find the group using the group id
|
||||
$userGroup = Sentry::findGroupById(3);
|
||||
|
||||
// Assign the group to the user
|
||||
$user->addGroup($userGroup);
|
||||
$this->comment('User '.$first_name.' created');
|
||||
}
|
||||
} else {
|
||||
$user = new User;
|
||||
$user->user_id = NULL;
|
||||
}
|
||||
|
||||
|
||||
// Check for the supplier match and create it if it doesn't exist
|
||||
if ($supplier = Supplier::where('name', $user_license_supplier)->first()) {
|
||||
$this->comment('Supplier '.$user_license_supplier.' already exists');
|
||||
} else {
|
||||
$supplier = new Supplier();
|
||||
$supplier->name = e($user_license_supplier);
|
||||
$supplier->user_id = 1;
|
||||
|
||||
if ($supplier->save()) {
|
||||
$this->comment('Supplier '.$user_license_supplier.' was created');
|
||||
} else {
|
||||
$this->comment('Something went wrong! Supplier '.$user_license_supplier.' was NOT created');
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
// Add the license
|
||||
$license = new License();
|
||||
$license->name = e($user_license_name);
|
||||
if ($user_license_purchase_date!='') {
|
||||
$license->purchase_date = $user_license_purchase_date;
|
||||
} else {
|
||||
$license->purchase_date = NULL;
|
||||
}
|
||||
$license->serial = e($user_license_serial);
|
||||
$license->seats = e($user_license_seats);
|
||||
$license->supplier_id = $supplier->id;
|
||||
$license->user_id = 1;
|
||||
if ($user_license_purchase_date!='') {
|
||||
$license->purchase_date = $user_license_purchase_date;
|
||||
} else {
|
||||
$license->purchase_date = NULL;
|
||||
}
|
||||
$license->license_name = $user_licensed_to_name;
|
||||
$license->license_email = $user_licensed_to_email;
|
||||
$license->notes = e($user_license_notes);
|
||||
|
||||
if ($license->save()) {
|
||||
$this->comment('License '.$user_license_name.' with serial number '.$user_license_serial.' was created');
|
||||
|
||||
|
||||
$license_seat_created = 0;
|
||||
|
||||
for ($x = 0; $x < $user_license_seats; $x++) {
|
||||
// Create the license seat entries
|
||||
$license_seat = new LicenseSeat();
|
||||
$license_seat->license_id = $license->id;
|
||||
|
||||
// Only assign the first seat to the user
|
||||
if ($x==0) {
|
||||
$license_seat->assigned_to = $user->id;
|
||||
} else {
|
||||
$license_seat->assigned_to = NULL;
|
||||
}
|
||||
|
||||
if ($license_seat->save()) {
|
||||
$license_seat_created++;
|
||||
}
|
||||
}
|
||||
|
||||
if ($license_seat_created > 0) {
|
||||
$this->comment($license_seat_created.' seats were created');
|
||||
} else {
|
||||
$this->comment('Something went wrong! NO seats for '.$user_license_name.' were created');
|
||||
}
|
||||
|
||||
|
||||
|
||||
} else {
|
||||
$this->comment('Something went wrong! License '.$user_license_name.' was NOT created');
|
||||
}
|
||||
|
||||
|
||||
$this->comment('=====================================');
|
||||
|
||||
return true;
|
||||
|
||||
});
|
||||
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the console command arguments.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function getArguments()
|
||||
{
|
||||
return array(
|
||||
array('filename', InputArgument::REQUIRED, 'File for the CSV import.'),
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the console command options.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function getOptions()
|
||||
{
|
||||
return array(
|
||||
array('domain', null, InputOption::VALUE_REQUIRED, 'Email domain for generated email addresses.', null),
|
||||
array('email_format', null, InputOption::VALUE_REQUIRED, 'The format of the email addresses that should be generated. Options are firstname.lastname, firstname, filastname', null),
|
||||
array('testrun', null, InputOption::VALUE_REQUIRED, 'Test the output without writing to the database or not.', null),
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -18,7 +18,7 @@ class SystemBackup extends Command {
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $description = 'This commandcreates a database dump and zips up all of the uploaded files in the upload directories.';
|
||||
protected $description = 'This command creates a database dump and zips up all of the uploaded files in the upload directories.';
|
||||
|
||||
/**
|
||||
* Create a new command instance.
|
||||
|
||||
@@ -101,10 +101,10 @@ return array(
|
||||
'Barryvdh\Debugbar\ServiceProvider',
|
||||
'Cartalyst\Sentry\SentryServiceProvider',
|
||||
'Chumper\Datatable\DatatableServiceProvider',
|
||||
'Dinesh\Barcode\BarcodeServiceProvider',
|
||||
'Maknz\Slack\SlackServiceProvider',
|
||||
'Schickling\Backup\BackupServiceProvider',
|
||||
'Chumper\Zipper\ZipperServiceProvider',
|
||||
'Fideloper\Proxy\ProxyServiceProvider',
|
||||
|
||||
),
|
||||
|
||||
@@ -176,8 +176,6 @@ return array(
|
||||
'Validator' => 'Illuminate\Support\Facades\Validator',
|
||||
'View' => 'Illuminate\Support\Facades\View',
|
||||
'Reader' => 'League\Csv\Reader',
|
||||
'DNS1D' => 'Dinesh\Barcode\Facades\DNS1DFacade',
|
||||
'DNS2D' => 'Dinesh\Barcode\Facades\DNS2DFacade',
|
||||
'Slack' => 'Maknz\Slack\Facades\Slack',
|
||||
'Zipper' => 'Chumper\Zipper\Zipper',
|
||||
|
||||
|
||||
@@ -28,6 +28,19 @@ return array(
|
||||
|
||||
'url' => 'http://snipe-it-laravel.local:8888',
|
||||
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Organization Domain Name
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| The domain name of the organization, used when generating email addresses
|
||||
| through the import tools.
|
||||
|
|
||||
*/
|
||||
|
||||
'domain' => 'yourserver.com',
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Encryption Key
|
||||
@@ -37,7 +50,7 @@ return array(
|
||||
| to a random, 32 character string, otherwise these encrypted strings
|
||||
| will not be safe. Please do this before deploying an application!
|
||||
|
|
||||
| Run a php artisan key:generate to create a random one
|
||||
| Run a php artisan key:generate --env=staging to create a random one
|
||||
*/
|
||||
|
||||
'key' => 'Change_this_key_or_snipe_will_get_ya',
|
||||
|
||||
112
app/config/local/ldap.example.php
Normal file
112
app/config/local/ldap.example.php
Normal file
@@ -0,0 +1,112 @@
|
||||
<?php
|
||||
|
||||
return array(
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| URL
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| URL for the LDAP server. This should start with ldap://, for example:
|
||||
| ldap://ldap.yourserver.com
|
||||
|
|
||||
*/
|
||||
'url' => "",
|
||||
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Username
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Username to use to connect authenticate to LDAP, for example:
|
||||
| cn=read-only-admin,dc=example,dc=com
|
||||
|
|
||||
*/
|
||||
'username' => "",
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Password
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Password to use when authenticating to LDAP.
|
||||
|
|
||||
*/
|
||||
'password' => "",
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Basedn
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| The base where the search for users will be executed, for example:
|
||||
| dc=example,dc=com
|
||||
|
|
||||
*/
|
||||
'basedn' => "",
|
||||
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Filter
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| The search filter for the LDAP query. This probably does not have to be
|
||||
| changed.
|
||||
|
|
||||
*/
|
||||
'filter' => "&(cn=*)",
|
||||
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| LDAP field names that will be retrieved to create a user.
|
||||
|
|
||||
| Using the username as an example:
|
||||
| If I set 'result.username' => 'my-org-username', the code will connect to
|
||||
| LDAP as follows (where $results[$i] represents a row in the LDAP query:
|
||||
| $username-to-insert-in-snipe-it = $results[$i]["my-org-username"][0]
|
||||
|
|
||||
| Note: all these fields are required.
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| The search filter for the LDAP query.
|
||||
|
|
||||
*/
|
||||
'result.username' => "",
|
||||
'result.last.name' => "",
|
||||
'result.first.name' => "",
|
||||
|
||||
/*
|
||||
| These fields are optional as not all LDAP directories will have it. If yours
|
||||
| does not have them, just leave these blank and the extra check will
|
||||
| be omitted.
|
||||
*/
|
||||
'result.active.flag' => "",
|
||||
'result.emp.num' => "",
|
||||
'result.email' => "",
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| LDAP filter query for authentication
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| The LDAP query that we want to execute when authenticating a user. This
|
||||
| should not have to be changed.
|
||||
|
|
||||
*/
|
||||
'authentication.filter.query' => "uid=",
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| LDAP Version
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Version of LDAP you are using.
|
||||
|
|
||||
*/
|
||||
'version' => 3,
|
||||
|
||||
|
||||
);
|
||||
@@ -46,7 +46,7 @@ return array(
|
||||
|
|
||||
*/
|
||||
|
||||
'hasher' => 'native',
|
||||
'hasher' => 'bcrypt',
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?php
|
||||
return array(
|
||||
'path' => storage_path() . '/dumps/',
|
||||
'path' => 'app/storage/dumps/',
|
||||
|
||||
'mysql' => array(
|
||||
'dump_command_path' => '',
|
||||
|
||||
1
app/config/production/.gitignore
vendored
1
app/config/production/.gitignore
vendored
@@ -1,3 +1,4 @@
|
||||
app.php
|
||||
mail.php
|
||||
database.php
|
||||
ldap.php
|
||||
@@ -28,6 +28,19 @@ return array(
|
||||
|
||||
'url' => 'https://production.yourserver.com',
|
||||
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Organization Domain Name
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| The domain name of the organization, used when generating email addresses
|
||||
| through the import tools.
|
||||
|
|
||||
*/
|
||||
|
||||
'domain' => 'yourserver.com',
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Encryption Key
|
||||
|
||||
112
app/config/production/ldap.example.php
Normal file
112
app/config/production/ldap.example.php
Normal file
@@ -0,0 +1,112 @@
|
||||
<?php
|
||||
|
||||
return array(
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| URL
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| URL for the LDAP server. This should start with ldap://, for example:
|
||||
| ldap://ldap.yourserver.com
|
||||
|
|
||||
*/
|
||||
'url' => "",
|
||||
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Username
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Username to use to connect authenticate to LDAP, for example:
|
||||
| cn=read-only-admin,dc=example,dc=com
|
||||
|
|
||||
*/
|
||||
'username' => "",
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Password
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Password to use when authenticating to LDAP.
|
||||
|
|
||||
*/
|
||||
'password' => "",
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Basedn
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| The base where the search for users will be executed, for example:
|
||||
| dc=example,dc=com
|
||||
|
|
||||
*/
|
||||
'basedn' => "",
|
||||
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Filter
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| The search filter for the LDAP query. This probably does not have to be
|
||||
| changed.
|
||||
|
|
||||
*/
|
||||
'filter' => "&(cn=*)",
|
||||
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| LDAP field names that will be retrieved to create a user.
|
||||
|
|
||||
| Using the username as an example:
|
||||
| If I set 'result.username' => 'my-org-username', the code will connect to
|
||||
| LDAP as follows (where $results[$i] represents a row in the LDAP query:
|
||||
| $username-to-insert-in-snipe-it = $results[$i]["my-org-username"][0]
|
||||
|
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| The search filter for the LDAP query.
|
||||
| Note: all these fields are required, and they should all be lowercase.
|
||||
|
|
||||
*/
|
||||
'result.username' => "",
|
||||
'result.last.name' => "",
|
||||
'result.first.name' => "",
|
||||
|
||||
/*
|
||||
| These fields are optional as not all LDAP directories will have it. If yours
|
||||
| does not have them, just leave these blank and the extra check will
|
||||
| be omitted.
|
||||
*/
|
||||
'result.active.flag' => "",
|
||||
'result.emp.num' => "",
|
||||
'result.email' => "",
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| LDAP filter query for authentication
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| The LDAP query that we want to execute when authenticating a user. This
|
||||
| should not have to be changed.
|
||||
|
|
||||
*/
|
||||
'authentication.filter.query' => "uid=",
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| LDAP Version
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Version of LDAP you are using.
|
||||
|
|
||||
*/
|
||||
'version' => 3,
|
||||
|
||||
|
||||
);
|
||||
@@ -13,7 +13,7 @@ return array(
|
||||
|
|
||||
*/
|
||||
|
||||
'debug' => true,
|
||||
'debug' => false,
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
@@ -28,6 +28,19 @@ return array(
|
||||
|
||||
'url' => 'http://staging.yourserver.com',
|
||||
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Organization Domain Name
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| The domain name of the organization, used when generating email addresses
|
||||
| through the import tools.
|
||||
|
|
||||
*/
|
||||
|
||||
'domain' => 'yourserver.com',
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Encryption Key
|
||||
|
||||
112
app/config/staging/ldap.example.php
Normal file
112
app/config/staging/ldap.example.php
Normal file
@@ -0,0 +1,112 @@
|
||||
<?php
|
||||
|
||||
return array(
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| URL
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| URL for the LDAP server. This should start with ldap://, for example:
|
||||
| ldap://ldap.yourserver.com
|
||||
|
|
||||
*/
|
||||
'url' => "",
|
||||
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Username
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Username to use to connect authenticate to LDAP, for example:
|
||||
| cn=read-only-admin,dc=example,dc=com
|
||||
|
|
||||
*/
|
||||
'username' => "",
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Password
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Password to use when authenticating to LDAP.
|
||||
|
|
||||
*/
|
||||
'password' => "",
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Basedn
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| The base where the search for users will be executed, for example:
|
||||
| dc=example,dc=com
|
||||
|
|
||||
*/
|
||||
'basedn' => "",
|
||||
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Filter
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| The search filter for the LDAP query. This probably does not have to be
|
||||
| changed.
|
||||
|
|
||||
*/
|
||||
'filter' => "&(cn=*)",
|
||||
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| LDAP field names that will be retrieved to create a user.
|
||||
|
|
||||
| Using the username as an example:
|
||||
| If I set 'result.username' => 'my-org-username', the code will connect to
|
||||
| LDAP as follows (where $results[$i] represents a row in the LDAP query:
|
||||
| $username-to-insert-in-snipe-it = $results[$i]["my-org-username"][0]
|
||||
|
|
||||
| Note: all these fields are required.
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| The search filter for the LDAP query.
|
||||
|
|
||||
*/
|
||||
'result.username' => "",
|
||||
'result.last.name' => "",
|
||||
'result.first.name' => "",
|
||||
|
||||
/*
|
||||
| These fields are optional as not all LDAP directories will have it. If yours
|
||||
| does not have them, just leave these blank and the extra check will
|
||||
| be omitted.
|
||||
*/
|
||||
'result.active.flag' => "",
|
||||
'result.emp.num' => "",
|
||||
'result.email' => "",
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| LDAP filter query for authentication
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| The LDAP query that we want to execute when authenticating a user. This
|
||||
| should not have to be changed.
|
||||
|
|
||||
*/
|
||||
'authentication.filter.query' => "uid=",
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| LDAP Version
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Version of LDAP you are using.
|
||||
|
|
||||
*/
|
||||
'version' => 3,
|
||||
|
||||
|
||||
);
|
||||
@@ -26,7 +26,7 @@ return array(
|
||||
|
|
||||
*/
|
||||
|
||||
'url' => 'http://staging.yourserver.com',
|
||||
'url' => 'http://snipe-it.dev',
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
@@ -40,6 +40,6 @@ return array(
|
||||
| Run a php artisan key:generate --env=staging to create a random one
|
||||
*/
|
||||
|
||||
'key' => 'Change_this_key_or_snipe_will_get_ya',
|
||||
'key' => '8YHfiO4EyWBewqrpGHDA4Iuom2ZIahXQ',
|
||||
|
||||
);
|
||||
|
||||
@@ -54,7 +54,7 @@ return array(
|
||||
'mysql' => array(
|
||||
'driver' => 'mysql',
|
||||
'host' => 'localhost',
|
||||
'database' => 'snipeit_laravel',
|
||||
'database' => 'snipeit_unit',
|
||||
'username' => 'travis',
|
||||
'password' => '',
|
||||
'charset' => 'utf8',
|
||||
|
||||
112
app/config/testing/ldap.example.php
Normal file
112
app/config/testing/ldap.example.php
Normal file
@@ -0,0 +1,112 @@
|
||||
<?php
|
||||
|
||||
return array(
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| URL
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| URL for the LDAP server. This should start with ldap://, for example:
|
||||
| ldap://ldap.yourserver.com
|
||||
|
|
||||
*/
|
||||
'url' => "",
|
||||
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Username
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Username to use to connect authenticate to LDAP, for example:
|
||||
| cn=read-only-admin,dc=example,dc=com
|
||||
|
|
||||
*/
|
||||
'username' => "",
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Password
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Password to use when authenticating to LDAP.
|
||||
|
|
||||
*/
|
||||
'password' => "",
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Basedn
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| The base where the search for users will be executed, for example:
|
||||
| dc=example,dc=com
|
||||
|
|
||||
*/
|
||||
'basedn' => "",
|
||||
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Filter
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| The search filter for the LDAP query. This probably does not have to be
|
||||
| changed.
|
||||
|
|
||||
*/
|
||||
'filter' => "&(cn=*)",
|
||||
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| LDAP field names that will be retrieved to create a user.
|
||||
|
|
||||
| Using the username as an example:
|
||||
| If I set 'result.username' => 'my-org-username', the code will connect to
|
||||
| LDAP as follows (where $results[$i] represents a row in the LDAP query:
|
||||
| $username-to-insert-in-snipe-it = $results[$i]["my-org-username"][0]
|
||||
|
|
||||
| Note: all these fields are required.
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| The search filter for the LDAP query.
|
||||
|
|
||||
*/
|
||||
'result.username' => "",
|
||||
'result.last.name' => "",
|
||||
'result.first.name' => "",
|
||||
|
||||
/*
|
||||
| These fields are optional as not all LDAP directories will have it. If yours
|
||||
| does not have them, just leave these blank and the extra check will
|
||||
| be omitted.
|
||||
*/
|
||||
'result.active.flag' => "",
|
||||
'result.emp.num' => "",
|
||||
'result.email' => "",
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| LDAP filter query for authentication
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| The LDAP query that we want to execute when authenticating a user. This
|
||||
| should not have to be changed.
|
||||
|
|
||||
*/
|
||||
'authentication.filter.query' => "uid=",
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| LDAP Version
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Version of LDAP you are using.
|
||||
|
|
||||
*/
|
||||
'version' => 3,
|
||||
|
||||
|
||||
);
|
||||
45
app/config/travis-ci/app.example.php
Executable file
45
app/config/travis-ci/app.example.php
Executable file
@@ -0,0 +1,45 @@
|
||||
<?php
|
||||
|
||||
return array(
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Application Debug Mode
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| When your application is in debug mode, detailed error messages with
|
||||
| stack traces will be shown on every error that occurs within your
|
||||
| application. If disabled, a simple generic error page is shown.
|
||||
|
|
||||
*/
|
||||
|
||||
'debug' => true,
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Application URL
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This URL is used by the console to properly generate URLs when using
|
||||
| the Artisan command line tool. You should set this to the root of
|
||||
| your application so that it is used when running Artisan tasks.
|
||||
|
|
||||
*/
|
||||
|
||||
'url' => 'http://localhost:8007',
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Encryption Key
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This key is used by the Illuminate encrypter service and should be set
|
||||
| to a random, 32 character string, otherwise these encrypted strings
|
||||
| will not be safe. Please do this before deploying an application!
|
||||
|
|
||||
| Run a php artisan key:generate --env=staging to create a random one
|
||||
*/
|
||||
|
||||
'key' => '8YHfiO4EyWBewqrpGHDA4Iuom2ZIahXQ',
|
||||
|
||||
);
|
||||
20
app/config/travis-ci/cache.php
Executable file
20
app/config/travis-ci/cache.php
Executable file
@@ -0,0 +1,20 @@
|
||||
<?php
|
||||
|
||||
return array(
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Default Cache Driver
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This option controls the default cache "driver" that will be used when
|
||||
| using the Caching library. Of course, you may use other drivers any
|
||||
| time you wish. This is the default when another is not specified.
|
||||
|
|
||||
| Supported: "file", "database", "apc", "memcached", "redis", "array"
|
||||
|
|
||||
*/
|
||||
|
||||
'driver' => 'array',
|
||||
|
||||
);
|
||||
103
app/config/travis-ci/database.example.php
Executable file
103
app/config/travis-ci/database.example.php
Executable file
@@ -0,0 +1,103 @@
|
||||
<?php
|
||||
|
||||
return array(
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| PDO Fetch Style
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| By default, database results will be returned as instances of the PHP
|
||||
| stdClass object; however, you may desire to retrieve records in an
|
||||
| array format for simplicity. Here you can tweak the fetch style.
|
||||
|
|
||||
*/
|
||||
|
||||
'fetch' => PDO::FETCH_CLASS,
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Default Database Connection Name
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Here you may specify which of the database connections below you wish
|
||||
| to use as your default connection for all database work. Of course
|
||||
| you may use many connections at once using the Database library.
|
||||
|
|
||||
*/
|
||||
|
||||
'default' => 'mysql',
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Database Connections
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Here are each of the database connections setup for your application.
|
||||
| Of course, examples of configuring each database platform that is
|
||||
| supported by Laravel is shown below to make development simple.
|
||||
|
|
||||
|
|
||||
| All database work in Laravel is done through the PHP PDO facilities
|
||||
| so make sure you have the driver for your particular database of
|
||||
| choice installed on your machine before you begin development.
|
||||
|
|
||||
*/
|
||||
|
||||
'connections' => array(
|
||||
'sqlite' => array(
|
||||
'driver' => 'sqlite',
|
||||
'database' => ':memory:',
|
||||
'prefix' => ''
|
||||
),
|
||||
|
||||
'mysql' => array(
|
||||
'driver' => 'mysql',
|
||||
'host' => 'localhost',
|
||||
'database' => 'snipeit_unit',
|
||||
'username' => 'travis',
|
||||
'password' => '',
|
||||
'charset' => 'utf8',
|
||||
'collation' => 'utf8_unicode_ci',
|
||||
'prefix' => '',
|
||||
),
|
||||
|
||||
),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Migration Repository Table
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This table keeps track of all the migrations that have already run for
|
||||
| your application. Using this information, we can determine which of
|
||||
| the migrations on disk have not actually be run in the databases.
|
||||
|
|
||||
*/
|
||||
|
||||
'migrations' => 'migrations',
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Redis Databases
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Redis is an open source, fast, and advanced key-value store that also
|
||||
| provides a richer set of commands than a typical key-value systems
|
||||
| such as APC or Memcached. Laravel makes it easy to dig right in.
|
||||
|
|
||||
*/
|
||||
|
||||
'redis' => array(
|
||||
|
||||
'cluster' => true,
|
||||
|
||||
'default' => array(
|
||||
'host' => '127.0.0.1',
|
||||
'port' => 6379,
|
||||
'database' => 0,
|
||||
),
|
||||
|
||||
),
|
||||
|
||||
);
|
||||
112
app/config/travis-ci/ldap.example.php
Normal file
112
app/config/travis-ci/ldap.example.php
Normal file
@@ -0,0 +1,112 @@
|
||||
<?php
|
||||
|
||||
return array(
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| URL
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| URL for the LDAP server. This should start with ldap://, for example:
|
||||
| ldap://ldap.yourserver.com
|
||||
|
|
||||
*/
|
||||
'url' => "",
|
||||
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Username
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Username to use to connect authenticate to LDAP, for example:
|
||||
| cn=read-only-admin,dc=example,dc=com
|
||||
|
|
||||
*/
|
||||
'username' => "",
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Password
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Password to use when authenticating to LDAP.
|
||||
|
|
||||
*/
|
||||
'password' => "",
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Basedn
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| The base where the search for users will be executed, for example:
|
||||
| dc=example,dc=com
|
||||
|
|
||||
*/
|
||||
'basedn' => "",
|
||||
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Filter
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| The search filter for the LDAP query. This probably does not have to be
|
||||
| changed.
|
||||
|
|
||||
*/
|
||||
'filter' => "&(cn=*)",
|
||||
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| LDAP field names that will be retrieved to create a user.
|
||||
|
|
||||
| Using the username as an example:
|
||||
| If I set 'result.username' => 'my-org-username', the code will connect to
|
||||
| LDAP as follows (where $results[$i] represents a row in the LDAP query:
|
||||
| $username-to-insert-in-snipe-it = $results[$i]["my-org-username"][0]
|
||||
|
|
||||
| Note: all these fields are required.
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| The search filter for the LDAP query.
|
||||
|
|
||||
*/
|
||||
'result.username' => "",
|
||||
'result.last.name' => "",
|
||||
'result.first.name' => "",
|
||||
|
||||
/*
|
||||
| These fields are optional as not all LDAP directories will have it. If yours
|
||||
| does not have them, just leave these blank and the extra check will
|
||||
| be omitted.
|
||||
*/
|
||||
'result.active.flag' => "",
|
||||
'result.emp.num' => "",
|
||||
'result.email' => "",
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| LDAP filter query for authentication
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| The LDAP query that we want to execute when authenticating a user. This
|
||||
| should not have to be changed.
|
||||
|
|
||||
*/
|
||||
'authentication.filter.query' => "uid=",
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| LDAP Version
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Version of LDAP you are using.
|
||||
|
|
||||
*/
|
||||
'version' => 3,
|
||||
|
||||
|
||||
);
|
||||
124
app/config/travis-ci/mail.example.php
Executable file
124
app/config/travis-ci/mail.example.php
Executable file
@@ -0,0 +1,124 @@
|
||||
<?php
|
||||
|
||||
return array(
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Mail Driver
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Laravel supports both SMTP and PHP's "mail" function as drivers for the
|
||||
| sending of e-mail. You may specify which one you're using throughout
|
||||
| your application here. By default, Laravel is setup for SMTP mail.
|
||||
|
|
||||
| Supported: "smtp", "mail", "sendmail"
|
||||
|
|
||||
*/
|
||||
|
||||
'driver' => 'smtp',
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| SMTP Host Address
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Here you may provide the host address of the SMTP server used by your
|
||||
| applications. A default option is provided that is compatible with
|
||||
| the Postmark mail service, which will provide reliable delivery.
|
||||
|
|
||||
*/
|
||||
|
||||
'host' => 'smtp.mandrillapp.com',
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| SMTP Host Port
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This is the SMTP port used by your application to delivery e-mails to
|
||||
| users of your application. Like the host we have set this value to
|
||||
| stay compatible with the Postmark e-mail application by default.
|
||||
|
|
||||
*/
|
||||
|
||||
'port' => 587,
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Global "From" Address
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| You may wish for all e-mails sent by your application to be sent from
|
||||
| the same address. Here, you may specify a name and address that is
|
||||
| used globally for all e-mails that are sent by your application.
|
||||
|
|
||||
*/
|
||||
|
||||
'from' => array('address' => null, 'name' => null),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| E-Mail Encryption Protocol
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Here you may specify the encryption protocol that should be used when
|
||||
| the application send e-mail messages. A sensible default using the
|
||||
| transport layer security protocol should provide great security.
|
||||
|
|
||||
*/
|
||||
|
||||
'encryption' => 'tls',
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| SMTP Server Username
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| If your SMTP server requires a username for authentication, you should
|
||||
| set it here. This will get used to authenticate with your server on
|
||||
| connection. You may also set the "password" value below this one.
|
||||
|
|
||||
*/
|
||||
|
||||
'username' => null,
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| SMTP Server Password
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Here you may set the password required by your SMTP server to send out
|
||||
| messages from your application. This will be given to the server on
|
||||
| connection so that the application will be able to send messages.
|
||||
|
|
||||
*/
|
||||
|
||||
'password' => null,
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Sendmail System Path
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| When using the "sendmail" driver to send e-mails, we will need to know
|
||||
| the path to where Sendmail lives on this server. A default path has
|
||||
| been provided here, which will work well on most of your systems.
|
||||
|
|
||||
*/
|
||||
|
||||
'sendmail' => '/usr/sbin/sendmail -bs',
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Mail "Pretend"
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| When this option is enabled, e-mail will not actually be sent over the
|
||||
| web and will instead be written to your application's logs files so
|
||||
| you may inspect the message. This is great for local development.
|
||||
|
|
||||
*/
|
||||
|
||||
'pretend' => true,
|
||||
|
||||
);
|
||||
@@ -1,5 +1,5 @@
|
||||
<?php
|
||||
return array (
|
||||
'app_version' => 'v2.0-beta',
|
||||
'hash_version' => 'v2.0-beta-4-g7e5f32c',
|
||||
'app_version' => 'v2.0.5-pre',
|
||||
'hash_version' => 'v2.0.5-pre-57-g5ebb267',
|
||||
);
|
||||
@@ -18,6 +18,114 @@ class AuthController extends BaseController
|
||||
return View::make('frontend.auth.signin');
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Authenticates a user to LDAP
|
||||
*
|
||||
* @param $username
|
||||
* @param $password
|
||||
* @param bool|false $returnUser
|
||||
* @return bool true if the username and/or password provided are valid
|
||||
* false if the username and/or password provided are invalid
|
||||
* array of ldap_attributes if $returnUser is true
|
||||
*/
|
||||
function ldap($username, $password, $returnUser = false) {
|
||||
|
||||
$ldaphost = Config::get('ldap.url');
|
||||
$ldaprdn = Config::get('ldap.username');
|
||||
$ldappass = Config::get('ldap.password');
|
||||
$baseDn = Config::get('ldap.basedn');
|
||||
$filterQuery = Config::get('ldap.authentication.filter.query') . $username;
|
||||
$ldapversion = Config::get('ldap.version');
|
||||
|
||||
// Connecting to LDAP
|
||||
$connection = ldap_connect($ldaphost) or die("Could not connect to {$ldaphost}");
|
||||
// Needed for AD
|
||||
ldap_set_option($connection, LDAP_OPT_REFERRALS, 0);
|
||||
ldap_set_option($connection, LDAP_OPT_PROTOCOL_VERSION,$ldapversion);
|
||||
|
||||
try {
|
||||
if ($connection) {
|
||||
// binding to ldap server
|
||||
$ldapbind = ldap_bind($connection, $ldaprdn, $ldappass);
|
||||
if ( ($results = @ldap_search($connection, $baseDn, $filterQuery)) != false ) {
|
||||
$entry = ldap_first_entry($connection, $results);
|
||||
if ( ($userDn = @ldap_get_dn($connection, $entry)) !== false ) {
|
||||
if( ($isBound = ldap_bind($connection, $userDn, $password)) == "true") {
|
||||
return $returnUser ?
|
||||
array_change_key_case(ldap_get_attributes($connection, $entry),CASE_LOWER)
|
||||
: true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (Exception $e) {
|
||||
LOG::error($e->getMessage());
|
||||
}
|
||||
ldap_close($connection);
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create user from LDAP attributes
|
||||
*
|
||||
* @param $ldapatttibutes
|
||||
* @return array|bool
|
||||
*/
|
||||
function createUserFromLdap($ldapatttibutes){
|
||||
//Get LDAP attribute config
|
||||
$ldap_result_username = Config::get('ldap.result.username');
|
||||
$ldap_result_emp_num = Config::get('ldap.result.emp.num');
|
||||
$ldap_result_last_name = Config::get('ldap.result.last.name');
|
||||
$ldap_result_first_name = Config::get('ldap.result.first.name');
|
||||
$ldap_result_email = Config::get('ldap.result.email');
|
||||
|
||||
//Get LDAP user data
|
||||
$item = array();
|
||||
$item["username"] = isset( $ldapatttibutes[$ldap_result_username][0] ) ? $ldapatttibutes[$ldap_result_username][0] : "";
|
||||
$item["employee_number"] = isset( $ldapatttibutes[$ldap_result_emp_num][0] ) ? $ldapatttibutes[$ldap_result_emp_num][0] : "";
|
||||
$item["lastname"] = isset( $ldapatttibutes[$ldap_result_last_name][0] ) ? $ldapatttibutes[$ldap_result_last_name][0] : "";
|
||||
$item["firstname"] = isset( $ldapatttibutes[$ldap_result_first_name][0] ) ? $ldapatttibutes[$ldap_result_first_name][0] : "";
|
||||
$item["email"] = isset( $ldapatttibutes[$ldap_result_email][0] ) ? $ldapatttibutes[$ldap_result_email][0] : "" ;
|
||||
|
||||
//create user
|
||||
if(!empty($item["username"]) && !empty($item['email'])) {
|
||||
$pass = substr(str_shuffle("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, 10);
|
||||
|
||||
$newuser = array(
|
||||
'first_name' => $item["firstname"],
|
||||
'last_name' => $item["lastname"],
|
||||
'username' => $item["username"],
|
||||
'email' => $item["email"],
|
||||
'employee_num' => $item["employee_number"],
|
||||
'password' => $pass,
|
||||
'activated' => 1,
|
||||
'location_id' => null,
|
||||
'permissions' => '{"user":1}',
|
||||
'notes' => 'Imported from LDAP'
|
||||
);
|
||||
|
||||
DB::table('users')->insert($newuser);
|
||||
$updateuser = Sentry::findUserByLogin($item["username"]);
|
||||
|
||||
// Update the user details
|
||||
$updateuser->password = $pass;
|
||||
|
||||
// Update the user
|
||||
$updateuser->save();
|
||||
} else {
|
||||
throw new Cartalyst\Sentry\Users\UserNotFoundException();
|
||||
}
|
||||
|
||||
//$item["note"] = "<strong>created</strong>";
|
||||
$credentials = array(
|
||||
'username' => $item["username"],
|
||||
'password' => $pass,
|
||||
);
|
||||
return $credentials;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Account sign in form processing.
|
||||
*
|
||||
@@ -39,10 +147,50 @@ class AuthController extends BaseController
|
||||
// Ooops.. something went wrong
|
||||
return Redirect::back()->withInput()->withErrors($validator);
|
||||
}
|
||||
|
||||
try {
|
||||
// Try to log the user in
|
||||
Sentry::authenticate(Input::only('username', 'password'), Input::get('remember-me', 0));
|
||||
|
||||
/**
|
||||
* =================================================================
|
||||
* Hack in LDAP authentication
|
||||
*/
|
||||
|
||||
// Try to get the user from the database.
|
||||
$user = (array) DB::table('users')->where('username', Input::get('username'))->first();
|
||||
//If user does not exist and authenticates sucessfully with LDAP we will create it onf the fly and sign in with default permissions
|
||||
if(!$user){
|
||||
if($userattr = $this->ldap(Input::get('username'), Input::get('password'),true) ){
|
||||
LOG::debug("Creating LDAP authenticated user.");
|
||||
$credentials = $this->createUserFromLdap($userattr);
|
||||
Sentry::authenticate($credentials, Input::get('remember-me', 0));
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
else if ($user && strpos($user["notes"],'LDAP') !== false) {
|
||||
LOG::debug("Authenticating user against LDAP.");
|
||||
if( $this->ldap(Input::get('username'), Input::get('password')) ) {
|
||||
LOG::debug("valid login");
|
||||
$pass = substr(str_shuffle("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, 10);
|
||||
$user = Sentry::findUserByLogin( Input::get('username') );
|
||||
$user->password = $pass;
|
||||
$user->save();
|
||||
$credentials = array(
|
||||
'username' => Input::get('username'),
|
||||
'password' => $pass,
|
||||
);
|
||||
Sentry::authenticate($credentials, Input::get('remember-me', 0));
|
||||
}
|
||||
else {
|
||||
throw new Cartalyst\Sentry\Users\UserNotFoundException();
|
||||
}
|
||||
}
|
||||
/* ============================================================== */
|
||||
else {
|
||||
LOG::debug("Authenticating user against database.");
|
||||
// Try to log the user in
|
||||
Sentry::authenticate(Input::only('username', 'password'), Input::get('remember-me', 0));
|
||||
}
|
||||
|
||||
// Get the page we were before
|
||||
$redirect = Session::get('loginRedirect', 'account');
|
||||
@@ -134,19 +282,30 @@ class AuthController extends BaseController
|
||||
|
||||
try {
|
||||
// Get the user password recovery code
|
||||
$user = Sentry::getUserProvider()->findByLogin(Input::get('username'));
|
||||
if (!$user = Sentry::getUserProvider()->findByLogin(Input::get('username'))) {
|
||||
$user = User::where('email','=',Input::get('username'));
|
||||
}
|
||||
|
||||
$reset = $user->getResetPasswordCode();
|
||||
|
||||
// Data to be used on the username view
|
||||
$data = array(
|
||||
'user' => $user,
|
||||
'forgotPasswordUrl' => URL::route('forgot-password-confirm', $user->getResetPasswordCode()),
|
||||
'forgotPasswordUrl' => URL::route('forgot-password-confirm', $reset),
|
||||
);
|
||||
|
||||
// Send the activation code through username
|
||||
Mail::send('usernames.forgot-password', $data, function ($m) use ($user) {
|
||||
$m->to($user->username, $user->first_name . ' ' . $user->last_name);
|
||||
$m->subject('Account Password Recovery');
|
||||
});
|
||||
$user->reset_password_code = $reset;
|
||||
$user->save();
|
||||
|
||||
|
||||
if ($user->email) {
|
||||
// Send the activation code through username
|
||||
Mail::send('emails.forgot-password', $data, function ($m) use ($user) {
|
||||
$m->to($user->email, $user->first_name . ' ' . $user->last_name);
|
||||
$m->subject('Account Password Recovery');
|
||||
});
|
||||
}
|
||||
|
||||
} catch (Cartalyst\Sentry\Users\UserNotFoundException $e) {
|
||||
// Even though the username was not found, we will pretend
|
||||
// we have sent the password reset code through username,
|
||||
@@ -165,12 +324,13 @@ class AuthController extends BaseController
|
||||
*/
|
||||
public function getForgotPasswordConfirm($passwordResetCode = null)
|
||||
{
|
||||
|
||||
try {
|
||||
// Find the user using the password reset code
|
||||
$user = Sentry::getUserProvider()->findByResetPasswordCode($passwordResetCode);
|
||||
} catch(Cartalyst\Sentry\Users\UserNotFoundException $e) {
|
||||
// Redirect to the forgot password page
|
||||
return Redirect::route('forgot-password')->with('error', Lang::get('auth/message.account_not_found'));
|
||||
//return Redirect::route('forgot-password')->with('error', Lang::get('auth/message.account_not_found'));
|
||||
}
|
||||
|
||||
// Show the page
|
||||
|
||||
@@ -12,6 +12,9 @@ use Actionlog;
|
||||
use Lang;
|
||||
use Accessory;
|
||||
use DB;
|
||||
use Slack;
|
||||
use Setting;
|
||||
use Config;
|
||||
|
||||
class ViewAssetsController extends AuthorizedController
|
||||
{
|
||||
@@ -47,117 +50,184 @@ class ViewAssetsController extends AuthorizedController
|
||||
|
||||
public function getRequestAsset($assetId = null) {
|
||||
|
||||
// Check if the asset exists
|
||||
if (is_null($asset = Asset::find($assetId))) {
|
||||
$user = Sentry::getUser();
|
||||
|
||||
// Check if the asset exists and is requestable
|
||||
if (is_null($asset = Asset::RequestableAssets()->find($assetId))) {
|
||||
// Redirect to the asset management page
|
||||
return Redirect::to('frontend/account/view-assets')->with('error', Lang::get('admin/hardware/message.does_not_exist'));
|
||||
return Redirect::route('requestable-assets')->with('error', Lang::get('admin/hardware/message.does_not_exist_or_not_requestable'));
|
||||
} else {
|
||||
|
||||
$logaction = new Actionlog();
|
||||
$logaction->asset_id = $asset->id;
|
||||
$logaction->asset_type = 'hardware';
|
||||
$logaction->created_at = date("Y-m-d h:i:s");
|
||||
|
||||
return View::make('frontend/account/view-assets', compact('asset'));
|
||||
if ($user->location_id) {
|
||||
$logaction->location_id = $user->location_id;
|
||||
}
|
||||
$logaction->user_id = Sentry::getUser()->id;
|
||||
$log = $logaction->logaction('requested');
|
||||
|
||||
$settings = Setting::getSettings();
|
||||
|
||||
if ($settings->slack_endpoint) {
|
||||
|
||||
|
||||
$slack_settings = [
|
||||
'username' => $settings->botname,
|
||||
'channel' => $settings->slack_channel,
|
||||
'link_names' => true
|
||||
];
|
||||
|
||||
$client = new \Maknz\Slack\Client($settings->slack_endpoint,$slack_settings);
|
||||
|
||||
try {
|
||||
$client->attach([
|
||||
'color' => 'good',
|
||||
'fields' => [
|
||||
[
|
||||
'title' => 'REQUESTED:',
|
||||
'value' => strtoupper($logaction->asset_type).' asset <'.Config::get('app.url').'/hardware/'.$asset->id.'/view'.'|'.$asset->showAssetName().'> requested by <'.Config::get('app.url').'/hardware/'.$asset->id.'/view'.'|'.Sentry::getUser()->fullName().'>.'
|
||||
]
|
||||
|
||||
]
|
||||
])->send('Asset Requested');
|
||||
|
||||
} catch (Exception $e) {
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return Redirect::route('requestable-assets')->with('success')->with('success', Lang::get('admin/hardware/message.requests.success'));
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// Get the acceptance screen
|
||||
public function getAcceptAsset($logID = null) {
|
||||
|
||||
|
||||
if (is_null($findlog = Actionlog::find($logID))) {
|
||||
// Redirect to the asset management page
|
||||
return Redirect::to('account')->with('error', Lang::get('admin/hardware/message.does_not_exist'));
|
||||
}
|
||||
|
||||
|
||||
// Asset
|
||||
if (($findlog->asset_id!='') && ($findlog->asset_type=='hardware')) {
|
||||
$item = Asset::find($findlog->asset_id);
|
||||
|
||||
// software
|
||||
} elseif (($findlog->asset_id!='') && ($findlog->asset_type=='software')) {
|
||||
|
||||
// software
|
||||
} elseif (($findlog->asset_id!='') && ($findlog->asset_type=='software')) {
|
||||
$item = License::find($findlog->asset_id);
|
||||
// accessories
|
||||
// accessories
|
||||
} elseif ($findlog->accessory_id!='') {
|
||||
$item = Accessory::find($findlog->accessory_id);
|
||||
$item = Accessory::find($findlog->accessory_id);
|
||||
}
|
||||
|
||||
|
||||
// Check if the asset exists
|
||||
if (is_null($item)) {
|
||||
// Redirect to the asset management page
|
||||
return Redirect::to('account')->with('error', Lang::get('admin/hardware/message.does_not_exist'));
|
||||
}
|
||||
|
||||
return View::make('frontend/account/accept-asset', compact('item'))->with('findlog', $findlog);
|
||||
|
||||
|
||||
|
||||
|
||||
return View::make('frontend/account/accept-asset', compact('item'))->with('findlog', $findlog);
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
// Save the acceptance
|
||||
public function postAcceptAsset($logID = null) {
|
||||
|
||||
|
||||
|
||||
|
||||
// Check if the asset exists
|
||||
if (is_null($findlog = Actionlog::find($logID))) {
|
||||
// Redirect to the asset management page
|
||||
return Redirect::to('account/view-assets')->with('error', Lang::get('admin/hardware/message.does_not_exist'));
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
if ($findlog->accepted_id!='') {
|
||||
// Redirect to the asset management page
|
||||
return Redirect::to('account/view-assets')->with('error', Lang::get('admin/users/message.error.asset_already_accepted'));
|
||||
}
|
||||
|
||||
|
||||
if (!Input::has('asset_acceptance')) {
|
||||
return Redirect::to('account/view-assets')->with('error', Lang::get('admin/users/message.error.accept_or_decline'));
|
||||
}
|
||||
|
||||
$user = Sentry::getUser();
|
||||
$logaction = new Actionlog();
|
||||
|
||||
|
||||
if (Input::get('asset_acceptance')=='accepted') {
|
||||
$logaction_msg = 'accepted';
|
||||
$accepted="accepted";
|
||||
$return_msg = Lang::get('admin/users/message.accepted');
|
||||
} else {
|
||||
$logaction_msg = 'declined';
|
||||
$accepted="rejected";
|
||||
$return_msg = Lang::get('admin/users/message.declined');
|
||||
}
|
||||
|
||||
// Asset
|
||||
if (($findlog->asset_id!='') && ($findlog->asset_type=='hardware')) {
|
||||
$logaction->asset_id = $findlog->asset_id;
|
||||
$logaction->accessory_id = NULL;
|
||||
$logaction->asset_type = 'hardware';
|
||||
|
||||
// software
|
||||
} elseif (($findlog->asset_id!='') && ($findlog->asset_type=='software')) {
|
||||
|
||||
if (Input::get('asset_acceptance')!='accepted') {
|
||||
DB::table('assets')
|
||||
->where('id', $findlog->asset_id)
|
||||
->update(array('assigned_to' => null));
|
||||
}
|
||||
|
||||
|
||||
// software
|
||||
} elseif (($findlog->asset_id!='') && ($findlog->asset_type=='software')) {
|
||||
$logaction->asset_id = $findlog->asset_id;
|
||||
$logaction->accessory_id = NULL;
|
||||
$logaction->asset_type = 'software';
|
||||
|
||||
// accessories
|
||||
|
||||
// accessories
|
||||
} elseif ($findlog->accessory_id!='') {
|
||||
$logaction->asset_id = NULL;
|
||||
$logaction->accessory_id = $findlog->accessory_id;
|
||||
$logaction->asset_type = 'accessory';
|
||||
$logaction->asset_type = 'accessory';
|
||||
}
|
||||
|
||||
|
||||
$logaction->checkedout_to = $findlog->checkedout_to;
|
||||
|
||||
|
||||
$logaction->note = e(Input::get('note'));
|
||||
$logaction->user_id = $user->id;
|
||||
$logaction->accepted_at = date("Y-m-d h:i:s");
|
||||
$log = $logaction->logaction('accepted');
|
||||
|
||||
|
||||
$log = $logaction->logaction($logaction_msg);
|
||||
|
||||
$update_checkout = DB::table('asset_logs')
|
||||
->where('id',$findlog->id)
|
||||
->update(array('accepted_id' => $logaction->id));
|
||||
|
||||
->where('id',$findlog->id)
|
||||
->update(array('accepted_id' => $logaction->id));
|
||||
|
||||
$affected_asset=$logaction->assetlog;
|
||||
$affected_asset->accepted=$accepted;
|
||||
$affected_asset->save();
|
||||
|
||||
if ($update_checkout ) {
|
||||
return Redirect::to('account/view-assets')->with('success', 'You have successfully accept this asset.');
|
||||
|
||||
return Redirect::to('account/view-assets')->with('success', $return_msg);
|
||||
|
||||
} else {
|
||||
return Redirect::to('account/view-assets')->with('error', 'Something went wrong ');
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -68,6 +68,20 @@ class AccessoriesController extends AdminController
|
||||
// Update the accessory data
|
||||
$accessory->name = e(Input::get('name'));
|
||||
$accessory->category_id = e(Input::get('category_id'));
|
||||
$accessory->order_number = e(Input::get('order_number'));
|
||||
|
||||
if (e(Input::get('purchase_date')) == '') {
|
||||
$accessory->purchase_date = NULL;
|
||||
} else {
|
||||
$accessory->purchase_date = e(Input::get('purchase_date'));
|
||||
}
|
||||
|
||||
if (e(Input::get('purchase_cost')) == '0.00') {
|
||||
$accessory->purchase_cost = NULL;
|
||||
} else {
|
||||
$accessory->purchase_cost = ParseFloat(e(Input::get('purchase_cost')));
|
||||
}
|
||||
|
||||
$accessory->qty = e(Input::get('qty'));
|
||||
$accessory->user_id = Sentry::getId();
|
||||
|
||||
@@ -136,6 +150,20 @@ class AccessoriesController extends AdminController
|
||||
// Update the accessory data
|
||||
$accessory->name = e(Input::get('name'));
|
||||
$accessory->category_id = e(Input::get('category_id'));
|
||||
$accessory->order_number = e(Input::get('order_number'));
|
||||
|
||||
if (e(Input::get('purchase_date')) == '') {
|
||||
$accessory->purchase_date = NULL;
|
||||
} else {
|
||||
$accessory->purchase_date = e(Input::get('purchase_date'));
|
||||
}
|
||||
|
||||
if (e(Input::get('purchase_cost')) == '0.00') {
|
||||
$accessory->purchase_cost = NULL;
|
||||
} else {
|
||||
$accessory->purchase_cost = ParseFloat(e(Input::get('purchase_cost')));
|
||||
}
|
||||
|
||||
$accessory->qty = e(Input::get('qty'));
|
||||
|
||||
// Was the accessory created?
|
||||
@@ -218,7 +246,7 @@ class AccessoriesController extends AdminController
|
||||
}
|
||||
|
||||
// Get the dropdown of users and then pass it to the checkout view
|
||||
$users_list = array('' => 'Select a User') + DB::table('users')->select(DB::raw('concat(last_name,", ",first_name) as full_name, id'))->whereNull('deleted_at')->orderBy('last_name', 'asc')->orderBy('first_name', 'asc')->lists('full_name', 'id');
|
||||
$users_list = array('' => 'Select a User') + DB::table('users')->select(DB::raw('concat(last_name,", ",first_name," (",username,")") as full_name, id'))->whereNull('deleted_at')->orderBy('last_name', 'asc')->orderBy('first_name', 'asc')->lists('full_name', 'id');
|
||||
|
||||
return View::make('backend/accessories/checkout', compact('accessory'))->with('users_list',$users_list);
|
||||
|
||||
@@ -322,6 +350,10 @@ class AccessoriesController extends AdminController
|
||||
$data['eula'] = $accessory->getEula();
|
||||
$data['first_name'] = $user->first_name;
|
||||
$data['item_name'] = $accessory->name;
|
||||
$data['checkout_date'] = $logaction->created_at;
|
||||
$data['item_tag'] = '';
|
||||
$data['expected_checkin'] = '';
|
||||
$data['note'] = $logaction->note;
|
||||
$data['require_acceptance'] = $accessory->requireAcceptance();
|
||||
|
||||
|
||||
@@ -429,6 +461,25 @@ class AccessoriesController extends AdminController
|
||||
|
||||
$log = $logaction->logaction('checkin from');
|
||||
|
||||
if(!is_null($accessory_user->assigned_to)) {
|
||||
$user = User::find($accessory_user->assigned_to);
|
||||
}
|
||||
|
||||
$data['log_id'] = $logaction->id;
|
||||
$data['first_name'] = $user->first_name;
|
||||
$data['item_name'] = $accessory->name;
|
||||
$data['checkin_date'] = $logaction->created_at;
|
||||
$data['item_tag'] = '';
|
||||
$data['note'] = $logaction->note;
|
||||
|
||||
if (($accessory->checkin_email()=='1')) {
|
||||
|
||||
Mail::send('emails.checkin-asset', $data, function ($m) use ($user) {
|
||||
$m->to($user->email, $user->first_name . ' ' . $user->last_name);
|
||||
$m->subject('Confirm Accessory Checkin');
|
||||
});
|
||||
}
|
||||
|
||||
if ($backto=='user') {
|
||||
return Redirect::to("admin/users/".$return_to.'/view')->with('success', Lang::get('admin/accessories/message.checkin.success'));
|
||||
} else {
|
||||
@@ -442,52 +493,77 @@ class AccessoriesController extends AdminController
|
||||
|
||||
public function getDatatable()
|
||||
{
|
||||
$accessories = Accessory::select(array('id','name','qty'))
|
||||
->whereNull('deleted_at')
|
||||
->orderBy('created_at', 'DESC');
|
||||
$accessories = Accessory::with('category')
|
||||
->whereNull('deleted_at');
|
||||
|
||||
$accessories = $accessories->get();
|
||||
if (Input::has('search')) {
|
||||
$accessories = $accessories->TextSearch(Input::get('search'));
|
||||
}
|
||||
|
||||
$actions = new \Chumper\Datatable\Columns\FunctionColumn('actions',function($accessories)
|
||||
{
|
||||
return '<a href="'.route('checkout/accessory', $accessories->id).'" style="margin-right:5px;" class="btn btn-info btn-sm" '.(($accessories->numRemaining() > 0 ) ? '' : ' disabled').'>'.Lang::get('general.checkout').'</a><a href="'.route('update/accessory', $accessories->id).'" class="btn btn-warning btn-sm" style="margin-right:5px;"><i class="fa fa-pencil icon-white"></i></a><a data-html="false" class="btn delete-asset btn-danger btn-sm" data-toggle="modal" href="'.route('delete/accessory', $accessories->id).'" data-content="'.Lang::get('admin/accessories/message.delete.confirm').'" data-title="'.Lang::get('general.delete').' '.htmlspecialchars($accessories->name).'?" onClick="return false;"><i class="fa fa-trash icon-white"></i></a>';
|
||||
});
|
||||
if (Input::has('offset')) {
|
||||
$offset = e(Input::get('offset'));
|
||||
} else {
|
||||
$offset = 0;
|
||||
}
|
||||
|
||||
return Datatable::collection($accessories)
|
||||
->addColumn('name',function($accessories)
|
||||
{
|
||||
return link_to('admin/accessories/'.$accessories->id.'/view', $accessories->name);
|
||||
})
|
||||
->addColumn('qty',function($accessories)
|
||||
{
|
||||
return $accessories->qty;
|
||||
})
|
||||
->addColumn('numRemaining',function($accessories)
|
||||
{
|
||||
return $accessories->numRemaining();
|
||||
})
|
||||
->addColumn($actions)
|
||||
->searchColumns('name','qty','numRemaining','actions')
|
||||
->orderColumns('name','qty','numRemaining','actions')
|
||||
->make();
|
||||
if (Input::has('limit')) {
|
||||
$limit = e(Input::get('limit'));
|
||||
} else {
|
||||
$limit = 50;
|
||||
}
|
||||
|
||||
|
||||
$allowed_columns = ['name','order_number','purchase_date','purchase_cost'];
|
||||
$order = Input::get('order') === 'asc' ? 'asc' : 'desc';
|
||||
$sort = in_array(Input::get('sort'), $allowed_columns) ? Input::get('sort') : 'created_at';
|
||||
|
||||
$accessories = $accessories->orderBy($sort, $order);
|
||||
|
||||
$accessCount = $accessories->count();
|
||||
$accessories = $accessories->skip($offset)->take($limit)->get();
|
||||
|
||||
$rows = array();
|
||||
|
||||
foreach ($accessories as $accessory) {
|
||||
$actions = '<a href="'.route('checkout/accessory', $accessory->id).'" style="margin-right:5px;" class="btn btn-info btn-sm" '.(($accessory->numRemaining() > 0 ) ? '' : ' disabled').'>'.Lang::get('general.checkout').'</a><a href="'.route('update/accessory', $accessory->id).'" class="btn btn-warning btn-sm" style="margin-right:5px;"><i class="fa fa-pencil icon-white"></i></a><a data-html="false" class="btn delete-asset btn-danger btn-sm" data-toggle="modal" href="'.route('delete/accessory', $accessory->id).'" data-content="'.Lang::get('admin/accessories/message.delete.confirm').'" data-title="'.Lang::get('general.delete').' '.htmlspecialchars($accessory->name).'?" onClick="return false;"><i class="fa fa-trash icon-white"></i></a>';
|
||||
|
||||
$rows[] = array(
|
||||
'name' => link_to('admin/accessories/'.$accessory->id.'/view', $accessory->name),
|
||||
'category' => link_to('admin/settings/categories/'.$accessory->category->id.'/view', $accessory->category->name),
|
||||
'qty' => $accessory->qty,
|
||||
'order_number' => $accessory->order_number,
|
||||
'purchase_date' => $accessory->purchase_date,
|
||||
'purchase_cost' => $accessory->purchase_cost,
|
||||
'numRemaining' => $accessory->numRemaining(),
|
||||
'actions' => $actions
|
||||
);
|
||||
}
|
||||
|
||||
$data = array('total'=>$accessCount, 'rows'=>$rows);
|
||||
|
||||
return $data;
|
||||
}
|
||||
|
||||
public function getDataView($accessoryID)
|
||||
{
|
||||
$accessory = Accessory::find($accessoryID);
|
||||
$accessory_users = $accessory->users;
|
||||
$count = $accessory_users->count();
|
||||
|
||||
$actions = new \Chumper\Datatable\Columns\FunctionColumn('actions',function($accessory_users){
|
||||
return '<a href="'.route('checkin/accessory', $accessory_users->pivot->id).'" class="btn-flat info">Checkin</a>';
|
||||
});
|
||||
$rows = array();
|
||||
|
||||
return Datatable::collection($accessory_users)
|
||||
->addColumn('name',function($accessory_users)
|
||||
{
|
||||
return link_to('/admin/users/'.$accessory_users->id.'/view', $accessory_users->fullName());
|
||||
})
|
||||
->addColumn($actions)
|
||||
->make();
|
||||
foreach ($accessory_users as $user) {
|
||||
$actions = '<a href="'.route('checkin/accessory', $user->pivot->id).'" class="btn-flat info">Checkin</a>';
|
||||
|
||||
$rows[] = array(
|
||||
'name' => link_to('/admin/users/'.$user->id.'/view', $user->fullName()),
|
||||
'actions' => $actions
|
||||
);
|
||||
}
|
||||
|
||||
$data = array('total'=>$count, 'rows'=>$rows);
|
||||
|
||||
return $data;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
465
app/controllers/admin/AssetMaintenancesController.php
Normal file
465
app/controllers/admin/AssetMaintenancesController.php
Normal file
@@ -0,0 +1,465 @@
|
||||
<?php
|
||||
|
||||
namespace Controllers\Admin;
|
||||
|
||||
use AdminController;
|
||||
use AssetMaintenance;
|
||||
use Carbon\Carbon;
|
||||
use DB;
|
||||
use Input;
|
||||
use Lang;
|
||||
use Log;
|
||||
use Mail;
|
||||
use Redirect;
|
||||
use Response;
|
||||
use Sentry;
|
||||
use Slack;
|
||||
use Str;
|
||||
use Supplier;
|
||||
use TCPDF;
|
||||
use Validator;
|
||||
use View;
|
||||
use Setting;
|
||||
|
||||
class AssetMaintenancesController extends AdminController
|
||||
{
|
||||
|
||||
/**
|
||||
* getIndex
|
||||
*
|
||||
* @return mixed
|
||||
* @author Vincent Sposato <vincent.sposato@gmail.com>
|
||||
* @version v1.0
|
||||
*/
|
||||
public function getIndex()
|
||||
{
|
||||
|
||||
return View::make( 'backend/asset_maintenances/index' );
|
||||
}
|
||||
|
||||
/**
|
||||
* getDatatable
|
||||
* Gets the datatable for the index page
|
||||
*
|
||||
* @return mixed
|
||||
* @author Vincent Sposato <vincent.sposato@gmail.com>
|
||||
* @version v1.0
|
||||
*/
|
||||
|
||||
public function getDatatable()
|
||||
{
|
||||
|
||||
|
||||
$maintenances = AssetMaintenance::with('asset','supplier')
|
||||
->whereNull('deleted_at');
|
||||
|
||||
if (Input::has('search')) {
|
||||
$maintenances = $maintenances->TextSearch(e(Input::get('search')));
|
||||
}
|
||||
|
||||
if (Input::has('offset')) {
|
||||
$offset = e(Input::get('offset'));
|
||||
} else {
|
||||
$offset = 0;
|
||||
}
|
||||
|
||||
if (Input::has('limit')) {
|
||||
$limit = e(Input::get('limit'));
|
||||
} else {
|
||||
$limit = 50;
|
||||
}
|
||||
|
||||
$allowed_columns = ['id','title','asset_maintenance_time','asset_maintenance_type','cost','start_date','completion_date','notes'];
|
||||
$order = Input::get('order') === 'asc' ? 'asc' : 'desc';
|
||||
$sort = in_array(Input::get('sort'), $allowed_columns) ? Input::get('sort') : 'created_at';
|
||||
|
||||
$maintenances->orderBy($sort, $order);
|
||||
|
||||
$maintenancesCount = $maintenances->count();
|
||||
$maintenances = $maintenances->skip($offset)->take($limit)->get();
|
||||
|
||||
$rows = array();
|
||||
$settings = Setting::getSettings();
|
||||
|
||||
foreach($maintenances as $maintenance) {
|
||||
|
||||
$actions = '<nobr><a href="'.route('update/asset_maintenance', $maintenance->id).'" class="btn btn-warning btn-sm" style="margin-right:5px;"><i class="fa fa-pencil icon-white"></i></a><a data-html="false" class="btn delete-asset btn-danger btn-sm" data-toggle="modal" href="'.route('delete/statuslabel', $maintenance->id).'" data-content="'.Lang::get('admin/asset_maintenances/message.delete.confirm').'" data-title="'.Lang::get('general.delete').' '.htmlspecialchars($maintenance->title).'?" onClick="return false;"><i class="fa fa-trash icon-white"></i></a></nobr>';
|
||||
|
||||
if (($maintenance->cost) && ($maintenance->asset->assetloc) && ($maintenance->asset->assetloc->currency!='')) {
|
||||
$maintenance_cost = $maintenance->asset->assetloc->currency.$maintenance->cost;
|
||||
} else {
|
||||
$maintenance_cost = $settings->default_currency.$maintenance->cost;
|
||||
}
|
||||
|
||||
$rows[] = array(
|
||||
'id' => $maintenance->id,
|
||||
'asset_name' => link_to('/hardware/'.$maintenance->asset->id.'/view', $maintenance->asset->showAssetName()) ,
|
||||
'title' => $maintenance->title,
|
||||
'notes' => $maintenance->notes,
|
||||
'supplier' => $maintenance->supplier->name,
|
||||
'cost' => $maintenance_cost,
|
||||
'asset_maintenance_type' => e($maintenance->asset_maintenance_type),
|
||||
'start_date' => $maintenance->start_date,
|
||||
'time' => $maintenance->asset_maintenance_time,
|
||||
'completion_date' => $maintenance->completion_date,
|
||||
'actions' => $actions
|
||||
);
|
||||
}
|
||||
|
||||
$data = array('total' => $maintenancesCount, 'rows' => $rows);
|
||||
|
||||
return $data;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* getCreate
|
||||
*
|
||||
* @param null $assetId
|
||||
*
|
||||
* @return mixed
|
||||
* @author Vincent Sposato <vincent.sposato@gmail.com>
|
||||
* @version v1.0
|
||||
*/
|
||||
public function getCreate( $assetId = null )
|
||||
{
|
||||
|
||||
// Prepare Asset Maintenance Type List
|
||||
$assetMaintenanceType = [
|
||||
'' => 'Select an asset maintenance type',
|
||||
] + AssetMaintenance::getImprovementOptions();
|
||||
// Mark the selected asset, if it came in
|
||||
$selectedAsset = $assetId;
|
||||
// Get the possible assets using a left join to get a list of assets and some other helpful info
|
||||
$asset = DB::table( 'assets' )
|
||||
->leftJoin( 'users', 'users.id', '=', 'assets.assigned_to' )
|
||||
->leftJoin( 'models', 'assets.model_id', '=', 'models.id' )
|
||||
->select( 'assets.id', 'assets.name', 'first_name', 'last_name', 'asset_tag',
|
||||
DB::raw( 'concat(first_name," ",last_name) as full_name, assets.id as id, models.name as modelname' ) )
|
||||
->whereNull( 'assets.deleted_at' )
|
||||
->get();
|
||||
$asset_array = json_decode( json_encode( $asset ), true );
|
||||
$asset_element[ '' ] = 'Please select an asset';
|
||||
// Build a list out of the data results
|
||||
for ($x = 0; $x < count( $asset_array ); $x++) {
|
||||
|
||||
if ($asset_array[ $x ][ 'full_name' ] != '') {
|
||||
$full_name = ' (' . $asset_array[ $x ][ 'full_name' ] . ') ' . $asset_array[ $x ][ 'modelname' ];
|
||||
} else {
|
||||
$full_name = ' (Unassigned) ' . $asset_array[ $x ][ 'modelname' ];
|
||||
}
|
||||
$asset_element[ $asset_array[ $x ][ 'id' ] ] =
|
||||
$asset_array[ $x ][ 'asset_tag' ] . ' - ' . $asset_array[ $x ][ 'name' ] . $full_name;
|
||||
}
|
||||
// Get Supplier List
|
||||
$supplier_list = [ '' => 'Select Supplier' ] + Supplier::orderBy( 'name', 'asc' )
|
||||
->lists( 'name', 'id' );
|
||||
|
||||
// Render the view
|
||||
return View::make( 'backend/asset_maintenances/edit' )
|
||||
->with( 'asset_list', $asset_element )
|
||||
->with( 'selectedAsset', $selectedAsset )
|
||||
->with( 'supplier_list', $supplier_list )
|
||||
->with( 'assetMaintenanceType', $assetMaintenanceType )
|
||||
->with( 'assetMaintenance', new AssetMaintenance );
|
||||
}
|
||||
|
||||
/**
|
||||
* postCreate
|
||||
*
|
||||
* @return mixed
|
||||
* @author Vincent Sposato <vincent.sposato@gmail.com>
|
||||
* @version v1.0
|
||||
*/
|
||||
public function postCreate()
|
||||
{
|
||||
|
||||
// get the POST data
|
||||
$new = Input::all();
|
||||
|
||||
// create a new model instance
|
||||
$assetMaintenance = new AssetMaintenance();
|
||||
|
||||
// attempt validation
|
||||
if ($assetMaintenance->validate( $new )) {
|
||||
|
||||
if (e( Input::get( 'supplier_id' ) ) == '') {
|
||||
$assetMaintenance->supplier_id = null;
|
||||
} else {
|
||||
$assetMaintenance->supplier_id = e( Input::get( 'supplier_id' ) );
|
||||
}
|
||||
|
||||
if (e( Input::get( 'is_warranty' ) ) == '') {
|
||||
$assetMaintenance->is_warranty = 0;
|
||||
} else {
|
||||
$assetMaintenance->is_warranty = e( Input::get( 'is_warranty' ) );
|
||||
}
|
||||
|
||||
if (e( Input::get( 'cost' ) ) == '') {
|
||||
$assetMaintenance->cost = '';
|
||||
} else {
|
||||
$assetMaintenance->cost = ParseFloat( e( Input::get( 'cost' ) ) );
|
||||
}
|
||||
|
||||
if (e( Input::get( 'notes' ) ) == '') {
|
||||
$assetMaintenance->notes = null;
|
||||
} else {
|
||||
$assetMaintenance->notes = e( Input::get( 'notes' ) );
|
||||
}
|
||||
|
||||
// Save the asset maintenance data
|
||||
$assetMaintenance->asset_id = e( Input::get( 'asset_id' ) );
|
||||
$assetMaintenance->asset_maintenance_type = e( Input::get( 'asset_maintenance_type' ) );
|
||||
$assetMaintenance->title = e( Input::get( 'title' ) );
|
||||
$assetMaintenance->start_date = e( Input::get( 'start_date' ) );
|
||||
$assetMaintenance->completion_date = e( Input::get( 'completion_date' ) );
|
||||
|
||||
if (( $assetMaintenance->completion_date == "" )
|
||||
|| ( $assetMaintenance->completion_date == "0000-00-00" )
|
||||
) {
|
||||
$assetMaintenance->completion_date = null;
|
||||
}
|
||||
|
||||
// Was the asset maintenance created?
|
||||
if ($assetMaintenance->save()) {
|
||||
|
||||
// Redirect to the new asset maintenance page
|
||||
return Redirect::to( "admin/asset_maintenances" )
|
||||
->with( 'success', Lang::get( 'admin/asset_maintenances/message.create.success' ) );
|
||||
}
|
||||
} else {
|
||||
// failure
|
||||
$errors = $assetMaintenance->errors();
|
||||
|
||||
return Redirect::back()
|
||||
->withInput()
|
||||
->withErrors( $errors );
|
||||
}
|
||||
|
||||
// Redirect to the asset maintenance create page
|
||||
return Redirect::to( 'admin/asset_maintenances/edit' )
|
||||
->with( 'error', Lang::get( 'admin/asset_maintenances/message.create.error' ) )
|
||||
->with( 'assetMaintenance', new AssetMaintenance );
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* getEdit
|
||||
*
|
||||
* @param null $assetMaintenanceId
|
||||
*
|
||||
* @return mixed
|
||||
* @author Vincent Sposato <vincent.sposato@gmail.com>
|
||||
* @version v1.0
|
||||
*/
|
||||
public function getEdit( $assetMaintenanceId = null )
|
||||
{
|
||||
|
||||
// Check if the asset maintenance exists
|
||||
if (is_null( $assetMaintenance = AssetMaintenance::find( $assetMaintenanceId ) )) {
|
||||
// Redirect to the improvement management page
|
||||
return Redirect::to( 'admin/asset_maintenances' )
|
||||
->with( 'error', Lang::get( 'admin/asset_maintenances/message.not_found' ) );
|
||||
}
|
||||
|
||||
if ($assetMaintenance->completion_date == '0000-00-00') {
|
||||
$assetMaintenance->completion_date = null;
|
||||
}
|
||||
|
||||
if ($assetMaintenance->start_date == '0000-00-00') {
|
||||
$assetMaintenance->start_date = null;
|
||||
}
|
||||
|
||||
if ($assetMaintenance->cost == '0.00') {
|
||||
$assetMaintenance->cost = null;
|
||||
}
|
||||
|
||||
// Prepare Improvement Type List
|
||||
$assetMaintenanceType = [
|
||||
'' => 'Select an improvement type',
|
||||
] + AssetMaintenance::getImprovementOptions();
|
||||
|
||||
// Get the possible assets using a left join to get a list of assets and some other helpful info
|
||||
$asset = DB::table( 'assets' )
|
||||
->leftJoin( 'users', 'users.id', '=', 'assets.assigned_to' )
|
||||
->leftJoin( 'models', 'assets.model_id', '=', 'models.id' )
|
||||
->select( 'assets.id', 'assets.name', 'first_name', 'last_name', 'asset_tag',
|
||||
DB::raw( 'concat(first_name," ",last_name) as full_name, assets.id as id, models.name as modelname' ) )
|
||||
->whereNull( 'assets.deleted_at' )
|
||||
->get();
|
||||
$asset_array = json_decode( json_encode( $asset ), true );
|
||||
$asset_element[ '' ] = 'Please select an asset';
|
||||
// Build a list out of the data results
|
||||
for ($x = 0; $x < count( $asset_array ); $x++) {
|
||||
|
||||
if ($asset_array[ $x ][ 'full_name' ] != '') {
|
||||
$full_name = ' (' . $asset_array[ $x ][ 'full_name' ] . ') ' . $asset_array[ $x ][ 'modelname' ];
|
||||
} else {
|
||||
$full_name = ' (Unassigned) ' . $asset_array[ $x ][ 'modelname' ];
|
||||
}
|
||||
$asset_element[ $asset_array[ $x ][ 'id' ] ] =
|
||||
$asset_array[ $x ][ 'asset_tag' ] . ' - ' . $asset_array[ $x ][ 'name' ] . $full_name;
|
||||
}
|
||||
// Get Supplier List
|
||||
$supplier_list = [ '' => 'Select Supplier' ] + Supplier::orderBy( 'name', 'asc' )
|
||||
->lists( 'name', 'id' );
|
||||
|
||||
// Render the view
|
||||
return View::make( 'backend/asset_maintenances/edit' )
|
||||
->with( 'asset_list', $asset_element )
|
||||
->with( 'selectedAsset', null )
|
||||
->with( 'supplier_list', $supplier_list )
|
||||
->with( 'assetMaintenanceType', $assetMaintenanceType )
|
||||
->with( 'assetMaintenance', $assetMaintenance );
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* postEdit
|
||||
*
|
||||
* @param null $assetMaintenanceId
|
||||
*
|
||||
* @return mixed
|
||||
* @author Vincent Sposato <vincent.sposato@gmail.com>
|
||||
* @version v1.0
|
||||
*/
|
||||
public function postEdit( $assetMaintenanceId = null )
|
||||
{
|
||||
|
||||
// get the POST data
|
||||
$new = Input::all();
|
||||
|
||||
// Check if the asset maintenance exists
|
||||
if (is_null( $assetMaintenance = AssetMaintenance::find( $assetMaintenanceId ) )) {
|
||||
// Redirect to the asset maintenance management page
|
||||
return Redirect::to( 'admin/asset_maintenances' )
|
||||
->with( 'error', Lang::get( 'admin/asset_maintenances/message.not_found' ) );
|
||||
}
|
||||
|
||||
// attempt validation
|
||||
if ($assetMaintenance->validate( $new )) {
|
||||
|
||||
if (e( Input::get( 'supplier_id' ) ) == '') {
|
||||
$assetMaintenance->supplier_id = null;
|
||||
} else {
|
||||
$assetMaintenance->supplier_id = e( Input::get( 'supplier_id' ) );
|
||||
}
|
||||
|
||||
if (e( Input::get( 'is_warranty' ) ) == '') {
|
||||
$assetMaintenance->is_warranty = 0;
|
||||
} else {
|
||||
$assetMaintenance->is_warranty = e( Input::get( 'is_warranty' ) );
|
||||
}
|
||||
|
||||
if (e( Input::get( 'cost' ) ) == '') {
|
||||
$assetMaintenance->cost = '';
|
||||
} else {
|
||||
$assetMaintenance->cost = ParseFloat( e( Input::get( 'cost' ) ) );
|
||||
}
|
||||
|
||||
if (e( Input::get( 'notes' ) ) == '') {
|
||||
$assetMaintenance->notes = null;
|
||||
} else {
|
||||
$assetMaintenance->notes = e( Input::get( 'notes' ) );
|
||||
}
|
||||
|
||||
// Save the asset maintenance data
|
||||
$assetMaintenance->asset_id = e( Input::get( 'asset_id' ) );
|
||||
$assetMaintenance->asset_maintenance_type = e( Input::get( 'asset_maintenance_type' ) );
|
||||
$assetMaintenance->title = e( Input::get( 'title' ) );
|
||||
$assetMaintenance->start_date = e( Input::get( 'start_date' ) );
|
||||
$assetMaintenance->completion_date = e( Input::get( 'completion_date' ) );
|
||||
|
||||
if (( $assetMaintenance->completion_date == "" )
|
||||
|| ( $assetMaintenance->completion_date == "0000-00-00" )
|
||||
) {
|
||||
$assetMaintenance->completion_date = null;
|
||||
if (( $assetMaintenance->asset_maintenance_time !== 0 )
|
||||
|| ( !is_null( $assetMaintenance->asset_maintenance_time ) )
|
||||
) {
|
||||
$assetMaintenance->asset_maintenance_time = null;
|
||||
}
|
||||
}
|
||||
|
||||
if (( $assetMaintenance->completion_date !== "" )
|
||||
&& ( $assetMaintenance->completion_date !== "0000-00-00" )
|
||||
&& ( $assetMaintenance->start_date !== "" )
|
||||
&& ( $assetMaintenance->start_date !== "0000-00-00" )
|
||||
) {
|
||||
$startDate = Carbon::parse( $assetMaintenance->start_date );
|
||||
$completionDate = Carbon::parse( $assetMaintenance->completion_date );
|
||||
$assetMaintenance->asset_maintenance_time = $completionDate->diffInDays( $startDate );
|
||||
}
|
||||
|
||||
// Was the asset maintenance created?
|
||||
if ($assetMaintenance->save()) {
|
||||
|
||||
// Redirect to the new asset maintenance page
|
||||
return Redirect::to( "admin/asset_maintenances" )
|
||||
->with( 'success', Lang::get( 'admin/asset_maintenances/message.create.success' ) );
|
||||
}
|
||||
} else {
|
||||
// failure
|
||||
$errors = $assetMaintenance->errors();
|
||||
|
||||
return Redirect::back()
|
||||
->withInput()
|
||||
->withErrors( $errors );
|
||||
}
|
||||
|
||||
// Redirect to the improvement create page
|
||||
return Redirect::to( 'admin/asset_maintenances/edit' )
|
||||
->with( 'error', Lang::get( 'admin/asset_maintenances/message.create.error' ) )
|
||||
->with( 'assetMaintenance', $assetMaintenance );
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* getDelete
|
||||
*
|
||||
* @param $assetMaintenanceId
|
||||
*
|
||||
* @return mixed
|
||||
* @author Vincent Sposato <vincent.sposato@gmail.com>
|
||||
* @version v1.0
|
||||
*/
|
||||
public function getDelete( $assetMaintenanceId )
|
||||
{
|
||||
|
||||
// Check if the asset maintenance exists
|
||||
if (is_null( $assetMaintenance = AssetMaintenance::find( $assetMaintenanceId ) )) {
|
||||
// Redirect to the asset maintenance management page
|
||||
return Redirect::to( 'admin/asset_maintenances' )
|
||||
->with( 'error', Lang::get( 'admin/asset_maintenances/message.not_found' ) );
|
||||
}
|
||||
// Delete the asset maintenance
|
||||
$assetMaintenance->delete();
|
||||
|
||||
// Redirect to the asset_maintenance management page
|
||||
return Redirect::to( 'admin/asset_maintenances' )
|
||||
->with( 'success', Lang::get( 'admin/asset_maintenances/message.delete.success' ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* getView
|
||||
*
|
||||
* @param $assetMaintenanceId
|
||||
*
|
||||
* @return mixed
|
||||
* @author Vincent Sposato <vincent.sposato@gmail.com>
|
||||
* @version v1.0
|
||||
*/
|
||||
public function getView( $assetMaintenanceId )
|
||||
{
|
||||
|
||||
// Check if the asset maintenance exists
|
||||
if (is_null( $assetMaintenance = AssetMaintenance::find( $assetMaintenanceId ) )) {
|
||||
// Redirect to the asset maintenance management page
|
||||
return Redirect::to( 'admin/asset_maintenances' )
|
||||
->with( 'error', Lang::get( 'admin/asset_maintenances/message.not_found' ) );
|
||||
}
|
||||
|
||||
return View::make( 'backend/asset_maintenances/view')->with('assetMaintenance', $assetMaintenance);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -2,9 +2,11 @@
|
||||
|
||||
use AdminController;
|
||||
use Input;
|
||||
use Image;
|
||||
use Lang;
|
||||
use Asset;
|
||||
use Supplier;
|
||||
use AssetMaintenance;
|
||||
use Statuslabel;
|
||||
use User;
|
||||
use Setting;
|
||||
@@ -21,15 +23,20 @@ use Response;
|
||||
use Config;
|
||||
use Location;
|
||||
use Log;
|
||||
use DNS2D;
|
||||
use Mail;
|
||||
use Datatable;
|
||||
use TCPDF;
|
||||
use Slack;
|
||||
use Paginator;
|
||||
use Manufacturer; //for embedded-create
|
||||
use Artisan;
|
||||
use Symfony\Component\Console\Output\BufferedOutput;
|
||||
use Symfony\Component\HttpFoundation\JsonResponse;
|
||||
|
||||
|
||||
class AssetsController extends AdminController
|
||||
{
|
||||
protected $qrCodeDimensions = array( 'height' => 3.5, 'width' => 3.5);
|
||||
protected $barCodeDimensions = array( 'height' => 2, 'width' => 22);
|
||||
|
||||
/**
|
||||
* Show a list of all the assets.
|
||||
@@ -42,8 +49,6 @@ class AssetsController extends AdminController
|
||||
return View::make('backend/hardware/index');
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Asset create.
|
||||
*
|
||||
@@ -53,29 +58,15 @@ class AssetsController extends AdminController
|
||||
*/
|
||||
public function getCreate($model_id = null)
|
||||
{
|
||||
|
||||
/*
|
||||
// Grab the dropdown list of models
|
||||
//$model_list = array('' => 'Select a Model') + Model::orderBy('name', 'asc')->lists('name'.' '. 'modelno', 'id');
|
||||
|
||||
$model_list = Model::select(DB::raw('concat(manufacturers.name," ",name) as name, id'))->orderBy('name', 'asc')->with('manufacturer')->lists('name', 'id');
|
||||
//$model_list = array('' => Lang::get('general.select_model'));
|
||||
*/
|
||||
|
||||
$model_list = array('' => Lang::get('general.select_model')) + DB::table('models')
|
||||
->select(DB::raw('concat(name," / ",modelno) as name, id'))->orderBy('name', 'asc')
|
||||
->orderBy('modelno', 'asc')
|
||||
->whereNull('deleted_at')
|
||||
->lists('name', 'id');
|
||||
|
||||
|
||||
$supplier_list = array('' => Lang::get('general.select_supplier')) + Supplier::orderBy('name', 'asc')->lists('name', 'id');
|
||||
$assigned_to = array('' => Lang::get('general.select_user')) + DB::table('users')->select(DB::raw('concat(first_name," ",last_name) as full_name, id'))->whereNull('deleted_at')->lists('full_name', 'id');
|
||||
$location_list = array('' => Lang::get('general.select_location')) + Location::orderBy('name', 'asc')->lists('name', 'id');
|
||||
|
||||
|
||||
// Grab the dropdown list of status
|
||||
$statuslabel_list = array('' => Lang::get('general.select_statuslabel')) + Statuslabel::orderBy('name', 'asc')->lists('name', 'id');
|
||||
// Grab the dropdown lists
|
||||
$model_list = modelList();
|
||||
$statuslabel_list = statusLabelList();
|
||||
$location_list = locationsList();
|
||||
$manufacturer_list = manufacturerList();
|
||||
$category_list = categoryList();
|
||||
$supplier_list = suppliersList();
|
||||
$assigned_to = usersList();
|
||||
$statuslabel_types = statusTypeList();
|
||||
|
||||
$view = View::make('backend/hardware/edit');
|
||||
$view->with('supplier_list',$supplier_list);
|
||||
@@ -84,6 +75,9 @@ class AssetsController extends AdminController
|
||||
$view->with('assigned_to',$assigned_to);
|
||||
$view->with('location_list',$location_list);
|
||||
$view->with('asset',new Asset);
|
||||
$view->with('manufacturer',$manufacturer_list);
|
||||
$view->with('category',$category_list);
|
||||
$view->with('statuslabel_types',$statuslabel_types);
|
||||
|
||||
if (!is_null($model_id)) {
|
||||
$selected_model = Model::find($model_id);
|
||||
@@ -177,6 +171,19 @@ class AssetsController extends AdminController
|
||||
$asset->physical = '1';
|
||||
$asset->depreciate = '0';
|
||||
|
||||
// Create the image (if one was chosen.)
|
||||
if (Input::file('image')) {
|
||||
$image = Input::file('image');
|
||||
$file_name = str_random(25).".".$image->getClientOriginalExtension();
|
||||
$path = public_path('uploads/assets/'.$file_name);
|
||||
Image::make($image->getRealPath())->resize(300, null, function ($constraint) {
|
||||
$constraint->aspectRatio();
|
||||
$constraint->upsize();
|
||||
})->save($path);
|
||||
$asset->image = $file_name;
|
||||
|
||||
}
|
||||
|
||||
// Was the asset created?
|
||||
if($asset->save()) {
|
||||
|
||||
@@ -189,7 +196,6 @@ class AssetsController extends AdminController
|
||||
$logaction->note = e(Input::get('note'));
|
||||
$log = $logaction->logaction('checkout');
|
||||
}
|
||||
|
||||
// Redirect to the asset listing page
|
||||
return Redirect::to("hardware")->with('success', Lang::get('admin/hardware/message.create.success'));
|
||||
}
|
||||
@@ -214,20 +220,25 @@ class AssetsController extends AdminController
|
||||
// Redirect to the asset management page
|
||||
return Redirect::to('hardware')->with('error', Lang::get('admin/hardware/message.does_not_exist'));
|
||||
}
|
||||
// Grab the dropdown lists
|
||||
$model_list = modelList();
|
||||
$statuslabel_list = statusLabelList();
|
||||
$location_list = locationsList();
|
||||
$manufacturer_list = manufacturerList();
|
||||
$category_list = categoryList();
|
||||
$supplier_list = suppliersList();
|
||||
$assigned_to = usersList();
|
||||
$statuslabel_types = statusTypeList();
|
||||
|
||||
|
||||
// Grab the dropdown list of models
|
||||
$model_list = array('' => Lang::get('general.select_model')) + DB::table('models')
|
||||
->select(DB::raw('concat(name," / ",modelno) as name, id'))->orderBy('name', 'asc')
|
||||
->orderBy('modelno', 'asc')
|
||||
->lists('name', 'id');
|
||||
$supplier_list = array('' => Lang::get('general.select_supplier')) + Supplier::orderBy('name', 'asc')->lists('name', 'id');
|
||||
$location_list = array('' => Lang::get('general.select_location')) + Location::orderBy('name', 'asc')->lists('name', 'id');
|
||||
|
||||
// Grab the dropdown list of status
|
||||
$statuslabel_list = Statuslabel::orderBy('name', 'asc')->lists('name', 'id');
|
||||
|
||||
return View::make('backend/hardware/edit', compact('asset'))->with('model_list',$model_list)->with('supplier_list',$supplier_list)->with('location_list',$location_list)->with('statuslabel_list',$statuslabel_list);
|
||||
return View::make('backend/hardware/edit', compact('asset'))
|
||||
->with('model_list',$model_list)
|
||||
->with('supplier_list',$supplier_list)
|
||||
->with('location_list',$location_list)
|
||||
->with('statuslabel_list',$statuslabel_list)
|
||||
->with('assigned_to',$assigned_to)
|
||||
->with('manufacturer',$manufacturer_list)
|
||||
->with('statuslabel_types',$statuslabel_types)
|
||||
->with('category',$category_list);
|
||||
}
|
||||
|
||||
|
||||
@@ -311,6 +322,20 @@ class AssetsController extends AdminController
|
||||
$asset->notes = e(Input::get('notes'));
|
||||
$asset->physical = '1';
|
||||
|
||||
// Update the image
|
||||
if (Input::file('image')) {
|
||||
$image = Input::file('image');
|
||||
$file_name = str_random(25).".".$image->getClientOriginalExtension();
|
||||
$path = public_path('uploads/assets/'.$file_name);
|
||||
Image::make($image->getRealPath())->resize(300, null, function ($constraint) {
|
||||
$constraint->aspectRatio();
|
||||
$constraint->upsize();
|
||||
})->save($path);
|
||||
$asset->image = $file_name;
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Was the asset updated?
|
||||
if($asset->save()) {
|
||||
// Redirect to the new asset page
|
||||
@@ -339,7 +364,7 @@ class AssetsController extends AdminController
|
||||
// Check if the asset exists
|
||||
if (is_null($asset = Asset::find($assetId))) {
|
||||
// Redirect to the asset management page with error
|
||||
return Redirect::to('hardware')->with('error', Lang::get('admin/hardware/message.not_found'));
|
||||
return Redirect::to('hardware')->with('error', Lang::get('admin/hardware/message.does_not_exist'));
|
||||
}
|
||||
|
||||
if (isset($asset->assigneduser->id) && ($asset->assigneduser->id!=0)) {
|
||||
@@ -371,11 +396,11 @@ class AssetsController extends AdminController
|
||||
// Check if the asset exists
|
||||
if (is_null($asset = Asset::find($assetId))) {
|
||||
// Redirect to the asset management page with error
|
||||
return Redirect::to('hardware')->with('error', Lang::get('admin/hardware/message.not_found'));
|
||||
return Redirect::to('hardware')->with('error', Lang::get('admin/hardware/message.does_not_exist'));
|
||||
}
|
||||
|
||||
// Get the dropdown of users and then pass it to the checkout view
|
||||
$users_list = array('' => Lang::get('general.select_user')) + DB::table('users')->select(DB::raw('concat(last_name,", ",first_name) as full_name, id'))->whereNull('deleted_at')->orderBy('last_name', 'asc')->orderBy('first_name', 'asc')->lists('full_name', 'id');
|
||||
$users_list = usersList();
|
||||
|
||||
return View::make('backend/hardware/checkout', compact('asset'))->with('users_list',$users_list);
|
||||
|
||||
@@ -386,113 +411,51 @@ class AssetsController extends AdminController
|
||||
**/
|
||||
public function postCheckout($assetId)
|
||||
{
|
||||
|
||||
// Check if the asset exists
|
||||
if (is_null($asset = Asset::find($assetId))) {
|
||||
// Redirect to the asset management page with error
|
||||
return Redirect::to('hardware')->with('error', Lang::get('admin/hardware/message.not_found'));
|
||||
if (!$asset = Asset::find($assetId)) {
|
||||
return Redirect::to('hardware')->with('error', Lang::get('admin/hardware/message.does_not_exist'));
|
||||
}
|
||||
|
||||
$assigned_to = e(Input::get('assigned_to'));
|
||||
|
||||
|
||||
|
||||
// Declare the rules for the form validation
|
||||
$rules = array(
|
||||
'assigned_to' => 'required|min:1',
|
||||
'checkout_at' => 'required|date',
|
||||
'note' => 'alpha_space',
|
||||
);
|
||||
|
||||
// Create a new validator instance from our validation rules
|
||||
$validator = Validator::make(Input::all(), $rules);
|
||||
|
||||
// If validation fails, we'll exit the operation now.
|
||||
if ($validator->fails()) {
|
||||
// Ooops.. something went wrong
|
||||
return Redirect::back()->withInput()->withErrors($validator);
|
||||
}
|
||||
|
||||
|
||||
// Check if the user exists
|
||||
if (is_null($user = User::find($assigned_to))) {
|
||||
// Redirect to the asset management page with error
|
||||
if (!$user = User::find(e(Input::get('assigned_to')))) {
|
||||
return Redirect::to('hardware')->with('error', Lang::get('admin/hardware/message.user_does_not_exist'));
|
||||
}
|
||||
|
||||
// Update the asset data
|
||||
$asset->assigned_to = e(Input::get('assigned_to'));
|
||||
|
||||
// Was the asset updated?
|
||||
if($asset->save()) {
|
||||
$logaction = new Actionlog();
|
||||
|
||||
if (Input::has('checkout_at')) {
|
||||
if (Input::get('checkout_at')!= date("Y-m-d")){
|
||||
$logaction->created_at = e(Input::get('checkout_at')).' 00:00:00';
|
||||
}
|
||||
}
|
||||
if (!$admin = Sentry::getUser()) {
|
||||
return Redirect::to('hardware')->with('error', Lang::get('admin/hardware/message.admin_user_does_not_exist'));
|
||||
}
|
||||
|
||||
|
||||
if (Input::get('checkout_at')!= date("Y-m-d")){
|
||||
$checkout_at = e(Input::get('checkout_at')).' 00:00:00';
|
||||
} else {
|
||||
$checkout_at = date("Y-m-d H:i:s");
|
||||
}
|
||||
|
||||
$logaction->asset_id = $asset->id;
|
||||
$logaction->checkedout_to = $asset->assigned_to;
|
||||
$logaction->asset_type = 'hardware';
|
||||
$logaction->location_id = $user->location_id;
|
||||
$logaction->user_id = Sentry::getUser()->id;
|
||||
$logaction->note = e(Input::get('note'));
|
||||
$log = $logaction->logaction('checkout');
|
||||
|
||||
$data['log_id'] = $logaction->id;
|
||||
$data['eula'] = $asset->getEula();
|
||||
$data['first_name'] = $user->first_name;
|
||||
$data['item_name'] = $asset->showAssetName();
|
||||
$data['require_acceptance'] = $asset->requireAcceptance();
|
||||
|
||||
$settings = Setting::getSettings();
|
||||
|
||||
if ($settings->slack_endpoint) {
|
||||
if (Input::has('expected_checkin')) {
|
||||
if (Input::get('expected_checkin')!= date("Y-m-d")){
|
||||
$expected_checkin = e(Input::get('expected_checkin'));
|
||||
}
|
||||
} else {
|
||||
$expected_checkin = null;
|
||||
}
|
||||
|
||||
|
||||
$slack_settings = [
|
||||
'username' => $settings->botname,
|
||||
'channel' => $settings->slack_channel,
|
||||
'link_names' => true
|
||||
];
|
||||
|
||||
$client = new \Maknz\Slack\Client($settings->slack_endpoint,$slack_settings);
|
||||
|
||||
try {
|
||||
$client->attach([
|
||||
'color' => 'good',
|
||||
'fields' => [
|
||||
[
|
||||
'title' => 'Checked Out:',
|
||||
'value' => strtoupper($logaction->asset_type).' asset <'.Config::get('app.url').'/hardware/'.$asset->id.'/view'.'|'.$asset->showAssetName().'> checked out to <'.Config::get('app.url').'/admin/users/'.$user->id.'/view|'.$user->fullName().'> by <'.Config::get('app.url').'/hardware/'.$asset->id.'/view'.'|'.Sentry::getUser()->fullName().'>.'
|
||||
],
|
||||
[
|
||||
'title' => 'Note:',
|
||||
'value' => e($logaction->note)
|
||||
],
|
||||
|
||||
|
||||
|
||||
]
|
||||
])->send('Asset Checked Out');
|
||||
|
||||
} catch (Exception $e) {
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
if (($asset->requireAcceptance()=='1') || ($asset->getEula())) {
|
||||
|
||||
Mail::send('emails.accept-asset', $data, function ($m) use ($user) {
|
||||
$m->to($user->email, $user->first_name . ' ' . $user->last_name);
|
||||
$m->subject('Confirm asset delivery');
|
||||
});
|
||||
}
|
||||
|
||||
if ($asset->checkOutToUser($user, $admin, $checkout_at, $expected_checkin, e(Input::get('note')), e(Input::get('name')))) {
|
||||
// Redirect to the new asset page
|
||||
return Redirect::to("hardware")->with('success', Lang::get('admin/hardware/message.checkout.success'));
|
||||
}
|
||||
@@ -513,7 +476,7 @@ class AssetsController extends AdminController
|
||||
// Check if the asset exists
|
||||
if (is_null($asset = Asset::find($assetId))) {
|
||||
// Redirect to the asset management page with error
|
||||
return Redirect::to('hardware')->with('error', Lang::get('admin/hardware/message.not_found'));
|
||||
return Redirect::to('hardware')->with('error', Lang::get('admin/hardware/message.does_not_exist'));
|
||||
}
|
||||
|
||||
return View::make('backend/hardware/checkin', compact('asset'))->with('backto', $backto);
|
||||
@@ -531,11 +494,15 @@ class AssetsController extends AdminController
|
||||
// Check if the asset exists
|
||||
if (is_null($asset = Asset::find($assetId))) {
|
||||
// Redirect to the asset management page with error
|
||||
return Redirect::to('hardware')->with('error', Lang::get('admin/hardware/message.not_found'));
|
||||
return Redirect::to('hardware')->with('error', Lang::get('admin/hardware/message.does_not_exist'));
|
||||
}
|
||||
|
||||
// Check for a valid user to checkout fa-random
|
||||
// This will need to be tweaked for checkout to location
|
||||
if (!is_null($asset->assigned_to)) {
|
||||
$user = User::find($asset->assigned_to);
|
||||
} else {
|
||||
return Redirect::to('hardware')->with('error', Lang::get('admin/hardware/message.already_checked_in'));
|
||||
}
|
||||
|
||||
// This is just used for the redirect
|
||||
@@ -546,6 +513,7 @@ class AssetsController extends AdminController
|
||||
|
||||
// Update the asset data to null, since it's being checked in
|
||||
$asset->assigned_to = NULL;
|
||||
$asset->accepted = NULL;
|
||||
|
||||
|
||||
// Was the asset updated?
|
||||
@@ -554,7 +522,7 @@ class AssetsController extends AdminController
|
||||
if (Input::has('checkin_at')) {
|
||||
|
||||
if (!strtotime(Input::get('checkin_at'))) {
|
||||
$logaction->created_at = date("Y-m-d h:i:s");
|
||||
$logaction->created_at = date("Y-m-d H:i:s");
|
||||
} elseif (Input::get('checkin_at')!= date("Y-m-d")) {
|
||||
$logaction->created_at = e(Input::get('checkin_at')).' 00:00:00';
|
||||
}
|
||||
@@ -571,7 +539,6 @@ class AssetsController extends AdminController
|
||||
|
||||
if ($settings->slack_endpoint) {
|
||||
|
||||
|
||||
$slack_settings = [
|
||||
'username' => $settings->botname,
|
||||
'channel' => $settings->slack_channel,
|
||||
@@ -602,6 +569,20 @@ class AssetsController extends AdminController
|
||||
|
||||
}
|
||||
|
||||
$data['log_id'] = $logaction->id;
|
||||
$data['first_name'] = $user->first_name;
|
||||
$data['item_name'] = $asset->showAssetName();
|
||||
$data['checkin_date'] = $logaction->created_at;
|
||||
$data['item_tag'] = $asset->asset_tag;
|
||||
$data['note'] = $logaction->note;
|
||||
|
||||
if ((($asset->checkin_email()=='1')) && ($user) && (!Config::get('app.lock_passwords'))) {
|
||||
Mail::send('emails.checkin-asset', $data, function ($m) use ($user) {
|
||||
$m->to($user->email, $user->first_name . ' ' . $user->last_name);
|
||||
$m->subject('Confirm Asset Checkin');
|
||||
});
|
||||
}
|
||||
|
||||
if ($backto=='user') {
|
||||
return Redirect::to("admin/users/".$return_to.'/view')->with('success', Lang::get('admin/hardware/message.checkin.success'));
|
||||
} else {
|
||||
@@ -624,17 +605,34 @@ class AssetsController extends AdminController
|
||||
public function getView($assetId = null)
|
||||
{
|
||||
$asset = Asset::withTrashed()->find($assetId);
|
||||
$settings = Setting::getSettings();
|
||||
|
||||
|
||||
if ($asset->userloc) {
|
||||
$use_currency = $asset->userloc->currency;
|
||||
} elseif ($asset->assetloc) {
|
||||
$use_currency = $asset->assetloc->currency;
|
||||
} else {
|
||||
$default_currency = Setting::first()->default_currency;
|
||||
|
||||
if ($settings->default_currency!='') {
|
||||
$use_currency = $settings->default_currency;
|
||||
} else {
|
||||
$use_currency = Lang::get('general.currency');
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (isset($asset->id)) {
|
||||
|
||||
$settings = Setting::getSettings();
|
||||
|
||||
|
||||
$qr_code = (object) array(
|
||||
'display' => $settings->qr_code == '1',
|
||||
'url' => route('qr_code/hardware', $asset->id)
|
||||
);
|
||||
|
||||
return View::make('backend/hardware/view', compact('asset', 'qr_code'));
|
||||
return View::make('backend/hardware/view', compact('asset', 'qr_code','settings'))->with('use_currency',$use_currency);
|
||||
} else {
|
||||
// Prepare the error message
|
||||
$error = Lang::get('admin/hardware/message.does_not_exist', compact('id'));
|
||||
@@ -657,26 +655,111 @@ class AssetsController extends AdminController
|
||||
|
||||
if ($settings->qr_code == '1') {
|
||||
$asset = Asset::find($assetId);
|
||||
$size = barcodeDimensions($settings->barcode_type);
|
||||
|
||||
if (isset($asset->id,$asset->asset_tag)) {
|
||||
|
||||
$content = DNS2D::getBarcodePNG(route('view/hardware', $asset->id), $settings->barcode_type,
|
||||
$this->qrCodeDimensions['height'],$this->qrCodeDimensions['width']);
|
||||
|
||||
$img = imagecreatefromstring(base64_decode($content));
|
||||
imagepng($img);
|
||||
imagedestroy($img);
|
||||
|
||||
$content_disposition = sprintf('attachment;filename=qr_code_%s.png', preg_replace('/\W/', '', $asset->asset_tag));
|
||||
$response = Response::make($content, 200);
|
||||
$response->header('Content-Type', 'image/png');
|
||||
$response->header('Content-Disposition', $content_disposition);
|
||||
return $response;
|
||||
$barcode = new \Com\Tecnick\Barcode\Barcode();
|
||||
$barcode_obj = $barcode->getBarcodeObj($settings->barcode_type, route('view/hardware', $asset->id), $size['height'], $size['width'], 'black', array(-2, -2, -2, -2));
|
||||
return $barcode_obj->getPngData();
|
||||
}
|
||||
}
|
||||
|
||||
$response = Response::make('', 404);
|
||||
return $response;
|
||||
}
|
||||
|
||||
|
||||
public function getImportUpload() {
|
||||
|
||||
$path = app_path().'/private_uploads/imports/assets';
|
||||
$files = array();
|
||||
|
||||
if ($handle = opendir($path)) {
|
||||
|
||||
/* This is the correct way to loop over the directory. */
|
||||
while (false !== ($entry = readdir($handle))) {
|
||||
clearstatcache();
|
||||
if (substr(strrchr($entry,'.'),1)=='csv') {
|
||||
$files[] = array(
|
||||
'filename' => $entry,
|
||||
'filesize' => Setting::fileSizeConvert(filesize($path.'/'.$entry)),
|
||||
'modified' => filemtime($path.'/'.$entry)
|
||||
);
|
||||
}
|
||||
|
||||
}
|
||||
closedir($handle);
|
||||
$files = array_reverse($files);
|
||||
}
|
||||
|
||||
return View::make('backend/hardware/import')->with('files',$files);
|
||||
}
|
||||
|
||||
|
||||
|
||||
public function postAPIImportUpload() {
|
||||
|
||||
if (!Config::get('app.lock_passwords')) {
|
||||
|
||||
$rules = array(
|
||||
'files' => 'required'
|
||||
);
|
||||
|
||||
$validator = Validator::make(Input::all(), $rules);
|
||||
|
||||
if ($validator->fails()) {
|
||||
$messages = $validator->messages();
|
||||
$results['error']=$messages->first('files');
|
||||
return $results;
|
||||
|
||||
} else {
|
||||
$files = Input::file('files');
|
||||
$path = app_path().'/private_uploads/imports/assets';
|
||||
$results = array();
|
||||
|
||||
foreach ($files as $file) {
|
||||
|
||||
if (!in_array($file->getMimeType(), array(
|
||||
'application/vnd.ms-excel',
|
||||
'text/csv',
|
||||
'text/plain',
|
||||
'text/comma-separated-values',
|
||||
'text/tsv'))) {
|
||||
$results['error']='File type must be CSV';
|
||||
return $results;
|
||||
}
|
||||
|
||||
$fixed_filename = str_replace(' ','-',$file->getClientOriginalName());
|
||||
$file->move($path, date('Y-m-d-his').'-'.$file->getClientOriginalName());
|
||||
$name = date('Y-m-d-his').'-'.$fixed_filename;
|
||||
$filesize = Setting::fileSizeConvert(filesize($path.'/'.$name));
|
||||
$results[] = compact('name', 'filesize');
|
||||
}
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
$results['error']=Lang::get('general.feature_disabled');
|
||||
return $results;
|
||||
}
|
||||
|
||||
return array(
|
||||
'files' => $results
|
||||
);
|
||||
|
||||
|
||||
}
|
||||
|
||||
public function getProcessImportFile($filename) {
|
||||
// php artisan asset-import:csv path/to/your/file.csv --domain=yourdomain.com --email_format=firstname.lastname
|
||||
|
||||
$output = new BufferedOutput;
|
||||
Artisan::call('asset-import:csv', ['filename'=> app_path().'/private_uploads/imports/assets/'.$filename, '--email_format'=>'firstname.lastname', '--username_format'=>'firstname.lastname'], $output);
|
||||
$display_output = $output->fetch();
|
||||
$file = app_path().'/private_uploads/imports/assets/'.str_replace('.csv','',$filename).'-output-'.date("Y-m-d-his").'.txt';
|
||||
file_put_contents($file, $display_output);
|
||||
|
||||
|
||||
return View::make('backend/hardware/import-status');
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -693,17 +776,15 @@ class AssetsController extends AdminController
|
||||
return Redirect::to('hardware')->with('error', Lang::get('admin/hardware/message.does_not_exist'));
|
||||
}
|
||||
|
||||
// Grab the dropdown list of models
|
||||
$model_list = array('' => Lang::get('general.select_model')) + Model::lists('name', 'id');
|
||||
|
||||
// Grab the dropdown list of status
|
||||
$statuslabel_list = Statuslabel::lists('name', 'id');
|
||||
|
||||
$location_list = array('' => Lang::get('general.select_location')) + Location::lists('name', 'id');
|
||||
|
||||
// get depreciation list
|
||||
$supplier_list = array('' => Lang::get('general.select_supplier')) + Supplier::orderBy('name', 'asc')->lists('name', 'id');
|
||||
$assigned_to = array('' => Lang::get('general.select_user')) + DB::table('users')->select(DB::raw('concat(first_name," ",last_name) as full_name, id'))->whereNull('deleted_at')->lists('full_name', 'id');
|
||||
// Grab the dropdown lists
|
||||
$model_list = modelList();
|
||||
$statuslabel_list = statusLabelList();
|
||||
$location_list = locationsList();
|
||||
$manufacturer_list = manufacturerList();
|
||||
$category_list = categoryList();
|
||||
$supplier_list = suppliersList();
|
||||
$assigned_to = usersList();
|
||||
$statuslabel_types = statusTypeList();
|
||||
|
||||
$asset = clone $asset_to_clone;
|
||||
$asset->id = null;
|
||||
@@ -711,7 +792,16 @@ class AssetsController extends AdminController
|
||||
$asset->serial = '';
|
||||
$asset->assigned_to = '';
|
||||
$asset->mac_address = '';
|
||||
return View::make('backend/hardware/edit')->with('supplier_list',$supplier_list)->with('model_list',$model_list)->with('statuslabel_list',$statuslabel_list)->with('assigned_to',$assigned_to)->with('asset',$asset)->with('location_list',$location_list);
|
||||
return View::make('backend/hardware/edit')
|
||||
->with('supplier_list',$supplier_list)
|
||||
->with('model_list',$model_list)
|
||||
->with('statuslabel_list',$statuslabel_list)
|
||||
->with('statuslabel_types',$statuslabel_types)
|
||||
->with('assigned_to',$assigned_to)
|
||||
->with('asset',$asset)
|
||||
->with('location_list',$location_list)
|
||||
->with('manufacturer',$manufacturer_list)
|
||||
->with('category',$category_list);
|
||||
|
||||
}
|
||||
|
||||
@@ -734,7 +824,7 @@ class AssetsController extends AdminController
|
||||
return Redirect::route('hardware')->with('success', $success);
|
||||
|
||||
} else {
|
||||
return Redirect::to('hardware')->with('error', Lang::get('admin/hardware/message.not_found'));
|
||||
return Redirect::to('hardware')->with('error', Lang::get('admin/hardware/message.does_not_exist'));
|
||||
}
|
||||
|
||||
}
|
||||
@@ -778,7 +868,7 @@ class AssetsController extends AdminController
|
||||
$logaction->user_id = Sentry::getUser()->id;
|
||||
$logaction->note = e(Input::get('notes'));
|
||||
$logaction->checkedout_to = NULL;
|
||||
$logaction->created_at = date("Y-m-d h:i:s");
|
||||
$logaction->created_at = date("Y-m-d H:i:s");
|
||||
$logaction->filename = $filename;
|
||||
$log = $logaction->logaction('uploaded');
|
||||
} else {
|
||||
@@ -795,7 +885,7 @@ class AssetsController extends AdminController
|
||||
}
|
||||
|
||||
} else {
|
||||
return Redirect::back()->with('success', Lang::get('admin/hardware/message.upload.nofiles'));
|
||||
return Redirect::back()->with('error', Lang::get('admin/hardware/message.upload.nofiles'));
|
||||
}
|
||||
|
||||
|
||||
@@ -858,9 +948,23 @@ class AssetsController extends AdminController
|
||||
|
||||
// the asset is valid
|
||||
if (isset($asset->id)) {
|
||||
$log = Actionlog::find($fileId);
|
||||
$file = $log->get_src();
|
||||
return Response::download($file);
|
||||
|
||||
$log = Actionlog::find($fileId);
|
||||
$file = $log->get_src();
|
||||
|
||||
$filetype = Asset::checkUploadIsImage($file);
|
||||
|
||||
if ($filetype) {
|
||||
|
||||
$contents = file_get_contents($file);
|
||||
$response = Response::make($contents);
|
||||
$response->header('Content-Type', $filetype);
|
||||
return $response;
|
||||
|
||||
} else {
|
||||
return Response::download($file);
|
||||
}
|
||||
|
||||
} else {
|
||||
// Prepare the error message
|
||||
$error = Lang::get('admin/hardware/message.does_not_exist', compact('id'));
|
||||
@@ -911,10 +1015,10 @@ class AssetsController extends AdminController
|
||||
$assets = Input::get('edit_asset');
|
||||
|
||||
$supplier_list = array('' => '') + Supplier::orderBy('name', 'asc')->lists('name', 'id');
|
||||
$statuslabel_list = array('' => '') + Statuslabel::lists('name', 'id');
|
||||
$location_list = array('' => '') + Location::lists('name', 'id');
|
||||
$statuslabel_list = array('' => '') + Statuslabel::lists('name', 'id');
|
||||
$location_list = array('' => '') + Location::lists('name', 'id');
|
||||
|
||||
return View::make('backend/hardware/bulk')->with('assets',$assets)->with('supplier_list',$supplier_list)->with('statuslabel_list',$statuslabel_list)->with('location_list',$location_list);
|
||||
return View::make('backend/hardware/bulk')->with('assets',$assets)->with('supplier_list',$supplier_list)->with('statuslabel_list',$statuslabel_list)->with('location_list',$location_list);
|
||||
|
||||
|
||||
}
|
||||
@@ -941,7 +1045,7 @@ class AssetsController extends AdminController
|
||||
|
||||
$assets = Input::get('bulk_edit');
|
||||
|
||||
if ( (Input::has('purchase_date')) || (Input::has('purchase_cost')) || (Input::has('supplier_id')) || (Input::has('order_number')) || (Input::has('warranty_months')) || (Input::has('rtd_location_id')) || (Input::has('status_id')) ) {
|
||||
if ( (Input::has('purchase_date')) || (Input::has('purchase_cost')) || (Input::has('supplier_id')) || (Input::has('order_number')) || (Input::has('warranty_months')) || (Input::has('rtd_location_id')) || (Input::has('requestable')) || (Input::has('status_id')) ) {
|
||||
|
||||
foreach ($assets as $key => $value) {
|
||||
|
||||
@@ -975,6 +1079,12 @@ class AssetsController extends AdminController
|
||||
$update_array['status_id'] = e(Input::get('status_id'));
|
||||
}
|
||||
|
||||
if (Input::get('requestable')=='1') {
|
||||
$update_array['requestable'] = 1;
|
||||
} else {
|
||||
$update_array['requestable'] = 0;
|
||||
}
|
||||
|
||||
|
||||
if (DB::table('assets')
|
||||
->where('id', $key)
|
||||
@@ -983,7 +1093,7 @@ class AssetsController extends AdminController
|
||||
$logaction = new Actionlog();
|
||||
$logaction->asset_id = $key;
|
||||
$logaction->asset_type = 'hardware';
|
||||
$logaction->created_at = date("Y-m-d h:i:s");
|
||||
$logaction->created_at = date("Y-m-d H:i:s");
|
||||
|
||||
if (Input::has('rtd_location_id')) {
|
||||
$logaction->location_id = e(Input::get('rtd_location_id'));
|
||||
@@ -1014,8 +1124,29 @@ class AssetsController extends AdminController
|
||||
public function getDatatable($status = null)
|
||||
{
|
||||
|
||||
$assets = Asset::with('model','assigneduser','assigneduser.userloc','assetstatus','defaultLoc','assetlog','model','model.category')->Hardware()->select(array('id', 'name','model_id','assigned_to','asset_tag','serial','status_id','purchase_date','deleted_at','rtd_location_id'));
|
||||
|
||||
$assets = Asset::with('model','assigneduser','assigneduser.userloc','assetstatus','defaultLoc','assetlog','model','model.category','assetstatus','assetloc')
|
||||
->Hardware();
|
||||
|
||||
if (Input::has('search')) {
|
||||
$assets = $assets->TextSearch(Input::get('search'));
|
||||
}
|
||||
|
||||
if (Input::has('offset')) {
|
||||
$offset = e(Input::get('offset'));
|
||||
} else {
|
||||
$offset = 0;
|
||||
}
|
||||
|
||||
if (Input::has('limit')) {
|
||||
$limit = e(Input::get('limit'));
|
||||
} else {
|
||||
$limit = 50;
|
||||
}
|
||||
|
||||
if (Input::has('order_number')) {
|
||||
$assets->where('order_number','=',e(Input::get('order_number')));
|
||||
}
|
||||
|
||||
switch ($status) {
|
||||
case 'Deleted':
|
||||
@@ -1042,106 +1173,90 @@ class AssetsController extends AdminController
|
||||
|
||||
}
|
||||
|
||||
$allowed_columns = [
|
||||
'id',
|
||||
'name',
|
||||
'asset_tag',
|
||||
'serial',
|
||||
'model',
|
||||
'last_checkout',
|
||||
'category',
|
||||
'notes',
|
||||
'expected_checkin',
|
||||
'order_number',
|
||||
'location',
|
||||
'image',
|
||||
];
|
||||
|
||||
$assets = $assets->orderBy('asset_tag', 'ASC')->get();
|
||||
$order = Input::get('order') === 'asc' ? 'asc' : 'desc';
|
||||
$sort = in_array(Input::get('sort'), $allowed_columns) ? Input::get('sort') : 'asset_tag';
|
||||
|
||||
switch ($sort)
|
||||
{
|
||||
case 'model':
|
||||
$assets = $assets->OrderModels($order);
|
||||
break;
|
||||
case 'category':
|
||||
$assets = $assets->OrderCategory($order);
|
||||
break;
|
||||
case 'location':
|
||||
$assets = $assets->OrderLocation($order);
|
||||
break;
|
||||
case 'status':
|
||||
$assets = $assets->OrderCategory($order);
|
||||
break;
|
||||
default:
|
||||
$assets = $assets->orderBy($sort, $order);
|
||||
break;
|
||||
}
|
||||
|
||||
$assetCount = $assets->count();
|
||||
$assets = $assets->skip($offset)->take($limit)->get();
|
||||
|
||||
|
||||
$actions = new \Chumper\Datatable\Columns\FunctionColumn('actions', function ($assets)
|
||||
{
|
||||
if ($assets->deleted_at=='') {
|
||||
return '<a href="'.route('update/hardware', $assets->id).'" class="btn btn-warning btn-sm"><i class="fa fa-pencil icon-white"></i></a> <a data-html="false" class="btn delete-asset btn-danger btn-sm" data-toggle="modal" href="'.route('delete/hardware', $assets->id).'" data-content="'.Lang::get('admin/hardware/message.delete.confirm').'" data-title="'.Lang::get('general.delete').' '.htmlspecialchars($assets->asset_tag).'?" onClick="return false;"><i class="fa fa-trash icon-white"></i></a>';
|
||||
} elseif ($assets->model->deleted_at=='') {
|
||||
return '<a href="'.route('restore/hardware', $assets->id).'" class="btn btn-warning btn-sm"><i class="fa fa-recycle icon-white"></i></a>';
|
||||
}
|
||||
$rows = array();
|
||||
foreach ($assets as $asset) {
|
||||
$inout = '';
|
||||
$actions = '';
|
||||
if ($asset->deleted_at=='') {
|
||||
$actions = '<div style=" white-space: nowrap;"><a href="'.route('clone/hardware', $asset->id).'" class="btn btn-info btn-sm" title="Clone asset"><i class="fa fa-files-o"></i></a> <a href="'.route('update/hardware', $asset->id).'" class="btn btn-warning btn-sm"><i class="fa fa-pencil icon-white"></i></a> <a data-html="false" class="btn delete-asset btn-danger btn-sm" data-toggle="modal" href="'.route('delete/hardware', $asset->id).'" data-content="'.Lang::get('admin/hardware/message.delete.confirm').'" data-title="'.Lang::get('general.delete').' '.htmlspecialchars($asset->asset_tag).'?" onClick="return false;"><i class="fa fa-trash icon-white"></i></a></div>';
|
||||
} elseif ($asset->model->deleted_at=='') {
|
||||
$actions = '<a href="'.route('restore/hardware', $asset->id).'" class="btn btn-warning btn-sm"><i class="fa fa-recycle icon-white"></i></a>';
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
$inout = new \Chumper\Datatable\Columns\FunctionColumn('inout', function ($assets)
|
||||
{
|
||||
if ($assets->assetstatus->deployable != 0) {
|
||||
if (($assets->assigned_to !='') && ($assets->assigned_to > 0)) {
|
||||
return '<a href="'.route('checkin/hardware', $assets->id).'" class="btn btn-primary btn-sm">'.Lang::get('general.checkin').'</a>';
|
||||
if ($asset->assetstatus) {
|
||||
if ($asset->assetstatus->deployable != 0) {
|
||||
if (($asset->assigned_to !='') && ($asset->assigned_to > 0)) {
|
||||
$inout = '<a href="'.route('checkin/hardware', $asset->id).'" class="btn btn-primary btn-sm">'.Lang::get('general.checkin').'</a>';
|
||||
} else {
|
||||
return '<a href="'.route('checkout/hardware', $assets->id).'" class="btn btn-info btn-sm">'.Lang::get('general.checkout').'</a>';
|
||||
$inout = '<a href="'.route('checkout/hardware', $asset->id).'" class="btn btn-info btn-sm">'.Lang::get('general.checkout').'</a>';
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
$rows[] = array(
|
||||
'checkbox' =>'<div class="text-center"><input type="checkbox" name="edit_asset['.$asset->id.']" class="one_required"></div>',
|
||||
'id' => $asset->id,
|
||||
'image' => ($asset->image!='') ? '<img src="'.Config::get('app.url').'/uploads/assets/'.$asset->image.'" height=50 width=50>' : (($asset->model->image!='') ? '<img src="'.Config::get('app.url').'/uploads/models/'.$asset->model->image.'" height=40 width=50>' : ''),
|
||||
'name' => '<a title="'.$asset->name.'" href="hardware/'.$asset->id.'/view">'.$asset->name.'</a>',
|
||||
'asset_tag' => '<a title="'.$asset->asset_tag.'" href="hardware/'.$asset->id.'/view">'.$asset->asset_tag.'</a>',
|
||||
'serial' => $asset->serial,
|
||||
'model' => ($asset->model) ? link_to('/hardware/models/'.$asset->model->id.'/view', $asset->model->name) : 'No model',
|
||||
'status' => ($asset->assigneduser) ? link_to('../admin/users/'.$asset->assigned_to.'/view', $asset->assigneduser->fullName()) : (($asset->assetstatus) ? $asset->assetstatus->name : ''),
|
||||
'location' => (($asset->assigneduser) && ($asset->assigneduser->userloc!='')) ? link_to('admin/settings/locations/'.$asset->assigneduser->userloc->id.'/edit', $asset->assigneduser->userloc->name) : (($asset->defaultLoc!='') ? link_to('admin/settings/locations/'.$asset->defaultLoc->id.'/edit', $asset->defaultLoc->name) : ''),
|
||||
'category' => (($asset->model) && ($asset->model->category)) ? $asset->model->category->name : '',
|
||||
'eol' => ($asset->eol_date()) ? $asset->eol_date() : '',
|
||||
'notes' => $asset->notes,
|
||||
'order_number' => ($asset->order_number!='') ? '<a href="../hardware/?order_number='.$asset->order_number.'">'.$asset->order_number.'</a>' : '',
|
||||
'last_checkout' => ($asset->last_checkout!='') ? $asset->last_checkout : '',
|
||||
'expected_checkin' => ($asset->expected_checkin!='') ? $asset->expected_checkin : '',
|
||||
'change' => ($inout) ? $inout : '',
|
||||
'actions' => ($actions) ? $actions : ''
|
||||
);
|
||||
}
|
||||
|
||||
$data = array('total'=>$assetCount, 'rows'=>$rows);
|
||||
|
||||
return Datatable::collection($assets)
|
||||
->addColumn('',function($assets)
|
||||
{
|
||||
return '<input type="checkbox" name="edit_asset['.$assets->id.']" class="one_required">';
|
||||
})
|
||||
->addColumn('name',function($assets)
|
||||
{
|
||||
return '<a title="'.$assets->name.'" href="hardware/'.$assets->id.'/view">'.$assets->name.'</a>';
|
||||
})
|
||||
->addColumn('asset_tag',function($assets)
|
||||
{
|
||||
return '<a title="'.$assets->asset_tag.'" href="hardware/'.$assets->id.'/view">'.$assets->asset_tag.'</a>';
|
||||
})
|
||||
|
||||
->showColumns('serial')
|
||||
|
||||
->addColumn('model',function($assets)
|
||||
{
|
||||
if ($assets->model) {
|
||||
return $assets->model->name;
|
||||
} else {
|
||||
return 'No model';
|
||||
}
|
||||
})
|
||||
|
||||
->addColumn('status',function($assets)
|
||||
{
|
||||
if ($assets->assigned_to!='') {
|
||||
return link_to('../admin/users/'.$assets->assigned_to.'/view', $assets->assigneduser->fullName());
|
||||
} else {
|
||||
if ($assets->assetstatus) {
|
||||
return $assets->assetstatus->name;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
})
|
||||
->addColumn('location',function($assets)
|
||||
{
|
||||
if ($assets->assigned_to && ($assets->assigneduser->userloc!='')) {
|
||||
return link_to('admin/settings/locations/'.$assets->assigneduser->userloc->id.'/edit', $assets->assigneduser->userloc->name);
|
||||
} elseif ($assets->defaultLoc){
|
||||
return link_to('admin/settings/locations/'.$assets->defaultLoc->id.'/edit', $assets->defaultLoc->name);
|
||||
}
|
||||
})
|
||||
->addColumn('category',function($assets)
|
||||
{
|
||||
if (isset($assets->model->category)) {
|
||||
return $assets->model->category->name;
|
||||
} else {
|
||||
return 'No category';
|
||||
}
|
||||
|
||||
})
|
||||
|
||||
->addColumn('eol',function($assets)
|
||||
{
|
||||
return $assets->eol_date();
|
||||
})
|
||||
|
||||
|
||||
->addColumn('checkout_date',function($assets)
|
||||
{
|
||||
if (($assets->assigned_to!='') && ($assets->assetlog->first())) {
|
||||
return $assets->assetlog->first()->created_at->format('Y-m-d');
|
||||
}
|
||||
|
||||
})
|
||||
->addColumn($inout)
|
||||
->addColumn($actions)
|
||||
->searchColumns('name', 'asset_tag', 'serial', 'model', 'status','location','eol','checkout_date', 'inout','category')
|
||||
->orderColumns('name', 'asset_tag', 'serial', 'model', 'status','location','eol','checkout_date', 'inout')
|
||||
->make();
|
||||
|
||||
}
|
||||
return $data;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,7 +11,6 @@ use Sentry;
|
||||
use Str;
|
||||
use Validator;
|
||||
use View;
|
||||
use Datatable;
|
||||
|
||||
class CategoriesController extends AdminController
|
||||
{
|
||||
@@ -36,7 +35,7 @@ class CategoriesController extends AdminController
|
||||
public function getCreate()
|
||||
{
|
||||
// Show the page
|
||||
$category_types= array('' => '', 'asset' => 'Asset', 'accessory' => 'Accessory', 'consumable' => 'Consumable');
|
||||
$category_types= categoryTypeList();
|
||||
return View::make('backend/categories/edit')->with('category',new Category)
|
||||
->with('category_types',$category_types);
|
||||
}
|
||||
@@ -68,6 +67,7 @@ class CategoriesController extends AdminController
|
||||
$category->eula_text = e(Input::get('eula_text'));
|
||||
$category->use_default_eula = e(Input::get('use_default_eula', '0'));
|
||||
$category->require_acceptance = e(Input::get('require_acceptance', '0'));
|
||||
$category->checkin_email = e(Input::get('checkin_email', '0'));
|
||||
$category->user_id = Sentry::getId();
|
||||
|
||||
// Was the asset created?
|
||||
@@ -145,6 +145,7 @@ class CategoriesController extends AdminController
|
||||
$category->eula_text = e(Input::get('eula_text'));
|
||||
$category->use_default_eula = e(Input::get('use_default_eula', '0'));
|
||||
$category->require_acceptance = e(Input::get('require_acceptance', '0'));
|
||||
$category->checkin_email = e(Input::get('checkin_email', '0'));
|
||||
|
||||
// Was the asset created?
|
||||
if($category->save()) {
|
||||
@@ -216,61 +217,122 @@ class CategoriesController extends AdminController
|
||||
public function getDatatable()
|
||||
{
|
||||
// Grab all the categories
|
||||
$categories = Category::orderBy('created_at', 'DESC')->get();
|
||||
$categories = Category::with('assets', 'accessories');
|
||||
|
||||
$actions = new \Chumper\Datatable\Columns\FunctionColumn('actions', function($categories) {
|
||||
return '<a href="'.route('update/category', $categories->id).'" class="btn btn-warning btn-sm" style="margin-right:5px;"><i class="fa fa-pencil icon-white"></i></a><a data-html="false" class="btn delete-asset btn-danger btn-sm" data-toggle="modal" href="'.route('delete/category', $categories->id).'" data-content="'.Lang::get('admin/categories/message.delete.confirm').'" data-title="'.Lang::get('general.delete').' '.htmlspecialchars($categories->name).'?" onClick="return false;"><i class="fa fa-trash icon-white"></i></a>';
|
||||
});
|
||||
if (Input::has('search')) {
|
||||
$categories = $categories->TextSearch(e(Input::get('search')));
|
||||
}
|
||||
|
||||
return Datatable::collection($categories)
|
||||
->showColumns('name')
|
||||
->addColumn('category_type', function($categories) {
|
||||
return ucwords($categories->category_type);
|
||||
})
|
||||
->addColumn('count', function($categories) {
|
||||
return ($categories->category_type=='asset') ? link_to('/admin/settings/categories/'.$categories->id.'/view', $categories->assetscount()) : $categories->accessoriescount();
|
||||
})
|
||||
->addColumn('acceptance', function($categories) {
|
||||
return ($categories->require_acceptance=='1') ? '<i class="fa fa-check" style="margin-right:50%;margin-left:50%;"></i>' : '';
|
||||
})
|
||||
->addColumn('eula', function($categories) {
|
||||
return ($categories->getEula()) ? '<i class="fa fa-check" style="margin-right:50%;margin-left:50%;"></i></a>' : '';
|
||||
})
|
||||
->addColumn($actions)
|
||||
->searchColumns('name','category_type','count','acceptance','eula','actions')
|
||||
->orderColumns('name','category_type','count','acceptance','eula','actions')
|
||||
->make();
|
||||
if (Input::has('offset')) {
|
||||
$offset = e(Input::get('offset'));
|
||||
} else {
|
||||
$offset = 0;
|
||||
}
|
||||
|
||||
if (Input::has('limit')) {
|
||||
$limit = e(Input::get('limit'));
|
||||
} else {
|
||||
$limit = 50;
|
||||
}
|
||||
|
||||
|
||||
$allowed_columns = ['id','name','category_type'];
|
||||
$order = Input::get('order') === 'asc' ? 'asc' : 'desc';
|
||||
$sort = in_array(Input::get('sort'), $allowed_columns) ? Input::get('sort') : 'created_at';
|
||||
|
||||
$categories = $categories->orderBy($sort, $order);
|
||||
|
||||
$catCount = $categories->count();
|
||||
$categories = $categories->skip($offset)->take($limit)->get();
|
||||
|
||||
$rows = array();
|
||||
|
||||
foreach ($categories as $category) {
|
||||
$actions = '<a href="'.route('update/category', $category->id).'" class="btn btn-warning btn-sm" style="margin-right:5px;"><i class="fa fa-pencil icon-white"></i></a><a data-html="false" class="btn delete-asset btn-danger btn-sm" data-toggle="modal" href="'.route('delete/category', $category->id).'" data-content="'.Lang::get('admin/categories/message.delete.confirm').'" data-title="'.Lang::get('general.delete').' '.htmlspecialchars($category->name).'?" onClick="return false;"><i class="fa fa-trash icon-white"></i></a>';
|
||||
|
||||
$rows[] = array(
|
||||
'id' => $category->id,
|
||||
'name' => link_to('/admin/settings/categories/'.$category->id.'/view', $category->name) ,
|
||||
'category_type' => ucwords($category->category_type),
|
||||
'count' => ($category->category_type=='asset') ? $category->assetscount() : $category->accessoriescount(),
|
||||
'acceptance' => ($category->require_acceptance=='1') ? '<i class="fa fa-check"></i>' : '',
|
||||
//EULA is still not working correctly
|
||||
'eula' => ($category->getEula()) ? '<i class="fa fa-check"></i>' : '',
|
||||
'actions' => $actions
|
||||
);
|
||||
}
|
||||
|
||||
$data = array('total' => $catCount, 'rows' => $rows);
|
||||
|
||||
return $data;
|
||||
}
|
||||
|
||||
public function getDataView($categoryID) {
|
||||
$category = Category::find($categoryID);
|
||||
$categoryassets = $category->assets;
|
||||
|
||||
$actions = new \Chumper\Datatable\Columns\FunctionColumn('actions', function ($categoryassets)
|
||||
{
|
||||
if (($categoryassets->assigned_to !='') && ($categoryassets->assigned_to > 0)) {
|
||||
return '<a href="'.route('checkin/hardware', $categoryassets->id).'" class="btn btn-primary btn-sm">'.Lang::get('general.checkin').'</a>';
|
||||
$category = Category::find($categoryID);
|
||||
$category_assets = $category->assets;
|
||||
|
||||
if (Input::has('search')) {
|
||||
$category_assets = $category_assets->TextSearch(e(Input::get('search')));
|
||||
}
|
||||
|
||||
if (Input::has('offset')) {
|
||||
$offset = e(Input::get('offset'));
|
||||
} else {
|
||||
$offset = 0;
|
||||
}
|
||||
|
||||
if (Input::has('limit')) {
|
||||
$limit = e(Input::get('limit'));
|
||||
} else {
|
||||
$limit = 50;
|
||||
}
|
||||
|
||||
$order = Input::get('order') === 'asc' ? 'asc' : 'desc';
|
||||
|
||||
$allowed_columns = ['id','name','serial','asset_tag'];
|
||||
$sort = in_array(Input::get('sort'), $allowed_columns) ? Input::get('sort') : 'created_at';
|
||||
$count = $category_assets->count();
|
||||
|
||||
$rows = array();
|
||||
|
||||
foreach ($category_assets as $asset) {
|
||||
|
||||
$actions = '';
|
||||
$inout='';
|
||||
|
||||
if ($asset->deleted_at=='') {
|
||||
$actions = '<div style=" white-space: nowrap;"><a href="'.route('clone/hardware', $asset->id).'" class="btn btn-info btn-sm" title="Clone asset"><i class="fa fa-files-o"></i></a> <a href="'.route('update/hardware', $asset->id).'" class="btn btn-warning btn-sm"><i class="fa fa-pencil icon-white"></i></a> <a data-html="false" class="btn delete-asset btn-danger btn-sm" data-toggle="modal" href="'.route('delete/hardware', $asset->id).'" data-content="'.Lang::get('admin/hardware/message.delete.confirm').'" data-title="'.Lang::get('general.delete').' '.htmlspecialchars($asset->asset_tag).'?" onClick="return false;"><i class="fa fa-trash icon-white"></i></a></div>';
|
||||
} elseif ($asset->deleted_at!='') {
|
||||
$actions = '<a href="'.route('restore/hardware', $asset->id).'" class="btn btn-warning btn-sm"><i class="fa fa-recycle icon-white"></i></a>';
|
||||
}
|
||||
|
||||
if ($asset->assetstatus) {
|
||||
if ($asset->assetstatus->deployable != 0) {
|
||||
if (($asset->assigned_to !='') && ($asset->assigned_to > 0)) {
|
||||
$inout = '<a href="'.route('checkin/hardware', $asset->id).'" class="btn btn-primary btn-sm">'.Lang::get('general.checkin').'</a>';
|
||||
} else {
|
||||
return '<a href="'.route('checkout/hardware', $categoryassets->id).'" class="btn btn-info btn-sm">'.Lang::get('general.checkout').'</a>';
|
||||
$inout = '<a href="'.route('checkout/hardware', $asset->id).'" class="btn btn-info btn-sm">'.Lang::get('general.checkout').'</a>';
|
||||
}
|
||||
});
|
||||
|
||||
return Datatable::collection($categoryassets)
|
||||
->addColumn('name', function ($categoryassets) {
|
||||
return link_to('/hardware/'.$categoryassets->id.'/view', $categoryassets->name);
|
||||
})
|
||||
->addColumn('asset_tag', function ($categoryassets) {
|
||||
return link_to('/hardware/'.$categoryassets->id.'/view', $categoryassets->asset_tag);
|
||||
})
|
||||
->addColumn('assigned_to', function ($categoryassets) {
|
||||
if ($categoryassets->assigned_to) {
|
||||
return link_to('/admin/users/'.$categoryassets->assigned_to.'/view', $categoryassets->assigneduser->fullName());
|
||||
}
|
||||
})
|
||||
->addColumn($actions)
|
||||
->searchColumns('name','asset_tag','assigned_to','actions')
|
||||
->orderColumns('name','asset_tag','assigned_to','actions')
|
||||
->make();
|
||||
}
|
||||
|
||||
$rows[] = array(
|
||||
'id' => $asset->id,
|
||||
'name' => link_to('/hardware/'.$asset->id.'/view', $asset->showAssetName()),
|
||||
'model' => $asset->model->name,
|
||||
'asset_tag' => $asset->asset_tag,
|
||||
'serial' => $asset->serial,
|
||||
'assigned_to' => ($asset->assigneduser) ? link_to('/admin/users/'.$asset->assigneduser->id.'/view', $asset->assigneduser->fullName()): '',
|
||||
'change' => $inout,
|
||||
'actions' => $actions,
|
||||
|
||||
|
||||
);
|
||||
}
|
||||
|
||||
$data = array('total' => $count, 'rows' => $rows);
|
||||
return $data;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -66,10 +66,24 @@ class ConsumablesController extends AdminController
|
||||
else{
|
||||
|
||||
// Update the consumable data
|
||||
$consumable->name = e(Input::get('name'));
|
||||
$consumable->category_id = e(Input::get('category_id'));
|
||||
$consumable->qty = e(Input::get('qty'));
|
||||
$consumable->user_id = Sentry::getId();
|
||||
$consumable->name = e(Input::get('name'));
|
||||
$consumable->category_id = e(Input::get('category_id'));
|
||||
$consumable->order_number = e(Input::get('order_number'));
|
||||
|
||||
if (e(Input::get('purchase_date')) == '') {
|
||||
$consumable->purchase_date = NULL;
|
||||
} else {
|
||||
$consumable->purchase_date = e(Input::get('purchase_date'));
|
||||
}
|
||||
|
||||
if (e(Input::get('purchase_cost')) == '0.00') {
|
||||
$consumable->purchase_cost = NULL;
|
||||
} else {
|
||||
$consumable->purchase_cost = ParseFloat(e(Input::get('purchase_cost')));
|
||||
}
|
||||
|
||||
$consumable->qty = e(Input::get('qty'));
|
||||
$consumable->user_id = Sentry::getId();
|
||||
|
||||
// Was the consumable created?
|
||||
if($consumable->save()) {
|
||||
@@ -134,9 +148,23 @@ class ConsumablesController extends AdminController
|
||||
else {
|
||||
|
||||
// Update the consumable data
|
||||
$consumable->name = e(Input::get('name'));
|
||||
$consumable->category_id = e(Input::get('category_id'));
|
||||
$consumable->qty = e(Input::get('qty'));
|
||||
$consumable->name = e(Input::get('name'));
|
||||
$consumable->category_id = e(Input::get('category_id'));
|
||||
$consumable->order_number = e(Input::get('order_number'));
|
||||
|
||||
if (e(Input::get('purchase_date')) == '') {
|
||||
$consumable->purchase_date = NULL;
|
||||
} else {
|
||||
$consumable->purchase_date = e(Input::get('purchase_date'));
|
||||
}
|
||||
|
||||
if (e(Input::get('purchase_cost')) == '0.00') {
|
||||
$consumable->purchase_cost = NULL;
|
||||
} else {
|
||||
$consumable->purchase_cost = ParseFloat(e(Input::get('purchase_cost')));
|
||||
}
|
||||
|
||||
$consumable->qty = e(Input::get('qty'));
|
||||
|
||||
// Was the consumable created?
|
||||
if($consumable->save()) {
|
||||
@@ -164,21 +192,11 @@ class ConsumablesController extends AdminController
|
||||
return Redirect::to('admin/consumables')->with('error', Lang::get('admin/consumables/message.not_found'));
|
||||
}
|
||||
|
||||
|
||||
if ($consumable->hasUsers() > 0) {
|
||||
return Redirect::to('admin/consumables')->with('error', Lang::get('admin/consumables/message.assoc_users', array('count'=> $consumable->hasUsers())));
|
||||
} else {
|
||||
$consumable->delete();
|
||||
|
||||
// Redirect to the locations management page
|
||||
return Redirect::to('admin/consumables')->with('success', Lang::get('admin/consumables/message.delete.success'));
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -218,7 +236,7 @@ class ConsumablesController extends AdminController
|
||||
}
|
||||
|
||||
// Get the dropdown of users and then pass it to the checkout view
|
||||
$users_list = array('' => 'Select a User') + DB::table('users')->select(DB::raw('concat(last_name,", ",first_name) as full_name, id'))->whereNull('deleted_at')->orderBy('last_name', 'asc')->orderBy('first_name', 'asc')->lists('full_name', 'id');
|
||||
$users_list = array('' => 'Select a User') + DB::table('users')->select(DB::raw('concat(last_name,", ",first_name," (",username,")") as full_name, id'))->whereNull('deleted_at')->orderBy('last_name', 'asc')->orderBy('first_name', 'asc')->lists('full_name', 'id');
|
||||
|
||||
return View::make('backend/consumables/checkout', compact('consumable'))->with('users_list',$users_list);
|
||||
|
||||
@@ -322,6 +340,10 @@ class ConsumablesController extends AdminController
|
||||
$data['eula'] = $consumable->getEula();
|
||||
$data['first_name'] = $user->first_name;
|
||||
$data['item_name'] = $consumable->name;
|
||||
$data['checkout_date'] = $logaction->created_at;
|
||||
$data['item_tag'] = '';
|
||||
$data['expected_checkin'] = '';
|
||||
$data['note'] = $logaction->note;
|
||||
$data['require_acceptance'] = $consumable->requireAcceptance();
|
||||
|
||||
|
||||
@@ -344,47 +366,70 @@ class ConsumablesController extends AdminController
|
||||
public function getDatatable()
|
||||
{
|
||||
$consumables = Consumable::select(array('id','name','qty'))
|
||||
->whereNull('deleted_at')
|
||||
->orderBy('created_at', 'DESC');
|
||||
->whereNull('deleted_at');
|
||||
|
||||
$consumables = $consumables->get();
|
||||
if (Input::has('search')) {
|
||||
$consumables = $consumables->TextSearch(Input::get('search'));
|
||||
}
|
||||
|
||||
$actions = new \Chumper\Datatable\Columns\FunctionColumn('actions',function($consumables)
|
||||
{
|
||||
return '<a href="'.route('checkout/consumable', $consumables->id).'" style="margin-right:5px;" class="btn btn-info btn-sm" '.(($consumables->numRemaining() > 0 ) ? '' : ' disabled').'>'.Lang::get('general.checkout').'</a><a href="'.route('update/consumable', $consumables->id).'" class="btn btn-warning btn-sm" style="margin-right:5px;"><i class="fa fa-pencil icon-white"></i></a><a data-html="false" class="btn delete-asset btn-danger btn-sm" data-toggle="modal" href="'.route('delete/consumable', $consumables->id).'" data-content="'.Lang::get('admin/consumables/message.delete.confirm').'" data-title="'.Lang::get('general.delete').' '.htmlspecialchars($consumables->name).'?" onClick="return false;"><i class="fa fa-trash icon-white"></i></a>';
|
||||
});
|
||||
if (Input::has('offset')) {
|
||||
$offset = e(Input::get('offset'));
|
||||
} else {
|
||||
$offset = 0;
|
||||
}
|
||||
|
||||
if (Input::has('limit')) {
|
||||
$limit = e(Input::get('limit'));
|
||||
} else {
|
||||
$limit = 50;
|
||||
}
|
||||
|
||||
$allowed_columns = ['id','name'];
|
||||
$order = Input::get('order') === 'asc' ? 'asc' : 'desc';
|
||||
$sort = in_array(Input::get('sort'), $allowed_columns) ? Input::get('sort') : 'created_at';
|
||||
|
||||
$consumables->orderBy($sort, $order);
|
||||
|
||||
$consumCount = $consumables->count();
|
||||
$consumables = $consumables->skip($offset)->take($limit)->get();
|
||||
|
||||
$rows = array();
|
||||
|
||||
foreach($consumables as $consumable) {
|
||||
$actions = '<a href="'.route('checkout/consumable', $consumable->id).'" style="margin-right:5px;" class="btn btn-info btn-sm" '.(($consumable->numRemaining() > 0 ) ? '' : ' disabled').'>'.Lang::get('general.checkout').'</a><a href="'.route('update/consumable', $consumable->id).'" class="btn btn-warning btn-sm" style="margin-right:5px;"><i class="fa fa-pencil icon-white"></i></a><a data-html="false" class="btn delete-asset btn-danger btn-sm" data-toggle="modal" href="'.route('delete/consumable', $consumable->id).'" data-content="'.Lang::get('admin/consumables/message.delete.confirm').'" data-title="'.Lang::get('general.delete').' '.htmlspecialchars($consumable->name).'?" onClick="return false;"><i class="fa fa-trash icon-white"></i></a>';
|
||||
|
||||
$rows[] = array(
|
||||
'id' => $consumable->id,
|
||||
'name' => link_to('admin/consumables/'.$consumable->id.'/view', $consumable->name),
|
||||
'qty' => $consumable->qty,
|
||||
'numRemaining' => $consumable->numRemaining(),
|
||||
'actions' => $actions
|
||||
);
|
||||
}
|
||||
|
||||
$data = array('total' => $consumCount, 'rows' => $rows);
|
||||
|
||||
return $data;
|
||||
|
||||
return Datatable::collection($consumables)
|
||||
->addColumn('name',function($consumables)
|
||||
{
|
||||
return link_to('admin/consumables/'.$consumables->id.'/view', $consumables->name);
|
||||
})
|
||||
->addColumn('qty',function($consumables)
|
||||
{
|
||||
return $consumables->qty;
|
||||
})
|
||||
->addColumn('numRemaining',function($consumables)
|
||||
{
|
||||
return $consumables->numRemaining();
|
||||
})
|
||||
->addColumn($actions)
|
||||
->searchColumns('name','qty','numRemaining','actions')
|
||||
->orderColumns('name','qty','numRemaining','actions')
|
||||
->make();
|
||||
}
|
||||
|
||||
public function getDataView($consumableID)
|
||||
{
|
||||
$consumable = Consumable::find($consumableID);
|
||||
$consumable_users = $consumable->users;
|
||||
$count = $consumable_users->count();
|
||||
|
||||
$rows = array();
|
||||
|
||||
return Datatable::collection($consumable_users)
|
||||
->addColumn('name',function($consumable_users)
|
||||
{
|
||||
return link_to('/admin/users/'.$consumable_users->id.'/view', $consumable_users->fullName());
|
||||
})
|
||||
->make();
|
||||
foreach ($consumable_users as $user) {
|
||||
$rows[] = array(
|
||||
'name' => link_to('/admin/users/'.$user->id.'/view', $user->fullName())
|
||||
);
|
||||
}
|
||||
|
||||
$data = array('total' => $count, 'rows' => $rows);
|
||||
|
||||
return $data;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -22,9 +22,6 @@ class DepreciationsController extends AdminController
|
||||
|
||||
public function getIndex()
|
||||
{
|
||||
// Grab all the depreciations
|
||||
$depreciations = Depreciation::orderBy('created_at', 'DESC')->get();
|
||||
|
||||
// Show the page
|
||||
return View::make('backend/depreciations/index', compact('depreciations'));
|
||||
}
|
||||
@@ -123,7 +120,7 @@ class DepreciationsController extends AdminController
|
||||
|
||||
if ($validator->fails())
|
||||
{
|
||||
// The given data did not pass validation
|
||||
// The given data did not pass validation
|
||||
return Redirect::back()->withInput()->withErrors($validator->messages());
|
||||
}
|
||||
// attempt validation
|
||||
@@ -137,7 +134,7 @@ class DepreciationsController extends AdminController
|
||||
// Redirect to the depreciation page
|
||||
return Redirect::to("admin/settings/depreciations/")->with('success', Lang::get('admin/depreciations/message.update.success'));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Redirect to the depreciation management page
|
||||
return Redirect::to("admin/settings/depreciations/$depreciationId/edit")->with('error', Lang::get('admin/depreciations/message.update.error'));
|
||||
@@ -174,5 +171,55 @@ class DepreciationsController extends AdminController
|
||||
}
|
||||
|
||||
|
||||
public function getDatatable()
|
||||
{
|
||||
$depreciations = Depreciation::select(array('id','name','months'));
|
||||
|
||||
if (Input::has('search')) {
|
||||
$depreciations = $depreciations->TextSearch(e(Input::get('search')));
|
||||
}
|
||||
|
||||
if (Input::has('offset')) {
|
||||
$offset = e(Input::get('offset'));
|
||||
} else {
|
||||
$offset = 0;
|
||||
}
|
||||
|
||||
if (Input::has('limit')) {
|
||||
$limit = e(Input::get('limit'));
|
||||
} else {
|
||||
$limit = 50;
|
||||
}
|
||||
|
||||
$allowed_columns = ['id','name','months'];
|
||||
$order = Input::get('order') === 'asc' ? 'asc' : 'desc';
|
||||
$sort = in_array(Input::get('sort'), $allowed_columns) ? Input::get('sort') : 'created_at';
|
||||
|
||||
$depreciations->orderBy($sort, $order);
|
||||
|
||||
$depreciationsCount = $depreciations->count();
|
||||
$depreciations = $depreciations->skip($offset)->take($limit)->get();
|
||||
|
||||
$rows = array();
|
||||
|
||||
foreach($depreciations as $depreciation) {
|
||||
$actions = '<a href="'.route('update/depreciations', $depreciation->id).'" class="btn btn-warning btn-sm" style="margin-right:5px;"><i class="fa fa-pencil icon-white"></i></a><a data-html="false" class="btn delete-asset btn-danger btn-sm" data-toggle="modal" href="'.route('delete/depreciations', $depreciation->id).'" data-content="'.Lang::get('admin/depreciations/message.delete.confirm').'" data-title="'.Lang::get('general.delete').' '.htmlspecialchars($depreciation->name).'?" onClick="return false;"><i class="fa fa-trash icon-white"></i></a>';
|
||||
|
||||
$rows[] = array(
|
||||
'id' => $depreciation->id,
|
||||
'name' => $depreciation->name,
|
||||
'months' => $depreciation->months,
|
||||
'actions' => $actions
|
||||
);
|
||||
}
|
||||
|
||||
$data = array('total' => $depreciationsCount, 'rows' => $rows);
|
||||
|
||||
return $data;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -81,7 +81,7 @@ class GroupsController extends AdminController
|
||||
// Was the group created?
|
||||
if ($group = Sentry::getGroupProvider()->create($inputs)) {
|
||||
// Redirect to the new group page
|
||||
return Redirect::route('update/group', $group->id)->with('success', Lang::get('admin/groups/message.success.create'));
|
||||
return Redirect::route('groups')->with('success', Lang::get('admin/groups/message.success.create'));
|
||||
}
|
||||
|
||||
// Redirect to the new group page
|
||||
@@ -163,7 +163,7 @@ class GroupsController extends AdminController
|
||||
|
||||
if (!Config::get('app.lock_passwords')) {
|
||||
|
||||
try {
|
||||
try {
|
||||
// Update the group data
|
||||
$group->name = Input::get('name');
|
||||
$group->permissions = Input::get('permissions');
|
||||
@@ -196,18 +196,22 @@ class GroupsController extends AdminController
|
||||
*/
|
||||
public function getDelete($id = null)
|
||||
{
|
||||
try {
|
||||
// Get group information
|
||||
$group = Sentry::getGroupProvider()->findById($id);
|
||||
if (!Config::get('app.lock_passwords')) {
|
||||
try {
|
||||
// Get group information
|
||||
$group = Sentry::getGroupProvider()->findById($id);
|
||||
|
||||
// Delete the group
|
||||
$group->delete();
|
||||
// Delete the group
|
||||
$group->delete();
|
||||
|
||||
// Redirect to the group management page
|
||||
return Redirect::route('groups')->with('success', Lang::get('admin/groups/message.success.delete'));
|
||||
} catch (GroupNotFoundException $e) {
|
||||
// Redirect to the group management page
|
||||
return Redirect::route('groups')->with('error', Lang::get('admin/groups/message.group_not_found', compact('id')));
|
||||
// Redirect to the group management page
|
||||
return Redirect::route('groups')->with('success', Lang::get('admin/groups/message.success.delete'));
|
||||
} catch (GroupNotFoundException $e) {
|
||||
// Redirect to the group management page
|
||||
return Redirect::route('groups')->with('error', Lang::get('admin/groups/message.group_not_found', compact('id')));
|
||||
}
|
||||
} else {
|
||||
return Redirect::route('groups')->with('error', Lang::get('general.feature_disabled'));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -101,6 +101,12 @@ class LicensesController extends AdminController
|
||||
$license->maintained = e(Input::get('maintained'));
|
||||
}
|
||||
|
||||
if ( e(Input::get('reassignable')) == '') {
|
||||
$license->reassignable = 0;
|
||||
} else {
|
||||
$license->reassignable = e(Input::get('reassignable'));
|
||||
}
|
||||
|
||||
if ( e(Input::get('purchase_order')) == '') {
|
||||
$license->purchase_order = '';
|
||||
} else {
|
||||
@@ -135,7 +141,7 @@ class LicensesController extends AdminController
|
||||
|
||||
// Was the license created?
|
||||
if($license->save()) {
|
||||
|
||||
|
||||
$insertedId = $license->id;
|
||||
// Save the license seat data
|
||||
for ($x=0; $x<$license->seats; $x++) {
|
||||
@@ -408,7 +414,7 @@ class LicensesController extends AdminController
|
||||
}
|
||||
|
||||
// Get the dropdown of users and then pass it to the checkout view
|
||||
$users_list = array('' => 'Select a User') + DB::table('users')->select(DB::raw('concat(last_name,", ",first_name) as full_name, id'))->whereNull('deleted_at')->orderBy('last_name', 'asc')->orderBy('first_name', 'asc')->lists('full_name', 'id');
|
||||
$users_list = array('' => 'Select a User') + DB::table('users')->select(DB::raw('concat(last_name,", ",first_name," (",username,")") as full_name, id'))->whereNull('deleted_at')->orderBy('last_name', 'asc')->orderBy('first_name', 'asc')->lists('full_name', 'id');
|
||||
|
||||
|
||||
// Left join to get a list of assets and some other helpful info
|
||||
@@ -524,7 +530,7 @@ class LicensesController extends AdminController
|
||||
$logaction->asset_id = $licenseseat->license_id;
|
||||
|
||||
|
||||
$license = License::find($licenseseat->license_id);
|
||||
$license = License::find($licenseseat->license_id);
|
||||
$settings = Setting::getSettings();
|
||||
|
||||
|
||||
@@ -533,23 +539,23 @@ class LicensesController extends AdminController
|
||||
$logaction->checkedout_to = NULL;
|
||||
$slack_msg = strtoupper($logaction->asset_type).' license <'.Config::get('app.url').'/admin/licenses/'.$license->id.'/view'.'|'.$license->name.'> checked out to <'.Config::get('app.url').'/hardware/'.$is_asset_id->id.'/view|'.$is_asset_id->showAssetName().'> by <'.Config::get('app.url').'/admin/users/'.$user->id.'/view'.'|'.$user->fullName().'>.';
|
||||
} else {
|
||||
$logaction->checkedout_to = e(Input::get('assigned_to'));
|
||||
$logaction->checkedout_to = e(Input::get('assigned_to'));
|
||||
$slack_msg = strtoupper($logaction->asset_type).' license <'.Config::get('app.url').'/admin/licenses/'.$license->id.'/view'.'|'.$license->name.'> checked out to <'.Config::get('app.url').'/admin/users/'.$is_assigned_to->id.'/view|'.$is_assigned_to->fullName().'> by <'.Config::get('app.url').'/admin/users/'.$user->id.'/view'.'|'.$user->fullName().'>.';
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
if ($settings->slack_endpoint) {
|
||||
|
||||
|
||||
|
||||
$slack_settings = [
|
||||
'username' => $settings->botname,
|
||||
'channel' => $settings->slack_channel,
|
||||
'link_names' => true
|
||||
];
|
||||
|
||||
|
||||
$client = new \Maknz\Slack\Client($settings->slack_endpoint,$slack_settings);
|
||||
|
||||
|
||||
try {
|
||||
$client->attach([
|
||||
'color' => 'good',
|
||||
@@ -563,13 +569,13 @@ class LicensesController extends AdminController
|
||||
'value' => e($logaction->note)
|
||||
],
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
]
|
||||
])->send('License Checked Out');
|
||||
|
||||
|
||||
} catch (Exception $e) {
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -612,7 +618,7 @@ class LicensesController extends AdminController
|
||||
// Redirect to the asset management page with error
|
||||
return Redirect::to('admin/licenses')->with('error', Lang::get('admin/licenses/message.not_found'));
|
||||
}
|
||||
|
||||
|
||||
$license = License::find($licenseseat->license_id);
|
||||
|
||||
if(!$license->reassignable) {
|
||||
@@ -620,7 +626,7 @@ class LicensesController extends AdminController
|
||||
Session::flash('error', 'License not reassignable.');
|
||||
return Redirect::back()->withInput();
|
||||
}
|
||||
|
||||
|
||||
// Declare the rules for the form validation
|
||||
$rules = array(
|
||||
'note' => 'alpha_space',
|
||||
@@ -642,7 +648,7 @@ class LicensesController extends AdminController
|
||||
// Update the asset data
|
||||
$licenseseat->assigned_to = NULL;
|
||||
$licenseseat->asset_id = NULL;
|
||||
|
||||
|
||||
$user = Sentry::getUser();
|
||||
|
||||
// Was the asset updated?
|
||||
@@ -652,20 +658,20 @@ class LicensesController extends AdminController
|
||||
$logaction->asset_type = 'software';
|
||||
$logaction->note = e(Input::get('note'));
|
||||
$logaction->user_id = $user->id;
|
||||
|
||||
|
||||
$settings = Setting::getSettings();
|
||||
|
||||
|
||||
if ($settings->slack_endpoint) {
|
||||
|
||||
|
||||
|
||||
$slack_settings = [
|
||||
'username' => $settings->botname,
|
||||
'channel' => $settings->slack_channel,
|
||||
'link_names' => true
|
||||
];
|
||||
|
||||
|
||||
$client = new \Maknz\Slack\Client($settings->slack_endpoint,$slack_settings);
|
||||
|
||||
|
||||
try {
|
||||
$client->attach([
|
||||
'color' => 'good',
|
||||
@@ -678,20 +684,20 @@ class LicensesController extends AdminController
|
||||
'title' => 'Note:',
|
||||
'value' => e($logaction->note)
|
||||
],
|
||||
|
||||
|
||||
]
|
||||
])->send('License Checked In');
|
||||
|
||||
|
||||
} catch (Exception $e) {
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
$log = $logaction->logaction('checkin from');
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
if ($backto=='user') {
|
||||
return Redirect::to("admin/users/".$return_to.'/view')->with('success', Lang::get('admin/licenses/message.checkin.success'));
|
||||
@@ -805,7 +811,7 @@ class LicensesController extends AdminController
|
||||
}
|
||||
|
||||
} else {
|
||||
return Redirect::back()->with('success', Lang::get('admin/licenses/message.upload.nofiles'));
|
||||
return Redirect::back()->with('error', Lang::get('admin/licenses/message.upload.nofiles'));
|
||||
}
|
||||
|
||||
|
||||
@@ -881,31 +887,49 @@ class LicensesController extends AdminController
|
||||
}
|
||||
|
||||
public function getDatatable() {
|
||||
$licenses = License::orderBy('created_at', 'DESC')->get();
|
||||
$licenses = License::select('id','name','serial','purchase_date','seats');
|
||||
|
||||
$actions = new \Chumper\Datatable\Columns\FunctionColumn('actions', function($licenses) {
|
||||
return '<a href="'.route('update/license', $licenses->id).'" class="btn btn-warning btn-sm" style="margin-right:5px;"><i class="fa fa-pencil icon-white"></i></a><a data-html="false" class="btn delete-asset btn-danger btn-sm" data-toggle="modal" href="'.route('delete/license', $licenses->id).'" data-content="'.Lang::get('admin/licenses/message.delete.confirm').'" data-title="'.Lang::get('general.delete').' '.htmlspecialchars($licenses->name).'?" onClick="return false;"><i class="fa fa-trash icon-white"></i></a>';
|
||||
});
|
||||
if (Input::has('search')) {
|
||||
$licenses = $licenses->TextSearch(Input::get('search'));
|
||||
}
|
||||
|
||||
return Datatable::collection($licenses)
|
||||
->addColumn('name', function($licenses) {
|
||||
return link_to('/admin/licenses/'.$licenses->id.'/view', $licenses->name);
|
||||
})
|
||||
->addColumn('serial', function($licenses) {
|
||||
return link_to('/admin/licenses/'.$licenses->id.'/view', mb_strimwidth($licenses->serial, 0, 50, "..."));
|
||||
})
|
||||
->addColumn('totalSeats', function($licenses) {
|
||||
return $licenses->totalSeatsByLicenseID();
|
||||
})
|
||||
->addColumn('remaining', function($licenses) {
|
||||
return $licenses->remaincount();
|
||||
})
|
||||
->addColumn('purchase_date', function($licenses) {
|
||||
return $licenses->purchase_date;
|
||||
})
|
||||
->addColumn($actions)
|
||||
->searchColumns('name','serial','totalSeats','remaining','purchase_date','actions')
|
||||
->orderColumns('name','serial','totalSeats','remaining','purchase_date','actions')
|
||||
->make();
|
||||
$allowed_columns = ['id','name'];
|
||||
$order = Input::get('order') === 'asc' ? 'asc' : 'desc';
|
||||
$sort = in_array(Input::get('sort'), $allowed_columns) ? Input::get('sort') : 'created_at';
|
||||
|
||||
$licenses = $licenses->orderBy($sort, $order);
|
||||
|
||||
$licenseCount = $licenses->count();
|
||||
$licenses = $licenses->skip(Input::get('offset'))->take(Input::get('limit'))->get();
|
||||
|
||||
$rows = array();
|
||||
|
||||
foreach ($licenses as $license) {
|
||||
$actions = '<span style="white-space: nowrap;"><a href="'.route('freecheckout/license', $license->id).'" class="btn btn-primary btn-sm" style="margin-right:5px;" '.(($license->remaincount() > 0) ? '' : 'disabled').'>'.Lang::get('general.checkout').'</a> <a href="'.route('clone/license', $license->id).'" class="btn btn-info btn-sm" style="margin-right:5px;" title="Clone asset"><i class="fa fa-files-o"></i></a><a href="'.route('update/license', $license->id).'" class="btn btn-warning btn-sm" style="margin-right:5px;"><i class="fa fa-pencil icon-white"></i></a><a data-html="false" class="btn delete-asset btn-danger btn-sm" data-toggle="modal" href="'.route('delete/license', $license->id).'" data-content="'.Lang::get('admin/licenses/message.delete.confirm').'" data-title="'.Lang::get('general.delete').' '.htmlspecialchars($license->name).'?" onClick="return false;"><i class="fa fa-trash icon-white"></i></a></span>';
|
||||
|
||||
$rows[] = array(
|
||||
'id' => $license->id,
|
||||
'name' => link_to('/admin/licenses/'.$license->id.'/view', $license->name),
|
||||
'serial' => link_to('/admin/licenses/'.$license->id.'/view', mb_strimwidth($license->serial, 0, 50, "...")),
|
||||
'totalSeats' => $license->totalSeatsByLicenseID(),
|
||||
'remaining' => $license->remaincount(),
|
||||
'purchase_date' => ($license->purchase_date) ? $license->purchase_date : '',
|
||||
'actions' => $actions
|
||||
);
|
||||
}
|
||||
|
||||
$data = array('total' => $licenseCount, 'rows' => $rows);
|
||||
|
||||
return $data;
|
||||
}
|
||||
|
||||
public function getFreeLicense($licenseId) {
|
||||
// Check if the asset exists
|
||||
if (is_null($license = License::find($licenseId))) {
|
||||
// Redirect to the asset management page with error
|
||||
return Redirect::to('admin/licenses')->with('error', Lang::get('admin/licenses/message.not_found'));
|
||||
}
|
||||
$seatId = $license->freeSeat($licenseId);
|
||||
return Redirect::to('admin/licenses/'.$seatId.'/checkout');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12,6 +12,8 @@ use Str;
|
||||
use Validator;
|
||||
use View;
|
||||
|
||||
use Symfony\Component\HttpFoundation\JsonResponse;
|
||||
|
||||
class LocationsController extends AdminController
|
||||
{
|
||||
/**
|
||||
@@ -73,7 +75,7 @@ class LocationsController extends AdminController
|
||||
} else {
|
||||
$location->parent_id = e(Input::get('parent_id'));
|
||||
}
|
||||
$location->currency = e(Input::get('currency'));
|
||||
$location->currency = Input::get('currency','$');
|
||||
$location->address = e(Input::get('address'));
|
||||
$location->address2 = e(Input::get('address2'));
|
||||
$location->city = e(Input::get('city'));
|
||||
@@ -98,6 +100,52 @@ class LocationsController extends AdminController
|
||||
|
||||
}
|
||||
|
||||
public function store()
|
||||
{
|
||||
$new = Input::all();
|
||||
|
||||
$new['currency']=Setting::first()->default_currency;
|
||||
|
||||
// create a new location instance
|
||||
$location = new Location();
|
||||
|
||||
// attempt validation
|
||||
if ($location->validate($new)) {
|
||||
|
||||
// Save the location data
|
||||
$location->name = e(Input::get('name'));
|
||||
// if (Input::get('parent_id')=='') {
|
||||
// $location->parent_id = null;
|
||||
// } else {
|
||||
// $location->parent_id = e(Input::get('parent_id'));
|
||||
// }
|
||||
$location->currency = Setting::first()->default_currency; //e(Input::get('currency'));
|
||||
$location->address = ''; //e(Input::get('address'));
|
||||
// $location->address2 = e(Input::get('address2'));
|
||||
$location->city = e(Input::get('city'));
|
||||
$location->state = '';//e(Input::get('state'));
|
||||
$location->country = e(Input::get('country'));
|
||||
// $location->zip = e(Input::get('zip'));
|
||||
$location->user_id = Sentry::getId();
|
||||
|
||||
// Was the asset created?
|
||||
if($location->save()) {
|
||||
// Redirect to the new location page
|
||||
return JsonResponse::create($location);
|
||||
//return Redirect::to("admin/settings/locations")->with('success', Lang::get('admin/locations/message.create.success'));
|
||||
} else {
|
||||
return JsonResponse::create(["error" => "Couldn't save Location"],500);
|
||||
}
|
||||
} else {
|
||||
// failure
|
||||
$errors = $location->errors();
|
||||
return JsonResponse::create(["error" => "Failed validation: ".print_r($errors->all('<li>:message</li>'),true)],500);
|
||||
}
|
||||
|
||||
// Redirect to the location create page
|
||||
return Redirect::to('admin/settings/locations/create')->with('error', Lang::get('admin/locations/message.create.error'));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Location update.
|
||||
@@ -154,7 +202,7 @@ class LocationsController extends AdminController
|
||||
} else {
|
||||
$location->parent_id = e(Input::get('parent_id',''));
|
||||
}
|
||||
$location->currency = e(Input::get('currency'));
|
||||
$location->currency = Input::get('currency','$');
|
||||
$location->address = e(Input::get('address'));
|
||||
$location->address2 = e(Input::get('address2'));
|
||||
$location->city = e(Input::get('city'));
|
||||
@@ -189,10 +237,14 @@ class LocationsController extends AdminController
|
||||
}
|
||||
|
||||
|
||||
if ($location->has_users->count() > 0) {
|
||||
if ($location->users->count() > 0) {
|
||||
return Redirect::to('admin/settings/locations')->with('error', Lang::get('admin/locations/message.assoc_users'));
|
||||
} elseif ($location->childLocations->count() > 0) {
|
||||
return Redirect::to('admin/settings/locations')->with('error', Lang::get('admin/locations/message.assoc_users'));
|
||||
return Redirect::to('admin/settings/locations')->with('error', Lang::get('admin/locations/message.assoc_child_loc'));
|
||||
} elseif ($location->assets->count() > 0) {
|
||||
return Redirect::to('admin/settings/locations')->with('error', Lang::get('admin/locations/message.assoc_assets'));
|
||||
} elseif ($location->assignedassets->count() > 0) {
|
||||
return Redirect::to('admin/settings/locations')->with('error', Lang::get('admin/locations/message.assoc_assets'));
|
||||
} else {
|
||||
$location->delete();
|
||||
return Redirect::to('admin/settings/locations')->with('success', Lang::get('admin/locations/message.delete.success'));
|
||||
@@ -203,5 +255,159 @@ class LocationsController extends AdminController
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the location page detail page
|
||||
*
|
||||
* @param int $locationID
|
||||
* @return View
|
||||
**/
|
||||
public function getView($locationId = null)
|
||||
{
|
||||
$location = Location::find($locationId);
|
||||
|
||||
if (isset($location->id)) {
|
||||
return View::make('backend/locations/view', compact('location'));
|
||||
} else {
|
||||
// Prepare the error message
|
||||
$error = Lang::get('admin/locations/message.does_not_exist', compact('id'));
|
||||
|
||||
// Redirect to the user management page
|
||||
return Redirect::route('locations')->with('error', $error);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the locations API information to present to the location view page
|
||||
*
|
||||
* @param int $locationID
|
||||
* @return JSON
|
||||
**/
|
||||
public function getDatatable()
|
||||
{
|
||||
$locations = Location::select(array('locations.id','locations.name','locations.address','locations.address2','locations.city','locations.state','locations.zip','locations.country','locations.parent_id','locations.currency'))->with('assets');
|
||||
|
||||
|
||||
if (Input::has('search')) {
|
||||
$locations = $locations->TextSearch(e(Input::get('search')));
|
||||
}
|
||||
|
||||
if (Input::has('offset')) {
|
||||
$offset = e(Input::get('offset'));
|
||||
} else {
|
||||
$offset = 0;
|
||||
}
|
||||
|
||||
if (Input::has('limit')) {
|
||||
$limit = e(Input::get('limit'));
|
||||
} else {
|
||||
$limit = 50;
|
||||
}
|
||||
|
||||
$order = Input::get('order') === 'asc' ? 'asc' : 'desc';
|
||||
|
||||
|
||||
|
||||
switch (Input::get('sort'))
|
||||
{
|
||||
case 'parent':
|
||||
$locations = $locations->OrderParent($order);
|
||||
break;
|
||||
default:
|
||||
$allowed_columns = ['id','name','address','city','state','country','currency'];
|
||||
|
||||
$sort = in_array(Input::get('sort'), $allowed_columns) ? Input::get('sort') : 'created_at';
|
||||
$locations = $locations->orderBy($sort, $order);
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
$locationsCount = $locations->count();
|
||||
$locations = $locations->skip($offset)->take($limit)->get();
|
||||
|
||||
$rows = array();
|
||||
|
||||
foreach($locations as $location) {
|
||||
$actions = '<nobr><a href="'.route('update/location', $location->id).'" class="btn btn-warning btn-sm" style="margin-right:5px;"><i class="fa fa-pencil icon-white"></i></a><a data-html="false" class="btn delete-asset btn-danger btn-sm" data-toggle="modal" href="'.route('delete/location', $location->id).'" data-content="'.Lang::get('admin/locations/message.delete.confirm').'" data-title="'.Lang::get('general.delete').' '.htmlspecialchars($location->name).'?" onClick="return false;"><i class="fa fa-trash icon-white"></i></a></nobr>';
|
||||
|
||||
$rows[] = array(
|
||||
'id' => $location->id,
|
||||
'name' => link_to('admin/settings/locations/'.$location->id.'/view', $location->name),
|
||||
'parent' => ($location->parent) ? $location->parent->name : '',
|
||||
// 'assets' => ($location->assets->count() + $location->assignedassets->count()),
|
||||
'assets_default' => $location->assignedassets->count(),
|
||||
'assets_checkedout' => $location->assets->count(),
|
||||
'address' => ($location->address) ? $location->address: '',
|
||||
'city' => $location->city,
|
||||
'state' => $location->state,
|
||||
'country' => $location->country,
|
||||
'currency' => $location->currency,
|
||||
'actions' => $actions
|
||||
);
|
||||
}
|
||||
|
||||
$data = array('total' => $locationsCount, 'rows' => $rows);
|
||||
|
||||
return $data;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the location user listing information to present to the location details page
|
||||
*
|
||||
* @param int $locationID
|
||||
* @return JSON
|
||||
**/
|
||||
public function getDataViewUsers($locationID)
|
||||
{
|
||||
$location = Location::find($locationID);
|
||||
$location_users = $location->users;
|
||||
$count = $location_users->count();
|
||||
|
||||
$rows = array();
|
||||
|
||||
foreach ($location_users as $user) {
|
||||
$rows[] = array(
|
||||
'name' => link_to('/admin/users/'.$user->id.'/view', $user->fullName())
|
||||
);
|
||||
}
|
||||
|
||||
$data = array('total' => $count, 'rows' => $rows);
|
||||
|
||||
return $data;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the location asset information to present to the location details page
|
||||
*
|
||||
* @param int $locationID
|
||||
* @return JSON
|
||||
**/
|
||||
public function getDataViewAssets($locationID)
|
||||
{
|
||||
$location = Location::find($locationID);
|
||||
$count = $location->assets->count();
|
||||
|
||||
$rows = array();
|
||||
|
||||
foreach ($location->assets as $asset) {
|
||||
$rows[] = array(
|
||||
'name' => link_to('/hardware/'.$asset->id.'/view', $asset->showAssetName()),
|
||||
'asset_tag' => $asset->asset_tag,
|
||||
'serial' => $asset->serial,
|
||||
'model' => $asset->model->name,
|
||||
|
||||
);
|
||||
}
|
||||
|
||||
$data = array('total' => $count, 'rows' => $rows);
|
||||
return $data;
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -20,9 +20,6 @@ class ManufacturersController extends AdminController
|
||||
*/
|
||||
public function getIndex()
|
||||
{
|
||||
// Grab all the manufacturers
|
||||
$manufacturers = Manufacturer::orderBy('created_at', 'DESC')->get();
|
||||
|
||||
// Show the page
|
||||
return View::make('backend/manufacturers/index', compact('manufacturers'));
|
||||
}
|
||||
@@ -192,7 +189,122 @@ class ManufacturersController extends AdminController
|
||||
|
||||
}
|
||||
|
||||
public function getDatatable()
|
||||
{
|
||||
$manufacturers = Manufacturer::select(array('id','name'))->with('assets')
|
||||
->whereNull('deleted_at');
|
||||
|
||||
if (Input::has('search')) {
|
||||
$manufacturers = $manufacturers->TextSearch(e(Input::get('search')));
|
||||
}
|
||||
|
||||
if (Input::has('offset')) {
|
||||
$offset = e(Input::get('offset'));
|
||||
} else {
|
||||
$offset = 0;
|
||||
}
|
||||
|
||||
if (Input::has('limit')) {
|
||||
$limit = e(Input::get('limit'));
|
||||
} else {
|
||||
$limit = 50;
|
||||
}
|
||||
|
||||
$allowed_columns = ['id','name'];
|
||||
$order = Input::get('order') === 'asc' ? 'asc' : 'desc';
|
||||
$sort = in_array(Input::get('sort'), $allowed_columns) ? Input::get('sort') : 'created_at';
|
||||
|
||||
$manufacturers->orderBy($sort, $order);
|
||||
|
||||
$manufacturersCount = $manufacturers->count();
|
||||
$manufacturers = $manufacturers->skip($offset)->take($limit)->get();
|
||||
|
||||
$rows = array();
|
||||
|
||||
foreach($manufacturers as $manufacturer) {
|
||||
$actions = '<a href="'.route('update/manufacturer', $manufacturer->id).'" class="btn btn-warning btn-sm" style="margin-right:5px;"><i class="fa fa-pencil icon-white"></i></a><a data-html="false" class="btn delete-asset btn-danger btn-sm" data-toggle="modal" href="'.route('delete/location', $manufacturer->id).'" data-content="'.Lang::get('admin/manufacturers/message.delete.confirm').'" data-title="'.Lang::get('general.delete').' '.htmlspecialchars($manufacturer->name).'?" onClick="return false;"><i class="fa fa-trash icon-white"></i></a>';
|
||||
|
||||
$rows[] = array(
|
||||
'id' => $manufacturer->id,
|
||||
'name' => link_to('admin/settings/manufacturers/'.$manufacturer->id.'/view', $manufacturer->name),
|
||||
'assets' => $manufacturer->assetscount(),
|
||||
'actions' => $actions
|
||||
);
|
||||
}
|
||||
|
||||
$data = array('total' => $manufacturersCount, 'rows' => $rows);
|
||||
|
||||
return $data;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
public function getDataView($manufacturerID) {
|
||||
|
||||
$manufacturer = Manufacturer::find($manufacturerID);
|
||||
$manufacturer_assets = $manufacturer->assets;
|
||||
|
||||
if (Input::has('search')) {
|
||||
$manufacturer_assets = $manufacturer_assets->TextSearch(e(Input::get('search')));
|
||||
}
|
||||
|
||||
if (Input::has('offset')) {
|
||||
$offset = e(Input::get('offset'));
|
||||
} else {
|
||||
$offset = 0;
|
||||
}
|
||||
|
||||
if (Input::has('limit')) {
|
||||
$limit = e(Input::get('limit'));
|
||||
} else {
|
||||
$limit = 50;
|
||||
}
|
||||
|
||||
$order = Input::get('order') === 'asc' ? 'asc' : 'desc';
|
||||
|
||||
$allowed_columns = ['id','name','serial','asset_tag'];
|
||||
$sort = in_array(Input::get('sort'), $allowed_columns) ? Input::get('sort') : 'created_at';
|
||||
$count = $manufacturer_assets->count();
|
||||
|
||||
$rows = array();
|
||||
|
||||
foreach ($manufacturer_assets as $asset) {
|
||||
|
||||
$actions = '';
|
||||
if ($asset->deleted_at=='') {
|
||||
$actions = '<div style=" white-space: nowrap;"><a href="'.route('clone/hardware', $asset->id).'" class="btn btn-info btn-sm" title="Clone asset"><i class="fa fa-files-o"></i></a> <a href="'.route('update/hardware', $asset->id).'" class="btn btn-warning btn-sm"><i class="fa fa-pencil icon-white"></i></a> <a data-html="false" class="btn delete-asset btn-danger btn-sm" data-toggle="modal" href="'.route('delete/hardware', $asset->id).'" data-content="'.Lang::get('admin/hardware/message.delete.confirm').'" data-title="'.Lang::get('general.delete').' '.htmlspecialchars($asset->asset_tag).'?" onClick="return false;"><i class="fa fa-trash icon-white"></i></a></div>';
|
||||
} elseif ($asset->deleted_at!='') {
|
||||
$actions = '<a href="'.route('restore/hardware', $asset->id).'" class="btn btn-warning btn-sm"><i class="fa fa-recycle icon-white"></i></a>';
|
||||
}
|
||||
|
||||
if ($asset->assetstatus) {
|
||||
if ($asset->assetstatus->deployable != 0) {
|
||||
if (($asset->assigned_to !='') && ($asset->assigned_to > 0)) {
|
||||
$inout = '<a href="'.route('checkin/hardware', $asset->id).'" class="btn btn-primary btn-sm">'.Lang::get('general.checkin').'</a>';
|
||||
} else {
|
||||
$inout = '<a href="'.route('checkout/hardware', $asset->id).'" class="btn btn-info btn-sm">'.Lang::get('general.checkout').'</a>';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$rows[] = array(
|
||||
'id' => $asset->id,
|
||||
'name' => link_to('/hardware/'.$asset->id.'/view', $asset->showAssetName()),
|
||||
'model' => $asset->model->name,
|
||||
'asset_tag' => $asset->asset_tag,
|
||||
'serial' => $asset->serial,
|
||||
'assigned_to' => ($asset->assigneduser) ? link_to('/admin/users/'.$asset->assigneduser->id.'/view', $asset->assigneduser->fullName()): '',
|
||||
'change' => $inout,
|
||||
'actions' => $actions,
|
||||
|
||||
|
||||
);
|
||||
}
|
||||
|
||||
$data = array('total' => $count, 'rows' => $rows);
|
||||
return $data;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -15,6 +15,10 @@ use Str;
|
||||
use Validator;
|
||||
use View;
|
||||
use Datatable;
|
||||
use Asset;
|
||||
|
||||
//use Symfony\Component\HttpFoundation\Response;
|
||||
use Symfony\Component\HttpFoundation\JsonResponse;
|
||||
|
||||
class ModelsController extends AdminController
|
||||
{
|
||||
@@ -37,9 +41,9 @@ class ModelsController extends AdminController
|
||||
public function getCreate()
|
||||
{
|
||||
// Show the page
|
||||
$depreciation_list = array('' => 'Do Not Depreciate') + Depreciation::lists('name', 'id');
|
||||
$manufacturer_list = array('' => 'Select One') + Manufacturer::lists('name', 'id');
|
||||
$category_list = array('' => '') + DB::table('categories')->whereNull('deleted_at')->lists('name', 'id');
|
||||
$depreciation_list = depreciationList();
|
||||
$manufacturer_list = manufacturerList();
|
||||
$category_list = categoryList();
|
||||
$view = View::make('backend/models/edit');
|
||||
$view->with('category_list',$category_list);
|
||||
$view->with('depreciation_list',$depreciation_list);
|
||||
@@ -60,6 +64,27 @@ class ModelsController extends AdminController
|
||||
// Create a new manufacturer
|
||||
$model = new Model;
|
||||
|
||||
|
||||
$validator = Validator::make(
|
||||
// Validator data goes here
|
||||
array(
|
||||
'unique_fields' => array(Input::get('name'), Input::get('modelno'), Input::get('manufacturer_id'))
|
||||
),
|
||||
// Validator rules go here
|
||||
array(
|
||||
'unique_fields' => 'unique_multiple:models,name,modelno,manufacturer_id'
|
||||
)
|
||||
);
|
||||
|
||||
// attempt validation
|
||||
if ($validator->fails())
|
||||
{
|
||||
// The given data did not pass validation
|
||||
return Redirect::back()->withInput()->with('error', Lang::get('admin/models/message.create.duplicate_set'));;
|
||||
}
|
||||
|
||||
|
||||
|
||||
$validator = Validator::make(Input::all(), $model->validationRules());
|
||||
|
||||
// attempt validation
|
||||
@@ -77,7 +102,7 @@ class ModelsController extends AdminController
|
||||
$model->depreciation_id = e(Input::get('depreciation_id'));
|
||||
}
|
||||
|
||||
if ( e(Input::get('eol')) == '') {
|
||||
if ( e(Input::get('eol')) == '') {
|
||||
$model->eol = 0;
|
||||
} else {
|
||||
$model->eol = e(Input::get('eol'));
|
||||
@@ -115,6 +140,36 @@ class ModelsController extends AdminController
|
||||
|
||||
}
|
||||
|
||||
public function store()
|
||||
{
|
||||
//COPYPASTA!!!! FIXME
|
||||
$model = new Model;
|
||||
|
||||
$settings=Input::all();
|
||||
$settings['eol']=0;
|
||||
//
|
||||
|
||||
$validator = Validator::make($settings, $model->validationRules());
|
||||
if ($validator->fails())
|
||||
{
|
||||
// The given data did not pass validation
|
||||
return JsonResponse::create(["error" => "Failed validation: ".print_r($validator->messages()->all('<li>:message</li>'),true)],500);
|
||||
} else {
|
||||
$model->name=e(Input::get('name'));
|
||||
$model->manufacturer_id = e(Input::get('manufacturer_id'));
|
||||
$model->category_id = e(Input::get('category_id'));
|
||||
$model->modelno = e(Input::get('modelno'));
|
||||
$model->user_id = Sentry::getUser()->id;
|
||||
$model->eol=0;
|
||||
|
||||
if($model->save()) {
|
||||
return JsonResponse::create($model);
|
||||
} else {
|
||||
return JsonResponse::create(["error" => "Couldn't save Model"],500);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Model update.
|
||||
*
|
||||
@@ -131,7 +186,7 @@ class ModelsController extends AdminController
|
||||
|
||||
$depreciation_list = array('' => 'Do Not Depreciate') + Depreciation::lists('name', 'id');
|
||||
$manufacturer_list = array('' => 'Select One') + Manufacturer::lists('name', 'id');
|
||||
$category_list = array('' => '') + DB::table('categories')->lists('name', 'id');
|
||||
$category_list = array('' => '') + DB::table('categories')->whereNull('deleted_at')->lists('name', 'id');
|
||||
$view = View::make('backend/models/edit', compact('model'));
|
||||
$view->with('category_list',$category_list);
|
||||
$view->with('depreciation_list',$depreciation_list);
|
||||
@@ -263,7 +318,7 @@ class ModelsController extends AdminController
|
||||
|
||||
|
||||
/**
|
||||
* Get the asset information to present to the model view page
|
||||
* Get the model information to present to the model view page
|
||||
*
|
||||
* @param int $assetId
|
||||
* @return View
|
||||
@@ -285,7 +340,14 @@ class ModelsController extends AdminController
|
||||
|
||||
}
|
||||
|
||||
public function getClone($modelId = null)
|
||||
/**
|
||||
* Get the clone page to clone a model
|
||||
*
|
||||
* @param int $modelId
|
||||
* @return View
|
||||
**/
|
||||
|
||||
public function getClone($modelId = null)
|
||||
{
|
||||
// Check if the model exists
|
||||
if (is_null($model_to_clone = Model::find($modelId))) {
|
||||
@@ -310,79 +372,131 @@ class ModelsController extends AdminController
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the JSON response for the bootstrap table list view
|
||||
*
|
||||
* @param string $status
|
||||
* @return JSON
|
||||
**/
|
||||
|
||||
public function getDatatable($status = null)
|
||||
{
|
||||
$models = Model::orderBy('created_at', 'DESC')->with('category','assets','depreciation');
|
||||
$models = Model::with('category','assets','depreciation');
|
||||
($status != 'Deleted') ?: $models->withTrashed()->Deleted();;
|
||||
$models = $models->get();
|
||||
|
||||
$actions = new \Chumper\Datatable\Columns\FunctionColumn('actions', function($models) {
|
||||
if($models->deleted_at=='') {
|
||||
return '<a href="'.route('update/model', $models->id).'" class="btn btn-warning btn-sm" style="margin-right:5px;"><i class="fa fa-pencil icon-white"></i></a><a data-html="false" class="btn delete-asset btn-danger btn-sm" data-toggle="modal" href="'.route('delete/model', $models->id).'" data-content="'.Lang::get('admin/models/message.delete.confirm').'" data-title="'.Lang::get('general.delete').' '.htmlspecialchars($models->name).'?" onClick="return false;"><i class="fa fa-trash icon-white"></i></a>';
|
||||
if (Input::has('search')) {
|
||||
$models = $models->TextSearch(Input::get('search'));
|
||||
}
|
||||
|
||||
if (Input::has('offset')) {
|
||||
$offset = e(Input::get('offset'));
|
||||
} else {
|
||||
$offset = 0;
|
||||
}
|
||||
|
||||
if (Input::has('limit')) {
|
||||
$limit = e(Input::get('limit'));
|
||||
} else {
|
||||
$limit = 50;
|
||||
}
|
||||
|
||||
|
||||
$allowed_columns = ['id','name','modelno'];
|
||||
$order = Input::get('order') === 'asc' ? 'asc' : 'desc';
|
||||
$sort = in_array(Input::get('sort'), $allowed_columns) ? Input::get('sort') : 'created_at';
|
||||
|
||||
$models = $models->orderBy($sort, $order);
|
||||
|
||||
$modelCount = $models->count();
|
||||
$models = $models->skip($offset)->take($limit)->get();
|
||||
|
||||
$rows = array();
|
||||
|
||||
foreach ($models as $model) {
|
||||
if ($model->deleted_at == '') {
|
||||
$actions = '<div style=" white-space: nowrap;"><a href="'.route('update/model', $model->id).'" class="btn btn-warning btn-sm" style="margin-right:5px;"><i class="fa fa-pencil icon-white"></i></a><a data-html="false" class="btn delete-asset btn-danger btn-sm" data-toggle="modal" href="'.route('delete/model', $model->id).'" data-content="'.Lang::get('admin/models/message.delete.confirm').'" data-title="'.Lang::get('general.delete').' '.htmlspecialchars($model->name).'?" onClick="return false;"><i class="fa fa-trash icon-white"></i></a></div>';
|
||||
} else {
|
||||
return '<a href="'.route('restore/model', $models->id).'" class="btn btn-warning btn-sm"><i class="fa fa-recycle icon-white"></i></a>';
|
||||
$actions = '<a href="'.route('restore/model', $model->id).'" class="btn btn-warning btn-sm"><i class="fa fa-recycle icon-white"></i></a>';
|
||||
}
|
||||
});
|
||||
|
||||
return Datatable::collection($models)
|
||||
->addColumn('manufacturer', function($models) {
|
||||
return $models->manufacturer->name;
|
||||
})
|
||||
->addColumn('name', function ($models) {
|
||||
return link_to('/hardware/models/'.$models->id.'/view', $models->name);
|
||||
})
|
||||
->showColumns('modelno')
|
||||
->addColumn('asset_count', function($models) {
|
||||
return $models->assets->count();
|
||||
})
|
||||
->addColumn('depreciation', function($models) {
|
||||
return (($models->depreciation)&&($models->depreciation->id > 0)) ? $models->depreciation->name.' ('.$models->depreciation->months.')' : Lang::get('general.no_depreciation');
|
||||
})
|
||||
->addColumn('category', function($models) {
|
||||
return ($models->category) ? $models->category->name : '';
|
||||
})
|
||||
->addColumn('eol', function($models) {
|
||||
return ($models->eol) ? $models->eol.' '.Lang::get('general.months') : '';
|
||||
})
|
||||
->addColumn($actions)
|
||||
->searchColumns('name','modelno','asset_count','depreciation','category','eol','actions')
|
||||
->orderColumns('name','modelno','asset_count','depreciation','category','eol','actions')
|
||||
->make();
|
||||
$rows[] = array(
|
||||
'id' => $model->id,
|
||||
'manufacturer' => link_to('/admin/settings/manufacturers/'.$model->manufacturer->id.'/view', $model->manufacturer->name),
|
||||
'name' => link_to('/hardware/models/'.$model->id.'/view', $model->name),
|
||||
'modelnumber' => $model->modelno,
|
||||
'numassets' => $model->assets->count(),
|
||||
'depreciation' => (($model->depreciation)&&($model->depreciation->id > 0)) ? $model->depreciation->name.' ('.$model->depreciation->months.')' : Lang::get('general.no_depreciation'),
|
||||
'category' => ($model->category) ? $model->category->name : '',
|
||||
'eol' => ($model->eol) ? $model->eol.' '.Lang::get('general.months') : '',
|
||||
'actions' => $actions
|
||||
);
|
||||
}
|
||||
|
||||
$data = array('total' => $modelCount, 'rows' => $rows);
|
||||
|
||||
return $data;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the asset information to present to the model view page
|
||||
*
|
||||
* @param int $modelID
|
||||
* @return View
|
||||
**/
|
||||
public function getDataView($modelID)
|
||||
{
|
||||
$model = Model::withTrashed()->find($modelID);
|
||||
$modelassets = $model->assets;
|
||||
$assets = Asset::where('model_id','=',$modelID)->withTrashed();
|
||||
|
||||
$actions = new \Chumper\Datatable\Columns\FunctionColumn('actions', function ($modelassets)
|
||||
{
|
||||
if (($modelassets->assigned_to !='') && ($modelassets->assigned_to > 0)) {
|
||||
return '<a href="'.route('checkin/hardware', $modelassets->id).'" class="btn btn-primary btn-sm">'.Lang::get('general.checkin').'</a>';
|
||||
} else {
|
||||
return '<a href="'.route('checkout/hardware', $modelassets->id).'" class="btn btn-info btn-sm">'.Lang::get('general.checkout').'</a>';
|
||||
}
|
||||
});
|
||||
if (Input::has('search')) {
|
||||
$assets = $assets->TextSearch(Input::get('search'));
|
||||
}
|
||||
|
||||
return Datatable::collection($modelassets)
|
||||
->addColumn('name', function ($modelassets) {
|
||||
return link_to('/hardware/'.$modelassets->id.'/view', $modelassets->showAssetName());
|
||||
// return $modelassets->name;
|
||||
})
|
||||
->addColumn('asset_tag', function ($modelassets) {
|
||||
return link_to('/hardware/'.$modelassets->id.'/view', $modelassets->asset_tag);
|
||||
})
|
||||
->showColumns('serial')
|
||||
->addColumn('assigned_to', function ($modelassets) {
|
||||
if ($modelassets->assigned_to) {
|
||||
return link_to('/admin/users/'.$modelassets->assigned_to.'/view', $modelassets->assigneduser->fullName());
|
||||
if (Input::has('offset')) {
|
||||
$offset = e(Input::get('offset'));
|
||||
} else {
|
||||
$offset = 0;
|
||||
}
|
||||
|
||||
if (Input::has('limit')) {
|
||||
$limit = e(Input::get('limit'));
|
||||
} else {
|
||||
$limit = 50;
|
||||
}
|
||||
|
||||
|
||||
$allowed_columns = ['name', 'serial','asset_tag'];
|
||||
$order = Input::get('order') === 'asc' ? 'asc' : 'desc';
|
||||
$sort = in_array(Input::get('sort'), $allowed_columns) ? Input::get('sort') : 'created_at';
|
||||
|
||||
$assets = $assets->orderBy($sort, $order);
|
||||
|
||||
$assetsCount = $assets->count();
|
||||
$assets = $assets->skip($offset)->take($limit)->get();
|
||||
|
||||
$rows = array();
|
||||
|
||||
foreach ($assets as $asset) {
|
||||
if (($asset->assigned_to !='') && ($asset->assigned_to > 0)) {
|
||||
$actions = '<a href="'.route('checkin/hardware', $asset->id).'" class="btn btn-primary btn-sm">'.Lang::get('general.checkin').'</a>';
|
||||
} else {
|
||||
$actions = '<a href="'.route('checkout/hardware', $asset->id).'" class="btn btn-info btn-sm">'.Lang::get('general.checkout').'</a>';
|
||||
}
|
||||
})
|
||||
->addColumn($actions)
|
||||
->searchColumns('name','asset_tag','serial','assigned_to','actions')
|
||||
->orderColumns('name','asset_tag','serial','assigned_to','actions')
|
||||
->make();
|
||||
|
||||
$rows[] = array(
|
||||
'id' => $asset->id,
|
||||
'name' => link_to('/hardware/'.$asset->id.'/view', $asset->showAssetName()),
|
||||
'asset_tag' => link_to('hardware/'.$asset->id.'/view', $asset->asset_tag),
|
||||
'serial' => $asset->serial,
|
||||
'assigned_to' => ($asset->assigned_to) ? link_to('/admin/users/'.$asset->assigned_to.'/view', $asset->assigneduser->fullName()) : '',
|
||||
'actions' => $actions
|
||||
);
|
||||
}
|
||||
|
||||
$data = array('total' => $assetsCount, 'rows' => $rows);
|
||||
|
||||
return $data;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,22 +1,76 @@
|
||||
<?php namespace Controllers\Admin;
|
||||
|
||||
use AdminController;
|
||||
use Input;
|
||||
use Lang;
|
||||
use License;
|
||||
use Asset;
|
||||
use User;
|
||||
use View;
|
||||
use Location;
|
||||
use Redirect;
|
||||
use Response;
|
||||
use Accessory;
|
||||
use Actionlog;
|
||||
use Setting;
|
||||
use League\Csv\Writer;
|
||||
use AdminController;
|
||||
use Asset;
|
||||
use AssetMaintenance;
|
||||
use Carbon\Carbon;
|
||||
use Category;
|
||||
use Illuminate\Support\Facades\Lang;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
use Illuminate\Support\Facades\Response;
|
||||
use Illuminate\Support\Facades\View;
|
||||
use Input;
|
||||
use League\Csv\Reader;
|
||||
use License;
|
||||
use Location;
|
||||
use Model;
|
||||
use Redirect;
|
||||
use Setting;
|
||||
use User;
|
||||
|
||||
class ReportsController extends AdminController
|
||||
{
|
||||
|
||||
/**
|
||||
* Show Report for Accessories
|
||||
*
|
||||
* @return View
|
||||
*/
|
||||
public function getAccessoryReport()
|
||||
{
|
||||
$accessories = Accessory::orderBy('created_at', 'DESC')->get();
|
||||
return View::make('backend/reports/accessories', compact('accessories'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Export Accessories Report as CSV
|
||||
*
|
||||
* @return file download
|
||||
*/
|
||||
public function exportAccessoryReport()
|
||||
{
|
||||
$accessories = Accessory::orderBy('created_at', 'DESC')->get();
|
||||
$rows = array();
|
||||
$header = array(
|
||||
Lang::get('admin/accessories/table.title'),
|
||||
Lang::get('admin/accessories/general.accessory_category'),
|
||||
Lang::get('admin/accessories/general.total'),
|
||||
Lang::get('admin/accessories/general.remaining')
|
||||
);
|
||||
$header = array_map('trim', $header);
|
||||
$rows[] = implode($header, ', ');
|
||||
|
||||
// Row per accessory
|
||||
foreach ($accessories as $accessory) {
|
||||
$row = array();
|
||||
$row[] = $accessory->accessory_name;
|
||||
$row[] = $accessory->accessory_category;
|
||||
$row[] = $accessory->total;
|
||||
$row[] = $accessory->remaining;
|
||||
|
||||
$rows[] = implode($row, ',');
|
||||
}
|
||||
|
||||
$csv = implode($rows, "\n");
|
||||
$response = Response::make($csv, 200);
|
||||
$response->header('Content-Type', 'text/csv');
|
||||
$response->header('Content-disposition', 'attachment;filename=report.csv');
|
||||
|
||||
return $response;
|
||||
}
|
||||
|
||||
/**
|
||||
* Show Asset Report
|
||||
*
|
||||
@@ -24,9 +78,14 @@ class ReportsController extends AdminController
|
||||
*/
|
||||
public function getAssetsReport()
|
||||
{
|
||||
|
||||
// Grab all the assets
|
||||
$assets = Asset::with('model','assigneduser.userLoc','assetstatus','defaultLoc','assetlog','supplier','model.manufacturer')->orderBy('created_at', 'DESC')->get();
|
||||
return View::make('backend/reports/asset', compact('assets'));
|
||||
$assets = Asset::with( 'model', 'assigneduser.userLoc', 'assetstatus', 'defaultLoc', 'assetlog', 'supplier',
|
||||
'model.manufacturer' )
|
||||
->orderBy( 'created_at', 'DESC' )
|
||||
->get();
|
||||
|
||||
return View::make( 'backend/reports/asset', compact( 'assets' ) );
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -36,41 +95,44 @@ class ReportsController extends AdminController
|
||||
*/
|
||||
public function exportAssetReport()
|
||||
{
|
||||
// Grab all the assets
|
||||
$assets = Asset::orderBy('created_at', 'DESC')->get();
|
||||
|
||||
$rows = array();
|
||||
// Grab all the assets
|
||||
$assets = Asset::orderBy( 'created_at', 'DESC' )
|
||||
->get();
|
||||
|
||||
$rows = [ ];
|
||||
|
||||
// Create the header row
|
||||
$header = array(
|
||||
Lang::get('admin/hardware/table.asset_tag'),
|
||||
Lang::get('admin/hardware/form.manufacturer'),
|
||||
Lang::get('admin/hardware/form.model'),
|
||||
Lang::get('general.model_no'),
|
||||
Lang::get('general.name'),
|
||||
Lang::get('admin/hardware/table.serial'),
|
||||
Lang::get('general.status'),
|
||||
Lang::get('admin/hardware/table.purchase_date'),
|
||||
Lang::get('admin/hardware/table.purchase_cost'),
|
||||
Lang::get('admin/hardware/form.order'),
|
||||
Lang::get('admin/hardware/form.supplier'),
|
||||
Lang::get('admin/hardware/table.checkoutto'),
|
||||
Lang::get('admin/hardware/table.location')
|
||||
);
|
||||
$header = array_map('trim', $header);
|
||||
$rows[] = implode($header, ',');
|
||||
$header = [
|
||||
Lang::get( 'admin/hardware/table.asset_tag' ),
|
||||
Lang::get( 'admin/hardware/form.manufacturer' ),
|
||||
Lang::get( 'admin/hardware/form.model' ),
|
||||
Lang::get( 'general.model_no' ),
|
||||
Lang::get( 'general.name' ),
|
||||
Lang::get( 'admin/hardware/table.serial' ),
|
||||
Lang::get( 'general.status' ),
|
||||
Lang::get( 'admin/hardware/table.purchase_date' ),
|
||||
Lang::get( 'admin/hardware/table.purchase_cost' ),
|
||||
Lang::get( 'admin/hardware/form.order' ),
|
||||
Lang::get( 'admin/hardware/form.supplier' ),
|
||||
Lang::get( 'admin/hardware/table.checkoutto' ),
|
||||
Lang::get( 'admin/hardware/table.location' ),
|
||||
Lang::get( 'general.notes' ),
|
||||
];
|
||||
$header = array_map( 'trim', $header );
|
||||
$rows[] = implode( $header, ',' );
|
||||
|
||||
// Create a row per asset
|
||||
foreach ($assets as $asset) {
|
||||
$row = array();
|
||||
$row = [ ];
|
||||
$row[] = $asset->asset_tag;
|
||||
if ($asset->model->manufacturer) {
|
||||
$row[] = $asset->model->manufacturer->name;
|
||||
} else {
|
||||
$row[] = '';
|
||||
}
|
||||
$row[] = '"'.$asset->model->name.'"';
|
||||
$row[] = '"'.$asset->model->modelno.'"';
|
||||
$row[] = '"' . $asset->model->name . '"';
|
||||
$row[] = '"' . $asset->model->modelno . '"';
|
||||
$row[] = $asset->name;
|
||||
$row[] = $asset->serial;
|
||||
if ($asset->assetstatus) {
|
||||
@@ -79,7 +141,7 @@ class ReportsController extends AdminController
|
||||
$row[] = '';
|
||||
}
|
||||
$row[] = $asset->purchase_date;
|
||||
$row[] = '"'.number_format($asset->purchase_cost).'"';
|
||||
$row[] = '"' . number_format( $asset->purchase_cost ) . '"';
|
||||
if ($asset->order_number) {
|
||||
$row[] = $asset->order_number;
|
||||
} else {
|
||||
@@ -92,21 +154,21 @@ class ReportsController extends AdminController
|
||||
}
|
||||
|
||||
if ($asset->assigned_to > 0) {
|
||||
$user = User::find($asset->assigned_to);
|
||||
$user = User::find( $asset->assigned_to );
|
||||
$row[] = $user->fullName();
|
||||
} else {
|
||||
$row[] = ''; // Empty string if unassigned
|
||||
}
|
||||
|
||||
if (($asset->assigned_to > 0) && ($asset->assigneduser->location_id > 0)) {
|
||||
$location = Location::find($asset->assigneduser->location_id);
|
||||
if (( $asset->assigned_to > 0 ) && ( $asset->assigneduser->location_id > 0 )) {
|
||||
$location = Location::find( $asset->assigneduser->location_id );
|
||||
if ($location->name) {
|
||||
$row[] = $location->name;
|
||||
} else {
|
||||
$row[] = '';
|
||||
}
|
||||
} elseif ($asset->rtd_location_id) {
|
||||
$location = Location::find($asset->rtd_location_id);
|
||||
$location = Location::find( $asset->rtd_location_id );
|
||||
if ($location->name) {
|
||||
$row[] = $location->name;
|
||||
} else {
|
||||
@@ -116,14 +178,20 @@ class ReportsController extends AdminController
|
||||
$row[] = ''; // Empty string if location is not set
|
||||
}
|
||||
|
||||
$rows[] = implode($row, ',');
|
||||
if ($asset->notes) {
|
||||
$row[] = '"' . $asset->notes . '"';
|
||||
} else {
|
||||
$row[] = '';
|
||||
}
|
||||
|
||||
$rows[] = implode( $row, ',' );
|
||||
}
|
||||
|
||||
// spit out a csv
|
||||
$csv = implode($rows, "\n");
|
||||
$response = Response::make($csv, 200);
|
||||
$response->header('Content-Type', 'text/csv');
|
||||
$response->header('Content-disposition', 'attachment;filename=report.csv');
|
||||
$csv = implode( $rows, "\n" );
|
||||
$response = Response::make( $csv, 200 );
|
||||
$response->header( 'Content-Type', 'text/csv' );
|
||||
$response->header( 'Content-disposition', 'attachment;filename=report.csv' );
|
||||
|
||||
return $response;
|
||||
}
|
||||
@@ -135,9 +203,13 @@ class ReportsController extends AdminController
|
||||
*/
|
||||
public function getDeprecationReport()
|
||||
{
|
||||
|
||||
// Grab all the assets
|
||||
$assets = Asset::with('model','assigneduser','assetstatus','defaultLoc','assetlog')->orderBy('created_at', 'DESC')->get();
|
||||
return View::make('backend/reports/depreciation', compact('assets'));
|
||||
$assets = Asset::with( 'model', 'assigneduser', 'assetstatus', 'defaultLoc', 'assetlog' )
|
||||
->orderBy( 'created_at', 'DESC' )
|
||||
->get();
|
||||
|
||||
return View::make( 'backend/reports/depreciation', compact( 'assets' ) );
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -147,47 +219,49 @@ class ReportsController extends AdminController
|
||||
*/
|
||||
public function exportDeprecationReport()
|
||||
{
|
||||
|
||||
// Grab all the assets
|
||||
$assets = Asset::with('model','assigneduser','assetstatus','defaultLoc','assetlog')->orderBy('created_at', 'DESC')->get();
|
||||
$assets = Asset::with( 'model', 'assigneduser', 'assetstatus', 'defaultLoc', 'assetlog' )
|
||||
->orderBy( 'created_at', 'DESC' )
|
||||
->get();
|
||||
|
||||
$csv = \League\Csv\Writer::createFromFileObject(new \SplTempFileObject());
|
||||
$csv->setOutputBOM(Reader::BOM_UTF16_BE);
|
||||
$csv = \League\Csv\Writer::createFromFileObject( new \SplTempFileObject() );
|
||||
$csv->setOutputBOM( Reader::BOM_UTF16_BE );
|
||||
|
||||
$rows = array();
|
||||
$rows = [ ];
|
||||
|
||||
// Create the header row
|
||||
$header = array(
|
||||
Lang::get('admin/hardware/table.asset_tag'),
|
||||
Lang::get('admin/hardware/table.title'),
|
||||
Lang::get('admin/hardware/table.serial'),
|
||||
Lang::get('admin/hardware/table.checkoutto'),
|
||||
Lang::get('admin/hardware/table.location'),
|
||||
Lang::get('admin/hardware/table.purchase_date'),
|
||||
Lang::get('admin/hardware/table.purchase_cost'),
|
||||
Lang::get('admin/hardware/table.book_value'),
|
||||
Lang::get('admin/hardware/table.diff')
|
||||
);
|
||||
$header = [
|
||||
Lang::get( 'admin/hardware/table.asset_tag' ),
|
||||
Lang::get( 'admin/hardware/table.title' ),
|
||||
Lang::get( 'admin/hardware/table.serial' ),
|
||||
Lang::get( 'admin/hardware/table.checkoutto' ),
|
||||
Lang::get( 'admin/hardware/table.location' ),
|
||||
Lang::get( 'admin/hardware/table.purchase_date' ),
|
||||
Lang::get( 'admin/hardware/table.purchase_cost' ),
|
||||
Lang::get( 'admin/hardware/table.book_value' ),
|
||||
Lang::get( 'admin/hardware/table.diff' )
|
||||
];
|
||||
|
||||
//we insert the CSV header
|
||||
$csv->insertOne($header);
|
||||
$csv->insertOne( $header );
|
||||
|
||||
// Create a row per asset
|
||||
foreach ($assets as $asset) {
|
||||
$row = array();
|
||||
$row = [ ];
|
||||
$row[] = $asset->asset_tag;
|
||||
$row[] = $asset->name;
|
||||
$row[] = $asset->serial;
|
||||
|
||||
|
||||
if ($asset->assigned_to > 0) {
|
||||
$user = User::find($asset->assigned_to);
|
||||
$row[] = $user->fullName();
|
||||
} else {
|
||||
$user = User::find( $asset->assigned_to );
|
||||
$row[] = $user->fullName();
|
||||
} else {
|
||||
$row[] = ''; // Empty string if unassigned
|
||||
}
|
||||
|
||||
if (($asset->assigned_to > 0) && ($asset->assigneduser->location_id > 0)) {
|
||||
$location = Location::find($asset->assigneduser->location_id);
|
||||
if (( $asset->assigned_to > 0 ) && ( $asset->assigneduser->location_id > 0 )) {
|
||||
$location = Location::find( $asset->assigneduser->location_id );
|
||||
if ($location->city) {
|
||||
$row[] = $location->city . ', ' . $location->state;
|
||||
} elseif ($location->name) {
|
||||
@@ -199,45 +273,44 @@ class ReportsController extends AdminController
|
||||
$row[] = ''; // Empty string if location is not set
|
||||
}
|
||||
|
||||
|
||||
|
||||
if ($asset->assetloc) {
|
||||
$currency = $asset->assetloc->currency;
|
||||
$currency = $asset->assetloc->currency;
|
||||
} else {
|
||||
$currency = Setting::first()->default_currency;
|
||||
$currency = Setting::first()->default_currency;
|
||||
}
|
||||
|
||||
$row[] = $asset->purchase_date;
|
||||
$row[] = $currency.number_format($asset->purchase_cost);
|
||||
$row[] = $currency.number_format($asset->getDepreciatedValue());
|
||||
$row[] = $currency.number_format(($asset->purchase_cost - $asset->getDepreciatedValue()));
|
||||
$csv->insertOne($row);
|
||||
$row[] = $currency . number_format( $asset->purchase_cost );
|
||||
$row[] = $currency . number_format( $asset->getDepreciatedValue() );
|
||||
$row[] = $currency . number_format( ( $asset->purchase_cost - $asset->getDepreciatedValue() ) );
|
||||
$csv->insertOne( $row );
|
||||
}
|
||||
|
||||
$csv->output('depreciation-report-'.date('Y-m-d').'.csv');
|
||||
$csv->output( 'depreciation-report-' . date( 'Y-m-d' ) . '.csv' );
|
||||
die;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
/**
|
||||
* Show Report for Activity
|
||||
*
|
||||
* @return View
|
||||
*/
|
||||
|
||||
public function getActivityReport()
|
||||
public function getActivityReport()
|
||||
{
|
||||
$log_actions = Actionlog::orderBy('created_at', 'DESC')
|
||||
->with('adminlog')
|
||||
->with('accessorylog')
|
||||
->with('assetlog')
|
||||
->with('licenselog')
|
||||
->with('userlog')
|
||||
->orderBy('created_at','DESC')
|
||||
->get();
|
||||
return View::make('backend/reports/activity', compact('log_actions'));
|
||||
}
|
||||
|
||||
$log_actions = Actionlog::orderBy( 'created_at', 'DESC' )
|
||||
->with( 'adminlog' )
|
||||
->with( 'accessorylog' )
|
||||
->with( 'assetlog' )
|
||||
->with( 'licenselog' )
|
||||
->with( 'userlog' )
|
||||
->orderBy( 'created_at', 'DESC' )
|
||||
->get();
|
||||
|
||||
return View::make( 'backend/reports/activity', compact( 'log_actions' ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Show Report for Licenses
|
||||
@@ -246,8 +319,11 @@ class ReportsController extends AdminController
|
||||
*/
|
||||
public function getLicenseReport()
|
||||
{
|
||||
$licenses = License::orderBy('created_at', 'DESC')->get();
|
||||
return View::make('backend/reports/licenses', compact('licenses'));
|
||||
|
||||
$licenses = License::orderBy( 'created_at', 'DESC' )
|
||||
->get();
|
||||
|
||||
return View::make( 'backend/reports/licenses', compact( 'licenses' ) );
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -257,170 +333,161 @@ class ReportsController extends AdminController
|
||||
*/
|
||||
public function exportLicenseReport()
|
||||
{
|
||||
$licenses = License::orderBy('created_at', 'DESC')->get();
|
||||
$rows = array();
|
||||
$header = array(
|
||||
Lang::get('admin/licenses/table.title'),
|
||||
Lang::get('admin/licenses/table.serial'),
|
||||
Lang::get('admin/licenses/form.seats'),
|
||||
Lang::get('admin/licenses/form.remaining_seats'),
|
||||
Lang::get('admin/licenses/form.expiration'),
|
||||
Lang::get('admin/licenses/form.date'),
|
||||
Lang::get('admin/licenses/form.cost')
|
||||
);
|
||||
|
||||
$header = array_map('trim', $header);
|
||||
$rows[] = implode($header, ', ');
|
||||
$licenses = License::orderBy( 'created_at', 'DESC' )
|
||||
->get();
|
||||
$rows = [ ];
|
||||
$header = [
|
||||
Lang::get( 'admin/licenses/table.title' ),
|
||||
Lang::get( 'admin/licenses/table.serial' ),
|
||||
Lang::get( 'admin/licenses/form.seats' ),
|
||||
Lang::get( 'admin/licenses/form.remaining_seats' ),
|
||||
Lang::get( 'admin/licenses/form.expiration' ),
|
||||
Lang::get( 'admin/licenses/form.date' ),
|
||||
Lang::get( 'admin/licenses/form.cost' )
|
||||
];
|
||||
|
||||
$header = array_map( 'trim', $header );
|
||||
$rows[] = implode( $header, ', ' );
|
||||
|
||||
// Row per license
|
||||
foreach ($licenses as $license) {
|
||||
$row = array();
|
||||
$row = [ ];
|
||||
$row[] = $license->name;
|
||||
$row[] = $license->serial;
|
||||
$row[] = $license->seats;
|
||||
$row[] = $license->remaincount();
|
||||
$row[] = $license->expiration_date;
|
||||
$row[] = $license->purchase_date;
|
||||
$row[] = '"'.number_format($license->purchase_cost).'"';
|
||||
$row[] = '"' . number_format( $license->purchase_cost ) . '"';
|
||||
|
||||
$rows[] = implode($row, ',');
|
||||
$rows[] = implode( $row, ',' );
|
||||
}
|
||||
|
||||
$csv = implode($rows, "\n");
|
||||
$response = Response::make($csv, 200);
|
||||
$response->header('Content-Type', 'text/csv');
|
||||
$response->header('Content-disposition', 'attachment;filename=report.csv');
|
||||
$csv = implode( $rows, "\n" );
|
||||
$response = Response::make( $csv, 200 );
|
||||
$response->header( 'Content-Type', 'text/csv' );
|
||||
$response->header( 'Content-disposition', 'attachment;filename=report.csv' );
|
||||
|
||||
return $response;
|
||||
}
|
||||
|
||||
public function getCustomReport()
|
||||
{
|
||||
return View::make('backend/reports/custom');
|
||||
|
||||
return View::make( 'backend/reports/custom' );
|
||||
}
|
||||
|
||||
public function postCustom()
|
||||
{
|
||||
$assets = Asset::orderBy('created_at', 'DESC')->get();
|
||||
$rows = array();
|
||||
$header = array();
|
||||
|
||||
if (e(Input::get('asset_name')) == '1')
|
||||
{
|
||||
$assets = Asset::orderBy( 'created_at', 'DESC' )
|
||||
->get();
|
||||
$rows = [ ];
|
||||
$header = [ ];
|
||||
|
||||
if (e( Input::get( 'asset_name' ) ) == '1') {
|
||||
$header[] = 'Asset Name';
|
||||
}
|
||||
if (e(Input::get('asset_tag')) == '1')
|
||||
{
|
||||
if (e( Input::get( 'asset_tag' ) ) == '1') {
|
||||
$header[] = 'Asset Tag';
|
||||
}
|
||||
if (e(Input::get('manufacturer')) == '1')
|
||||
{
|
||||
if (e( Input::get( 'manufacturer' ) ) == '1') {
|
||||
$header[] = 'Manufacturer';
|
||||
}
|
||||
if (e(Input::get('model')) == '1')
|
||||
{
|
||||
if (e( Input::get( 'model' ) ) == '1') {
|
||||
$header[] = 'Model';
|
||||
$header[] = 'Model Number';
|
||||
}
|
||||
if (e(Input::get('serial')) == '1')
|
||||
{
|
||||
if (e( Input::get( 'serial' ) ) == '1') {
|
||||
$header[] = 'Serial';
|
||||
}
|
||||
if (e(Input::get('purchase_date')) == '1')
|
||||
{
|
||||
if (e( Input::get( 'purchase_date' ) ) == '1') {
|
||||
$header[] = 'Purchase Date';
|
||||
}
|
||||
if ((e(Input::get('purchase_cost')) == '1') && (e(Input::get('depreciation')) == '0'))
|
||||
{
|
||||
if (( e( Input::get( 'purchase_cost' ) ) == '1' ) && ( e( Input::get( 'depreciation' ) ) != '1' )) {
|
||||
$header[] = 'Purchase Cost';
|
||||
}
|
||||
if (e(Input::get('order')) == '1')
|
||||
{
|
||||
if (e( Input::get( 'order' ) ) == '1') {
|
||||
$header[] = 'Order Number';
|
||||
}
|
||||
if (e(Input::get('supplier')) == '1')
|
||||
{
|
||||
if (e( Input::get( 'supplier' ) ) == '1') {
|
||||
$header[] = 'Supplier';
|
||||
}
|
||||
if (e(Input::get('location')) == '1')
|
||||
{
|
||||
if (e( Input::get( 'location' ) ) == '1') {
|
||||
$header[] = 'Location';
|
||||
}
|
||||
if (e(Input::get('assigned_to')) == '1')
|
||||
{
|
||||
if (e( Input::get( 'assigned_to' ) ) == '1') {
|
||||
$header[] = 'Assigned To';
|
||||
}
|
||||
if (e(Input::get('status')) == '1')
|
||||
{
|
||||
if (e( Input::get( 'status' ) ) == '1') {
|
||||
$header[] = 'Status';
|
||||
}
|
||||
if (e(Input::get('warranty')) == '1')
|
||||
{
|
||||
if (e( Input::get( 'warranty' ) ) == '1') {
|
||||
$header[] = 'Warranty';
|
||||
$header[] = 'Warranty Expires';
|
||||
}
|
||||
if (e(Input::get('depreciation')) == '1')
|
||||
{
|
||||
if (e( Input::get( 'depreciation' ) ) == '1') {
|
||||
$header[] = 'Purchase Cost';
|
||||
$header[] = 'Value';
|
||||
$header[] = 'Diff';
|
||||
}
|
||||
|
||||
$header = array_map('trim', $header);
|
||||
$rows[] = implode($header, ',');
|
||||
$header = array_map( 'trim', $header );
|
||||
$rows[] = implode( $header, ',' );
|
||||
|
||||
foreach($assets as $asset) {
|
||||
$row = array();
|
||||
if (e(Input::get('asset_name')) == '1') {
|
||||
foreach ($assets as $asset) {
|
||||
$row = [ ];
|
||||
if (e( Input::get( 'asset_name' ) ) == '1') {
|
||||
$row[] = $asset->name;
|
||||
}
|
||||
if (e(Input::get('asset_tag')) == '1') {
|
||||
if (e( Input::get( 'asset_tag' ) ) == '1') {
|
||||
$row[] = $asset->asset_tag;
|
||||
}
|
||||
if (e(Input::get('manufacturer')) == '1') {
|
||||
if (e( Input::get( 'manufacturer' ) ) == '1') {
|
||||
if ($asset->model->manufacturer) {
|
||||
$row[] = $asset->model->manufacturer->name;
|
||||
} else {
|
||||
$row[] = '';
|
||||
}
|
||||
}
|
||||
if (e(Input::get('model')) == '1') {
|
||||
$row[] = '"'.$asset->model->name.'"';
|
||||
$row[] = '"'.$asset->model->modelno.'"';
|
||||
if (e( Input::get( 'model' ) ) == '1') {
|
||||
$row[] = '"' . $asset->model->name . '"';
|
||||
$row[] = '"' . $asset->model->modelno . '"';
|
||||
}
|
||||
if (e(Input::get('serial')) == '1') {
|
||||
if (e( Input::get( 'serial' ) ) == '1') {
|
||||
$row[] = $asset->serial;
|
||||
}
|
||||
if (e(Input::get('purchase_date')) == '1') {
|
||||
if (e( Input::get( 'purchase_date' ) ) == '1') {
|
||||
$row[] = $asset->purchase_date;
|
||||
}
|
||||
if (e(Input::get('purchase_cost')) == '1') {
|
||||
$row[] = '"'.number_format($asset->purchase_cost).'"';
|
||||
if (e( Input::get( 'purchase_cost' ) ) == '1' && ( e( Input::get( 'depreciation' ) ) != '1' )) {
|
||||
$row[] = '"' . number_format( $asset->purchase_cost ) . '"';
|
||||
}
|
||||
if (e(Input::get('order')) == '1') {
|
||||
if (e( Input::get( 'order' ) ) == '1') {
|
||||
if ($asset->order_number) {
|
||||
$row[] = $asset->order_number;
|
||||
} else {
|
||||
$row[] = '';
|
||||
}
|
||||
}
|
||||
if (e(Input::get('supplier')) == '1') {
|
||||
if (e( Input::get( 'supplier' ) ) == '1') {
|
||||
if ($asset->supplier_id) {
|
||||
$row[] = $asset->supplier->name;
|
||||
} else {
|
||||
$row[] = '';
|
||||
}
|
||||
}
|
||||
if (e(Input::get('location')) == '1') {
|
||||
if (($asset->assigned_to > 0) && ($asset->assigneduser->location_id > 0)) {
|
||||
$location = Location::find($asset->assigneduser->location_id);
|
||||
if (e( Input::get( 'location' ) ) == '1') {
|
||||
if (( $asset->assigned_to > 0 ) && ( $asset->assigneduser->location_id > 0 )) {
|
||||
$location = Location::find( $asset->assigneduser->location_id );
|
||||
if ($location->name) {
|
||||
$row[] = $location->name;
|
||||
} else {
|
||||
$row[] = '';
|
||||
}
|
||||
} elseif ($asset->rtd_location_id) {
|
||||
$location = Location::find($asset->rtd_location_id);
|
||||
$location = Location::find( $asset->rtd_location_id );
|
||||
if ($location->name) {
|
||||
$row[] = $location->name;
|
||||
} else {
|
||||
@@ -430,26 +497,26 @@ class ReportsController extends AdminController
|
||||
$row[] = ''; // Empty string if location is not set
|
||||
}
|
||||
}
|
||||
if (e(Input::get('assigned_to')) == '1') {
|
||||
if (e( Input::get( 'assigned_to' ) ) == '1') {
|
||||
if ($asset->assigned_to > 0) {
|
||||
$user = User::find($asset->assigned_to);
|
||||
$user = User::find( $asset->assigned_to );
|
||||
$row[] = $user->fullName();
|
||||
} else {
|
||||
$row[] = ''; // Empty string if unassigned
|
||||
}
|
||||
}
|
||||
if (e(Input::get('status')) == '1') {
|
||||
if (($asset->status_id == '0') && ($asset->assigned_to == '0')) {
|
||||
$row[] = Lang::get('general.ready_to_deploy');
|
||||
} elseif (($asset->status_id == '') && ($asset->assigned_to == '0')) {
|
||||
$row[] = Lang::get('general.pending');
|
||||
if (e( Input::get( 'status' ) ) == '1') {
|
||||
if (( $asset->status_id == '0' ) && ( $asset->assigned_to == '0' )) {
|
||||
$row[] = Lang::get( 'general.ready_to_deploy' );
|
||||
} elseif (( $asset->status_id == '' ) && ( $asset->assigned_to == '0' )) {
|
||||
$row[] = Lang::get( 'general.pending' );
|
||||
} elseif ($asset->assetstatus) {
|
||||
$row[] = $asset->assetstatus->name;
|
||||
} else {
|
||||
$row[] = '';
|
||||
}
|
||||
}
|
||||
if (e(Input::get('warranty')) == '1') {
|
||||
if (e( Input::get( 'warranty' ) ) == '1') {
|
||||
if ($asset->warranty_months) {
|
||||
$row[] = $asset->warranty_months;
|
||||
$row[] = $asset->warrantee_expires();
|
||||
@@ -458,24 +525,249 @@ class ReportsController extends AdminController
|
||||
$row[] = '';
|
||||
}
|
||||
}
|
||||
if (e(Input::get('depreciation')) == '1') {
|
||||
if (e( Input::get( 'depreciation' ) ) == '1') {
|
||||
$depreciation = $asset->getDepreciatedValue();
|
||||
$row[] = '"'.number_format($asset->purchase_cost).'"';
|
||||
$row[] = '"'.number_format($depreciation).'"';
|
||||
$row[] = '"'.number_format($asset->purchase_cost - $depreciation).'"';
|
||||
$row[] = '"' . number_format( $asset->purchase_cost ) . '"';
|
||||
$row[] = '"' . number_format( $depreciation ) . '"';
|
||||
$row[] = '"' . number_format( $asset->purchase_cost - $depreciation ) . '"';
|
||||
}
|
||||
$rows[] = implode($row, ',');
|
||||
$rows[] = implode( $row, ',' );
|
||||
}
|
||||
|
||||
// spit out a csv
|
||||
if (array_filter($rows)) {
|
||||
$csv = implode($rows, "\n");
|
||||
$response = Response::make($csv, 200);
|
||||
$response->header('Content-Type', 'text/csv');
|
||||
$response->header('Content-disposition', 'attachment;filename=report.csv');
|
||||
if (array_filter( $rows )) {
|
||||
$csv = implode( $rows, "\n" );
|
||||
$response = Response::make( $csv, 200 );
|
||||
$response->header( 'Content-Type', 'text/csv' );
|
||||
$response->header( 'Content-disposition', 'attachment;filename=report.csv' );
|
||||
|
||||
return $response;
|
||||
} else {
|
||||
return Redirect::to("reports/custom")->with('error', Lang::get('admin/reports/message.error'));
|
||||
return Redirect::to( "reports/custom" )
|
||||
->with( 'error', Lang::get( 'admin/reports/message.error' ) );
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* getImprovementsReport
|
||||
*
|
||||
* @return mixed
|
||||
* @author Vincent Sposato <vincent.sposato@gmail.com>
|
||||
* @version v1.0
|
||||
*/
|
||||
public function getAssetMaintenancesReport()
|
||||
{
|
||||
|
||||
// Grab all the improvements
|
||||
$assetMaintenances = \AssetMaintenance::with( 'asset', 'supplier' )
|
||||
->orderBy( 'created_at', 'DESC' )
|
||||
->get();
|
||||
|
||||
return View::make( 'backend/reports/asset_maintenances', compact( 'assetMaintenances' ) );
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* exportImprovementsReport
|
||||
*
|
||||
* @return \Illuminate\Http\Response
|
||||
* @author Vincent Sposato <vincent.sposato@gmail.com>
|
||||
* @version v1.0
|
||||
*/
|
||||
public function exportAssetMaintenancesReport()
|
||||
{
|
||||
|
||||
// Grab all the improvements
|
||||
$assetMaintenances = AssetMaintenance::with( 'asset', 'supplier' )
|
||||
->orderBy( 'created_at', 'DESC' )
|
||||
->get();
|
||||
|
||||
$rows = [ ];
|
||||
|
||||
$header = [
|
||||
Lang::get( 'admin/asset_maintenances/table.asset_name' ),
|
||||
Lang::get( 'admin/asset_maintenances/table.supplier_name' ),
|
||||
Lang::get( 'admin/asset_maintenances/form.asset_maintenance_type' ),
|
||||
Lang::get( 'admin/asset_maintenances/form.title' ),
|
||||
Lang::get( 'admin/asset_maintenances/form.start_date' ),
|
||||
Lang::get( 'admin/asset_maintenances/form.completion_date' ),
|
||||
Lang::get( 'admin/asset_maintenances/form.asset_maintenance_time' ),
|
||||
Lang::get( 'admin/asset_maintenances/form.cost' )
|
||||
];
|
||||
|
||||
$header = array_map( 'trim', $header );
|
||||
$rows[] = implode( $header, ',' );
|
||||
|
||||
foreach ($assetMaintenances as $assetMaintenance) {
|
||||
$row = [ ];
|
||||
$row[] = str_replace( ',', '', $assetMaintenance->asset->name );
|
||||
$row[] = str_replace( ',', '', $assetMaintenance->supplier->name );
|
||||
$row[] = $assetMaintenance->improvement_type;
|
||||
$row[] = $assetMaintenance->title;
|
||||
$row[] = $assetMaintenance->start_date;
|
||||
$row[] = $assetMaintenance->completion_date;
|
||||
if (is_null( $assetMaintenance->asset_maintenance_time )) {
|
||||
$improvementTime = intval( Carbon::now()
|
||||
->diffInDays( Carbon::parse( $assetMaintenance->start_date ) ) );
|
||||
} else {
|
||||
$improvementTime = intval( $assetMaintenance->asset_maintenance_time );
|
||||
}
|
||||
$row[] = $improvementTime;
|
||||
$row[] = Lang::get( 'general.currency' ) . number_format( $assetMaintenance->cost, 2 );
|
||||
$rows[] = implode( $row, ',' );
|
||||
}
|
||||
|
||||
// spit out a csv
|
||||
$csv = implode( $rows, "\n" );
|
||||
$response = Response::make( $csv, 200 );
|
||||
$response->header( 'Content-Type', 'text/csv' );
|
||||
$response->header( 'Content-disposition', 'attachment;filename=report.csv' );
|
||||
|
||||
return $response;
|
||||
}
|
||||
|
||||
/**
|
||||
* getAssetAcceptanceReport
|
||||
*
|
||||
* @return mixed
|
||||
* @author Vincent Sposato <vincent.sposato@gmail.com>
|
||||
* @version v1.0
|
||||
*/
|
||||
public function getAssetAcceptanceReport()
|
||||
{
|
||||
|
||||
$assetsForReport = Asset::notYetAccepted()
|
||||
->get();
|
||||
|
||||
return View::make( 'backend/reports/unaccepted_assets', compact( 'assetsForReport' ) );
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* exportAssetAcceptanceReport
|
||||
*
|
||||
* @return \Illuminate\Http\Response
|
||||
* @author Vincent Sposato <vincent.sposato@gmail.com>
|
||||
* @version v1.0
|
||||
*/
|
||||
public function exportAssetAcceptanceReport()
|
||||
{
|
||||
|
||||
// Grab all the improvements
|
||||
$assetsForReport = Actionlog::whereIn( 'id', $this->getAssetsNotAcceptedYet() )
|
||||
->get();
|
||||
|
||||
$rows = [ ];
|
||||
|
||||
$header = [
|
||||
Lang::get( 'general.category' ),
|
||||
Lang::get( 'admin/hardware/form.model' ),
|
||||
Lang::get( 'admin/hardware/form.name' ),
|
||||
Lang::get( 'admin/hardware/table.asset_tag' ),
|
||||
Lang::get( 'admin/hardware/table.checkoutto' ),
|
||||
];
|
||||
|
||||
$header = array_map( 'trim', $header );
|
||||
$rows[] = implode( $header, ',' );
|
||||
|
||||
foreach ($assetsForReport as $assetItem) {
|
||||
$row = [ ];
|
||||
$row[] = str_replace( ',', '', $assetItem->assetlog->model->category->name );
|
||||
$row[] = str_replace( ',', '', $assetItem->assetlog->model->name );
|
||||
$row[] = str_replace( ',', '', $assetItem->assetlog->showAssetName() );
|
||||
$row[] = str_replace( ',', '', $assetItem->assetlog->asset_tag );
|
||||
$row[] = str_replace( ',', '', $assetItem->assetlog->assigneduser->fullName() );
|
||||
$rows[] = implode( $row, ',' );
|
||||
}
|
||||
|
||||
// spit out a csv
|
||||
$csv = implode( $rows, "\n" );
|
||||
$response = Response::make( $csv, 200 );
|
||||
$response->header( 'Content-Type', 'text/csv' );
|
||||
$response->header( 'Content-disposition', 'attachment;filename=report.csv' );
|
||||
|
||||
return $response;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* getCheckedOutAssetsRequiringAcceptance
|
||||
*
|
||||
* @param $modelsInCategoriesThatRequireAcceptance
|
||||
*
|
||||
* @return array
|
||||
* @author Vincent Sposato <vincent.sposato@gmail.com>
|
||||
* @version v1.0
|
||||
*/
|
||||
protected function getCheckedOutAssetsRequiringAcceptance( $modelsInCategoriesThatRequireAcceptance )
|
||||
{
|
||||
|
||||
return array_pluck( Asset::deployed()
|
||||
->inModelList( $modelsInCategoriesThatRequireAcceptance )
|
||||
->select( 'id' )
|
||||
->get()
|
||||
->toArray(), 'id' );
|
||||
}
|
||||
|
||||
/**
|
||||
* getModelsInCategoriesThatRequireAcceptance
|
||||
*
|
||||
* @param $assetCategoriesRequiringAcceptance
|
||||
*
|
||||
* @return array
|
||||
* @author Vincent Sposato <vincent.sposato@gmail.com>
|
||||
* @version v1.0
|
||||
*/
|
||||
protected function getModelsInCategoriesThatRequireAcceptance( $assetCategoriesRequiringAcceptance )
|
||||
{
|
||||
|
||||
return array_pluck( Model::inCategory( $assetCategoriesRequiringAcceptance )
|
||||
->select( 'id' )
|
||||
->get()
|
||||
->toArray(), 'id' );
|
||||
}
|
||||
|
||||
/**
|
||||
* getCategoriesThatRequireAcceptance
|
||||
*
|
||||
* @return array
|
||||
* @author Vincent Sposato <vincent.sposato@gmail.com>
|
||||
* @version v1.0
|
||||
*/
|
||||
protected function getCategoriesThatRequireAcceptance()
|
||||
{
|
||||
|
||||
return array_pluck( Category::requiresAcceptance()
|
||||
->select( 'id' )
|
||||
->get()
|
||||
->toArray(), 'id' );
|
||||
}
|
||||
|
||||
/**
|
||||
* getAssetsCheckedOutRequiringAcceptance
|
||||
*
|
||||
* @return array
|
||||
* @author Vincent Sposato <vincent.sposato@gmail.com>
|
||||
* @version v1.0
|
||||
*/
|
||||
protected function getAssetsCheckedOutRequiringAcceptance()
|
||||
{
|
||||
|
||||
return $this->getCheckedOutAssetsRequiringAcceptance(
|
||||
$this->getModelsInCategoriesThatRequireAcceptance( $this->getCategoriesThatRequireAcceptance() )
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* getAssetsNotAcceptedYet
|
||||
*
|
||||
* @return array
|
||||
* @author Vincent Sposato <vincent.sposato@gmail.com>
|
||||
* @version v1.0
|
||||
*/
|
||||
protected function getAssetsNotAcceptedYet()
|
||||
{
|
||||
|
||||
return Asset::unaccepted();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,6 +13,7 @@ use View;
|
||||
use Image;
|
||||
use Config;
|
||||
use Response;
|
||||
use Artisan;
|
||||
|
||||
class SettingsController extends AdminController
|
||||
{
|
||||
@@ -67,9 +68,11 @@ class SettingsController extends AdminController
|
||||
// Declare the rules for the form validation
|
||||
|
||||
$rules = array(
|
||||
"per_page" => 'required|min:1|numeric',
|
||||
"brand" => 'required|min:1|numeric',
|
||||
"per_page" => 'required|min:1|numeric',
|
||||
"qr_text" => 'min:1|max:31',
|
||||
"logo" => 'mimes:jpeg,bmp,png,gif',
|
||||
"custom_css" => 'alpha_space',
|
||||
"alert_email" => 'email',
|
||||
"slack_endpoint" => 'url',
|
||||
"default_currency" => 'required',
|
||||
@@ -113,13 +116,15 @@ class SettingsController extends AdminController
|
||||
|
||||
if (Config::get('app.lock_passwords')==false) {
|
||||
$setting->site_name = e(Input::get('site_name'));
|
||||
$setting->brand = e(Input::get('brand'));
|
||||
$setting->custom_css = e(Input::get('custom_css'));
|
||||
}
|
||||
|
||||
$setting->per_page = e(Input::get('per_page'));
|
||||
$setting->qr_code = e(Input::get('qr_code', '0'));
|
||||
$setting->barcode_type = e(Input::get('barcode_type'));
|
||||
$setting->load_remote = e(Input::get('load_remote', '0'));
|
||||
$setting->default_currency = e(Input::get('default_currency', '$'));
|
||||
$setting->default_currency = Input::get('default_currency', '$');
|
||||
$setting->qr_text = e(Input::get('qr_text'));
|
||||
$setting->auto_increment_prefix = e(Input::get('auto_increment_prefix'));
|
||||
$setting->auto_increment_assets = e(Input::get('auto_increment_assets', '0'));
|
||||
@@ -170,12 +175,34 @@ class SettingsController extends AdminController
|
||||
|
||||
}
|
||||
closedir($handle);
|
||||
$files = array_reverse($files);
|
||||
}
|
||||
|
||||
|
||||
return View::make('backend/settings/backups', compact('path','files'));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Generate the backup page
|
||||
*
|
||||
* @return View
|
||||
**/
|
||||
|
||||
public function postBackups()
|
||||
{
|
||||
if (!Config::get('app.lock_passwords')) {
|
||||
Artisan::call('snipe:backup');
|
||||
return Redirect::to("admin/settings/backups")->with('success', Lang::get('admin/settings/message.backup.generated'));
|
||||
} else {
|
||||
Artisan::call('snipe:backup');
|
||||
return Redirect::to("admin/settings/backups")->with('error', Lang::get('general.feature_disabled'));
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Download the dump file
|
||||
*
|
||||
@@ -184,20 +211,45 @@ class SettingsController extends AdminController
|
||||
**/
|
||||
public function downloadFile($filename = null)
|
||||
{
|
||||
if (!Config::get('app.lock_passwords')) {
|
||||
$file = Config::get('backup::path').'/'.$filename;
|
||||
if (file_exists($file)) {
|
||||
return Response::download($file);
|
||||
} else {
|
||||
|
||||
$file = Config::get('backup::path').'/'.$filename;
|
||||
|
||||
|
||||
// the license is valid
|
||||
if (file_exists($file)) {
|
||||
return Response::download($file);
|
||||
// Redirect to the backup page
|
||||
return Redirect::route('settings/backups')->with('error', Lang::get('admin/settings/message.backup.file_not_found'));
|
||||
}
|
||||
} else {
|
||||
// Prepare the error message
|
||||
$error = Lang::get('admin/settings/message.does_not_exist');
|
||||
|
||||
// Redirect to the licence management page
|
||||
return Redirect::route('settings/backups')->with('error', $error);
|
||||
// Redirect to the backup page
|
||||
return Redirect::route('settings/backups')->with('error', Lang::get('general.feature_disabled'));
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Download the dump file
|
||||
*
|
||||
* @param int $assetId
|
||||
* @return View
|
||||
**/
|
||||
public function deleteFile($filename = null)
|
||||
{
|
||||
|
||||
if (!Config::get('app.lock_passwords')) {
|
||||
|
||||
$file = Config::get('backup::path').'/'.$filename;
|
||||
if (file_exists($file)) {
|
||||
unlink($file);
|
||||
return Redirect::route('settings/backups')->with('success', Lang::get('admin/settings/message.backup.file_deleted'));
|
||||
} else {
|
||||
return Redirect::route('settings/backups')->with('error', Lang::get('admin/settings/message.backup.file_not_found'));
|
||||
}
|
||||
} else {
|
||||
return Redirect::route('settings/backups')->with('error', Lang::get('general.feature_disabled'));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -12,6 +12,8 @@ use Str;
|
||||
use Validator;
|
||||
use View;
|
||||
|
||||
use Symfony\Component\HttpFoundation\JsonResponse;
|
||||
|
||||
class StatuslabelsController extends AdminController
|
||||
{
|
||||
/**
|
||||
@@ -22,9 +24,6 @@ class StatuslabelsController extends AdminController
|
||||
|
||||
public function getIndex()
|
||||
{
|
||||
// Grab all the statuslabels
|
||||
$statuslabels = Statuslabel::orderBy('created_at', 'DESC')->get();
|
||||
|
||||
// Show the page
|
||||
return View::make('backend/statuslabels/index', compact('statuslabels'));
|
||||
}
|
||||
@@ -40,8 +39,7 @@ class StatuslabelsController extends AdminController
|
||||
// Show the page
|
||||
$statuslabel = new Statuslabel;
|
||||
$use_statuslabel_type = $statuslabel->getStatuslabelType();
|
||||
|
||||
$statuslabel_types = array('' => Lang::get('admin/hardware/form.select_statustype')) + array('undeployable' => Lang::get('admin/hardware/general.undeployable')) + array('pending' => Lang::get('admin/hardware/general.pending')) + array('archived' => Lang::get('admin/hardware/general.archived')) + array('deployable' => Lang::get('admin/hardware/general.deployable'));
|
||||
$statuslabel_types = statusTypeList();
|
||||
|
||||
return View::make('backend/statuslabels/edit', compact('statuslabel_types','statuslabel'))->with('use_statuslabel_type',$use_statuslabel_type);
|
||||
}
|
||||
@@ -90,6 +88,44 @@ class StatuslabelsController extends AdminController
|
||||
|
||||
}
|
||||
|
||||
public function store()
|
||||
{
|
||||
// get the POST data
|
||||
$new = Input::all();
|
||||
|
||||
$new['statuslabel_types']="deployable";
|
||||
|
||||
// create a new model instance
|
||||
$statuslabel = new Statuslabel();
|
||||
$statustype = Statuslabel::getStatuslabelTypesForDB(Input::get('statuslabel_types'));
|
||||
|
||||
// attempt validation
|
||||
if ($statuslabel->validate($new)) {
|
||||
|
||||
//$statustype = Statuslabel::getStatuslabelTypesForDB(Input::get('statuslabel_types'));
|
||||
|
||||
// Save the Statuslabel data
|
||||
$statuslabel->name = e(Input::get('name'));
|
||||
$statuslabel->user_id = Sentry::getId();
|
||||
$statuslabel->notes = '';
|
||||
$statuslabel->deployable = $statustype['deployable'];
|
||||
$statuslabel->pending = $statustype['pending'];
|
||||
$statuslabel->archived = $statustype['archived'];
|
||||
|
||||
// Was the asset created?
|
||||
if($statuslabel->save()) {
|
||||
// Redirect to the new Statuslabel page
|
||||
return JsonResponse::create($statuslabel);
|
||||
} else {
|
||||
return JsonResponse::create(["error" => "Couldn't save Statuslabel"],500);
|
||||
}
|
||||
} else {
|
||||
// failure
|
||||
$errors = $statuslabel->errors();
|
||||
return JsonResponse::create(["error" => "Failed validation: ".print_r($errors->all('<li>:message</li>'),true)],500);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Statuslabel update.
|
||||
@@ -191,5 +227,67 @@ class StatuslabelsController extends AdminController
|
||||
}
|
||||
|
||||
|
||||
public function getDatatable()
|
||||
{
|
||||
$statuslabels = Statuslabel::select(array('id','name','deployable','pending','archived'))
|
||||
->whereNull('deleted_at');
|
||||
|
||||
if (Input::has('search')) {
|
||||
$statuslabels = $statuslabels->TextSearch(e(Input::get('search')));
|
||||
}
|
||||
|
||||
if (Input::has('offset')) {
|
||||
$offset = e(Input::get('offset'));
|
||||
} else {
|
||||
$offset = 0;
|
||||
}
|
||||
|
||||
if (Input::has('limit')) {
|
||||
$limit = e(Input::get('limit'));
|
||||
} else {
|
||||
$limit = 50;
|
||||
}
|
||||
|
||||
$allowed_columns = ['id','name'];
|
||||
$order = Input::get('order') === 'asc' ? 'asc' : 'desc';
|
||||
$sort = in_array(Input::get('sort'), $allowed_columns) ? Input::get('sort') : 'created_at';
|
||||
|
||||
$statuslabels->orderBy($sort, $order);
|
||||
|
||||
$statuslabelsCount = $statuslabels->count();
|
||||
$statuslabels = $statuslabels->skip($offset)->take($limit)->get();
|
||||
|
||||
$rows = array();
|
||||
|
||||
foreach($statuslabels as $statuslabel) {
|
||||
|
||||
if ($statuslabel->deployable == 1) {
|
||||
$label_type = Lang::get('admin/statuslabels/table.deployable');
|
||||
} elseif ($statuslabel->pending == 1) {
|
||||
$label_type = Lang::get('admin/statuslabels/table.pending');
|
||||
} elseif ($statuslabel->archived == 1) {
|
||||
$label_type = Lang::get('admin/statuslabels/table.archived');
|
||||
} else {
|
||||
$label_type = Lang::get('admin/statuslabels/table.undeployable');
|
||||
}
|
||||
|
||||
$actions = '<a href="'.route('update/statuslabel', $statuslabel->id).'" class="btn btn-warning btn-sm" style="margin-right:5px;"><i class="fa fa-pencil icon-white"></i></a><a data-html="false" class="btn delete-asset btn-danger btn-sm" data-toggle="modal" href="'.route('delete/statuslabel', $statuslabel->id).'" data-content="'.Lang::get('admin/statuslabels/message.delete.confirm').'" data-title="'.Lang::get('general.delete').' '.htmlspecialchars($statuslabel->name).'?" onClick="return false;"><i class="fa fa-trash icon-white"></i></a>';
|
||||
|
||||
$rows[] = array(
|
||||
'id' => $statuslabel->id,
|
||||
'type' => $label_type,
|
||||
'name' => e($statuslabel->name),
|
||||
'actions' => $actions
|
||||
);
|
||||
}
|
||||
|
||||
$data = array('total' => $statuslabelsCount, 'rows' => $rows);
|
||||
|
||||
return $data;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
use AdminController;
|
||||
use Image;
|
||||
use AssetMaintenance;
|
||||
use Input;
|
||||
use Lang;
|
||||
use Supplier;
|
||||
@@ -12,6 +13,9 @@ use Str;
|
||||
use Validator;
|
||||
use View;
|
||||
|
||||
use Symfony\Component\HttpFoundation\JsonResponse;
|
||||
|
||||
|
||||
class SuppliersController extends AdminController
|
||||
{
|
||||
/**
|
||||
@@ -100,6 +104,26 @@ class SuppliersController extends AdminController
|
||||
|
||||
}
|
||||
|
||||
public function store()
|
||||
{
|
||||
$supplier=new Supplier;
|
||||
$new=Input::all();
|
||||
$validator = Validator::make($new, $supplier->validationRules());
|
||||
if($validator->fails()) {
|
||||
return JsonResponse::create(["error" => "Failed validation: ".print_r($validator->messages()->all('<li>:message</li>'),true)],500);
|
||||
} else {
|
||||
//$supplier->fill($new);
|
||||
$supplier->name=$new['name'];
|
||||
$supplier->user_id = Sentry::getId();
|
||||
|
||||
if($supplier->save()) {
|
||||
return JsonResponse::create($supplier);
|
||||
} else {
|
||||
return JsonResponse::create(["error" => "Couldn't save Supplier"]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Supplier update.
|
||||
*
|
||||
@@ -139,7 +163,7 @@ class SuppliersController extends AdminController
|
||||
|
||||
if ($validator->fails())
|
||||
{
|
||||
// The given data did not pass validation
|
||||
// The given data did not pass validation
|
||||
return Redirect::back()->withInput()->withErrors($validator->messages());
|
||||
}
|
||||
// attempt validation
|
||||
@@ -180,7 +204,7 @@ class SuppliersController extends AdminController
|
||||
// Redirect to the new supplier page
|
||||
return Redirect::to("admin/settings/suppliers")->with('success', Lang::get('admin/suppliers/message.update.success'));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Redirect to the supplier management page
|
||||
return Redirect::to("admin/settings/suppliers/$supplierId/edit")->with('error', Lang::get('admin/suppliers/message.update.error'));
|
||||
@@ -240,6 +264,61 @@ class SuppliersController extends AdminController
|
||||
|
||||
}
|
||||
|
||||
public function getDatatable()
|
||||
{
|
||||
$suppliers = Supplier::select(array('id','name','address','address2','city','state','country','fax', 'phone','email','contact'))
|
||||
->whereNull('deleted_at');
|
||||
|
||||
if (Input::has('search')) {
|
||||
$suppliers = $suppliers->TextSearch(e(Input::get('search')));
|
||||
}
|
||||
|
||||
if (Input::has('offset')) {
|
||||
$offset = e(Input::get('offset'));
|
||||
} else {
|
||||
$offset = 0;
|
||||
}
|
||||
|
||||
if (Input::has('limit')) {
|
||||
$limit = e(Input::get('limit'));
|
||||
} else {
|
||||
$limit = 50;
|
||||
}
|
||||
|
||||
$allowed_columns = ['id','name','address','phone','contact','fax','email'];
|
||||
$order = Input::get('order') === 'asc' ? 'asc' : 'desc';
|
||||
$sort = in_array(Input::get('sort'), $allowed_columns) ? Input::get('sort') : 'created_at';
|
||||
|
||||
$suppliers->orderBy($sort, $order);
|
||||
|
||||
$suppliersCount = $suppliers->count();
|
||||
$suppliers = $suppliers->skip($offset)->take($limit)->get();
|
||||
|
||||
$rows = array();
|
||||
|
||||
foreach($suppliers as $supplier) {
|
||||
$actions = '<a href="'.route('update/supplier', $supplier->id).'" class="btn btn-warning btn-sm" style="margin-right:5px;"><i class="fa fa-pencil icon-white"></i></a><a data-html="false" class="btn delete-asset btn-danger btn-sm" data-toggle="modal" href="'.route('delete/location', $supplier->id).'" data-content="'.Lang::get('admin/suppliers/message.delete.confirm').'" data-title="'.Lang::get('general.delete').' '.htmlspecialchars($supplier->name).'?" onClick="return false;"><i class="fa fa-trash icon-white"></i></a>';
|
||||
|
||||
$rows[] = array(
|
||||
'id' => $supplier->id,
|
||||
'name' => link_to('admin/settings/suppliers/'.$supplier->id.'/view', $supplier->name),
|
||||
'contact' => $supplier->contact,
|
||||
'address' => $supplier->address.' '.$supplier->address2.' '.$supplier->city.' '.$supplier->state.' '.$supplier->country,
|
||||
'phone' => $supplier->phone,
|
||||
'fax' => $supplier->fax,
|
||||
'email' => ($supplier->email!='') ? '<a href="mailto:'.$supplier->email.'">'.$supplier->email.'</a>' : '',
|
||||
'assets' => $supplier->num_assets(),
|
||||
'licenses' => $supplier->num_licenses(),
|
||||
'actions' => $actions
|
||||
);
|
||||
}
|
||||
|
||||
$data = array('total' => $suppliersCount, 'rows' => $rows);
|
||||
|
||||
return $data;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,65 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Lang;
|
||||
|
||||
class CreateAssetMaintenancesTable extends Migration
|
||||
{
|
||||
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
|
||||
Schema::create( 'asset_maintenances', function ( Blueprint $table ) {
|
||||
|
||||
$table->increments( 'id' );
|
||||
$table->integer( 'asset_id' )
|
||||
->unsigned();
|
||||
$table->integer( 'supplier_id' )
|
||||
->unsigned();
|
||||
$table->enum( 'asset_maintenance_type', $this->getEnumFields() );
|
||||
$table->string( 'title', 100 );
|
||||
$table->boolean( 'is_warranty' );
|
||||
$table->date( 'start_date' );
|
||||
$table->date( 'completion_date' )
|
||||
->nullable();
|
||||
$table->integer( 'asset_maintenance_time' )
|
||||
->nullable();
|
||||
$table->longText( 'notes' )
|
||||
->nullable();
|
||||
$table->decimal( 'cost', 10, 2 )
|
||||
->nullable();
|
||||
$table->dateTime( 'deleted_at' )
|
||||
->nullable();
|
||||
$table->timestamps();
|
||||
} );
|
||||
}
|
||||
|
||||
protected function getEnumFields()
|
||||
{
|
||||
|
||||
return [
|
||||
Lang::get( 'admin/asset_maintenances/general.maintenance' ),
|
||||
Lang::get( 'admin/asset_maintenances/general.repair' ),
|
||||
Lang::get( 'admin/asset_maintenances/general.upgrade' )
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
|
||||
Schema::dropIfExists( 'asset_maintenances' );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
|
||||
class AddExpectedCheckinDateToAssetLogs extends Migration {
|
||||
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
|
||||
Schema::table('asset_logs', function ($table) {
|
||||
$table->date('expected_checkin')->nullable()->default(NULL);
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
|
||||
Schema::table('asset_logs', function(Blueprint $table)
|
||||
{
|
||||
$table->dropColumn('expected_checkin');
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
|
||||
class AddCheckinEmailToCategoryTable extends Migration {
|
||||
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
Schema::table('categories', function ($table) {
|
||||
$table->boolean('checkin_email')->default(0);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
Schema::table('categories', function ($table) {
|
||||
$table->dropColumn('checkin_email');
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
|
||||
class RemoveEmailUniqueConstraint extends Migration {
|
||||
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
Schema::table('users', function(Blueprint $table)
|
||||
{
|
||||
$table->dropUnique('users_email_unique');
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,214 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
|
||||
class AddThreadIdToAssetLogsTable extends Migration
|
||||
{
|
||||
|
||||
/**
|
||||
* currentAssetId
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
protected $currentAssetId = null;
|
||||
|
||||
/**
|
||||
* currentAssetLogId
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
protected $currentAssetLogId = null;
|
||||
|
||||
/**
|
||||
* assetLogs
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $assetLogs = null;
|
||||
|
||||
/**
|
||||
* startOfCurrentThread
|
||||
*
|
||||
* @var bool
|
||||
*/
|
||||
protected $startOfCurrentThread = true;
|
||||
|
||||
/**
|
||||
* threadStartingActionTypes
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $threadStartingActionTypes = [ 'checkout', 'requested' ];
|
||||
|
||||
/**
|
||||
* threadFinalActionTypes
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $threadFinalActionTypes = [ 'checkin from' ];
|
||||
|
||||
/**
|
||||
* actionlog
|
||||
*
|
||||
* @var \Actionlog
|
||||
*/
|
||||
private $actionlog;
|
||||
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
|
||||
if (!Schema::hasColumn('asset_logs', 'thread_id')) {
|
||||
|
||||
Schema::table( 'asset_logs', function ( Blueprint $table ) {
|
||||
|
||||
$table->integer( 'thread_id' )
|
||||
->nullable()
|
||||
->default( null );
|
||||
$table->index( 'thread_id' );
|
||||
} );
|
||||
}
|
||||
|
||||
$this->actionlog = new Actionlog();
|
||||
$this->assetLogs = $this->actionlog->getListingOfActionLogsChronologicalOrder();
|
||||
|
||||
foreach ($this->assetLogs as $assetLog) {
|
||||
|
||||
if ($this->hasAssetChanged( $assetLog )) {
|
||||
$this->resetCurrentAssetInformation( $assetLog );
|
||||
}
|
||||
|
||||
if ($this->hasBegunNewChain( $assetLog )) {
|
||||
$this->startOfCurrentThread = false;
|
||||
continue;
|
||||
}
|
||||
|
||||
$this->updateAssetLogWithThreadInformation( $assetLog );
|
||||
|
||||
if ($this->hasReachedEndOfChain( $assetLog )
|
||||
) {
|
||||
$this->clearCurrentAssetInformation();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
|
||||
Schema::table( 'asset_logs', function ( Blueprint $table ) {
|
||||
|
||||
$table->dropIndex( 'thread_id' );
|
||||
$table->dropColumn( 'thread_id' );
|
||||
} );
|
||||
}
|
||||
|
||||
/**
|
||||
* hasAssetChanged
|
||||
*
|
||||
* @param $assetLog
|
||||
*
|
||||
* @return bool
|
||||
* @author Vincent Sposato <vincent.sposato@gmail.com>
|
||||
* @version v1.0
|
||||
*/
|
||||
protected function hasAssetChanged( $assetLog )
|
||||
{
|
||||
|
||||
return $assetLog->asset_id !== $this->currentAssetId;
|
||||
}
|
||||
|
||||
/**
|
||||
* resetCurrentAssetInformation
|
||||
*
|
||||
* @param $assetLog
|
||||
*
|
||||
* @author Vincent Sposato <vincent.sposato@gmail.com>
|
||||
* @version v1.0
|
||||
*/
|
||||
protected function resetCurrentAssetInformation( $assetLog )
|
||||
{
|
||||
|
||||
$this->currentAssetId = $assetLog->asset_id;
|
||||
$this->currentAssetLogId = $assetLog->id;
|
||||
$this->startOfCurrentThread = true;
|
||||
}
|
||||
|
||||
/**
|
||||
* hasReachedEndOfChain
|
||||
*
|
||||
* @param $assetLog
|
||||
*
|
||||
* @return bool
|
||||
* @author Vincent Sposato <vincent.sposato@gmail.com>
|
||||
* @version v1.0
|
||||
*/
|
||||
protected function hasReachedEndOfChain( $assetLog )
|
||||
{
|
||||
|
||||
return in_array( $assetLog->action_type, $this->threadFinalActionTypes )
|
||||
&& $this->startOfCurrentThread == false;
|
||||
}
|
||||
|
||||
/**
|
||||
* clearCurrentAssetInformation
|
||||
* @author Vincent Sposato <vincent.sposato@gmail.com>
|
||||
* @version v1.0
|
||||
*/
|
||||
protected function clearCurrentAssetInformation()
|
||||
{
|
||||
|
||||
$this->startOfCurrentThread = true;
|
||||
$this->currentAssetLogId = null;
|
||||
$this->currentAssetId = null;
|
||||
}
|
||||
|
||||
/**
|
||||
* updateAssetLogWithThreadInformation
|
||||
*
|
||||
* @param $assetLog
|
||||
*
|
||||
* @author Vincent Sposato <vincent.sposato@gmail.com>
|
||||
* @version v1.0
|
||||
*/
|
||||
protected function updateAssetLogWithThreadInformation( $assetLog )
|
||||
{
|
||||
|
||||
$loadedAssetLog = Actionlog::find( $assetLog->id );
|
||||
|
||||
$loadedAssetLog->thread_id = $this->currentAssetLogId;
|
||||
|
||||
$loadedAssetLog->update();
|
||||
|
||||
unset( $loadedAssetLog );
|
||||
}
|
||||
|
||||
/**
|
||||
* hasBegunNewChain
|
||||
*
|
||||
* @param $assetLog
|
||||
*
|
||||
* @return bool
|
||||
* @author Vincent Sposato <vincent.sposato@gmail.com>
|
||||
* @version v1.0
|
||||
*/
|
||||
protected function hasBegunNewChain( $assetLog )
|
||||
{
|
||||
|
||||
return in_array( $assetLog->action_type, $this->threadStartingActionTypes )
|
||||
&& $this->startOfCurrentThread == true;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
|
||||
class AddAcceptedToAssets extends Migration {
|
||||
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
Schema::table('assets', function(Blueprint $table)
|
||||
{
|
||||
$table->enum('accepted',["pending","accepted","rejected"])->nullable();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
Schema::table('assets', function(Blueprint $table)
|
||||
{
|
||||
$table->dropColumn('accepted');
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
|
||||
class AddCustomCssToSettings extends Migration {
|
||||
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
Schema::table('settings', function(Blueprint $table)
|
||||
{
|
||||
$table->text('custom_css')->nullable()->default(NULL);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
Schema::table('settings', function(Blueprint $table)
|
||||
{
|
||||
$table->dropColumn('custom_css');
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
|
||||
class FixDefaultPurchaseOrder extends Migration {
|
||||
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
DB::statement('ALTER TABLE `'.DB::getTablePrefix().'licenses` MODIFY `purchase_order` varchar(255) DEFAULT NULL;');
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
//
|
||||
DB::statement('ALTER TABLE `'.DB::getTablePrefix().'licenses` MODIFY `purchase_order` varchar(255);');
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
|
||||
class AddAccessoryConsumablePriceInfo extends Migration {
|
||||
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
Schema::table('accessories', function ($table) {
|
||||
$table->date('purchase_date')->nullable();
|
||||
$table->decimal('purchase_cost', 13, 4)->nullable();
|
||||
$table->string('order_number');
|
||||
});
|
||||
|
||||
Schema::table('consumables', function ($table) {
|
||||
$table->date('purchase_date')->nullable();
|
||||
$table->decimal('purchase_cost', 13, 4)->nullable();
|
||||
$table->string('order_number');
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
Schema::table('accessories', function ($table) {
|
||||
$table->dropColumn('purchase_date');
|
||||
$table->dropColumn('purchase_cost');
|
||||
$table->dropColumn('order_number');
|
||||
});
|
||||
|
||||
Schema::table('consumables', function ($table) {
|
||||
$table->dropColumn('purchase_date');
|
||||
$table->dropColumn('purchase_cost');
|
||||
$table->dropColumn('order_number');
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
|
||||
class AddBrandToSettings extends Migration {
|
||||
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
Schema::table('settings', function(Blueprint $table)
|
||||
{
|
||||
$table->tinyInteger('brand')->default(1);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
Schema::table('settings', function(Blueprint $table)
|
||||
{
|
||||
$table->dropColumn('brand');
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
|
||||
class FixDefaultsAccessories extends Migration {
|
||||
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
DB::statement('ALTER TABLE `'.DB::getTablePrefix().'accessories` MODIFY `order_number` varchar(255) DEFAULT NULL;');
|
||||
|
||||
DB::statement('ALTER TABLE `'.DB::getTablePrefix().'consumables` MODIFY `order_number` varchar(255) DEFAULT NULL;');
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
//
|
||||
DB::statement('ALTER TABLE `'.DB::getTablePrefix().'accessories` MODIFY `order_number` varchar(255);');
|
||||
DB::statement('ALTER TABLE `'.DB::getTablePrefix().'consumables` MODIFY `order_number` varchar(255);');
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
|
||||
class AddCheckoutTimeAndExpectedCheckoutDateToAssets extends Migration {
|
||||
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
Schema::table('assets', function(Blueprint $table)
|
||||
{
|
||||
//
|
||||
$answer=$table->dateTime('last_checkout')->nullable();
|
||||
$table->date('expected_checkin')->nullable();
|
||||
});
|
||||
DB::statement("UPDATE assets SET last_checkout=(SELECT MAX(created_at) FROM asset_logs WHERE asset_logs.id=assets.id AND action_type='checkout') WHERE assigned_to IS NOT NULL");
|
||||
DB::statement("UPDATE assets SET expected_checkin=(SELECT expected_checkin FROM asset_logs WHERE asset_logs.id=assets.id AND action_type='checkout' ORDER BY id DESC limit 1) WHERE assigned_to IS NOT NULL");
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
Schema::table('assets', function(Blueprint $table)
|
||||
{
|
||||
//
|
||||
$table->dropColumn('last_checkout');
|
||||
$table->dropColumn('expected_checkin');
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
34
app/database/migrations/2015_11_05_183749_image.php
Normal file
34
app/database/migrations/2015_11_05_183749_image.php
Normal file
@@ -0,0 +1,34 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
|
||||
class Image extends Migration {
|
||||
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
Schema::table('assets', function(Blueprint $table)
|
||||
{
|
||||
$table->text('image')->after('notes')->nullable()->default(NULL);
|
||||
//
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
Schema::table('assets', function ($table) {
|
||||
$table->dropColumn('image');
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
39
app/database/seeds/AccessoriesSeeder.php
Normal file
39
app/database/seeds/AccessoriesSeeder.php
Normal file
@@ -0,0 +1,39 @@
|
||||
<?php
|
||||
class AccessoriesSeeder extends Seeder
|
||||
{
|
||||
public function run()
|
||||
{
|
||||
|
||||
|
||||
// Initialize empty array
|
||||
$accessory = array();
|
||||
|
||||
$date = new DateTime;
|
||||
|
||||
|
||||
$accessory[] = array(
|
||||
'name' => 'Cisco Desktop Phone',
|
||||
'category_id' => 4,
|
||||
'qty' => '20',
|
||||
'requestable' => '0',
|
||||
'user_id' => 1,
|
||||
);
|
||||
|
||||
$accessory[] = array(
|
||||
'name' => 'ASUS 23-inch',
|
||||
'category_id' => 5,
|
||||
'qty' => '20',
|
||||
'requestable' => '0',
|
||||
'user_id' => 1,
|
||||
);
|
||||
|
||||
|
||||
|
||||
// Delete all the old data
|
||||
DB::table('accessories')->truncate();
|
||||
|
||||
// Insert the new posts
|
||||
Accessory::insert($accessory);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -30,7 +30,7 @@ class ActionlogSeeder extends Seeder
|
||||
'asset_id' => '1',
|
||||
'checkedout_to' => '1',
|
||||
'location_id' => NULL,
|
||||
'created_at' => $date->modify('-10 day'),
|
||||
'created_at' => $date->modify('-10 day'),
|
||||
'asset_type' => 'hardware',
|
||||
'note' => NULL,
|
||||
'filename' => NULL,
|
||||
|
||||
35
app/database/seeds/AssetMaintenancesSeeder.php
Normal file
35
app/database/seeds/AssetMaintenancesSeeder.php
Normal file
@@ -0,0 +1,35 @@
|
||||
<?php
|
||||
class AssetMaintenancesSeeder extends Seeder
|
||||
{
|
||||
public function run()
|
||||
{
|
||||
|
||||
|
||||
// Initialize empty array
|
||||
$asset_maintenances = array();
|
||||
|
||||
$date = new DateTime;
|
||||
|
||||
|
||||
$asset_maintenances[] = array(
|
||||
'asset_id' => 1,
|
||||
'supplier_id' => 1,
|
||||
'asset_maintenance_type' => 'Maintenance',
|
||||
'title' => 'Test Maintenance',
|
||||
'start_date' => $date->modify('-10 day'),
|
||||
'cost' => '200.99',
|
||||
'is_warranty' => '0',
|
||||
'created_at' => $date->modify('-10 day'),
|
||||
'updated_at' => $date->modify('-3 day'),
|
||||
);
|
||||
|
||||
|
||||
|
||||
// Delete all the old data
|
||||
DB::table('asset_maintenances')->truncate();
|
||||
|
||||
// Insert the new posts
|
||||
AssetMaintenance::insert($asset_maintenances);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -15,6 +15,7 @@ class AssetsSeeder extends Seeder
|
||||
'name' => 'Shanen MBP',
|
||||
'asset_tag' => 'NNY2878796',
|
||||
'model_id' => 1,
|
||||
'supplier_id' => 1,
|
||||
'serial' => 'WS90585666669',
|
||||
'purchase_date' => '2013-10-02',
|
||||
'purchase_cost' => '2435.99',
|
||||
@@ -38,6 +39,7 @@ class AssetsSeeder extends Seeder
|
||||
'name' => 'Michael MBP',
|
||||
'asset_tag' => 'NNY28633396',
|
||||
'model_id' => 1,
|
||||
'supplier_id' => 1,
|
||||
'serial' => 'WS905823226669',
|
||||
'purchase_date' => '2013-10-02',
|
||||
'purchase_cost' => '2435.99',
|
||||
@@ -62,6 +64,7 @@ class AssetsSeeder extends Seeder
|
||||
'name' => 'Alison MBP',
|
||||
'asset_tag' => 'NNY287958796',
|
||||
'model_id' => 1,
|
||||
'supplier_id' => 1,
|
||||
'serial' => 'WS905869046069',
|
||||
'purchase_date' => '2013-10-02',
|
||||
'purchase_cost' => '2435.99',
|
||||
@@ -85,6 +88,7 @@ class AssetsSeeder extends Seeder
|
||||
'name' => 'Brady MBP',
|
||||
'asset_tag' => 'NNY78795566',
|
||||
'model_id' => 2,
|
||||
'supplier_id' => 2,
|
||||
'serial' => 'WS9078686069',
|
||||
'purchase_date' => '2012-01-02',
|
||||
'purchase_cost' => '1999.99',
|
||||
@@ -108,6 +112,7 @@ class AssetsSeeder extends Seeder
|
||||
'name' => 'Deborah MBP',
|
||||
'asset_tag' => 'NNY65756756775',
|
||||
'model_id' => 2,
|
||||
'supplier_id' => 2,
|
||||
'serial' => 'WS9078686069',
|
||||
'purchase_date' => '2012-01-02',
|
||||
'purchase_cost' => '699.99',
|
||||
@@ -132,6 +137,7 @@ class AssetsSeeder extends Seeder
|
||||
'name' => 'Sara MBP',
|
||||
'asset_tag' => 'NNY6897856775',
|
||||
'model_id' => 2,
|
||||
'supplier_id' => 2,
|
||||
'serial' => 'WS87897998Q',
|
||||
'purchase_date' => '2012-01-02',
|
||||
'purchase_cost' => '1999.99',
|
||||
@@ -155,6 +161,7 @@ class AssetsSeeder extends Seeder
|
||||
'name' => 'Ben MBP',
|
||||
'asset_tag' => 'NNY67567775',
|
||||
'model_id' => 2,
|
||||
'supplier_id' => 2,
|
||||
'serial' => 'WS89080890',
|
||||
'purchase_date' => '2012-01-02',
|
||||
'purchase_cost' => '1999.99',
|
||||
@@ -178,6 +185,7 @@ class AssetsSeeder extends Seeder
|
||||
'name' => 'Broken Laptop',
|
||||
'asset_tag' => 'NNY6756756775',
|
||||
'model_id' => 2,
|
||||
'supplier_id' => 2,
|
||||
'serial' => 'WS89080890',
|
||||
'purchase_date' => '2012-01-02',
|
||||
'purchase_cost' => '1999.99',
|
||||
@@ -201,6 +209,7 @@ class AssetsSeeder extends Seeder
|
||||
'name' => 'Maybe Broke-Ass Laptop',
|
||||
'asset_tag' => 'NNY6755667775',
|
||||
'model_id' => 2,
|
||||
'supplier_id' => 1,
|
||||
'serial' => 'WS45689080890',
|
||||
'purchase_date' => '2012-01-02',
|
||||
'purchase_cost' => '1999.99',
|
||||
@@ -224,6 +233,7 @@ class AssetsSeeder extends Seeder
|
||||
'name' => 'Completely Facacta Laptop',
|
||||
'asset_tag' => 'NNY6564567775',
|
||||
'model_id' => 2,
|
||||
'supplier_id' => 2,
|
||||
'serial' => 'WS99689080890',
|
||||
'purchase_date' => '2012-01-02',
|
||||
'purchase_cost' => '1999.99',
|
||||
@@ -247,6 +257,7 @@ class AssetsSeeder extends Seeder
|
||||
'name' => 'Borked Laptop',
|
||||
'asset_tag' => 'NNY656456778975',
|
||||
'model_id' => 2,
|
||||
'supplier_id' => 1,
|
||||
'serial' => 'WS99689080890',
|
||||
'purchase_date' => '2012-01-02',
|
||||
'purchase_cost' => '1999.99',
|
||||
@@ -270,6 +281,7 @@ class AssetsSeeder extends Seeder
|
||||
'name' => 'Noah MBP',
|
||||
'asset_tag' => 'NNY98056775',
|
||||
'model_id' => 2,
|
||||
'supplier_id' => 1,
|
||||
'serial' => 'WS909098888',
|
||||
'purchase_date' => '2011-12-20',
|
||||
'purchase_cost' => '699.99',
|
||||
|
||||
@@ -16,6 +16,7 @@ class CategoriesSeeder extends Seeder
|
||||
'require_acceptance' => 0,
|
||||
'deleted_at' => NULL,
|
||||
'eula_text' => NULL,
|
||||
'category_type' => 'asset',
|
||||
);
|
||||
|
||||
$date = new DateTime;
|
||||
@@ -28,6 +29,7 @@ class CategoriesSeeder extends Seeder
|
||||
'require_acceptance' => 0,
|
||||
'deleted_at' => NULL,
|
||||
'eula_text' => NULL,
|
||||
'category_type' => 'asset',
|
||||
);
|
||||
|
||||
$date = new DateTime;
|
||||
@@ -40,6 +42,7 @@ class CategoriesSeeder extends Seeder
|
||||
'require_acceptance' => 0,
|
||||
'deleted_at' => NULL,
|
||||
'eula_text' => NULL,
|
||||
'category_type' => 'asset',
|
||||
);
|
||||
|
||||
$date = new DateTime;
|
||||
@@ -52,6 +55,7 @@ class CategoriesSeeder extends Seeder
|
||||
'require_acceptance' => 0,
|
||||
'deleted_at' => NULL,
|
||||
'eula_text' => NULL,
|
||||
'category_type' => 'accessory',
|
||||
);
|
||||
|
||||
$date = new DateTime;
|
||||
@@ -64,6 +68,20 @@ class CategoriesSeeder extends Seeder
|
||||
'require_acceptance' => 0,
|
||||
'deleted_at' => NULL,
|
||||
'eula_text' => NULL,
|
||||
'category_type' => 'accessory',
|
||||
);
|
||||
|
||||
$date = new DateTime;
|
||||
$category[] = array(
|
||||
'name' => 'Printer Ink',
|
||||
'created_at' => $date->modify('-10 day'),
|
||||
'updated_at' => $date->modify('-3 day'),
|
||||
'user_id' => 1,
|
||||
'use_default_eula' => 0,
|
||||
'require_acceptance' => 0,
|
||||
'deleted_at' => NULL,
|
||||
'eula_text' => NULL,
|
||||
'category_type' => 'consumable',
|
||||
);
|
||||
|
||||
|
||||
|
||||
@@ -22,6 +22,9 @@ class DatabaseSeeder extends Seeder
|
||||
$this->call('LicensesSeeder');
|
||||
$this->call('LicenseSeatsSeeder');
|
||||
$this->call('ActionlogSeeder');
|
||||
$this->call('AccessoriesSeeder');
|
||||
$this->call('AssetMaintenancesSeeder');
|
||||
$this->call('SuppliersSeeder');
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -17,6 +17,7 @@ class LocationsSeeder extends Seeder
|
||||
'state' => 'NY',
|
||||
'country' => 'US',
|
||||
'zip' => '10004',
|
||||
'currency' => '$',
|
||||
'created_at' => $date->modify('-10 day'),
|
||||
'updated_at' => $date->modify('-3 day'),
|
||||
'user_id' => 1,
|
||||
@@ -31,6 +32,7 @@ class LocationsSeeder extends Seeder
|
||||
'state' => 'NY',
|
||||
'country' => 'US',
|
||||
'zip' => '10004',
|
||||
'currency' => '$',
|
||||
'created_at' => $date->modify('-10 day'),
|
||||
'updated_at' => $date->modify('-3 day'),
|
||||
'user_id' => 1,
|
||||
@@ -45,6 +47,7 @@ class LocationsSeeder extends Seeder
|
||||
'state' => 'CA',
|
||||
'country' => 'US',
|
||||
'zip' => '94111',
|
||||
'currency' => '$',
|
||||
'created_at' => $date->modify('-10 day'),
|
||||
'updated_at' => $date->modify('-3 day'),
|
||||
'user_id' => 1,
|
||||
@@ -59,6 +62,7 @@ class LocationsSeeder extends Seeder
|
||||
'state' => 'CA',
|
||||
'country' => 'US',
|
||||
'zip' => '90028',
|
||||
'currency' => '$',
|
||||
'created_at' => $date->modify('-10 day'),
|
||||
'updated_at' => $date->modify('-3 day'),
|
||||
'user_id' => 1,
|
||||
|
||||
37
app/database/seeds/SuppliersSeeder.php
Normal file
37
app/database/seeds/SuppliersSeeder.php
Normal file
@@ -0,0 +1,37 @@
|
||||
<?php
|
||||
class SuppliersSeeder extends Seeder
|
||||
{
|
||||
public function run()
|
||||
{
|
||||
|
||||
|
||||
// Initialize empty array
|
||||
$supplier = array();
|
||||
|
||||
$date = new DateTime;
|
||||
|
||||
|
||||
$supplier[] = array(
|
||||
'name' => 'New Egg',
|
||||
'created_at' => $date->modify('-10 day'),
|
||||
'updated_at' => $date->modify('-3 day'),
|
||||
'user_id' => 1,
|
||||
);
|
||||
|
||||
$supplier[] = array(
|
||||
'name' => 'Microsoft',
|
||||
'created_at' => $date->modify('-10 day'),
|
||||
'updated_at' => $date->modify('-3 day'),
|
||||
'user_id' => 1,
|
||||
);
|
||||
|
||||
|
||||
|
||||
// Delete all the old data
|
||||
DB::table('suppliers')->truncate();
|
||||
|
||||
// Insert the new posts
|
||||
Supplier::insert($supplier);
|
||||
}
|
||||
|
||||
}
|
||||
103
app/helpers.php
103
app/helpers.php
@@ -1,18 +1,101 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
/*
|
||||
* To change this license header, choose License Headers in Project Properties.
|
||||
* To change this template file, choose Tools | Templates
|
||||
* and open the template in the editor.
|
||||
*/
|
||||
function ParseFloat($floatString){
|
||||
|
||||
function ParseFloat($floatString){
|
||||
|
||||
// use comma for thousands until local info is property used
|
||||
$LocaleInfo = localeconv();
|
||||
//$thousands = isset($LocaleInfo["mon_thousands_sep"]) ? $LocaleInfo["mon_thousands_sep"] : ",";
|
||||
//$floatString = str_replace($LocaleInfo["mon_thousands_sep"] , "", $floatString);
|
||||
//$floatString = str_replace($LocaleInfo["decimal_point"] , ".", $floatString);
|
||||
$floatString = str_replace("," , "", $floatString);
|
||||
$floatString = str_replace($LocaleInfo["decimal_point"] , ".", $floatString);
|
||||
return floatval($floatString);
|
||||
}
|
||||
$floatString = str_replace("," , "", $floatString);
|
||||
$floatString = str_replace($LocaleInfo["decimal_point"] , ".", $floatString);
|
||||
return floatval($floatString);
|
||||
}
|
||||
|
||||
function modelList() {
|
||||
$model_list = array('' => Lang::get('general.select_model')) + DB::table('models')
|
||||
->select(DB::raw('IF (modelno="" OR modelno IS NULL,name,concat(name, " / ",modelno)) as name, id'))
|
||||
->orderBy('name', 'asc')
|
||||
->whereNull('deleted_at')
|
||||
->lists('name', 'id');
|
||||
return $model_list;
|
||||
}
|
||||
|
||||
function categoryList() {
|
||||
$category_list = array('' => '') + DB::table('categories')
|
||||
->whereNull('deleted_at')
|
||||
->orderBy('name', 'asc')
|
||||
->lists('name', 'id');
|
||||
return $category_list;
|
||||
}
|
||||
|
||||
function suppliersList() {
|
||||
$supplier_list = array('' => Lang::get('general.select_supplier')) + Supplier::orderBy('name', 'asc')
|
||||
->orderBy('name', 'asc')
|
||||
->lists('name', 'id');
|
||||
return $supplier_list;
|
||||
}
|
||||
|
||||
function statusLabelList() {
|
||||
$statuslabel_list = array('' => Lang::get('general.select_statuslabel')) + Statuslabel::orderBy('name', 'asc')
|
||||
->lists('name', 'id');
|
||||
return $statuslabel_list;
|
||||
}
|
||||
|
||||
function locationsList() {
|
||||
$location_list = array('' => Lang::get('general.select_location')) + Location::orderBy('name', 'asc')
|
||||
->lists('name', 'id');
|
||||
return $location_list;
|
||||
}
|
||||
|
||||
function manufacturerList() {
|
||||
$manufacturer_list = array('' => 'Select One') + Manufacturer::orderBy('name', 'asc')
|
||||
->lists('name', 'id');
|
||||
return $manufacturer_list;
|
||||
}
|
||||
|
||||
function statusTypeList() {
|
||||
$statuslabel_types = array('' => Lang::get('admin/hardware/form.select_statustype')) + array('undeployable' => Lang::get('admin/hardware/general.undeployable')) + array('pending' => Lang::get('admin/hardware/general.pending')) + array('archived' => Lang::get('admin/hardware/general.archived')) + array('deployable' => Lang::get('admin/hardware/general.deployable'));
|
||||
return $statuslabel_types;
|
||||
}
|
||||
|
||||
function managerList() {
|
||||
$manager_list = array('' => '') + DB::table('users')
|
||||
->select(DB::raw('concat(last_name,", ",first_name," (",username,")") as full_name, id'))
|
||||
->whereNull('deleted_at', 'and')
|
||||
->orderBy('last_name', 'asc')
|
||||
->orderBy('first_name', 'asc')
|
||||
->lists('full_name', 'id');
|
||||
return $manager_list;
|
||||
}
|
||||
|
||||
function depreciationList() {
|
||||
$depreciation_list = array('' => 'Do Not Depreciate') + Depreciation::orderBy('name', 'asc')->lists('name', 'id');
|
||||
return $depreciation_list;
|
||||
}
|
||||
|
||||
function categoryTypeList() {
|
||||
$category_types= array('' => '','accessory' => 'Accessory', 'asset' => 'Asset', 'consumable' => 'Consumable');
|
||||
return $category_types;
|
||||
}
|
||||
|
||||
function usersList() {
|
||||
$users_list = array('' => Lang::get('general.select_user')) + DB::table('users')->select(DB::raw('concat(last_name,", ",first_name," (",username,")") as full_name, id'))->whereNull('deleted_at')->orderBy('last_name', 'asc')->orderBy('first_name', 'asc')->lists('full_name', 'id');
|
||||
return $users_list;
|
||||
}
|
||||
|
||||
function barcodeDimensions ($barcode_type = 'QRCODE') {
|
||||
if ($barcode_type == 'C128') {
|
||||
$size['height'] = '-1';
|
||||
$size['width'] = '-10';
|
||||
} elseif ($barcode_type == 'PDF417') {
|
||||
$size['height'] = '-3';
|
||||
$size['width'] = '-10';
|
||||
} else {
|
||||
$size['height'] = '-3';
|
||||
$size['width'] = '-3';
|
||||
}
|
||||
return $size;
|
||||
}
|
||||
|
||||
@@ -5,15 +5,18 @@ return array(
|
||||
'about_accessories_text' => 'الملحقات هي أي شيء تقوم بتسليمه للمستخدمين لكنه لا يحتوي على رقم تسلسلي (أو أنك لست بحاجة إلى تتبعه بشكل خاص). مثال: فأرة الحاسوب أو لوحة المفاتيح.',
|
||||
'accessory_category' => 'فئة الملحق',
|
||||
'accessory_name' => 'اسم الملحق',
|
||||
'create' => 'إنشاء فئة جديدة',
|
||||
'cost' => 'Purchase Cost',
|
||||
'create' => 'Create Accessory',
|
||||
'date' => 'Purchase Date',
|
||||
'eula_text' => 'إنشاء اتفاقية جديدة',
|
||||
'eula_text_help' => 'يسمح لك هذا الحقل بتخصيص الاتفاقيات لأنواع معينة من الأصول. اذا كنت تمتلك اتفاقية واحدة لجميع أصولك يمكنك أن تقوم بتأشير المربع في الأسفل لاستخدام الاتفاقية الافتراضية.',
|
||||
'require_acceptance' => 'مطالبة المستخدمين بتأكيد قبولهم الأصول في هذه الفئة.',
|
||||
'no_default_eula' => 'ليس هناك اتفاقيات. قم باضافة واحدة من "الاعدادات".',
|
||||
'order' => 'Order Number',
|
||||
'qty' => 'الكمية',
|
||||
'total' => 'المجموع',
|
||||
'remaining' => 'المتاح',
|
||||
'update' => 'تحديث الفئة',
|
||||
'update' => 'Update Accessory',
|
||||
'use_default_eula' => 'قم باستعمال <a href="#" data-toggle="modal" data-target="#eulaModal">primary default EULA</a>.',
|
||||
'use_default_eula_disabled' => '<del>Use the primary default EULA instead.</del> No primary default EULA is set. Please add one in Settings.',
|
||||
|
||||
|
||||
@@ -1,9 +1,11 @@
|
||||
<?php
|
||||
|
||||
return array(
|
||||
'dl_csv' => 'Download CSV',
|
||||
'eula_text' => 'اتفاقية ترخيص المستخدم',
|
||||
'id' => 'رقم المعرف',
|
||||
'require_acceptance' => 'القبول',
|
||||
'title' => 'اسم الملحق',
|
||||
|
||||
|
||||
);
|
||||
|
||||
14
app/lang/ar/admin/asset_maintenances/form.php
Executable file
14
app/lang/ar/admin/asset_maintenances/form.php
Executable file
@@ -0,0 +1,14 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'asset_maintenance_type' => 'Maintenance Type',
|
||||
'title' => 'Title',
|
||||
'start_date' => 'Started',
|
||||
'completion_date' => 'Completed',
|
||||
'cost' => 'Cost',
|
||||
'is_warranty' => 'Warranty Improvement',
|
||||
'asset_maintenance_time' => 'Days',
|
||||
'notes' => 'Notes',
|
||||
'update' => 'Update',
|
||||
'create' => 'Create'
|
||||
];
|
||||
11
app/lang/ar/admin/asset_maintenances/general.php
Executable file
11
app/lang/ar/admin/asset_maintenances/general.php
Executable file
@@ -0,0 +1,11 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'asset_maintenances' => 'Asset Maintenances',
|
||||
'edit' => 'Edit Asset Maintenance',
|
||||
'delete' => 'Delete Asset Maintenance',
|
||||
'view' => 'View Asset Maintenance Details',
|
||||
'repair' => 'Repair',
|
||||
'maintenance' => 'Maintenance',
|
||||
'upgrade' => 'Upgrade'
|
||||
];
|
||||
17
app/lang/ar/admin/asset_maintenances/message.php
Executable file
17
app/lang/ar/admin/asset_maintenances/message.php
Executable file
@@ -0,0 +1,17 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'not_found' => 'Asset Maintenance you were looking for was not found!',
|
||||
'delete' => [
|
||||
'confirm' => 'Are you sure you wish to delete this asset maintenance?',
|
||||
'error' => 'There was an issue deleting the asset maintenance. Please try again.',
|
||||
'success' => 'The asset maintenance was deleted successfully.'
|
||||
],
|
||||
'create' => [
|
||||
'error' => 'Asset Maintenance was not created, please try again.',
|
||||
'success' => 'Asset Maintenance created successfully.'
|
||||
],
|
||||
'asset_maintenance_incomplete' => 'Not Completed Yet',
|
||||
'warranty' => 'Warranty',
|
||||
'not_warranty' => 'Not Warranty',
|
||||
];
|
||||
9
app/lang/ar/admin/asset_maintenances/table.php
Executable file
9
app/lang/ar/admin/asset_maintenances/table.php
Executable file
@@ -0,0 +1,9 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'title' => 'Asset Maintenance',
|
||||
'asset_name' => 'Asset',
|
||||
'supplier_name' => 'Supplier',
|
||||
'is_warranty' => 'Warranty',
|
||||
'dl_csv' => 'Download CSV'
|
||||
];
|
||||
@@ -5,6 +5,7 @@ return array(
|
||||
'about_categories' => 'تصنيفات الأصول تساعدك على ترتيب الأصول. من الأمثلة على التصنيفات " مكاتب "، "أجهزة الكمبيوتر المحمولة "، "الهواتف النقالة "، "أجهزة لوحية " وهكذا، كما يمكنك استخدام التصنيفات بأي طريقة تناسبك. ',
|
||||
'asset_categories' => 'التصنيفات',
|
||||
'category_name' => 'اسم التصنيف',
|
||||
'checkin_email' => 'Send email to user on checkin.',
|
||||
'clone' => 'Clone Category',
|
||||
'create' => 'إنشاء تصنيف',
|
||||
'edit' => 'Edit Category',
|
||||
|
||||
@@ -3,6 +3,12 @@
|
||||
return array(
|
||||
'about_consumables_title' => 'About Consumables',
|
||||
'about_consumables_text' => 'Consumables are anything purchased that will be used up over time. For example, printer ink or copier paper.',
|
||||
'consumable_name' => 'Consumable Name',
|
||||
'cost' => 'Purchase Cost',
|
||||
'create' => 'Create Consumable',
|
||||
'date' => 'Purchase Date',
|
||||
'order' => 'Order Number',
|
||||
'remaining' => 'Remaining',
|
||||
'total' => 'Total',
|
||||
'update' => 'Update Consumable',
|
||||
);
|
||||
|
||||
@@ -15,9 +15,9 @@ return array(
|
||||
),
|
||||
|
||||
'delete' => array(
|
||||
'confirm' => 'Are you sure you wish to delete this accessory?',
|
||||
'confirm' => 'Are you sure you wish to delete this consumable?',
|
||||
'error' => 'There was an issue deleting the consumable. Please try again.',
|
||||
'success' => 'The accessory was deleted successfully.'
|
||||
'success' => 'The consumable was deleted successfully.'
|
||||
),
|
||||
|
||||
'checkout' => array(
|
||||
|
||||
@@ -17,9 +17,10 @@ return array(
|
||||
'default_location' => 'Default Location',
|
||||
'eol_date' => 'EOL Date',
|
||||
'eol_rate' => 'EOL Rate',
|
||||
'expected_checkin' => 'Expected Checkin Date',
|
||||
'expires' => 'Expires',
|
||||
'fully_depreciated' => 'Fully Depreciated',
|
||||
'help_checkout' => 'If you wish to assign this asset immediately, you should select "Ready to Deploy" from the status list above, or unexpected things may happen. ',
|
||||
'help_checkout' => 'If you wish to assign this asset immediately, select "Ready to Deploy" from the status list above. ',
|
||||
'mac_address' => 'MAC Address',
|
||||
'manufacturer' => 'Manufacturer',
|
||||
'model' => 'Model',
|
||||
|
||||
@@ -5,6 +5,7 @@ return array(
|
||||
'undeployable' => '<strong>Warning: </strong> This asset has been marked as currently undeployable.
|
||||
If this status has changed, please update the asset status.',
|
||||
'does_not_exist' => 'Asset does not exist.',
|
||||
'does_not_exist_or_not_requestable' => 'Nice try. That asset does not exist or is not requestable.',
|
||||
'assoc_users' => 'This asset is currently checked out to a user and cannot be deleted. Please check the asset in first, and then try deleting again. ',
|
||||
|
||||
'create' => array(
|
||||
@@ -22,7 +23,7 @@ return array(
|
||||
'error' => 'Asset was not restored, please try again',
|
||||
'success' => 'Asset restored successfully.'
|
||||
),
|
||||
|
||||
|
||||
'deletefile' => array(
|
||||
'error' => 'File not deleted. Please try again.',
|
||||
'success' => 'File successfully deleted.',
|
||||
@@ -31,7 +32,7 @@ return array(
|
||||
'upload' => array(
|
||||
'error' => 'File(s) not uploaded. Please try again.',
|
||||
'success' => 'File(s) successfully uploaded.',
|
||||
'nofiles' => 'You did not select any files for upload',
|
||||
'nofiles' => 'You did not select any files for upload, or the file you are trying to upload is too large',
|
||||
'invalidfiles' => 'One or more of your files is too large or is a filetype that is not allowed. Allowed filetypes are png, gif, jpg, doc, docx, pdf, and txt.',
|
||||
),
|
||||
|
||||
|
||||
@@ -18,5 +18,6 @@ return array(
|
||||
'serial' => 'Serial',
|
||||
'status' => 'Status',
|
||||
'title' => 'Asset ',
|
||||
'days_without_acceptance' => 'Days Without Acceptance'
|
||||
|
||||
);
|
||||
|
||||
@@ -22,7 +22,7 @@ return array(
|
||||
'upload' => array(
|
||||
'error' => 'File(s) not uploaded. Please try again.',
|
||||
'success' => 'File(s) successfully uploaded.',
|
||||
'nofiles' => 'You did not select any files for upload',
|
||||
'nofiles' => 'You did not select any files for upload, or the file you are trying to upload is too large',
|
||||
'invalidfiles' => 'One or more of your files is too large or is a filetype that is not allowed. Allowed filetypes are png, gif, jpg, doc, docx, pdf, and txt.',
|
||||
),
|
||||
|
||||
|
||||
@@ -4,6 +4,8 @@ return array(
|
||||
|
||||
'does_not_exist' => 'Location does not exist.',
|
||||
'assoc_users' => 'This location is currently associated with at least one user and cannot be deleted. Please update your users to no longer reference this location and try again. ',
|
||||
'assoc_assets' => 'This location is currently associated with at least one asset and cannot be deleted. Please update your assets to no longer reference this location and try again. ',
|
||||
'assoc_child_loc' => 'This location is currently the parent of at least one child location and cannot be deleted. Please update your locations to no longer reference this location and try again. ',
|
||||
|
||||
|
||||
'create' => array(
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
<?php
|
||||
|
||||
return array(
|
||||
|
||||
'assets_rtd' => 'Assets RTD',
|
||||
'assets_checkedout' => 'Assets Assigned',
|
||||
'id' => 'ID',
|
||||
'city' => 'City',
|
||||
'state' => 'State',
|
||||
@@ -12,4 +13,6 @@ return array(
|
||||
'address' => 'Address',
|
||||
'zip' => 'Postal Code',
|
||||
'locations' => 'Locations',
|
||||
'parent' => 'Parent',
|
||||
'currency' => 'Location Currency',
|
||||
);
|
||||
|
||||
@@ -8,7 +8,8 @@ return array(
|
||||
|
||||
'create' => array(
|
||||
'error' => 'Model was not created, please try again.',
|
||||
'success' => 'Model created successfully.'
|
||||
'success' => 'Model created successfully.',
|
||||
'duplicate_set' => 'An asset model with that name, manufacturer and model number already exists.',
|
||||
),
|
||||
|
||||
'update' => array(
|
||||
@@ -21,7 +22,7 @@ return array(
|
||||
'error' => 'There was an issue deleting the model. Please try again.',
|
||||
'success' => 'The model was deleted successfully.'
|
||||
),
|
||||
|
||||
|
||||
'restore' => array(
|
||||
'error' => 'Model was not restored, please try again',
|
||||
'success' => 'Model restored successfully.'
|
||||
|
||||
@@ -10,6 +10,9 @@ return array(
|
||||
'backups' => 'Backups',
|
||||
'barcode_type' => 'Barcode Type',
|
||||
'barcode_settings' => 'Barcode Settings',
|
||||
'custom_css' => 'Custom CSS',
|
||||
'custom_css_help' => 'Enter any custom CSS overrides you would like to use. Do not include the <style></style> tags.',
|
||||
'default_currency' => 'Default Currency',
|
||||
'default_eula_text' => 'Default EULA',
|
||||
'default_eula_help_text' => 'You can also associate custom EULAs to specific asset categories.',
|
||||
'display_asset_name' => 'Display Asset Name',
|
||||
@@ -19,10 +22,12 @@ return array(
|
||||
'eula_settings' => 'EULA Settings',
|
||||
'eula_markdown' => 'This EULA allows <a href="https://help.github.com/articles/github-flavored-markdown/">Github flavored markdown</a>.',
|
||||
'general_settings' => 'General Settings',
|
||||
'generate_backup' => 'Generate Backup',
|
||||
'header_color' => 'Header Color',
|
||||
'info' => 'These settings let you customize certain aspects of your installation.',
|
||||
'laravel' => 'Laravel Version',
|
||||
'load_remote' => 'This Snipe-IT install can load scripts from the outside world.',
|
||||
'load_remote_text' => 'Remote Scripts',
|
||||
'load_remote_help_text' => 'This Snipe-IT install can load scripts from the outside world.',
|
||||
'logo' => 'Logo',
|
||||
'optional' => 'optional',
|
||||
'per_page' => 'Results Per Page',
|
||||
@@ -43,4 +48,7 @@ return array(
|
||||
'system' => 'System Information',
|
||||
'update' => 'Update Settings',
|
||||
'value' => 'Value',
|
||||
'brand' => 'Branding',
|
||||
'about_settings_title' => 'About Settings',
|
||||
'about_settings_text' => 'These settings let you customize certain aspects of your installation.',
|
||||
);
|
||||
|
||||
@@ -4,8 +4,14 @@ return array(
|
||||
|
||||
|
||||
'update' => array(
|
||||
'error' => 'An error has occurred while updating. ',
|
||||
'success' => 'Settings updated successfully.'
|
||||
'error' => 'An error has occurred while updating. ',
|
||||
'success' => 'Settings updated successfully.'
|
||||
),
|
||||
'backup' => array(
|
||||
'delete_confirm' => 'Are you sure you would like to delete this backup file? This action cannot be undone. ',
|
||||
'file_deleted' => 'The backup file was successfully deleted. ',
|
||||
'generated' => 'A new backup file was successfully created.',
|
||||
'file_not_found' => 'That backup file could not be found on the server.',
|
||||
),
|
||||
|
||||
);
|
||||
|
||||
@@ -3,13 +3,16 @@
|
||||
|
||||
return array(
|
||||
|
||||
'assets_user' => 'الجهاز مسجل بعهدة :name',
|
||||
'clone' => 'نسخ المستخدم',
|
||||
'contact_user' => 'اتصل بـ :name',
|
||||
'edit' => 'تعديل المستخدم',
|
||||
'history_user' => 'الأرشيف الخاص بـ :name',
|
||||
'last_login' => 'آخر دخول للمستخدم',
|
||||
'software_user' => 'البرامج المسجلة لـ :name',
|
||||
'view_user' => 'عرض المستخدم :name',
|
||||
'usercsv' => 'ملف CSV',
|
||||
'assets_user' => 'الجهاز مسجل بعهدة :name',
|
||||
'clone' => 'نسخ المستخدم',
|
||||
'contact_user' => 'اتصل بـ :name',
|
||||
'edit' => 'تعديل المستخدم',
|
||||
'filetype_info' => 'Allowed filetypes are png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, and rar.',
|
||||
'history_user' => 'الأرشيف الخاص بـ :name',
|
||||
'last_login' => 'آخر دخول للمستخدم',
|
||||
'ldap_config_text' => 'LDAP configuration settings can be found in the app/config folder in a file called ldap.php. The selected location will be set for all imported users. You will need to have at least one location set to use this feature.',
|
||||
'ldap_text' => 'Connect to LDAP and create users. Passwords will be auto-generated.',
|
||||
'software_user' => 'البرامج المسجلة لـ :name',
|
||||
'view_user' => 'عرض المستخدم :name',
|
||||
'usercsv' => 'ملف CSV',
|
||||
);
|
||||
|
||||
@@ -2,12 +2,15 @@
|
||||
|
||||
return array(
|
||||
|
||||
'user_exists' => 'المستخدم موجود مسبقاً!',
|
||||
'user_not_found' => 'المستخدم [id:] غير موجود.',
|
||||
'user_login_required' => 'حقل "الدخول" مطلوب',
|
||||
'user_password_required' => 'كلمة السر مطلوبة.',
|
||||
'insufficient_permissions' => 'صلاحيات غير كافية.',
|
||||
'user_deleted_warning' => 'تم حذف المستخدم. سيكون عليك استعادة هذا المستخدم للتعديل عليه او تسليمه اجهزة جديدة.',
|
||||
'accepted' => 'You have successfully accepted this asset.',
|
||||
'declined' => 'You have successfully declined this asset.',
|
||||
'user_exists' => 'المستخدم موجود مسبقاً!',
|
||||
'user_not_found' => 'المستخدم [id:] غير موجود.',
|
||||
'user_login_required' => 'حقل "الدخول" مطلوب',
|
||||
'user_password_required' => 'كلمة السر مطلوبة.',
|
||||
'insufficient_permissions' => 'صلاحيات غير كافية.',
|
||||
'user_deleted_warning' => 'تم حذف المستخدم. سيكون عليك استعادة هذا المستخدم للتعديل عليه او تسليمه اجهزة جديدة.',
|
||||
'ldap_not_configured' => 'LDAP integration has not been configured for this installation.',
|
||||
|
||||
|
||||
'success' => array(
|
||||
@@ -29,6 +32,23 @@ return array(
|
||||
'unsuspend' => 'حدث خطأ ما أثناء إلغاء التعليق عن المستخدم. حاول مرة أخرى.',
|
||||
'import' => 'حدث خطأ أثناء استيراد المستخدمين. حاول مرة أخرى.',
|
||||
'asset_already_accepted' => 'هذا الجهاز تم قبوله مسبقاً.',
|
||||
'accept_or_decline' => 'You must either accept or decline this asset.',
|
||||
'ldap_could_not_connect' => 'Could not connect to the LDAP server. Please check your LDAP server configuration in the LDAP config file. <br>Error from LDAP Server:',
|
||||
'ldap_could_not_bind' => 'Could not bind to the LDAP server. Please check your LDAP server configuration in the LDAP config file. <br>Error from LDAP Server: ',
|
||||
'ldap_could_not_search' => 'Could not search the LDAP server. Please check your LDAP server configuration in the LDAP config file. <br>Error from LDAP Server:',
|
||||
'ldap_could_not_get_entries' => 'Could not get entries from the LDAP server. Please check your LDAP server configuration in the LDAP config file. <br>Error from LDAP Server:',
|
||||
),
|
||||
|
||||
'deletefile' => array(
|
||||
'error' => 'File not deleted. Please try again.',
|
||||
'success' => 'File successfully deleted.',
|
||||
),
|
||||
|
||||
'upload' => array(
|
||||
'error' => 'File(s) not uploaded. Please try again.',
|
||||
'success' => 'File(s) successfully uploaded.',
|
||||
'nofiles' => 'You did not select any files for upload',
|
||||
'invalidfiles' => 'One or more of your files is too large or is a filetype that is not allowed. Allowed filetypes are png, gif, jpg, doc, docx, pdf, and txt.',
|
||||
),
|
||||
|
||||
);
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
return array(
|
||||
|
||||
'account_already_exists' => 'An account with the this email already exists.',
|
||||
'account_not_found' => 'The email account or password is incorrect.',
|
||||
'account_not_found' => 'The username or password is incorrect.',
|
||||
'account_not_activated' => 'This user account is not activated.',
|
||||
'account_suspended' => 'This user account is suspended.',
|
||||
'account_banned' => 'This user account is banned.',
|
||||
|
||||
@@ -8,6 +8,7 @@ return array(
|
||||
'delete' => 'حذف',
|
||||
'edit' => 'تعديل',
|
||||
'restore' => 'إستعادة',
|
||||
'request' => 'Request',
|
||||
'submit' => 'إرسال',
|
||||
'upload' => 'Upload',
|
||||
|
||||
|
||||
@@ -1,10 +1,9 @@
|
||||
<?php
|
||||
|
||||
return array(
|
||||
|
||||
|
||||
return [
|
||||
'accessories' => 'Accessories',
|
||||
'accessory' => 'Accessory',
|
||||
'accessory_report' => 'Accessory Report',
|
||||
'action' => 'Action',
|
||||
'activity_report' => 'Activity Report',
|
||||
'address' => 'العنوان',
|
||||
@@ -21,6 +20,7 @@ return array(
|
||||
'avatar_delete' => 'حذف الصورة الرمزية',
|
||||
'avatar_upload' => 'رفع صورة رمزية',
|
||||
'back' => 'الرجوع للخلف',
|
||||
'bad_data' => 'Nothing found. Maybe bad data?',
|
||||
'cancel' => 'إلغاء',
|
||||
'categories' => 'Categories',
|
||||
'category' => 'Category',
|
||||
@@ -36,13 +36,14 @@ return array(
|
||||
'create' => 'إضافة',
|
||||
'created_asset' => 'الأصول المضافة',
|
||||
'created_at' => 'أنشئت في',
|
||||
'currency' => '$',
|
||||
'currency' => '$', // this is deprecated
|
||||
'current' => 'الحالي',
|
||||
'custom_report' => 'Custom Asset Report',
|
||||
'dashboard' => 'Dashboard',
|
||||
'date' => 'التاريخ',
|
||||
'delete' => 'حذف',
|
||||
'deleted' => 'تم حذفها',
|
||||
'delete_seats' => 'Deleted Seats',
|
||||
'deployed' => 'مُوزعة',
|
||||
'depreciation_report' => 'تقرير الإستهلاك',
|
||||
'download' => 'Download',
|
||||
@@ -60,6 +61,10 @@ return array(
|
||||
'id' => 'الرقم',
|
||||
'image_delete' => 'حذف الصورة',
|
||||
'image_upload' => 'رفع صورة',
|
||||
'import' => 'Import',
|
||||
'asset_maintenance' => 'Asset Maintenance',
|
||||
'asset_maintenance_report' => 'Asset Maintenance Report',
|
||||
'asset_maintenances' => 'Asset Maintenances',
|
||||
'item' => 'Item',
|
||||
'last' => 'Last',
|
||||
'last_name' => 'الإسم الأخير',
|
||||
@@ -69,6 +74,8 @@ return array(
|
||||
'licenses' => 'الرخص',
|
||||
'list_all' => 'عرض الكل',
|
||||
'loading' => 'Loading',
|
||||
'lock_passwords' => 'This field cannot be edited in this installation.',
|
||||
'feature_disabled' => 'This feature has been disabled for this installation.',
|
||||
'location' => 'الموقع',
|
||||
'locations' => 'المواقع',
|
||||
'logout' => 'تسجيل خروج',
|
||||
@@ -96,6 +103,7 @@ return array(
|
||||
'ready_to_deploy' => 'جاهزة للتوزيع',
|
||||
'recent_activity' => 'Recent Activity',
|
||||
'reports' => 'التقارير',
|
||||
'requested' => 'Requested',
|
||||
'save' => 'حفظ',
|
||||
'select' => 'Select',
|
||||
'search' => 'Search',
|
||||
@@ -106,6 +114,7 @@ return array(
|
||||
'select_supplier' => 'Select a Supplier',
|
||||
'select_user' => 'Select a User',
|
||||
'select_date' => 'Select Date',
|
||||
'select_statuslabel' => 'Select Status',
|
||||
'settings' => 'الإعدادات',
|
||||
'sign_in' => 'تسجيل الدخول',
|
||||
'site_name' => 'إسم الموقع',
|
||||
@@ -118,8 +127,12 @@ return array(
|
||||
'type' => 'Type',
|
||||
'undeployable' => 'غير قابلة للتوزيع',
|
||||
'unknown_admin' => 'إداري غير معروف',
|
||||
'update' => 'Update',
|
||||
'uploaded' => 'Uploaded',
|
||||
'user' => 'المستخدم',
|
||||
'accepted' => 'accepted',
|
||||
'declined' => 'declined',
|
||||
'unaccepted_asset_report' => 'Unaccepted Assets',
|
||||
'users' => 'Users',
|
||||
'viewassets' => 'عرض الأصول المسجلة',
|
||||
'website' => 'الموقع',
|
||||
@@ -127,5 +140,4 @@ return array(
|
||||
'years' => 'سنوات',
|
||||
'yes' => 'نعم',
|
||||
'zip' => 'الرمز البريدي',
|
||||
|
||||
);
|
||||
];
|
||||
|
||||
@@ -77,7 +77,7 @@ return array(
|
||||
*/
|
||||
|
||||
'custom' => array(),
|
||||
'alpha_space' => "The :attribute field may only contain letters, commas, spaces and dashes.",
|
||||
'alpha_space' => "The :attribute field contains a character that is not allowed.",
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
|
||||
23
app/lang/bg/admin/accessories/general.php
Executable file
23
app/lang/bg/admin/accessories/general.php
Executable file
@@ -0,0 +1,23 @@
|
||||
<?php
|
||||
|
||||
return array(
|
||||
'about_accessories_title' => 'Относно аксесоарите',
|
||||
'about_accessories_text' => 'Аксесоарите са всички неща, които се изписват на потребителите, но нямат сериен номер (или няма нужда да бъдат конкретно проследявани). Например, това са мишки, клавиатури и др.',
|
||||
'accessory_category' => 'Категория аксесоари',
|
||||
'accessory_name' => 'Аксесоар',
|
||||
'cost' => 'Purchase Cost',
|
||||
'create' => 'Създаване на аксесоар',
|
||||
'date' => 'Purchase Date',
|
||||
'eula_text' => 'EULA на категорията',
|
||||
'eula_text_help' => 'Това поле позволява да задавате различни EULA за всеки тип активи. Ако имате обща EULA за всички активи, можете да използвате кутийката по-долу за да използвате една обща по подразбиране.',
|
||||
'require_acceptance' => 'Задължаване на потребителите да потвърждават приемането на активи от тази категория.',
|
||||
'no_default_eula' => 'Няма EULA по подразбиране. Добавете я в Настройки.',
|
||||
'order' => 'Order Number',
|
||||
'qty' => 'Количество',
|
||||
'total' => 'Oбщо',
|
||||
'remaining' => 'Наличност',
|
||||
'update' => 'Обновяване на аксесоар',
|
||||
'use_default_eula' => 'Използване на <a href="#" data-toggle="modal" data-target="#eulaModal">EULA по подразбиране</a>.',
|
||||
'use_default_eula_disabled' => '<del>Използване на EULA по подразбиране</del> Няма EULA по подразбиране. Добавете я в Настройки.',
|
||||
|
||||
);
|
||||
37
app/lang/bg/admin/accessories/message.php
Executable file
37
app/lang/bg/admin/accessories/message.php
Executable file
@@ -0,0 +1,37 @@
|
||||
<?php
|
||||
|
||||
return array(
|
||||
|
||||
'does_not_exist' => 'Няма такава категория.',
|
||||
'assoc_users' => 'От този аксесоар са предадени :count броя на потребителите. Моля впишете обратно нови или върнати и опитайте отново.',
|
||||
|
||||
'create' => array(
|
||||
'error' => 'Категорията не беше създадена. Моля опитайте отново.',
|
||||
'success' => 'Категорията е създадена.'
|
||||
),
|
||||
|
||||
'update' => array(
|
||||
'error' => 'Категорията не беше обновена. Моля опитайте отново.',
|
||||
'success' => 'Категорията е обновена.'
|
||||
),
|
||||
|
||||
'delete' => array(
|
||||
'confirm' => 'Сигурни ли сте, че желаете изтриване на категорията?',
|
||||
'error' => 'Проблем при изтриване на категорията. Моля опитайте отново.',
|
||||
'success' => 'Категорията бе изтрита успешно.'
|
||||
),
|
||||
|
||||
'checkout' => array(
|
||||
'error' => 'Аксесоарът не беше изписан. Моля опитайте отново.',
|
||||
'success' => 'Аксесоарът изписан успешно.',
|
||||
'user_does_not_exist' => 'Невалиден потребител. Моля опитайте отново.'
|
||||
),
|
||||
|
||||
'checkin' => array(
|
||||
'error' => 'Аксесоарът не беше вписан. Моля опитайте отново.',
|
||||
'success' => 'Аксесоарът вписан успешно.',
|
||||
'user_does_not_exist' => 'Невалиден потребител. Моля опитайте отново.'
|
||||
)
|
||||
|
||||
|
||||
);
|
||||
11
app/lang/bg/admin/accessories/table.php
Executable file
11
app/lang/bg/admin/accessories/table.php
Executable file
@@ -0,0 +1,11 @@
|
||||
<?php
|
||||
|
||||
return array(
|
||||
'dl_csv' => 'Сваляне на CSV',
|
||||
'eula_text' => 'EULA',
|
||||
'id' => 'ID',
|
||||
'require_acceptance' => 'Утвърждаване',
|
||||
'title' => 'Аксесоар',
|
||||
|
||||
|
||||
);
|
||||
14
app/lang/bg/admin/asset_maintenances/form.php
Executable file
14
app/lang/bg/admin/asset_maintenances/form.php
Executable file
@@ -0,0 +1,14 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'asset_maintenance_type' => 'Тип на поддръжка на актив',
|
||||
'title' => 'Заглавие',
|
||||
'start_date' => 'Начална дата',
|
||||
'completion_date' => 'Крайна дата',
|
||||
'cost' => 'Стойност',
|
||||
'is_warranty' => 'Подобрение на гаранцията',
|
||||
'asset_maintenance_time' => 'Време за поддръжка на актив (в дни)',
|
||||
'notes' => 'Бележки',
|
||||
'update' => 'Редакция на поддръжка на актив',
|
||||
'create' => 'Създаване на поддръжка на актив'
|
||||
];
|
||||
11
app/lang/bg/admin/asset_maintenances/general.php
Executable file
11
app/lang/bg/admin/asset_maintenances/general.php
Executable file
@@ -0,0 +1,11 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'asset_maintenances' => 'Поддръжка на активи',
|
||||
'edit' => 'Редакция на поддръжка на актив',
|
||||
'delete' => 'Изтриване на поддръжка на актив',
|
||||
'view' => 'Преглед на поддръжка на актив',
|
||||
'repair' => 'Ремонт',
|
||||
'maintenance' => 'Поддръжка',
|
||||
'upgrade' => 'Upgrade'
|
||||
];
|
||||
17
app/lang/bg/admin/asset_maintenances/message.php
Executable file
17
app/lang/bg/admin/asset_maintenances/message.php
Executable file
@@ -0,0 +1,17 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'not_found' => 'Поддръжката на актив, която търсите не бе открита!',
|
||||
'delete' => [
|
||||
'confirm' => 'Потвърдете изтриването на поддръжката на актив.',
|
||||
'error' => 'Проблем при изтриването на поддръжка на актив. Моля опитайте отново.',
|
||||
'success' => 'Поддръжката на актив изтрита успешно.'
|
||||
],
|
||||
'create' => [
|
||||
'error' => 'Поддръжката на актив не бе създадена. Моля опитайте отново.',
|
||||
'success' => 'Поддръжката на актив създадена успешно.'
|
||||
],
|
||||
'asset_maintenance_incomplete' => 'Все още неприключила',
|
||||
'warranty' => 'Гаранция',
|
||||
'not_warranty' => 'Без гаранция',
|
||||
];
|
||||
9
app/lang/bg/admin/asset_maintenances/table.php
Executable file
9
app/lang/bg/admin/asset_maintenances/table.php
Executable file
@@ -0,0 +1,9 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'title' => 'Поддръжка на активи',
|
||||
'asset_name' => 'Актив',
|
||||
'supplier_name' => 'Доставчик',
|
||||
'is_warranty' => 'Гаранция',
|
||||
'dl_csv' => 'Сваляне на CSV'
|
||||
];
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user