Compare commits
2037 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| d47e2aab76 | |||
| c7399b0c4f | |||
| 086b13c17e | |||
| 2620da186b | |||
| 3689a52894 | |||
| 725a9320cb | |||
| 12996cafac | |||
| 859c53e975 | |||
| 1322d81d64 | |||
| 3ab828a4cd | |||
| 5ca572b914 | |||
| 1bc7ff9941 | |||
| b855f2fa2b | |||
| 114e6ec6cc | |||
| be4230af81 | |||
| 390de7ae36 | |||
| 588f0a23ba | |||
| d40129bdae | |||
| 54f3c65624 | |||
| 8e18218652 | |||
| bf9aba3f20 | |||
| 7e554a3c59 | |||
| 91ac9bd485 | |||
| f16122070a | |||
| 4803bc71ec | |||
| f0a589f150 | |||
| 32591d4ca0 | |||
| d1bcee0dfa | |||
| e4dfb188fa | |||
| 4f057bfe5e | |||
| 8bbaf2e52f | |||
| cf5fcdf9d7 | |||
| 2333d4e933 | |||
| e1be3efd82 | |||
| 97f97e3590 | |||
| 701c16f4e6 | |||
| 59c203b6ae | |||
| d84479d9fc | |||
| 480f0ef13b | |||
| 6020de6321 | |||
| 796866fd54 | |||
| ef58de5e8c | |||
| 7e07c7dee3 | |||
| 9dc57ff673 | |||
| dea95f9f5b | |||
| 23431fafd9 | |||
| 2cf566422c | |||
| b85d624f08 | |||
| e69eddeef8 | |||
| 061e0d4cdb | |||
| 64b1355393 | |||
| 2cf169a64a | |||
| 6d810a9b0d | |||
| 4a9701af71 | |||
| 0890a22bdb | |||
| f9c66917bd | |||
| 311cccbb1e | |||
| ca27ef6741 | |||
| 0dfa0d9c45 | |||
| 90442c720b | |||
| e228577936 | |||
| 9a18312ab1 | |||
| fc4863837f | |||
| 9bb2ffcf9a | |||
| a78874d986 | |||
| 458f413c61 | |||
| 503f9145a4 | |||
| 04233336aa | |||
| e5b2163ffe | |||
| 9f899ee878 | |||
| 03caa85396 | |||
| f1a4608faf | |||
| c66fe3d4d2 | |||
| 855b3809d0 | |||
| 2d4dee2f72 | |||
| 8667964e3c | |||
| 72a2ee6ea4 | |||
| 6a638f131f | |||
| ab5ff0f709 | |||
| 36fd4ab7c5 | |||
| 98db6fe9df | |||
| 20fd420690 | |||
| 771e21d9f7 | |||
| 3fd9df62f4 | |||
| 1b1a733043 | |||
| e70dab64a2 | |||
| f121766037 | |||
| 9563cf4614 | |||
| 2d56240408 | |||
| 00bb511506 | |||
| fb1dd29059 | |||
| 0896ca6517 | |||
| 9a84497fb0 | |||
| e4cb237bfe | |||
| 28b89f3ddb | |||
| 9ad9e1d5a5 | |||
| 39f40a3f6d | |||
| 0d3a4813ce | |||
| 51e480661d | |||
| 77632cdfb0 | |||
| 19d6f33770 | |||
| c779034e41 | |||
| 8ff7a6ce21 | |||
| 1908499379 | |||
| 348c8f62d1 | |||
| 7da0ffc325 | |||
| 33b05b071d | |||
| f98b4095a2 | |||
| b30edfd9d6 | |||
| b16ea61da8 | |||
| a5e2e7e285 | |||
| 456e586e02 | |||
| 4c4e0ce5c5 | |||
| 8ea23e6773 | |||
| c9feff0757 | |||
| f1b2ba5c51 | |||
| 76220b7884 | |||
| bb88b85a02 | |||
| dad816ba25 | |||
| 4037200fad | |||
| 326d0cc764 | |||
| 9800786485 | |||
| ce6b2f2e5f | |||
| 3e2fc13af5 | |||
| 73317f14a0 | |||
| 6bc2af6e71 | |||
| 962e7531a6 | |||
| e8e8e8f4f3 | |||
| 2982cffc3a | |||
| 218fe72e16 | |||
| 2b13641661 | |||
| 66fe626d51 | |||
| ca9ab681b9 | |||
| 0f07f12d35 | |||
| 03efe0b3e2 | |||
| d7b91d88d6 | |||
| 298a938db2 | |||
| 6c389298f8 | |||
| d4685ec037 | |||
| 602501b4a3 | |||
| e93aebc27b | |||
| e392c87250 | |||
| 2707742518 | |||
| 738dc1fdf0 | |||
| 6f04cf9f61 | |||
| 4be3f2700c | |||
| 4cb0e40abb | |||
| ad144e127c | |||
| 2f4e54c8a6 | |||
| 7c06cba647 | |||
| 5eb506b9c3 | |||
| 4aa376826f | |||
| 1d9e014bfa | |||
| 506af72d83 | |||
| 1ce205a579 | |||
| a7a82e5fbc | |||
| 23da312fff | |||
| faf2e464fa | |||
| 79c5d3f7d6 | |||
| 2888103d1a | |||
| f89176d500 | |||
| 5eb95272ee | |||
| 6c7e265921 | |||
| 76955ec064 | |||
| de9a15a33b | |||
| f9cf2b2558 | |||
| e4627cee96 | |||
| 36eb51d6e4 | |||
| 689832036e | |||
| 8cfcb2aed8 | |||
| 27962d5439 | |||
| f4af607d1a | |||
| 90340a7111 | |||
| 8742bf26b4 | |||
| 8eb31a9a82 | |||
| aeeb273d4c | |||
| 5f6ba2a148 | |||
| 0cb3a9265e | |||
| 96a5f437f2 | |||
| 4b92cdf684 | |||
| 50be3eed4a | |||
| 3b7da8f379 | |||
| 90b00b02cc | |||
| 9eee73d2e5 | |||
| 6639bc1300 | |||
| e272cab82f | |||
| 5967dbae64 | |||
| f42a3c8918 | |||
| d3b3ed0d16 | |||
| 0484924490 | |||
| 894579314c | |||
| b76f014669 | |||
| f03d1cd4cc | |||
| a0db241ac8 | |||
| 0c27717c20 | |||
| ce1565a545 | |||
| ac5527e7d3 | |||
| 865468d091 | |||
| b20f4d245e | |||
| 927c368235 | |||
| eacd4ee2b0 | |||
| 8dab50edc6 | |||
| ee097dd1da | |||
| 775ea95458 | |||
| 73f0a19adb | |||
| a68cbcf767 | |||
| 5c698d7cfd | |||
| efc06f4b31 | |||
| bac1b313f6 | |||
| cac254ded6 | |||
| e217d354dc | |||
| e1837069da | |||
| eb83d9c486 | |||
| 25338c00e5 | |||
| 599ea20d65 | |||
| 72f3b459c5 | |||
| c34c9438da | |||
| 3d8733c612 | |||
| cab1642ead | |||
| 6aa3e21b4c | |||
| b1e48b7054 | |||
| 2686dd640c | |||
| bb7b8f3964 | |||
| 5bed0bd7ed | |||
| be3c8e4515 | |||
| 784d1995d8 | |||
| 7802af837b | |||
| 6f8a76246e | |||
| 66e9203b97 | |||
| b41461698d | |||
| 8cdb032a14 | |||
| 3417d833ba | |||
| aff7b99d91 | |||
| 3944553bfc | |||
| 3dc79197c3 | |||
| f1b00853c6 | |||
| 7f46a48173 | |||
| ae8c9f420d | |||
| aa385571cf | |||
| 9920cb2744 | |||
| 179f96c8e8 | |||
| 7562552f7a | |||
| 5f9d5ae836 | |||
| 639d6214d8 | |||
| dad492d131 | |||
| 6e78fc0a2d | |||
| e98020fa89 | |||
| 6ec4f605f4 | |||
| e88f5629df | |||
| 475fc4855c | |||
| edb2a0b1b7 | |||
| e81fe52aa8 | |||
| 74ed75dd24 | |||
| 17e681ba7c | |||
| 4e065e8df7 | |||
| 9e0f7089c4 | |||
| c22dcdafa4 | |||
| e5cc6d32d1 | |||
| 54655faf83 | |||
| 3b42738a2d | |||
| 65feb00ea4 | |||
| 82a3560f27 | |||
| e8ca98a37d | |||
| 9316af7ed8 | |||
| bbdb576519 | |||
| 43c26f853b | |||
| 1cd7f10f10 | |||
| e4ceddd6ce | |||
| bb83a14707 | |||
| fffc8ed644 | |||
| c6db29e6c4 | |||
| 948e9c2a2b | |||
| 62fe4b8cd3 | |||
| 9b46a5b0f6 | |||
| 8158c12242 | |||
| 36ecf3032f | |||
| 19820db0cc | |||
| fc06caded5 | |||
| a44c56c937 | |||
| 2accfab79e | |||
| 418be7f5de | |||
| beeb28bf09 | |||
| 92410ba054 | |||
| 078750726f | |||
| 7d2ae0d10d | |||
| d8a9d2d3eb | |||
| b925c5766f | |||
| 6bedaa903a | |||
| 4f3cdc20f5 | |||
| 1efb1f7038 | |||
| 6708911d5d | |||
| 3bbcbf5f47 | |||
| 989ce59a5b | |||
| 774b1cb28b | |||
| 10086479b7 | |||
| c0e988b6b1 | |||
| 93cf37336d | |||
| 924f61fce9 | |||
| c6f8d3e6f2 | |||
| a212abee1d | |||
| 4508225d65 | |||
| e3ec2ae3ec | |||
| d653126a2a | |||
| ba39cbb5e0 | |||
| 34276984f3 | |||
| 2195e27d61 | |||
| 948be5c74b | |||
| 93c582970c | |||
| 9624388522 | |||
| 6abfb1b968 | |||
| 59b2b8c63e | |||
| 658462cda5 | |||
| dad1ffb355 | |||
| 12b82d6679 | |||
| 20490986c6 | |||
| 64eecc8df7 | |||
| 0f33bad1b6 | |||
| 632fa92f92 | |||
| 99391d0179 | |||
| c6c6bd02bb | |||
| 904ddddce9 | |||
| d34e7178b3 | |||
| 0428d21c5e | |||
| d8b43215b0 | |||
| b39c53a5ea | |||
| 67e968b032 | |||
| 032aabeadd | |||
| 1202ce4a81 | |||
| 406e077c1e | |||
| 4be046a675 | |||
| 535263788d | |||
| 29bb6a3c4f | |||
| f04e4b1fb4 | |||
| c8c755f8c3 | |||
| 287c7735b6 | |||
| 2a28c73845 | |||
| 3dc0381e2b | |||
| a3dbd87f9f | |||
| 6d42d2c614 | |||
| e910b532c7 | |||
| a777499c0b | |||
| b99c138cb0 | |||
| cbb2151f1a | |||
| 256f33e6b4 | |||
| 59315878c3 | |||
| f6e2654609 | |||
| 4ad241e65e | |||
| 808b66b9f5 | |||
| edbfdc6eb1 | |||
| 716c459985 | |||
| ef011cdf7e | |||
| b93f36a856 | |||
| e60c0e3b4d | |||
| 407b341510 | |||
| 120c8394bb | |||
| cc17862eae | |||
| c24f1721d7 | |||
| c80f1789d4 | |||
| 4a49e6f471 | |||
| e9f4be711a | |||
| 1bccb6127e | |||
| 61107769e8 | |||
| 4e96a5a793 | |||
| f87a25bf3f | |||
| 4ae02c1fb3 | |||
| 9ec132acde | |||
| 318b4b48c6 | |||
| 329a2282e4 | |||
| f8014c4677 | |||
| 7a07c07e29 | |||
| 4b926f015b | |||
| aa834aa72b | |||
| 400b97c40a | |||
| 8394212df7 | |||
| 2487ce42e3 | |||
| fb59ad9fe6 | |||
| 8af5fd0384 | |||
| 4de42f69ba | |||
| 620d4754c0 | |||
| 6ea3bedb9e | |||
| 840e5b1523 | |||
| 1ee3f29d2e | |||
| 6b26640077 | |||
| 964d2bc463 | |||
| e4a634a8a3 | |||
| 5445a7d16b | |||
| 86a174201e | |||
| 7a03a56498 | |||
| 01b574069a | |||
| cc930fc5b8 | |||
| 67a58221eb | |||
| 31c4a63ec0 | |||
| a0f2ad5d54 | |||
| 2c7553e81e | |||
| e82ede5d44 | |||
| e91a22fce0 | |||
| 31ecd165a3 | |||
| fe44846c1b | |||
| c708a24657 | |||
| dbdc2c8e64 | |||
| e66e2e42d3 | |||
| a598fdcb59 | |||
| 177fadba8a | |||
| 1fe5bd3770 | |||
| 2b26fd7e20 | |||
| 7a0598dfc3 | |||
| 5ebb267a53 | |||
| 638a7773bd | |||
| 113dfc9c24 | |||
| 3942fd1869 | |||
| d2423b2fc8 | |||
| a8e686cdf7 | |||
| 08781a561b | |||
| 8fb7d82bab | |||
| ced2a99031 | |||
| 0a97c626e7 | |||
| 6478425be6 | |||
| 999910f31f | |||
| 73a183677d | |||
| 1d24450dcd | |||
| 6f338e573c | |||
| 8e44421788 | |||
| e031239cf0 | |||
| 21a280676b | |||
| ac44140d83 | |||
| c8ecddba54 | |||
| 2f69be03d3 | |||
| 7e8a0af6e5 | |||
| 63cd0c1ae1 | |||
| 8a014d4bd3 | |||
| 8793a04869 | |||
| d72df21b3b | |||
| 08d0fe5118 | |||
| 2ec5f340e8 | |||
| 3e1e9b0077 | |||
| 937249b960 | |||
| 50ea6c66f9 | |||
| 0910d9cf8c | |||
| 30e8555148 | |||
| 8f6c37c301 | |||
| b202e01205 | |||
| 7f9fab0055 | |||
| b210d90148 | |||
| 23d10a8f7f | |||
| 6d365157e7 | |||
| 3a99136f73 | |||
| 50170dd774 | |||
| 5e1bec71f2 | |||
| d73134f32d | |||
| d8df61bd32 | |||
| 12912b3e27 | |||
| d9cd4a4da0 | |||
| 2afc252549 | |||
| aa05d041bd | |||
| bbe0189be2 | |||
| a0599712a6 | |||
| 1a4926ce13 | |||
| 3c8959e92d | |||
| ab3871f678 | |||
| 7297a6031e | |||
| 75bd29b027 | |||
| b77b9c0434 | |||
| b9c36f8638 | |||
| ecae451ebf | |||
| 9627f15412 | |||
| 464f11c398 | |||
| 90009db1b5 | |||
| d7f8d0fc04 | |||
| effad46cc0 | |||
| 4509631921 | |||
| d1a306cfd8 | |||
| 2de4741170 | |||
| fc609ece12 | |||
| ecfd1b2693 | |||
| a8da68d3fd | |||
| 69970d1296 | |||
| ef7c7da4e5 | |||
| 306d8ebaf7 | |||
| 250880c6f3 | |||
| 6bf2a2875f | |||
| 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 | |||
| a955d57c20 | |||
| 63eca44789 | |||
| aaf2c6fbce | |||
| 9a63cbbd6c | |||
| 0aeab1ab7e | |||
| 4c3a5a99df | |||
| 60370b9627 | |||
| df986c7cfe | |||
| a67951fbce | |||
| a3f5dc331d | |||
| af6a3dcccd | |||
| 0f6de6a477 | |||
| 5890d26545 | |||
| 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 | |||
| 20c35fd0bb | |||
| ca625418fe | |||
| 4beb3b024d | |||
| b39e617e96 | |||
| 93bd9120cc | |||
| 2171e668fe | |||
| 103c61d936 | |||
| f4d882606a | |||
| b56aba3cc2 | |||
| 377e4c06a1 | |||
| 58911cd10e | |||
| 9264e7bdc4 | |||
| 78143cbd1c | |||
| 01f00cfe51 | |||
| b492ac4950 | |||
| bdc0619016 | |||
| 273d838a42 | |||
| 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 | |||
| 22ea008bb4 | |||
| 86c620df3d | |||
| 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 | |||
| 4b68efb80b | |||
| 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 | |||
| c8842a85ee | |||
| 7255a8bb0c | |||
| f5d4eb5842 | |||
| 7e5f32c9d8 | |||
| e1724cf25f | |||
| 9936cf4a43 | |||
| e9443a244c | |||
| f8be47dfbf | |||
| 2d10931d6c | |||
| 4a5066054b | |||
| 84ffc1a728 | |||
| 74429d9075 | |||
| c2d63915c3 | |||
| fd59ca0802 | |||
| de23ec5785 | |||
| 05f0b94bf6 | |||
| f54c86db87 | |||
| e714def74a | |||
| a9e169261c | |||
| 665ffa6571 | |||
| a22687abc5 | |||
| 2645acd827 | |||
| 8335f10f8c | |||
| 518680f23c | |||
| 38c36699a7 | |||
| f363e742e6 | |||
| 1edce0a4fa | |||
| 7da7907fbd | |||
| 32a0f6eb92 | |||
| 1301119c9a | |||
| c7f2dc83db | |||
| 82892a38b8 | |||
| 3664e75c47 | |||
| 61836f20c5 | |||
| 62d382d704 | |||
| 3746bc333b | |||
| ccde517c88 | |||
| f855bfd4ef | |||
| 674348b5a5 | |||
| 1b423f5b54 | |||
| 7d5810b656 | |||
| 1601bdd4eb | |||
| 552bdfdc2d | |||
| d4af197b0e | |||
| be685467eb | |||
| 7a0b3a7350 | |||
| 55f544829d | |||
| bb7ce83c48 | |||
| 1d4cfcfd58 | |||
| 6915987239 | |||
| 3a44a7e8bb | |||
| f2abbd0e8f | |||
| 62f8d002e3 | |||
| 0766ae2d17 | |||
| 95920be8ea | |||
| 588ff742fe | |||
| a8cb5c1e7d | |||
| 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 | |||
| 1fb2878772 | |||
| 84e130d6aa | |||
| edfa064fd4 | |||
| 3caded990a | |||
| 3bca2566d7 | |||
| 1aa4841868 | |||
| fc1e8a4e4e | |||
| bf3cb73070 | |||
| d77e763f86 | |||
| 8ef3d00f22 | |||
| 5266c22890 | |||
| 26540b1aac | |||
| 39a3b93537 | |||
| ba13101f64 | |||
| ce55b7ab2f | |||
| 28a9f90a72 | |||
| f2a2ccdab4 | |||
| f2e1ec0928 | |||
| 17ca66f4a2 | |||
| a43f075ff0 | |||
| c87d4ad801 | |||
| d94cc1f17d | |||
| f30285eaea | |||
| 20d35953f1 | |||
| 537630bae4 | |||
| 85d6b062f3 | |||
| 74a9a176e9 | |||
| 94f8c61720 | |||
| 75b9b70a86 | |||
| 2e585f9cd2 | |||
| edddf6ae80 | |||
| ea0f2c5f34 | |||
| 826d3ccae8 | |||
| fd7d4eb3f2 | |||
| e8e0c7bfe4 | |||
| ccdda7b8e8 | |||
| 9abafba180 | |||
| 2ed47a6089 | |||
| 818d1769b8 | |||
| bf6674f6a0 | |||
| ee08586279 | |||
| ef75880398 | |||
| 221ae62ea5 | |||
| 40c59e664b | |||
| 61e3381b24 | |||
| 3dfa1e1ea7 | |||
| c0fab2f425 | |||
| ffdd437e47 | |||
| 76825441b9 | |||
| 8e83206556 | |||
| 2aa357f315 | |||
| df59e7f699 | |||
| 5084836737 | |||
| 063e3bbea6 | |||
| d0216d76f8 | |||
| ec10526d69 | |||
| 49b746a811 | |||
| 1013580236 | |||
| 98d9a2e6f9 | |||
| e4217af1ec | |||
| 3d4607ebd3 | |||
| 2be1d64de3 | |||
| c3c4e9def2 | |||
| 16ec68e0b6 | |||
| 3ce9500d75 | |||
| c699452473 | |||
| d943408f44 | |||
| a7aee2fe1c | |||
| 32f3740eda | |||
| f42540fedf | |||
| f25b90ee27 | |||
| fdef266089 | |||
| c4375f9fbc | |||
| 7820efc121 | |||
| d0189fb076 | |||
| e4517a8782 | |||
| 19604480bb | |||
| 704d66b6f3 | |||
| 6315c343a7 | |||
| 766b4b901f | |||
| f671c89b14 | |||
| 03bd1498e8 | |||
| f743bacd0f | |||
| 309158352e | |||
| 2540ac09ec | |||
| 5a6fe6ccf8 | |||
| af2decea9d | |||
| c69038d3ae | |||
| 9ea8316d74 | |||
| 5939e46eee | |||
| a8a0a59982 | |||
| 73a08c031c | |||
| 123caf42c2 | |||
| 5997dd9387 | |||
| 9cf03e2e60 | |||
| c77e7bf725 | |||
| 7a4299c724 | |||
| b9b0239837 | |||
| a43ae71afd | |||
| c4339a5d94 | |||
| b161a38e9b | |||
| 735268034d | |||
| aad473486f | |||
| 08970f2b7b | |||
| 212f09dd31 | |||
| 8334e7b863 | |||
| a80d67c1ff | |||
| 7c95f4231e | |||
| 6e8ad5b085 | |||
| 145d386ce2 | |||
| 496a768013 | |||
| 7415a5898f | |||
| f1486bfee3 | |||
| bc8521043b | |||
| 3597d71230 | |||
| d92e2eaebc | |||
| 8cdea8a384 | |||
| 4457c7aec0 | |||
| 95279f885b | |||
| 94bfab762b | |||
| 20d8ad29e5 | |||
| 75644eb894 | |||
| 2d7a348ab7 | |||
| 139dd13392 | |||
| 2f52369d07 | |||
| aab52d0850 | |||
| 71febc1c81 | |||
| 68d8b10b22 | |||
| 0d2333203a | |||
| 3881e2e83e | |||
| 51eeee09d7 | |||
| c487beeaca | |||
| f463cd6c8d | |||
| 5e7a4e8193 | |||
| c8870ddcab | |||
| bbdbd5397c | |||
| 527650d03b | |||
| 126121065c | |||
| 48ccf844fa | |||
| 7556f989df | |||
| 8207597a58 | |||
| 1137768f84 | |||
| 5f6925858b | |||
| 77d1d93ebc | |||
| c95af84452 | |||
| 62b5ec5b02 | |||
| 9f9a9a51b3 | |||
| a2dd2509fd | |||
| 3c00f38a0f | |||
| 767e2c69f3 | |||
| 3b491d4a6b | |||
| 179ef7f060 | |||
| a0fce2e0fb | |||
| bce06543b2 | |||
| 9841dbbbc4 | |||
| d61506fcf7 | |||
| 6a7fcd5c40 | |||
| b4b273fc43 | |||
| 495201ebf7 | |||
| e6d0d83070 | |||
| 564d5fcb31 | |||
| c0a58897c0 | |||
| 1c2e5ecc0f | |||
| 6109368799 | |||
| f8ea40d3d1 | |||
| 2fb65c5682 | |||
| c6419e1c07 | |||
| ba58e718b4 | |||
| 30c8fffa0a | |||
| a560d4db31 | |||
| fe72139410 | |||
| 6f9daa28eb | |||
| d408bb9086 | |||
| 5f3bc8e74b | |||
| bd3409285f | |||
| 18a3ff67cb | |||
| 61eda122e4 | |||
| 6cb70e865e | |||
| 4b32c28f7e | |||
| f0a9b2c71d | |||
| 2e0fa9126a | |||
| 63b1f3834e | |||
| 1a4f148318 | |||
| 9de083afa7 | |||
| 551b5c42d8 | |||
| 30966b14af | |||
| 9bbf933b05 | |||
| f8143b6c7c | |||
| efba1b9038 | |||
| 80090a41ec | |||
| 0cff78d127 | |||
| e88a81141f | |||
| c88ce0d14d | |||
| 33e7ce6761 | |||
| 766afdeeae | |||
| 1edd6d3542 | |||
| 9be50152b3 | |||
| 7ad6dda260 | |||
| e4b45231ec | |||
| 6b853750e5 | |||
| dc1380edd1 | |||
| b53847cb61 | |||
| 06b465540d | |||
| 0a734d8502 | |||
| 98eda57188 | |||
| 46781c94cd | |||
| 3a06d8802d | |||
| 0e26480674 | |||
| 92a4f025d8 | |||
| 5529204b17 | |||
| da43f44fea | |||
| ff23616bb5 | |||
| de59f654af | |||
| 7d9c90f8dd | |||
| b0886f970a | |||
| afdf00eacb | |||
| 51148f1371 | |||
| d58cc8d490 | |||
| 0c827b318b | |||
| 5d946b19cb | |||
| d2e23adf84 | |||
| 7d35fae0f4 | |||
| 605d0ed8e1 | |||
| c92f09fddb | |||
| 2cde817ffb | |||
| 87bf51b033 | |||
| 06b3d6e5ce | |||
| b32379393f | |||
| bbcc8aa9ac | |||
| 865c302f71 | |||
| 2cf8256079 | |||
| e2a2746ed6 | |||
| 6854c568c7 | |||
| d952a1199b | |||
| 7f2ccc860b | |||
| f0d3d1b036 | |||
| d9b9224045 | |||
| 8685e90513 | |||
| a9f15fbcae | |||
| 7d266fdc4e | |||
| 7f03c7538f | |||
| d90d7d7ddd | |||
| 7881e70afb | |||
| e61f254ffc | |||
| 678b7700b4 | |||
| 1d1c14ae21 | |||
| 66d1872230 | |||
| faa999ab2b | |||
| 6678905d79 | |||
| 3e98f05564 | |||
| 35bbea3052 | |||
| 86623822f5 | |||
| ad1a9396ac | |||
| 2c6597c5fb | |||
| da983af2cb | |||
| c79fd5ed30 | |||
| 2d9e49f245 | |||
| 75d5f494a3 | |||
| 40852f9a6a | |||
| 7f07f35beb | |||
| c6be6f480e | |||
| 617cc67467 | |||
| 0c9bc4e59e | |||
| 72048a5267 | |||
| 80d2347095 | |||
| fa794d7a15 | |||
| 85b6571bc3 | |||
| 14aa12eb09 | |||
| 8af799614e | |||
| f9e0add436 | |||
| 3782531f57 | |||
| fab313a908 | |||
| 4e70cfdb95 | |||
| 75bbbcb4ca | |||
| abf91c7b29 | |||
| 603fccb26c | |||
| 333d858f33 | |||
| c9628722cb | |||
| e56ccb0c82 | |||
| 61d916d94d | |||
| 7e573c73f9 | |||
| 4aa4e7c9fc | |||
| 161d72390b | |||
| 53ab21b016 | |||
| 7bb9929624 | |||
| 25dea384fe | |||
| ceb93926a3 | |||
| e9a6261752 | |||
| 434dbe035c | |||
| f5e14e59e9 | |||
| c8bf26a3b3 | |||
| 139d206413 | |||
| a341db4cf7 | |||
| b66f55362f | |||
| fdb92a2012 | |||
| b3a75690f1 | |||
| 0292a0fee6 | |||
| c14761b9a1 | |||
| 8404736662 | |||
| 9edcc39de2 | |||
| 1620186f5d | |||
| 94afe20c20 | |||
| d254f9809f | |||
| 18209c2448 | |||
| 519575893d | |||
| f794218b6f | |||
| 4932fe3397 | |||
| 4f18a71124 | |||
| 07e9ff4290 | |||
| 176264b317 | |||
| 4c3033d414 | |||
| 61e6d55bcf | |||
| c00086c740 | |||
| e01b1b3935 | |||
| c2c0196a3d | |||
| 3da652216b | |||
| 0ffb5df40b | |||
| cfc26b283c | |||
| 1a615f8941 | |||
| 41dd7a2b2a | |||
| c0b61991ba | |||
| 1597461c02 | |||
| 46c1f2a28b | |||
| 77fd73bc1b | |||
| 3ad17d64b0 | |||
| 412ec53d08 | |||
| 6f3be59b14 | |||
| fce4c4dcb1 | |||
| bb7d3d1a85 | |||
| ff7499e373 | |||
| 958a7298fe | |||
| 69b80dc9c6 | |||
| 60531450c8 | |||
| cbfdb88e13 | |||
| fcd62d72b1 | |||
| e8355fe4ff | |||
| aabf879464 | |||
| 41928e4bb9 | |||
| 6f38f76e4a | |||
| 5cfb2d5f6a | |||
| f6141e59e4 | |||
| d581fbc2c8 | |||
| ab0a8b3b61 | |||
| 4243710378 | |||
| 2a0350b9d1 | |||
| f58b448f6b | |||
| 1f0625cfa1 | |||
| 5e4175723c | |||
| 61f1b145b7 | |||
| 5db853dbdd | |||
| 87d6d83c41 | |||
| 1d3d41b808 | |||
| fc81e404ca | |||
| 3af215de45 | |||
| 2244c60499 | |||
| 9cf2798424 | |||
| e23c0cb89f | |||
| 1684d211ff | |||
| 96e40721b2 | |||
| e94c24ded7 | |||
| ebe13fd665 | |||
| fe2d696f1f | |||
| 3656822ac9 | |||
| 009b66eccf | |||
| da3743ad55 | |||
| 47136ca774 | |||
| 00b3556188 | |||
| b2b11812bd | |||
| 5e5b32e060 | |||
| 662c3f04dd | |||
| 2cdfeacc1b | |||
| 7559f5836b | |||
| b2af86230a | |||
| 482c28804a | |||
| 48481586ec | |||
| f33844d4af | |||
| 35f3350ddf | |||
| 84affbafa6 | |||
| ae2d2ca2be | |||
| f9dcefcc21 | |||
| cb171bcac5 | |||
| b92e46180c | |||
| 62d5ed48f0 | |||
| 83c6371016 | |||
| 33dd59fb81 | |||
| e72577cbd8 | |||
| 85c22c897a | |||
| 6a89728380 | |||
| d31c12cfaf | |||
| 91d2b89d68 | |||
| fb85ac8d07 | |||
| 7ef17365be | |||
| 00b16c6434 | |||
| 4fd17f267a | |||
| 54b63fa218 | |||
| 70c770a975 | |||
| cbf1fc1988 | |||
| a71ad5dd02 | |||
| 22942c3bef | |||
| b98fa6075e | |||
| d88b90c398 | |||
| ff8b88d187 | |||
| f532665f06 | |||
| 6bab442651 | |||
| df0da15dbb | |||
| 696325ac8b | |||
| f1afe1ed20 | |||
| 456d8e365a | |||
| 6746c18092 | |||
| 45ae13749d | |||
| 330a6d0f87 | |||
| 76a0ef8d83 | |||
| 4a175aea4e | |||
| 90536b1cc2 | |||
| f62148b28c | |||
| 100ac9dba0 | |||
| dba243b1f7 | |||
| 4c8239c03d | |||
| dab3a7135c | |||
| 0dae4cef08 | |||
| 14280a277c | |||
| e9ac0a3209 | |||
| efebfe3a13 | |||
| 472b7056c9 | |||
| 984ef44a43 | |||
| 94e8ca0c86 | |||
| 58a8d2f077 | |||
| 9f38a62fe5 | |||
| c79e830888 | |||
| ad25c048c4 | |||
| bb33e3c831 | |||
| f62f22b4bf | |||
| 7d339624b8 | |||
| f27fb90457 | |||
| 2115c82587 | |||
| 4076b29b63 | |||
| 817384b761 | |||
| 3f9d9f23d5 | |||
| 7d5ee9750f | |||
| 1c333e4a24 | |||
| 4ae624a541 | |||
| 2540e90c37 | |||
| 2d196b1595 | |||
| 18fc20777b | |||
| 61b04d6e40 | |||
| 3263543d84 | |||
| 9ea4386354 | |||
| ac23e8fd02 | |||
| 6bb3f222ea | |||
| d7b7a3a4a8 | |||
| 4502582beb | |||
| 9355fcb58f | |||
| c6f23e7b27 | |||
| b986b3276c | |||
| 3e3935485f | |||
| 7047af44f6 | |||
| 2d5e9b6ea5 | |||
| 33a709ecbc | |||
| 9b42d3a4fc | |||
| c598e3d9c0 | |||
| c822fff714 | |||
| c881535fda | |||
| 715fc3fa9b | |||
| c484afb12b | |||
| 5ec91ef5fc | |||
| 30db9a2943 | |||
| 1273c4ca87 | |||
| cb73d81d5b | |||
| 04735f1aff | |||
| d33dcbbcb1 | |||
| 04401ca09f | |||
| 0ff23c422a | |||
| 74a7b304c2 | |||
| 231e465898 | |||
| 68c3e88343 | |||
| ef6eae63d8 | |||
| afe2eb736c | |||
| 1552c1e917 | |||
| 258d1cd705 | |||
| d7b4e8a8de | |||
| c0c563b1c7 | |||
| 430b8233ed | |||
| 47f1488acc | |||
| 21799cca6d | |||
| e7ae4bd1c4 | |||
| 7da6ba5f68 | |||
| 8e9f7965c7 | |||
| 4ef2dd0c7e | |||
| 19ad8970d7 | |||
| a20e1f6943 | |||
| 5010720a97 | |||
| efaf067b94 | |||
| 6efd268004 | |||
| 7f26f01a8f | |||
| 31df29cac8 | |||
| 15a7e205be | |||
| 3e189d3502 | |||
| 6d16c97902 | |||
| 1ac401f0c0 | |||
| 62cb1daefd | |||
| acedab5587 | |||
| ad30aebcbc | |||
| 528c06cf7f | |||
| 97d97fc4df | |||
| e89cb883ec | |||
| 88ce0abe85 | |||
| 4570efc68b | |||
| ea28873fb0 | |||
| eb5d4983de | |||
| 379f6bef6c | |||
| e090762b5a | |||
| 9f3edd701b | |||
| 54bad2e4f6 | |||
| e41621def0 | |||
| 95fd96f29a | |||
| 663d5213eb | |||
| 92d6ed0761 | |||
| 59ea144b28 | |||
| f9f3b5b4f9 | |||
| 3de1a8f96c | |||
| 5d71628927 | |||
| 323a607130 | |||
| 8eaa70c39b | |||
| 29863004e2 | |||
| c2bbc1281c | |||
| a6232cbfd8 | |||
| 734dc49564 | |||
| a5a1c4223b | |||
| ca1351b704 | |||
| 3135869d5a | |||
| c2d30ce865 | |||
| 69a446af97 | |||
| 93b11c35d0 | |||
| cc3d007fa6 | |||
| 8cc1bd0159 | |||
| 8879bff160 | |||
| fae70bb485 | |||
| d4cafe364f | |||
| 346b62bf26 | |||
| 3ba6e45011 | |||
| 525a9225c8 | |||
| df448f0c35 | |||
| 7808039d0d | |||
| 0ff0d18351 | |||
| fc4f1fd7fc | |||
| d55d9f5530 | |||
| cd7461a3a8 | |||
| ad39ec1dc3 | |||
| b2af455523 | |||
| 6d4f4c6064 | |||
| 2b83b52735 | |||
| cd99295f83 | |||
| 6ab95ff387 | |||
| 1aa25d1e6d | |||
| 1b5b3fba8a | |||
| c71bdc0d5e | |||
| 7380affe9c | |||
| 1734c5ab99 | |||
| 18f96bb20a | |||
| da28036297 | |||
| 474731d1a3 | |||
| f59db3c741 | |||
| ecfc0e0e2b | |||
| 8ac16e53c7 | |||
| 5d81c04b3d | |||
| 037a8bee2f | |||
| e12bbbc171 | |||
| 31e2299385 | |||
| 097bb38a23 | |||
| 73ae41f3a9 | |||
| 4340d50071 | |||
| de94311c47 | |||
| cb51dc45b6 | |||
| dee4baf7dd | |||
| e04ac89c5a | |||
| 3fa1bc5c3f | |||
| 254f4b5f3e | |||
| 132578bfe3 | |||
| c2a1e39b54 | |||
| c41f4e9203 | |||
| c54615a85f | |||
| a7d953f923 | |||
| 35cf5b3d60 | |||
| ae381576aa | |||
| b28bcce5f1 | |||
| 7d7059504e | |||
| e04fb70aa3 | |||
| 7f1489a701 | |||
| 720c36e433 | |||
| 0cceacd17d | |||
| f9ad8d8aa5 | |||
| 253c402f3d | |||
| 083cb1b5ec | |||
| 8b3e22b58e | |||
| ad9e7f1d9e | |||
| 5887cce2c5 | |||
| f85061f988 | |||
| f8e12cabd4 | |||
| 348e996e31 | |||
| 70ae59ed62 | |||
| 6c4d661a85 | |||
| ae104293da | |||
| c07907833c | |||
| 7360e52f61 | |||
| 7d87b3384c | |||
| 30df21c7aa | |||
| 6bc1524783 | |||
| 366fb60628 | |||
| 01f11f2da4 | |||
| f6ae35df63 | |||
| 87936a58fa | |||
| 305db59472 | |||
| c0ce1939cb | |||
| 879b6b8f3f | |||
| 8777a1a9f1 | |||
| f5b5f66b82 | |||
| 24e72d1b56 | |||
| f2922b0a44 | |||
| 92a99993ea | |||
| 9be159ea15 | |||
| 3ee9e93349 | |||
| c9b51bface |
@@ -1,37 +0,0 @@
|
||||
ls
|
||||
pwd
|
||||
cd app
|
||||
ls
|
||||
cd views/
|
||||
cd backend/
|
||||
ls
|
||||
cd users/
|
||||
ls
|
||||
vi view.blade.php
|
||||
ls -alF
|
||||
cd
|
||||
pwd
|
||||
ls -alF
|
||||
pwd
|
||||
cd app
|
||||
ls
|
||||
cd views/
|
||||
cd backend/
|
||||
cd users/
|
||||
ls
|
||||
ls -alF
|
||||
chown snipeitftp view.blade.php
|
||||
sudo chown snipeitftp view.blade.php
|
||||
pwd
|
||||
ls
|
||||
vi view.blade.php
|
||||
set noswapfile
|
||||
set nobackup
|
||||
vi view.blade.php
|
||||
touch delete.me
|
||||
vi delete.me
|
||||
ls
|
||||
ls -alF
|
||||
touch view.blade.php
|
||||
touch index.blade.php
|
||||
vi view.blade.php
|
||||
@@ -0,0 +1,5 @@
|
||||
.git
|
||||
.dockerignore
|
||||
app/storage/logs/*
|
||||
app/storage/views/*
|
||||
vendor/*
|
||||
@@ -0,0 +1,31 @@
|
||||
#### Expected Behavior (or desired behavior if a feature request)
|
||||
|
||||
(what you expect to happen goes here)
|
||||
|
||||
-----
|
||||
|
||||
#### Actual Behavior
|
||||
|
||||
(what actually happens goes here)
|
||||
|
||||
-----
|
||||
|
||||
#### Please confirm you have done the following before posting your bug report:
|
||||
|
||||
- [ ] I have enabled debug mode
|
||||
- [ ] I have read [checked the Common Issues page](http://docs.snipeitapp.com/common-issues.html)
|
||||
|
||||
-----
|
||||
#### Please provide answers to these questions before posting your bug report:
|
||||
|
||||
- Version of Snipe-IT you're running
|
||||
- What OS and web server you're running Snipe-IT on
|
||||
- What method you used to install Snipe-IT (install.sh, manual installation, docker, etc)
|
||||
- If you're getting an error in your browser, include that error
|
||||
- What specific Snipe-IT page you're on, and what specific element you're interacting with to trigger the error
|
||||
- If a stacktrace is provided in the error, include that too.
|
||||
- Any errors that appear in your browser's error console.
|
||||
- Confirm whether the error is [reproduceable on the demo](https://snipeitapp.com/demo).
|
||||
- Include any additional information you can find in `app/storage/logs` and your webserver's logs.
|
||||
- Include what you've done so far in the installation, and if you got any error messages along the way.
|
||||
- Indicate whether or not you've manually edited any data directly in the database
|
||||
+13
-1
@@ -7,8 +7,10 @@ composer.phar
|
||||
/app/database/*.sqlite
|
||||
/app/storage/meta/services.json
|
||||
/app/config/*/mail.php
|
||||
/app/config/*/session.php
|
||||
/app/config/*/database.php
|
||||
/app/config/*/app.php
|
||||
/app/config/*/ldap.php
|
||||
public/packages/*
|
||||
public/uploads/models/*
|
||||
public/uploads/avatars/*
|
||||
@@ -17,4 +19,14 @@ public/uploads/avatars/*
|
||||
/app/storage/debugbar/
|
||||
/bin/
|
||||
.idea
|
||||
crowdin.yaml
|
||||
crowdin.yaml
|
||||
public/uploads/logo.gif
|
||||
public/uploads/logo.png
|
||||
.siteflow
|
||||
public/assets/.siteflow
|
||||
app/config/local/session.php
|
||||
.couscous
|
||||
app/storage/dumps/*
|
||||
tests/_support/_generated/*
|
||||
tests/_data/scenarios
|
||||
public/uploads/assets/*
|
||||
|
||||
+25
-13
@@ -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
|
||||
|
||||
+802
-146
@@ -1,182 +1,698 @@
|
||||
|
||||
|
||||
### v1.1 - Released Nov 06, 2014 02:16:26
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/fafd03f00f49cb9ffe81d50aa9ca3d1f1fa1d043">view</a> • Added DB Prefix to Migrations
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/309772e67d62989f1f60141a4a10d724a44c6baa">view</a> • Fixed operator for setting bool display
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/22f81912e416cfe1227a08b5d8b6323e32e1ef36">view</a> • Fixes #299
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/86b7b6946f1e1bd404127e228c615e4abe0b20fb">view</a> • Fixes #316 - added model name back to view
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/9e85dcb9fcb4cc932ecddd23caa6b51e83110543">view</a> • Fixes #315 - add EOL as display option in settings (run migrations)
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/ee35948980c22f9256241c02d7febd90275f6229">view</a> • fix div issues
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/0022389463e251e73402450cfbc280cb05633bd1">view</a> • Fix dropdown menu position
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/343798d241172707145ef365445062db9bb6b99a">view</a> • Merge pull request #322 from madd15/fix-js-delete-asset
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/1078dbf5c5f6a5bec1a2ef864cebfcc7883d31e6">view</a> • Fixes #324
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/6b2d3efe3e76429c9c2f5de78f04c4f7e2748a3d">view</a> • Fixes #237 - reporting-only group
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/e04cc806d9209b54a1833172ebb66ab55b5f0c06">view</a> • Fixes #327
|
||||
|
||||
|
||||
### v1.0 - Released Oct 16, 2014 09:46:47
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/a4b220d6c31c97f6504023f0b52527825a4cd897">view</a> • Fixed #191 - allow admins to assign a user during asset creation
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/dc1033025a0bc1b2d657e06c89058c3ab95f2c59">view</a> • Fixed #151 - more complete translations
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/56d619b218794b43d8c6b182c89c75f83af9dcd9">view</a> • Fixed missing language string
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/69fca5d1eda0e5f26d2085f7eebc08fafd84a3ae">view</a> • Fixed #58
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/8197e6174e9f12bcfddd94c6bf606ee36e6801bf">view</a> • Fixes #200
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/cb8369e9de96aaf1cf9108e22f4038fa6486b881">view</a> • Initial QA Patch to fix errors Add License Add Asset Show Deleted Users License Assign
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/62a3ed671bbd957075563933f49e8a5445042737">view</a> • DB migration, layout and clone fixes
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/9ccc7d756f9361757eafc1dce9684ee9f5ecc1c3">view</a> • A0.4.2: Added asset, license, user, model cloning and fixed some bugs.
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/652f1c746c4757dce9d33d7bd90a9357822c4656">view</a> • Fixes Travis CI build
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/363d084bd623f778cd72ca7d385a4fb2f67ef474">view</a> • Fixed DB name in travis CI
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/49c5607e1c8a82a3111123ad84b537644546ebb3">view</a> • Fixes #222
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/96e40d72b9ac3f74b94b0e39b6f296f0f0b2a1f4">view</a> • fix typo: artisand -> artisan
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/e978038cc044f60c2eca71b6319063009a57886f">view</a> • Merge pull request #234 from burlito/typo-fix
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/a829fcf52f933d087c3776993b42311ec9a8988e">view</a> • fix: Use the old asset tag when cloning
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/ee7d9bec7082dc2e60a4797dea84a0b7443c8090">view</a> • Fixes #279 - QR checkbox not staying checked
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/bf1e07555160ede517d41f649d6b1d0911f89dd2">view</a> • Fixes #87 - made datatables responsive
|
||||
|
||||
|
||||
### v0.3.11-alpha - Released Jul 19, 2014 05:16:53
|
||||
### v2.1.0-pre - Released Dec 31, 2015 12:32:16
|
||||
#### 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
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/3a99136f73ec5589c9b9e0bae29a16e6418f62a7">view</a> • More documentation fixes
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/989ce59a5b63eea0e25a2bb7917b44c14d0f6235">view</a> • Fixes #1399 - Import LDAP config into database
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/3bbcbf5f47e95ef031d521ff840a0ba7197356ed">view</a> • Merge branch 'hotfixes/ldap_settings' into develop
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/b925c5766f15d678702ad2ae245cc76a66b235ec">view</a> • Set company_id to null if no logged in user to fix seeder
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/078750726fd5f1f2d8ea35e25b366a95d15d7075">view</a> • Set default value for company_id to fix seeder
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/beeb28bf09a36604820ae111b3e171aec3746444">view</a> • Fix routes for custom fields, fix admin access. Helps with #1397
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/418be7f5dee1224526bf9037cc6d3ab464cacca2">view</a> • Fix to adding same custom field twice. Helps with #1397. Requires PR #1408 to be merged first.
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/2accfab79ede9fd3905d0ed383b5a50999340944">view</a> • Fixes #1413 - wrong link for manufacturers delete
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/a44c56c93713a8de20981e0a876b579b5845f6ff">view</a> • Merge branch 'hotfixes/fix_1413' into develop
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/fc06caded5c6d8c2554146f986752ad1fe2e1e5a">view</a> • Fixes #1406 - Fixes link to suppliers delete
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/19820db0cc41086971c9458dc5c8f0ca37a90777">view</a> • Fixes #1406 - Fixes link to suppliers delete
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/36ecf3032f0bd9e37054898912469c6efd83529a">view</a> • Fixes #1402 - remoe warranty date from EOL calc
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/8158c12242b5f2f37488a5db9cffefd0b5ec52ef">view</a> • Merge branch 'hotfixes/EOL' into develop
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/9b46a5b0f6f19543d4799dd88673695445317650">view</a> • Fixes #1403 - hide checkout on asset model listing assets when nt deployable
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/62fe4b8cd391cadf690be4a27ec4bd7eea017165">view</a> • Merge branch 'hotfixes/1403' into develop
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/bb83a1470744fe94fa8793f6b1af3bfee8613042">view</a> • Fix incorrect routes for update and delete
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/e4ceddd6ce246d5864b075a1dd0c1f891ef2f8b1">view</a> • Fix for merge conflict on routes
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/bbdb576519ab8f73a24ca6082c9172ddafdca665">view</a> • Merge branch 'hotfixes/remove_fk' into develop
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/e8ca98a37d744a899dcd77360b9590ae99950301">view</a> • Fixes issue with assets without a model (which should never happen, but can occur from imports)
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/82a3560f276353a2eccdb6be69f559ff9908f2c5">view</a> • Merge branch 'hotfixes/image_fix' into develop
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/9e0f7089c46dcec72d0b24f35f2ef4ef96c6823c">view</a> • Fixes #1415 - Added CSRF token to backup form
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/17e681ba7c72647288f0777daeaf6a96a1e72767">view</a> • Merge branch 'hotfixes/backup_CSRF' into develop
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/74ed75dd24fbaa69589e7bb8e89f68a8fce28a66">view</a> • Fixes #1426 - use Asset class for asset maintenances
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/e81fe52aa8b60c13d8d477db1fa6df6d6690ff0d">view</a> • Merge branch 'hotfixes/asset_maintenances_create' into develop
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/dad492d131b2fb4c9ac83433661706addd92d623">view</a> • Fixed back/cancel urls for #1397
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/7f46a48173c2a65f2aee5aae0af22bab3e8714f8">view</a> • Attempting to fix #1430 - commented out FK drop to prevent collisions, remove FK creation for new installs
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/3dc79197c3140528f2443107c7f3757ede66d7c2">view</a> • Fix for LDAP error if username is wrong
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/8cdb032a14b92b79f52514d0c806d602cc47db12">view</a> • Fixes error messages, and re-filling old input on failed asset create
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/b41461698ddc316d80fde921a7be0d69ae4df909">view</a> • Fix for error on asset create
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/6f8a76246ec014457452109ac07c6aa98b478996">view</a> • LDAP fix for local users
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/7802af837b2894b04c8ad690aeb7053f632f7767">view</a> • One more fix for LDAP and local users working together
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/be3c8e451522988bfd6f19767061a538dcc248e2">view</a> • Fixes #1440 - make employee number searchable/sortable
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/5bed0bd7ed3415a58833218b59a81b061712671a">view</a> • Fixes #1437 - set expected checkout correctly
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/72f3b459c5172fb30865c6d708ecd57d0ff1eee8">view</a> • Merge branch 'hotfixes/user_import_company_id' into develop
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/599ea20d65695e3e3cd5dfd929003c3c39620968">view</a> • Fixes #1449 - full link to order number
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/25338c00e50d854a62ee86240489cf23d178302b">view</a> • Fixes #1456 - email notification when asset requested
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/e1837069da97f1dfcbbd0007c2eda0ddd1ee3d2e">view</a> • Allow bulk model update for #1462, fixes #1442
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/e217d354dc3b5d078a91cff7a9d6e9ba11bd55c8">view</a> • Fixed bug in strict mode for fieldsets
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/cac254ded6685ef1e087b803e28cd14ff93047ca">view</a> • Fixes #1371 - problem saving new models with non-latin characters
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/5c698d7cfd4e0bb93e1c1483e41504057397a2c5">view</a> • Fixes #1469 - don't require currency at model level
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/a68cbcf7674a315268ec082386db30199e97f211">view</a> • Fixes #1472 - only fire DB seeder if the user inputs 'y'
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/73f0a19adbf595f82e6110dec7eb685181dc0993">view</a> • Fixes #1459 - fieldset_id error if null
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/775ea9545824c2bf1bc55b0e7a5423dcec66caa1">view</a> • Fix inability to edit models (unique constraint)
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/8dab50edc64a59cbdae2c424fb36678ea4852324">view</a> • Fixes #1498 - better regex for characters in custom field name
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/eacd4ee2b09b21b465947b0acae2292cf54e1982">view</a> • Fix for bad data in asset report
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/927c36823526e68a83e2898033fea1ebe0112b4a">view</a> • Fix for weird location info in asset report
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/b20f4d245e39d640aac3de9b34c2c79b855f06f4">view</a> • Fixes #1494 - uncommented mac_address fields
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/865468d0910a39d0a891de3225e383e6afd08ead">view</a> • Fix for location error
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/ac5527e7d30c3df805302a92c3d8d48bf54c6cb5">view</a> • Merge branch 'hotfixes/custom_reports_fix' into develop
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/f03d1cd4ccc1d47b4b6297b7a2c6bcbbfc686e87">view</a> • Simplified currency display until we can fix it on a broader level
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/6639bc1300163f5e4c079101682b27a5ef33f8e6">view</a> • Fix overwriting of username if no first/last name
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/3b7da8f379ca9e57a07c968bcf0917b4dae7daa4">view</a> • Fix consumable count in categories. This adds new methods to Category, consumables consumablesCount and a generic count. It also refactors CatgoriesController to use the count method rather than having it determine the category type.
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/50be3eed4abce136af1e244402893f7cff389e3f">view</a> • Fix Two issues with Asset Maintenance.
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/4b92cdf684cf64958bc2b1f1194fa6ad2a67dcd7">view</a> • Use the same values/calculations in the view as the index. Should fix #1140 I believe
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/0cb3a9265e0eb46294f2bd534e672dc226ce11ca">view</a> • Fix PHPDocs that contained incorrect params tags.
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/5f6ba2a1480a9383c10c5222e368b6c219f4bd2c">view</a> • Clear the expected checkin and last checkout dates when checking an item back in. Fixes #1531
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/8eb31a9a820ce2033a585b35d7d17d618e6aa831">view</a> • Merge pull request #1523 from thehereward/fix-up-some-php-docs
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/90340a71119ab72b45c34a4a328877d363cabae1">view</a> • Merge pull request #1535 from dmeltzer/fix-1531-proper
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/27962d5439ccd587dfbb945149693cf81a6cb944">view</a> • Merge branch 'develop' into docker_fix_2
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/8cfcb2aed8a69070686f2d23f8b6c7fcf4596797">view</a> • Merge pull request #1544 from snipe/docker_fix_2
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/36eb51d6e484586c9da3b90dc86fac6774e22218">view</a> • Fixed typo in string
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/5eb95272eeac1183fe47972e7d8cf01976efe3a0">view</a> • Merge pull request #1546 from snipe/docker_fix_2
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/79c5d3f7d69ac34e98e1b4e925ced54b1ab2f612">view</a> • Fixes #1537 and #1524
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/faf2e464faff6fb2ac8decd3889d1c60bfcf954f">view</a> • Fixes #1526
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/a7a82e5fbcab028c618b40d839a121325508490e">view</a> • Fixes #1541
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/1ce205a5798be9b69d8750af9bb0fa7c96752a1e">view</a> • Fixes #1502 - load tableexport and jquery base64 locally
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/7c06cba6477dc7e7902841b48ffb3089bd198a8e">view</a> • More LDAP login fixes
|
||||
|
||||
|
||||
### v0.3.10-alpha - Released Jul 17, 2014 05:54:10
|
||||
### v2.0.6 - Released Nov 25, 2015 11:50:08
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/ac44140d835da40b44193ddfdbe2af0539a6aa5d">view</a> • fix edit blades
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/999910f31fac58f1d7b1e5b45de296e911c88e6e">view</a> • Fix 'use' used with non-compound
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/6478425be6fa02322aac276bd31c0bc6472b7fd3">view</a> • Fix dashboard shows all companies
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/0a97c626e7955af7240b8084f90b249daf53a5e7">view</a> • Fix $inout used when undefined
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/8fb7d82babd8deb136e71734e3a7fa37d2b05b08">view</a> • Fix no admin/consumables route
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/08781a561b828198b62cf14a8f2608f23a52c3ef">view</a> • Fix: use global scope for companies support
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/dbdc2c8e64b8d27ac3111d2308c0582b05992561">view</a> • Fix some typos (e.g: companayable)
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/fe44846c1ba583156358de48fefe3ed3e63ef8f6">view</a> • Fix: only super users can change multiple companies support option
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/e91a22fce0232ffd24976c214b12a7ff784d60ff">view</a> • Fix assumeng Setting::getSettings() is not null in Company
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/e82ede5d44000ee337fad329cf5ac18052cfe52b">view</a> • Fix: some Company functions throw when seeding the DB
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/67a58221eb93ffb6a1e827ab1dc745c27e8d81fe">view</a> • Fixes #1368 - typos in installer
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/cc930fc5b8bcfdf972b35fb9460c0b2c82a1e9d0">view</a> • Fixed links to getting help and common issues
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/01b574069af2ae8cda5ab9716de58d8e39a3da79">view</a> • Fixes #1362 - status labels losing type on edit
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/7a03a5649863bc44af2459abf1d9fcfe0ffad21a">view</a> • Fix: company field required
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/4b926f015b5b69c4e3180e996ab489e179589be5">view</a> • fixed typo in installer
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/318b4b48c64e2dbfcbbbf9f024e9f6b20bc7a0db">view</a> • Fixes null value for LDAP settings
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/9ec132acde7238963ffb3cb042e65e49e929eb7c">view</a> • Small fixed for LDAP in settings table
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/120c8394bbc0141a2ca6d2cd7124d8fbad459073">view</a> • Fixes #1380 - groups pagination
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/716c459985c78301998fe60fc8c274edb4f945c0">view</a> • Fix ident
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/b99c138cb040c92e6988c40307bd871514fb39f8">view</a> • Fixes #1369 - fixed searching/sorting on location
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/a777499c0bec415566c9360b6239600c9d6d0f74">view</a> • Fixes #1376 - added new fields to consumables view
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/6d42d2c6142075124c453b75315db1b0fca0fdc9">view</a> • Fixed bootstrap class for button
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/a3dbd87f9ffacc0ac1f48f758f87316bab831fe6">view</a> • Fixed weird company table styles
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/2a28c73845e5e90947e207392c4b7b12e7e91e7c">view</a> • Importer fixes - check for asset before inserting
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/c8c755f8c35983adaad6a3ba1868021acb2e3583">view</a> • Fixed filename renaming
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/29bb6a3c4f839e96f79d02473221673aed401898">view</a> • Fixed issue where deleted asset tags could not be re-used
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/535263788dac198cf79562efe7df4671fd1e755b">view</a> • Fixed dumb indenting
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/4be046a6753315fb88858ea264acec10d66b4938">view</a> • Fixes #1387 - adds server-side compound search
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/406e077c1e1a279c588e1506c2ce75f1e79dbbb1">view</a> • Fixed indenting
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/67e968b03276d563a920a09cd4cec5258e62d016">view</a> • Fixed attach() timestamps
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/b39c53a5ea355c91d5ef4adf1a03a342697039ae">view</a> • Closes #1375 - More data in consumables detail view
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/d8b43215b0109ab7f548a0dc46dee3d12a271a77">view</a> • Fix for missing admin ID
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/c6c6bd02bb32a22da7d30a0cca81516f99a9f5b0">view</a> • Possible fix for weird UTF-8 issues
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/99391d01796bfe6b1e63e8e979fa010397405236">view</a> • Fixes #1332 - added location to accessories
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/632fa92f9239d7f701efd29461ebf24746246be8">view</a> • Fixes #1333 - hide checkout button if asset status is not deployable
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/20490986c634c7fa260fd952a7311ca18aae8605">view</a> • Fixes #1325 - zenbra striping and borders on table for money value clarity
|
||||
|
||||
|
||||
### v2.0.5 - Released Nov 18, 2015 10:29:53
|
||||
* <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/5df26f9b0ae7708e2f221ee873126bf1d7cd91dc">view</a> • Fixed the ubuntu install portion that i broke
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/958672dfd36d220ea242d7772626916c748063e3">view</a> • Fixed missing vars and typos
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/0d1544c3d65bf27a3e64e8ec258fb8dfaf961438">view</a> • Fixing some package issues and syntax errors
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/56b50468d2bc14d33dbad17357664cd68937ee00">view</a> • fixed packages for centos6
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/62cee46a83d9d9dcf9e12884563918bab0adb61a">view</a> • update webdir for debian and fix the error logs
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/ca1384504a6a3802cea8bacc7fce2413f65a3681">view</a> • fixed tzone variable assignment
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/a47a4e83e2fb90fb7e6d55c34ca9d515f4316c7e">view</a> • fixed issues with sed command and /
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/9f43b6af9f355f6d8de6b5b9689ffdb6904fd5eb">view</a> • fixed apache config file
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/306d8ebaf72076cbccadae7d214eed68276d65f5">view</a> • Fixes #1317 - regression issue in bulk delete
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/a8da68d3fda0be7d8533dcecadbe758d24bacf12">view</a> • Fixes #1320 - added name for cookie table
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/b9c36f863833188bd0462d809985bd876f36c6d7">view</a> • Fixes #1335 - editing maintenance
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/aa05d041bd7abd193ea580c0928326d4855b522f">view</a> • Fixes #1324 - missing $inout variable when if/else not met
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/2b26fd7e20e0636cee068a7804eb82ece780f5a2">view</a> • Fixed string in gh-changelog
|
||||
|
||||
|
||||
### 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/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/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
|
||||
|
||||
|
||||
### v0.3.9-alpha - Released Jul 03, 2014 02:08:38
|
||||
### 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/1bed711f0e7462d5b4875b8c014d15690648049d">view</a> • Another tweak getting closer
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/41c257829ed8d7019b5fe4761fcdf7560167cc74">view</a> • Another tweak - getting close
|
||||
* <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/f836f88e38fb4bb0b682d301081254bb59923bf6">view</a> • Another tweak getting closer
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/309ce7d0bd6758c186d9f002ebc9924b72542f4f">view</a> • Another tweak - getting close
|
||||
* <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/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/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
|
||||
|
||||
|
||||
### v0.3.8-alpha - Released Jun 27, 2014 09:28:22
|
||||
### 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/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/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
|
||||
|
||||
|
||||
### v.0.3.5-alpha - Released Jun 20, 2014 02:23:09
|
||||
### 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/d1499deecdff3c7a4235ffdfad5adbddc1a5098f">view</a> • Provisions for strict mode, fixed license deletion bug
|
||||
* <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
|
||||
|
||||
|
||||
### v.0.3.4-alpha - Released Jun 19, 2014 10:27:59
|
||||
### 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/08d05b481f6366ad48fcdce72a8df53755f5dee8">view</a> • Fixes #158
|
||||
* <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
|
||||
|
||||
|
||||
### v.0.3.3-alpha - Released Jun 18, 2014 08:04:46
|
||||
### 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 :(
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/61b04d6e40baa9054e1701455259d8d62fa868ff">view</a> • Fixes #579 - user cannot accept more than once
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/2d196b1595ec87f119ad5a82f8f676918c52c896">view</a> • Fixes #602 for strict_mode
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/2540e90c37f37515d8d0277a4152c4b8198a4222">view</a> • Fixes #605 - hides user requestable view from admins
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/1c333e4a24a4950418175a8c354d7541637b7658">view</a> • Fixes #596 - better routes for checking in multiple items from user
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/7d5ee9750f912d85ac0c7f42e2beaba7e026989c">view</a> • Added #596 fix for accessories
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/3f9d9f23d5190052deb1f36be919c650e8f773b8">view</a> • Fixes #280 - updated link to use config url
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/817384b7615a301d6d692aefe6e41cd92ecfd6e1">view</a> • Fixes #597 - print-friendly view on users
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/2115c82587e06049245f17f9d710fbc7a61e57b9">view</a> • Fixed DB format for nullable EULA
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/f62f22b4bf1399c3b98041dfe17f4cc8450847b2">view</a> • ref #599. showing groups in user detail view. fixes a small design bug with group edit view
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/ad25c048c4a52a7f80a479a3b7d621aaad18b1d7">view</a> • Updated Sentry version to fix #625
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/d31c12cfafb2ba323973964215f033bd9aeb1f9b">view</a> • Merge pull request #629 from uberbrady/unicode_fix
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/33dd59fb814089c81886c0264b2356df2b212864">view</a> • Fix #637 - Remove Deleted Models from drop down
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/cb171bcac5c4ccbb347f370e3d2b28783378c0b2">view</a> • Fixes #645 - adds zip and rar to filetype
|
||||
|
||||
|
||||
### v1.2.6 - Released Feb 28, 2015 08:27:45
|
||||
|
||||
|
||||
### v1.2.6-beta - Released Feb 27, 2015 03:17:06
|
||||
#### 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
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/30df21c7aa2582bc3b1efbfd788c1aea2733aa7d">view</a> • Fixed missing checkedout-to info on asset view
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/70ae59ed6260101bcfb6e3cbd6309ecb9c1c935a">view</a> • Fixed a bug when no assets are in table that the autoincrement method blows up. Also optimzed the logic to get max id instead of popping top off creation date.
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/f8e12cabd4af8875abd759a3c9d6c2216cb88601">view</a> • Fixes #476 - added logo upload and header color
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/f85061f988a946f1d4a284fbfc8c442636c1364c">view</a> • Fix #541 - Headers not being skipped if checked
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/8b3e22b58e080b44e4de809b8598283fa6ba5bb0">view</a> • Fixes #546 - only insert data if values exist
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/083cb1b5ec51aa2b6932a59b9436a1a45fad5460">view</a> • Fix activate for strict db
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/35cf5b3d609fec2bc3613bdae42d338448413520">view</a> • Fixes #423
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/097bb38a231795aa52ff772a38887700e828256d">view</a> • Fixes #163 - accept acceptance + eula
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/b2af455523fcca1bb02018b38fdb6dc4861819d8">view</a> • Merge conflict resolution. Added a use at the same line as remote. Fixed
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/8879bff16084b2cfa0280fcb1f83d3f90368797f">view</a> • Fixed bug for reporting on upload in dashboard
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/3135869d5a3fafcf70e49dcbb99e36c2ec04ddd0">view</a> • Fixed font path
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/a5a1c4223b357b9cc2751a28e0c4e3085e476733">view</a> • Fixed chevrons
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/734dc49564e4f970846f786177c9d2928284fb5f">view</a> • Fixed icon
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/a6232cbfd8050ace613259df56afae243954c625">view</a> • Fix language string for create accessory
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/c2bbc1281ccdda65caa55665c66c78613142099f">view</a> • Mobile fixes
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/29863004e2e622a9b3b4616abdcd92f2b950bebe">view</a> • more small mobile fixes
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/8eaa70c39b3ace90a517387dc91f452aede18958">view</a> • Fixes #567 - bug in depreciation report csv export
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/e41621def05994302627cd4a6a81abd8e43c86be">view</a> • Fixed relation between accessory and category
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/9f3edd701b51a7aecf792e5736534c1bb15aca9a">view</a> • Fixes #565 - Soft Delete Models and Allow Restore
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/528c06cf7fb4f5c35d4b90eb256c0d195b8366b7">view</a> • Reverting icon fix
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/1ac401f0c036eca0cec1df0986d4c7e1903556fa">view</a> • Fixed EULA mail
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/6d16c97902dadad2351b627f3157257774a075f3">view</a> • Fixed back arrow
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/3e189d3502f8147c012b641cc366394875e9005c">view</a> • Fixes #538 - sortable tables
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/31df29cac878deeb75d8b9b5a2efc7c84ef4b592">view</a> • Fixed funky layout from datatables
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/efaf067b948899d0b784f47092dc3bc22fe504ca">view</a> • Fixed user relationship
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/5010720a976019306e37b89f5aa0e917c0ffdea3">view</a> • Fixed accessory relationship
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/a20e1f6943eab11fc937fcfeb3fe99dc0d520734">view</a> • Fixed attach to relation
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/19ad8970d76a1676de3494b758efa65c0ed6a5c1">view</a> • Fixed arrow icon
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/430b8233ed6f23402597fe54215b9988a3405dd7">view</a> • Fixed user relationship
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/c0c563b1c77ff9942212af89384c8ded40b83b29">view</a> • Fixes accessory relationshop for pivot
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/ef6eae63d86f159a170c3a322a44e08bab827080">view</a> • Fixed error icon
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/d33dcbbcb12172527cec977f679198f594ac975b">view</a> • Fixed bad method call in accessories on delete
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/04735f1affd2fdff9d6cf96ed583ece895cfb341">view</a> • Fixed assetlog display
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/c484afb12b0720eaba2d28f501bf547e2ad9caa9">view</a> • Fixed typo for accessories accept
|
||||
|
||||
|
||||
### v.0.3.2-alpha - Released May 06, 2014 08:26:21
|
||||
### v1.2.5 - Released Feb 18, 2015 03:18:10
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/00f7717142e11b90764ffce2d554c566f8ad219f">view</a> • Fix #475 and styling
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/49f25a23a99c08606d58101e039a885b89503fa7">view</a> • Merge pull request #516 from splaer/fix-475
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/58ff929d7193b054073ef46ae2fafdef51d51919">view</a> • Fixes error when no model present because new asset
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/f57c61dd4d789635cee6f62899807b1a7928800e">view</a> • Possible fix for #518 - license count issue
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/064c0211dbb310d1dfdb126e3ce2cee72a80f628">view</a> • Fix #517 - User Requestable Assets
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/4a5007264e1712250726047162df91041d12d28c">view</a> • Fixed mac address not showing
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/17258b73a1c09918960d894702a0ae341a18f0b8">view</a> • Fixes #520 - state no longer required
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/f40bb7b8b3a17ff772c797a3f91a845b068be3d2">view</a> • Fixes #520 postal code requirement
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/08ee02d0cd4d1ff9ed2b0600b75390c1e34c1f53">view</a> • Fixes #525 - added serial to asset model UI
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/24f5cdc743acd55ead02282e13e07f3cbd3551b0">view</a> • Fixes #523 - added file uploads to assets
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/e02bea4275306fb3d2696e3018066b4b1486fa8d">view</a> • Fixes #457 - added bulk options to hardware
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/4e4144ea749974332f645fa77eb74fbbfef51b90">view</a> • Fixed blade reference
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/b32d74de57a3a26326a220236838f57550549ca5">view</a> • Fixed seeder with duplicate ID
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/ea6a6d098ad1795fc5463c61b72240cdcd8a43e7">view</a> • Fixes #440 - removed unique constraint on serial
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/38961298ed6efe3649fdbf4b1e9b3278ab85567a">view</a> • Fixes #439 - loads javascript and CSS locally
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/063e5c407c8f817c16026887be16eeb42598417f">view</a> • Fixed the depreciation report, fixes to calculate current depreciated value (which were only used there). Additional fixes and refactoring around Depreciable, in terms of how assets get depreciation via models, and licenses get depreciation directly.
|
||||
|
||||
|
||||
### v1.2.4 - Released Feb 12, 2015 06:57:47
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/2277b6ee699a78108523eee11695a280e76b1bb4">view</a> • Fixed checkout logic for new assigned_to
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/dbc93de6b3966470f83254547f8029c60f489490">view</a> • Fixes checkin button on view
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/c06a4d4118039d112b69e48f9d4efc2be796f2e0">view</a> • Fixed wonky checkin/checkout buttons
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/31f4ba88f655e1386f2f4f0efae84399f7aa6d52">view</a> • Fix RTD query to not display checked out asset
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/5867c604104781c351f870ff3e0fd4b4d6eeb35a">view</a> • Fixed scope chaining on assigned_to
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/a2178392e65bcc35594d516a20f67eea8466e5c1">view</a> • Fixed seeder
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/7715731c4a2e423afb94873227eb728ad4877221">view</a> • Fix count in header
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/c2e532e32e4943e251dcb5fdd005e9b65d9798a5">view</a> • Fixed language file for status label messages
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/f36029a34a696d89b1058c9abdca7953d51e2bc4">view</a> • Fixed migration for to set assigned_to to null per #506
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/f72b38579037d76b5b188c5d85e24ca567e2480b">view</a> • Fix licenses so null instead of 0
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/34032c73ceee7a9666680f21bf7490fdc32dbdb6">view</a> • Fixed licenses so null instead of 0
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/7b165a12e05396b72381fc2789124acd2b98a2b8">view</a> • Fixes #508 - compacted UI for licenses overview
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/c89be345033bfbed326ffd4207a63438ea09378f">view</a> • Fixes #329 and #454 - added category asset view
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/35a133bbf9f7330a038dda2e79995b9825ca7633">view</a> • Fixes #382 - allow admins to restore deleted assets
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/80e10c4c9838ae4acea8847ed907c6ad05bfac1a">view</a> • Fixes #387 - sortable asset view by manufacturer
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/e343c157c5998d6f30a4e25da23ad1092d50c103">view</a> • Fixed naming conflict for requestable
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/cd5a352961a1e1e8d90368abf81fedee5ce94bef">view</a> • Fix for wrong math on remaining licenses when assigned to an asset
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/342a8b81afb2060a128d0667acc15fa5caafc2ea">view</a> • Fix for error when asset has null status
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/8cdd2156143864974423bea70521d45db6d0cb9c">view</a> • Fixed intenting
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/fbf03b225d732e12821bfc83b9bae7fb7b4b8be8">view</a> • Fixes #509 - added MAC address as model option
|
||||
|
||||
|
||||
### v1.2.4-beta - Released Feb 11, 2015 01:11:40
|
||||
#### 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
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/389c27b2e691743eb361cc1fbe4ece4259ae6046">view</a> • Fixes #477 - wrong sidebar on asset view
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/7009b24748edab02921c609c26bc549fa96dcd2f">view</a> • Merge pull request #498 from snipe/fixes/477
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/c1600a33db6d4463d27f74f87389489210de700e">view</a> • Fixes #499 - timestamps in asset logs
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/b360736b7728d2ac872193bbe8888037c9794494">view</a> • Fixes #484
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/addfcd4bc5417784f95145394940f90f1302376f">view</a> • Fix RTD bug
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/d2438f9fdb9b281025c17e22ac2bfaa07ce04a2d">view</a> • Fixes #502 - normalized statuses
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/aef3a734a3530f109b82fc0897e25727293f9862">view</a> • Small fix for pending status
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/f175f52530e58bd5ab80139c526fc7838750cb11">view</a> • Fixed spacer in sidenav for list all
|
||||
|
||||
|
||||
### v.0.3.1-alpha - Released May 06, 2014 04:48:09
|
||||
### v1.2.3 - Released Feb 09, 2015 12:22:12
|
||||
|
||||
|
||||
### v1.2.3-beta - Released Feb 07, 2015 06:02:52
|
||||
#### 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
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/950567e9d66a6836cbca1383d24fc8548d3cbadf">view</a> • Fixes issue related to #471 - assigning to user ID 0 causes erro
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/2b86f14e30c155f72b903428fd05a896ee9adfcc">view</a> • Possible fix for #484 - fullname issue
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/b3af102d22a2f4f147b863e0ba8c2e4064aad01a">view</a> • Fixed safe mode issue with license seeder
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/1db806f8b283e13dd04f20335d7087d12a04fa23">view</a> • Fixes #488 - longer user jobtitle
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/f5efc368a58e1b26689dadb285918b090b66eb59">view</a> • Fixes #487 - maintained and purchase order in strict mode
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/4dc81ce65fddced3282a9255a5a31ba8aa6a1458">view</a> • Resolves #478 - redirects non-reporting users to view assets page
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/cd338d2a70e1bd4dca3bc651813e51095d7155f0">view</a> • Fixes #483 - line breaks in notes on view
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/e67ba8a7437d4f27ae869072898e65749602f2dd">view</a> • Fix reporting error on depreciation
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/1aeb4de0fae723801f0cdb555c77b5ee17ae1919">view</a> • Possible fix for #491 - solving for giticide on package dep
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/c255edaf617872ac4a896106e56cc816209c2d5b">view</a> • More travis fixes
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/feeef4b66c1b6049a1f18c67e034907ea26c7da9">view</a> • Fix for asset log incorrectly using soft deletes
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/140bd137a48c199269d635aef57d14b1f0a4330a">view</a> • Minor display fixes
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/29f5b7c5e3adc994b727842730c0157429520197">view</a> • Fixed datetime
|
||||
|
||||
|
||||
### 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)
|
||||
### v1.2.2 - Released Jan 22, 2015 11:41:36
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/4a77dee79c18f0e2ab155c7024234150ce98b808">view</a> • Fixes #447 - added asset log entry on save
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/d85e5246807e597c1efac85c368a642a6fdcf944">view</a> • Fixes #451 - allows spaces in state name
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/95141d49ba3c4f2b17ed6a26c20e7ad2a8aac9cb">view</a> • Fixes #432 - add model name to checkout
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/3787a3f4bab9908f4903abdc2951cc254c8dc911">view</a> • Fixed language strings for incrementing IDs
|
||||
|
||||
|
||||
### 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
|
||||
### v1.2.1 - Released Jan 22, 2015 09:24:01
|
||||
|
||||
|
||||
### 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
|
||||
### v1.2.0 - Released Jan 22, 2015 09:24:01
|
||||
* <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
|
||||
@@ -234,3 +750,143 @@
|
||||
* <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/cc275367bffa3965a229e1527f6cd8cffd3415f1">view</a> • Removed close button on 'no results' error
|
||||
* <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
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/a4b220d6c31c97f6504023f0b52527825a4cd897">view</a> • Fixed #191 - allow admins to assign a user during asset creation
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/dc1033025a0bc1b2d657e06c89058c3ab95f2c59">view</a> • Fixed #151 - more complete translations
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/56d619b218794b43d8c6b182c89c75f83af9dcd9">view</a> • Fixed missing language string
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/69fca5d1eda0e5f26d2085f7eebc08fafd84a3ae">view</a> • Fixed #58
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/8197e6174e9f12bcfddd94c6bf606ee36e6801bf">view</a> • Fixes #200
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/cb8369e9de96aaf1cf9108e22f4038fa6486b881">view</a> • Initial QA Patch to fix errors Add License Add Asset Show Deleted Users License Assign
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/62a3ed671bbd957075563933f49e8a5445042737">view</a> • DB migration, layout and clone fixes
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/9ccc7d756f9361757eafc1dce9684ee9f5ecc1c3">view</a> • A0.4.2: Added asset, license, user, model cloning and fixed some bugs.
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/652f1c746c4757dce9d33d7bd90a9357822c4656">view</a> • Fixes Travis CI build
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/363d084bd623f778cd72ca7d385a4fb2f67ef474">view</a> • Fixed DB name in travis CI
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/49c5607e1c8a82a3111123ad84b537644546ebb3">view</a> • Fixes #222
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/96e40d72b9ac3f74b94b0e39b6f296f0f0b2a1f4">view</a> • fix typo: artisand -> artisan
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/e978038cc044f60c2eca71b6319063009a57886f">view</a> • Merge pull request #234 from burlito/typo-fix
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/a829fcf52f933d087c3776993b42311ec9a8988e">view</a> • fix: Use the old asset tag when cloning
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/ee7d9bec7082dc2e60a4797dea84a0b7443c8090">view</a> • Fixes #279 - QR checkbox not staying checked
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/bf1e07555160ede517d41f649d6b1d0911f89dd2">view</a> • Fixes #87 - made datatables responsive
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/fafd03f00f49cb9ffe81d50aa9ca3d1f1fa1d043">view</a> • Added DB Prefix to Migrations
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/309772e67d62989f1f60141a4a10d724a44c6baa">view</a> • Fixed operator for setting bool display
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/22f81912e416cfe1227a08b5d8b6323e32e1ef36">view</a> • Fixes #299
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/86b7b6946f1e1bd404127e228c615e4abe0b20fb">view</a> • Fixes #316 - added model name back to view
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/9e85dcb9fcb4cc932ecddd23caa6b51e83110543">view</a> • Fixes #315 - add EOL as display option in settings (run migrations)
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/ee35948980c22f9256241c02d7febd90275f6229">view</a> • fix div issues
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/0022389463e251e73402450cfbc280cb05633bd1">view</a> • Fix dropdown menu position
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/343798d241172707145ef365445062db9bb6b99a">view</a> • Merge pull request #322 from madd15/fix-js-delete-asset
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/1078dbf5c5f6a5bec1a2ef864cebfcc7883d31e6">view</a> • Fixes #324
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/6b2d3efe3e76429c9c2f5de78f04c4f7e2748a3d">view</a> • Fixes #237 - reporting-only group
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/e04cc806d9209b54a1833172ebb66ab55b5f0c06">view</a> • Fixes #327
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/8699a90093bd27c0502dcc25f6e7d55344d54a3b">view</a> • Fixed changelog
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/cff24309a1514f9ea991881ca72898c7a6358562">view</a> • Possibly fixes #343
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/b2d5dc9ec5460ff1f02db6c1a31ea87d224de4c9">view</a> • Fix #342
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/74ae2fceea68d18514e87edc008cb3016361beee">view</a> • Fix class on th
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/fc2d472ed350d7d63fb97942d00a97b62d4bed55">view</a> • Fixed english language string
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/89c7159c56f88bcf8459a5eb02d79d636335cb28">view</a> • Fix array check for empty rows
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/7ddc6d497af13e7894031ac763939be9863889a4">view</a> • Fix Report Langs
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/13b173409fcd5b5ce8e79566b5110eadcf51c233">view</a> • Fix License form langs
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/b73ae3147a60b29ac455063ecf419a609cce2cac">view</a> • Fixes #362, reduced asset name to 2 char min
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/637009054cc74b17e2dd226c6f8c467eed5b0962">view</a> • Fixed typo in english
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/6905d82fc48998f9c95c454c8bf37a34e30c002e">view</a> • Fixes #374 to keep the requirement to PHP 5.4
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/102481631330fbed894bf72510845bff6c88e59e">view</a> • Fix #377 - Checkout users last_name, first_name
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/d6a0249c60cbb026b2e3190285d50723a76f22ee">view</a> • Fixed #373 - added ability to auto-increment asset tags
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/1b41c974cf67c550b2cae39eeec8f90cb2da79e0">view</a> • Fixes #348 - remove constraints on license keys
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/89a2b87e42c18b308835ef71d196b91002b451ef">view</a> • Fixes #367 - added model number to dropdown
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/64c16a0bacfcde7c4d92971f2129f1b1aeac2c0e">view</a> • Fixes #386 and #273 - altered column type to text
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/daefc86e5878a21f9909806599f22198360c1f9b">view</a> • Formattig fixes for #386
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/73dd339772fcc35e50603ded115f67714620da69">view</a> • Fix #388 - License not showing checked out in view
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/0663ccb99fa926ff944dded330ba1f0cd95abbb3">view</a> • Check if ->adminuser->id isset before trying to print the fullName so we can catch when a user that created an asset has been deleted. Fixes #349
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/533be7f942cb6dfccd1e8a79c043d61791e4c54b">view</a> • fixed #435. using namespace with route groups to increase the readability
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/e434616db83a8d693af63b4705e1b24476fc3c17">view</a> • Merge pull request #436 from rashivkp/fix-435
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/5e496672c66428a1bbd37772aabd44f8bb1cb0fa">view</a> • Fixes #469
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/3c141e8f5017e8f161b6fd1fb82b288283b8450c">view</a> • Fixes #467
|
||||
* <a href="http://github.com/snipe/snipe-it/commit/548de1a1a217e6b5c6fcbbf6cd4918f078e64542">view</a> • Fixes #468 - updated ordering on license checkout
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
# Contributor Code of Conduct
|
||||
|
||||
As contributors and maintainers of this project, we pledge to respect all people who contribute through reporting issues, posting feature requests, updating documentation, submitting pull requests or patches, and other activities.
|
||||
|
||||
We are committed to making participation in this project a harassment-free experience for everyone, regardless of level of experience, gender, gender identity and expression, sexual orientation, disability, personal appearance, body size, race, ethnicity, age, or religion.
|
||||
|
||||
Examples of unacceptable behavior by participants include the use of sexual language or imagery, derogatory comments or personal attacks, trolling, public or private harassment, insults, or other unprofessional conduct.
|
||||
|
||||
Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct. Project maintainers who do not follow the Code of Conduct may be removed from the project team.
|
||||
|
||||
This code of conduct applies both within project spaces and in public spaces when an individual is representing the project or its community.
|
||||
|
||||
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by opening an issue or contacting one or more of the project maintainers.
|
||||
|
||||
This Code of Conduct is adapted from the [Contributor Covenant](http://contributor-covenant.org), version 1.1.0, available at [http://contributor-covenant.org/version/1/1/0/](http://contributor-covenant.org/version/1/1/0/)
|
||||
+3
-16
@@ -1,20 +1,7 @@
|
||||
# Contribution Guidelines
|
||||
|
||||
Please submit all issues and pull requests to the [snipe/snipe-it](http://github.com/snipe/snipe-it) repository in the `develop` branch!
|
||||
**Before opening an issue to report a bug or request help, make sure you've checked the [Common Issues](http://docs.snipeitapp.com/common-issues.html) and [Getting Help](http://docs.snipeitapp.com/getting-help.html) pages.**
|
||||
|
||||
**As you're working on bug-fixes or features, please break them out into their own feature branches and open the pull request against your feature branch**. It makes it _much_ easier to decipher down the road, as you open multiple pull requests over time, and makes it much easier for me to approve pull requests quickly.
|
||||
## Developing on Snipe-IT
|
||||
|
||||
If you don't have a feature in mind, but would like to contribute back to the project, check out the [open issues](https://github.com/snipe/snipe-it/issues?state=open) and see if there are any you can tackle.
|
||||
|
||||
-----
|
||||
|
||||
[](http://waffle.io/snipe/snipe-it)
|
||||
|
||||
The labels we use in GitHub Issues and Waffle.io indicate whether we've confirmed an issue as a bug, whether we're considering the issue as a potential feature, and whether it's ready for someone to work on it. We also provide labels such as "n00b", "intermediate" and "advanced" for the experience level we think it requires for contributors who want to help.
|
||||
|
||||
|
||||
## Translations!
|
||||
|
||||
If you're not a coder but want to give back to the project and you're fluent in other languages, that's okay too. We use [CrowdIn](https://crowdin.com) to manage translations, and it makes it super-simple for you to add translations (or validate proposed translations) to the project without messing with code. __Check out [the Snipe-IT CrowdIn translation project here](https://crowdin.com/project/snipe-it/)__.
|
||||
|
||||
Thanks!
|
||||
Please see the [Contributing guidelines in the documentation](http://docs.snipeitapp.com/contributing.html).
|
||||
|
||||
+91
@@ -0,0 +1,91 @@
|
||||
FROM ubuntu:trusty
|
||||
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 \
|
||||
patch \
|
||||
curl \
|
||||
vim \
|
||||
git \
|
||||
mysql-client
|
||||
|
||||
RUN php5enmod mcrypt
|
||||
RUN php5enmod gd
|
||||
|
||||
RUN sed -i 's/variables_order = .*/variables_order = "EGPCS"/' /etc/php5/apache2/php.ini
|
||||
RUN sed -i 's/variables_order = .*/variables_order = "EGPCS"/' /etc/php5/cli/php.ini
|
||||
|
||||
RUN useradd --uid 1000 --gid 50 docker
|
||||
|
||||
RUN echo export APACHE_RUN_USER=docker >> /etc/apache2/envvars
|
||||
RUN echo export APACHE_RUN_GROUP=staff >> /etc/apache2/envvars
|
||||
|
||||
COPY docker/000-default.conf /etc/apache2/sites-enabled/000-default.conf
|
||||
|
||||
#SSL
|
||||
RUN mkdir -p /var/lib/snipeit/ssl
|
||||
COPY docker/001-default-ssl.conf /etc/apache2/sites-enabled/001-default-ssl.conf
|
||||
#COPY docker/001-default-ssl.conf /etc/apache2/sites-available/001-default-ssl.conf
|
||||
|
||||
RUN a2enmod ssl
|
||||
#RUN a2ensite 001-default-ssl.conf
|
||||
|
||||
COPY . /var/www/html
|
||||
|
||||
RUN a2enmod rewrite
|
||||
|
||||
############ INITIAL APPLICATION SETUP #####################
|
||||
|
||||
WORKDIR /var/www/html
|
||||
|
||||
#Append to bootstrap file (less brittle than 'patch')
|
||||
RUN sed -i 's/return $app;/$env="production";\nreturn $app;/' bootstrap/start.php
|
||||
|
||||
#copy all configuration files
|
||||
COPY docker/*.php /var/www/html/app/config/production/
|
||||
|
||||
RUN chown -R docker /var/www/html
|
||||
|
||||
RUN \
|
||||
rm -r "/var/www/html/app/private_uploads" && ln -fs "/var/lib/snipeit/data/private_uploads" "/var/www/html/app/private_uploads" && \
|
||||
rm -r "/var/www/html/public/uploads/avatars" && ln -fs "/var/lib/snipeit/data/uploads/avatars" "/var/www/html/public/uploads/avatars" && \
|
||||
rm -r "/var/www/html/public/uploads/models" && ln -fs "/var/lib/snipeit/data/uploads/models" "/var/www/html/public/uploads/models" && \
|
||||
rm -r "/var/www/html/public/uploads/suppliers" && ln -fs "/var/lib/snipeit/data/uploads/suppliers" "/var/www/html/public/uploads/suppliers" && \
|
||||
rm -r "/var/www/html/app/storage/dumps" && ln -fs "/var/lib/snipeit/dumps" "/var/www/html/app/storage/dumps"
|
||||
|
||||
############## DEPENDENCIES via COMPOSER ###################
|
||||
|
||||
#global install of composer
|
||||
RUN cd /tmp;curl -sS https://getcomposer.org/installer | php;mv /tmp/composer.phar /usr/local/bin/composer
|
||||
|
||||
# Get dependencies
|
||||
RUN cd /var/www/html;composer install
|
||||
|
||||
############### APPLICATION INSTALL/INIT #################
|
||||
|
||||
#RUN php artisan app:install
|
||||
# too interactive! Try something else
|
||||
|
||||
#COPY docker/app_install.exp /tmp/app_install.exp
|
||||
#RUN chmod +x /tmp/app_install.exp
|
||||
#RUN /tmp/app_install.exp
|
||||
|
||||
############### DATA VOLUME #################
|
||||
|
||||
VOLUME [/var/lib/snipeit]
|
||||
|
||||
##### START SERVER
|
||||
|
||||
COPY docker/entrypoint.sh /entrypoint.sh
|
||||
RUN chmod +x /entrypoint.sh
|
||||
|
||||
ENTRYPOINT ["/entrypoint.sh"]
|
||||
|
||||
EXPOSE 80
|
||||
EXPOSE 443
|
||||
@@ -1,26 +1,32 @@
|
||||
[](https://pledgie.com/campaigns/22899) [](https://travis-ci.org/snipe/snipe-it) [](http://waffle.io/snipe/snipe-it) [](http://stillmaintained.com/snipe/snipe-it) [](https://crowdin.com/project/snipe-it)
|
||||
[](https://travis-ci.org/snipe/snipe-it) [](http://waffle.io/snipe/snipe-it) []() [](https://crowdin.com/project/snipe-it)
|
||||
[](https://gitter.im/snipe/snipe-it?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
||||
[](https://hub.docker.com/r/snipe/snipe-it/)
|
||||
[](https://twitter.com/snipeyhead)
|
||||
|
||||
|
||||
## Snipe-IT - Asset Management For the Rest of Us
|
||||
|
||||
[](https://gitter.im/snipe/snipe-it?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
||||
|
||||
This is a FOSS project for asset management in IT Operations. Knowing who has which laptop, when it was purchased in order to depreciate it correctly, handling software licenses, etc.
|
||||
|
||||
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.php).)
|
||||
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,43 +35,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.
|
||||
|
||||
|
||||
[](https://bitdeli.com/free "Bitdeli Badge")
|
||||
[](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.
|
||||
|
||||
+87
-13
@@ -18,7 +18,7 @@ class AppCommand extends Command
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $description = '';
|
||||
protected $description = 'This command kicks off your database table creation and migration, and creates your first admin user.';
|
||||
|
||||
/**
|
||||
* Holds the user information.
|
||||
@@ -28,10 +28,12 @@ class AppCommand extends Command
|
||||
protected $userData = array(
|
||||
'first_name' => null,
|
||||
'last_name' => null,
|
||||
'email' => null,
|
||||
'username' => null,
|
||||
'password' => null
|
||||
);
|
||||
|
||||
protected $dummyData = false;
|
||||
|
||||
/**
|
||||
* Create a new command instance.
|
||||
*
|
||||
@@ -64,9 +66,11 @@ class AppCommand extends Command
|
||||
// Let's ask the user some questions, shall we?
|
||||
$this->askUserFirstName();
|
||||
$this->askUserLastName();
|
||||
$this->askUserUsername();
|
||||
$this->askUserEmail();
|
||||
$this->askUserPassword();
|
||||
|
||||
$this->askUserDummyData();
|
||||
|
||||
$this->comment('');
|
||||
$this->comment('');
|
||||
@@ -86,16 +90,28 @@ 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();
|
||||
|
||||
// Seed the tables with dummy data
|
||||
$this->call('db:seed');
|
||||
if( $this->dummyData === true )
|
||||
{
|
||||
$this->call('db:seed', array('--force'=>true));
|
||||
}
|
||||
else
|
||||
{
|
||||
// Seeding Settings table is mandatory
|
||||
$this->call('db:seed', array('--class' => 'SettingsSeeder', '--force'=>true));
|
||||
// Seeding Statuslabels is strongly recommended
|
||||
$this->call('db:seed', array('--class' => 'StatuslabelsSeeder', '--force'=>true));
|
||||
// Seeding Categories is good to have
|
||||
$this->call('db:seed', array('--class' => 'CategoriesSeeder', '--force'=>true));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -147,7 +163,7 @@ class AppCommand extends Command
|
||||
}
|
||||
|
||||
/**
|
||||
* Asks the user for the user email address.
|
||||
* Asks the user for the username address.
|
||||
*
|
||||
* @return void
|
||||
* @todo Use the Laravel Validator
|
||||
@@ -156,7 +172,7 @@ class AppCommand extends Command
|
||||
{
|
||||
do {
|
||||
// Ask the user to input the email address
|
||||
$email = $this->ask('Please enter your user email: ');
|
||||
$email = $this->ask('Please enter your email: ');
|
||||
|
||||
// Check if email is valid
|
||||
if ($email == '') {
|
||||
@@ -170,6 +186,32 @@ class AppCommand extends Command
|
||||
while ( ! $email);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Asks the user for the username address.
|
||||
*
|
||||
* @return void
|
||||
* @todo Use the Laravel Validator
|
||||
*/
|
||||
protected function askUserUsername()
|
||||
{
|
||||
do {
|
||||
// Ask the user to input the username
|
||||
$username = $this->ask('Please enter your username: ');
|
||||
|
||||
// Check if username is valid
|
||||
if ($username == '') {
|
||||
// Return an error message
|
||||
$this->error('Username is invalid. Please try again.');
|
||||
}
|
||||
|
||||
// Store the username address
|
||||
$this->userData['username'] = $username;
|
||||
}
|
||||
while ( ! $username);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Asks the user for the user password.
|
||||
*
|
||||
@@ -180,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 email is valid
|
||||
if ($password == '') {
|
||||
// Check if password is valid
|
||||
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
|
||||
@@ -193,6 +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 no): ');
|
||||
$this->dummyData = (strstr($dummydata, 'y' )) ? true : false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Runs all the necessary Sentry commands.
|
||||
*
|
||||
@@ -207,7 +273,10 @@ class AppCommand extends Command
|
||||
$this->sentryCreateUser();
|
||||
|
||||
// Create dummy user
|
||||
$this->sentryCreateDummyUser();
|
||||
if( $this->dummyData === true )
|
||||
{
|
||||
$this->sentryCreateDummyUser();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -286,9 +355,12 @@ class AppCommand extends Command
|
||||
$data = array_merge($this->userData, array(
|
||||
'activated' => 1,
|
||||
'manager_id' => NULL,
|
||||
'notes' => 'Generated on install',
|
||||
'permissions' => array(
|
||||
'admin' => 1,
|
||||
'user' => 1,
|
||||
'superuser' => 1,
|
||||
'reports' => 1,
|
||||
),
|
||||
));
|
||||
|
||||
@@ -296,7 +368,7 @@ class AppCommand extends Command
|
||||
$user = Sentry::getUserProvider()->create($data);
|
||||
|
||||
// Associate the Admin group to this user
|
||||
$group = Sentry::getGroupProvider()->findById(1);
|
||||
$group = Sentry::findGroupByName('Admin');
|
||||
$user->addGroup($group);
|
||||
|
||||
// Show the success message
|
||||
@@ -317,7 +389,9 @@ class AppCommand extends Command
|
||||
'first_name' => 'John',
|
||||
'last_name' => 'Doe',
|
||||
'email' => 'john.doe@example.com',
|
||||
'password' => 'johndoe',
|
||||
'username' => 'john.doe@example.com',
|
||||
'password' => substr(str_shuffle(str_repeat('0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', mt_rand(1,10))),1,10),
|
||||
'notes' => 'Generated on install',
|
||||
'activated' => 1,
|
||||
'manager_id' => 1,
|
||||
);
|
||||
|
||||
@@ -0,0 +1,538 @@
|
||||
<?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) {
|
||||
|
||||
|
||||
// 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 username
|
||||
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 Model
|
||||
if (array_key_exists('5',$row)) {
|
||||
$user_asset_model = substr(trim($row[5]), 0, 254);
|
||||
} else {
|
||||
$user_asset_model = '';
|
||||
}
|
||||
|
||||
// Asset Manufacturer
|
||||
if (array_key_exists('6',$row)) {
|
||||
$user_asset_mfgr = substr(trim($row[6]), 0, 254);
|
||||
} else {
|
||||
$user_asset_mfgr = '';
|
||||
}
|
||||
|
||||
// Asset model number
|
||||
if (array_key_exists('7',$row)) {
|
||||
$user_asset_modelno = substr(trim($row[7]), 0, 254);
|
||||
//$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 = '';
|
||||
}
|
||||
|
||||
// Asset Company Name
|
||||
if (array_key_exists('14',$row)) {
|
||||
if ($row[14]!='') {
|
||||
$user_asset_company_name = trim($row[14]);
|
||||
} else {
|
||||
$user_asset_company_name= '';
|
||||
}
|
||||
} else {
|
||||
$user_asset_company_name = '';
|
||||
}
|
||||
|
||||
// Asset Status Name
|
||||
if (array_key_exists('15',$row)) {
|
||||
if ($row[15]!='') {
|
||||
$user_asset_status = trim($row[15]);
|
||||
} else {
|
||||
$user_asset_status= '';
|
||||
}
|
||||
} else {
|
||||
$user_asset_status = '';
|
||||
}
|
||||
|
||||
// Asset Warranty Months
|
||||
if (array_key_exists('16',$row)) {
|
||||
if ($row[16]!='') {
|
||||
$user_asset_warranty = intval($row[16]);
|
||||
} else {
|
||||
$user_asset_warranty= NULL;
|
||||
}
|
||||
} else {
|
||||
$user_asset_warranty = NULL;
|
||||
}
|
||||
|
||||
// Asset Supplier
|
||||
if (array_key_exists('17',$row)) {
|
||||
if ($row[17]!='') {
|
||||
$user_asset_supplier = trim($row[17]);
|
||||
} else {
|
||||
$user_asset_supplier= '';
|
||||
}
|
||||
} else {
|
||||
$user_asset_supplier = '';
|
||||
}
|
||||
|
||||
|
||||
// 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_model);
|
||||
$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('Status: '.$user_asset_status);
|
||||
$this->comment('Supplier: '.$user_asset_supplier);
|
||||
$this->comment('Warranty Months: '.$user_asset_warranty);
|
||||
$this->comment('Notes: '.$user_asset_notes);
|
||||
$this->comment('Company Name: '.$user_asset_company_name);
|
||||
$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', e($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.');
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (e($user_asset_category)=='') {
|
||||
$category_name = 'Unnamed Category';
|
||||
} else {
|
||||
$category_name = e($user_asset_category);
|
||||
}
|
||||
|
||||
// Check for the category match and create it if it doesn't exist
|
||||
if ($category = Category::where('name', e($category_name))->where('category_type', 'asset')->first()) {
|
||||
$this->comment('Category '.$category_name.' already exists');
|
||||
|
||||
} else {
|
||||
$category = new Category();
|
||||
$category->name = e($category_name);
|
||||
$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', e($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 supplier match and create it if it doesn't exist
|
||||
if ($supplier = Supplier::where('name', e($user_asset_supplier))->first()) {
|
||||
$this->comment('Supplier '.$user_asset_supplier.' already exists');
|
||||
} else {
|
||||
$supplier = new Supplier();
|
||||
$supplier->name = e($user_asset_supplier);
|
||||
$supplier->user_id = 1;
|
||||
|
||||
if ($supplier->save()) {
|
||||
$this->comment('Supplier '.$user_asset_supplier.' was created');
|
||||
} else {
|
||||
$this->comment('Something went wrong! Supplier '.$user_asset_supplier.' was NOT created');
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
if ($user_asset_status=='') {
|
||||
$user_asset_status = 'Unspecified Status';
|
||||
}
|
||||
// Check for the status label match and create it if it doesn't exist
|
||||
if ($statuslabel = Statuslabel::where('name', e($user_asset_status))->first()) {
|
||||
$this->comment('Status Label '.$user_asset_status.' already exists');
|
||||
} else {
|
||||
|
||||
$statuslabel = new Statuslabel();
|
||||
$statuslabel->name = e($user_asset_status);
|
||||
$statuslabel->user_id = 1;
|
||||
$statuslabel->deployable = 1;
|
||||
|
||||
if ($statuslabel->save()) {
|
||||
$this->comment('Status Label '.$user_asset_status.' was created');
|
||||
} else {
|
||||
$this->comment('Something went wrong! Status Label '.$user_asset_status.' was NOT created');
|
||||
}
|
||||
|
||||
}
|
||||
$status_id = $statuslabel->id;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// Check for the asset model match and create it if it doesn't exist
|
||||
if ($asset_model = Model::where('name', e($user_asset_model ))->where('modelno', e($user_asset_modelno))->where('category_id', $category->id)->where('manufacturer_id', $manufacturer->id)->first()) {
|
||||
$this->comment('The Asset Model '.$user_asset_model .' with model number '.$user_asset_modelno.' already exists');
|
||||
} else {
|
||||
$asset_model = new Model();
|
||||
$asset_model->name = e($user_asset_model );
|
||||
$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_model .' with model number '.$user_asset_modelno.' was created');
|
||||
} else {
|
||||
$this->comment('Something went wrong! Asset Model '.$user_asset_model .' was NOT created');
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// Check for the asset company match and create it if it doesn't exist
|
||||
if ($user_asset_company_name!='') {
|
||||
if ($company = Company::where('name', e($user_asset_company_name))->first()) {
|
||||
$this->comment('Company '.$user_asset_company_name.' already exists');
|
||||
} else {
|
||||
$company = new Company();
|
||||
$company->name = e($user_asset_company_name);
|
||||
|
||||
if ($company->save()) {
|
||||
$this->comment('Company '.$user_asset_company_name.' was created');
|
||||
} else {
|
||||
$this->comment('Something went wrong! Company '.$user_asset_company_name.' was NOT created');
|
||||
}
|
||||
}
|
||||
|
||||
} else {
|
||||
$company = new Company();
|
||||
}
|
||||
|
||||
// Check for the asset match and create it if it doesn't exist
|
||||
if ($asset = Asset::where('asset_tag', e($user_asset_tag))->first()) {
|
||||
$this->comment('The Asset with asset tag '.$user_asset_tag.' already exists');
|
||||
} else {
|
||||
$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;
|
||||
$asset->warranty_months = $user_asset_warranty;
|
||||
$asset->company_id = $company->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_model .' with serial number '.$user_asset_serial.' was created');
|
||||
} else {
|
||||
$this->comment('Something went wrong! Asset '.$user_asset_model .' 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),
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -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),
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,130 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Console\Command;
|
||||
use Symfony\Component\Console\Input\InputOption;
|
||||
use Symfony\Component\Console\Input\InputArgument;
|
||||
|
||||
class SendExpirationAlerts extends Command {
|
||||
|
||||
/**
|
||||
* The console command name.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $name = 'alerts:expiring';
|
||||
|
||||
/**
|
||||
* The console command description.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $description = 'This command checks for expiring warrantees and service agreements, and sends out an alert email.';
|
||||
|
||||
/**
|
||||
* Create a new command instance.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct();
|
||||
}
|
||||
|
||||
/**
|
||||
* Execute the console command.
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public function fire()
|
||||
{
|
||||
|
||||
// Expiring Assets
|
||||
$expiring_assets = Asset::getExpiringWarrantee(60);
|
||||
$this->info(count($expiring_assets).' expiring assets');
|
||||
|
||||
$asset_data['count'] = count($expiring_assets);
|
||||
$asset_data['email_content'] ='';
|
||||
$now = date("Y-m-d");
|
||||
|
||||
|
||||
foreach ($expiring_assets as $asset) {
|
||||
|
||||
$expires = $asset->warrantee_expires();
|
||||
$difference = round(abs(strtotime($expires) - strtotime($now))/86400);
|
||||
|
||||
if ($difference > 30) {
|
||||
$asset_data['email_content'] .= '<tr style="background-color: #fcffa3;">';
|
||||
} else {
|
||||
$asset_data['email_content'] .= '<tr style="background-color:#d9534f;">';
|
||||
}
|
||||
$asset_data['email_content'] .= '<td><a href="'.Config::get('app.url').'/hardware/'.$asset->id.'/view">';
|
||||
$asset_data['email_content'] .= $asset->showAssetName().'</a></td><td>'.$asset->asset_tag.'</td>';
|
||||
$asset_data['email_content'] .= '<td>'.$asset->warrantee_expires().'</td>';
|
||||
$asset_data['email_content'] .= '<td>'.$difference.' days</td>';
|
||||
$asset_data['email_content'] .= '</tr>';
|
||||
}
|
||||
|
||||
// Expiring licenses
|
||||
$expiring_licenses = License::getExpiringLicenses(60);
|
||||
$this->info(count($expiring_licenses).' expiring licenses');
|
||||
|
||||
|
||||
$license_data['count'] = count($expiring_licenses);
|
||||
$license_data['email_content'] = '';
|
||||
|
||||
foreach ($expiring_licenses as $license) {
|
||||
$expires = $license->expiration_date;
|
||||
$difference = round(abs(strtotime($expires) - strtotime($now))/86400);
|
||||
|
||||
if ($difference > 30) {
|
||||
$license_data['email_content'] .= '<tr style="background-color: #fcffa3;">';
|
||||
} else {
|
||||
$license_data['email_content'] .= '<tr style="background-color:#d9534f;">';
|
||||
}
|
||||
$license_data['email_content'] .= '<td><a href="'.Config::get('app.url').'/admin/licenses/'.$license->id.'/view">';
|
||||
$license_data['email_content'] .= $license->name.'</a></td>';
|
||||
$license_data['email_content'] .= '<td>'.$license->expiration_date.'</td>';
|
||||
$license_data['email_content'] .= '<td>'.$difference.' days</td>';
|
||||
$license_data['email_content'] .= '</tr>';
|
||||
}
|
||||
|
||||
if ((Setting::getSettings()->alert_email!='') && (Setting::getSettings()->alerts_enabled==1)) {
|
||||
|
||||
|
||||
if (count($expiring_assets) > 0) {
|
||||
Mail::send('emails.expiring-assets-report', $asset_data, function ($m) {
|
||||
$m->to(Setting::getSettings()->alert_email, Setting::getSettings()->site_name);
|
||||
$m->subject('Expiring Assets Report');
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
if (count($expiring_licenses) > 0) {
|
||||
Mail::send('emails.expiring-licenses-report', $license_data, function ($m) {
|
||||
$m->to(Setting::getSettings()->alert_email, Setting::getSettings()->site_name);
|
||||
$m->subject('Expiring Licenses Report');
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
|
||||
} else {
|
||||
|
||||
if (Setting::getSettings()->alert_email=='') {
|
||||
echo "Could not send email. No alert email configured in settings. \n";
|
||||
} elseif (Setting::getSettings()->alerts_enabled!=1) {
|
||||
echo "Alerts are disabled in the settings. No mail will be sent. \n";
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,65 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Console\Command;
|
||||
use Symfony\Component\Console\Input\InputOption;
|
||||
use Symfony\Component\Console\Input\InputArgument;
|
||||
|
||||
class SystemBackup extends Command {
|
||||
|
||||
/**
|
||||
* The console command name.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $name = 'snipeit:backup';
|
||||
|
||||
/**
|
||||
* The console command description.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
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.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct();
|
||||
}
|
||||
|
||||
/**
|
||||
* Execute the console command.
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public function fire()
|
||||
{
|
||||
//
|
||||
$files['avatars'] = glob(public_path().'/uploads/avatars/*');
|
||||
$files['models'] = glob(public_path().'/uploads/models/*');
|
||||
$files['suppliers'] = glob(public_path().'/uploads/suppliers/*');
|
||||
$files['private_uploads'] = glob(app_path().'/private_uploads/*');
|
||||
$base_filename = date('Ymdgis');
|
||||
$zip_file = app_path().'/storage/dumps/'.$base_filename.'-backup.zip';
|
||||
$db_dump = Config::get('backup::path').$base_filename.'-db.sql';
|
||||
$this->call('db:backup', array('filename' => $db_dump));
|
||||
|
||||
Zipper::make($zip_file)
|
||||
->folder('avatars')->add($files['avatars'])
|
||||
->folder('models')->add($files['models'])
|
||||
->folder('suppliers')->add($files['suppliers'])
|
||||
->folder('private_uploads')->add($files['private_uploads'])
|
||||
->folder('database')->add($db_dump)->close();
|
||||
|
||||
$this->info('Backup file created at '.$zip_file);
|
||||
$this->info('Removing SQL dump at '.$db_dump);
|
||||
unlink($db_dump);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,89 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Console\Command;
|
||||
use Symfony\Component\Console\Input\InputOption;
|
||||
use Symfony\Component\Console\Input\InputArgument;
|
||||
|
||||
class Versioning extends Command {
|
||||
|
||||
/**
|
||||
* The console command name.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $name = 'versioning:update';
|
||||
|
||||
/**
|
||||
* The console command description.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $description = 'Generate and update app\'s version via git.';
|
||||
|
||||
/**
|
||||
* Create a new command instance.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct();
|
||||
}
|
||||
|
||||
/**
|
||||
* Execute the console command.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function fire()
|
||||
{
|
||||
// Path to the file containing your version
|
||||
// This will be overwritten everything you commit a message
|
||||
$versionFile = app_path().'/config/version.php';
|
||||
|
||||
// The git's output
|
||||
// get the argument passed in the git command
|
||||
$hash_version = $this->argument('app_version');
|
||||
|
||||
// discard the commit hash
|
||||
$version = explode('-', $hash_version);
|
||||
$realVersion = $version[0] . '-' . $version[1];
|
||||
|
||||
// save the version array to a variable
|
||||
$array = var_export(array('app_version' => $realVersion,'hash_version' => $hash_version), true);
|
||||
|
||||
|
||||
// Construct our file content
|
||||
$content = <<<CON
|
||||
<?php
|
||||
return $array;
|
||||
CON;
|
||||
|
||||
// And finally write the file and output the current version
|
||||
\File::put($versionFile, $content);
|
||||
$this->line('Setting version: '. \Config::get('version.latest'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the console command arguments.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function getArguments()
|
||||
{
|
||||
return array(
|
||||
array('app_version', InputArgument::REQUIRED, 'version number is required.'),
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the console command options.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function getOptions()
|
||||
{
|
||||
return array(
|
||||
);
|
||||
}
|
||||
}
|
||||
+23
-2
@@ -20,7 +20,7 @@ return array(
|
||||
| Application Locale
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This locale ties into the languaage files in app/lang, which contain the
|
||||
| This locale ties into the language files in app/lang, which contain the
|
||||
| language files for each translation.
|
||||
|
|
||||
*/
|
||||
@@ -44,6 +44,20 @@ return array(
|
||||
|
||||
'cipher' => MCRYPT_RIJNDAEL_256,
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Prevent Password changes
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| If for some reason you do not wish for admins to be able to edit the password
|
||||
| for any user (including themselves), set this to true.
|
||||
|
|
||||
*/
|
||||
|
||||
'lock_passwords' => false,
|
||||
|
||||
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Autoloaded Service Providers
|
||||
@@ -87,6 +101,10 @@ return array(
|
||||
'Barryvdh\Debugbar\ServiceProvider',
|
||||
'Cartalyst\Sentry\SentryServiceProvider',
|
||||
'Chumper\Datatable\DatatableServiceProvider',
|
||||
'Maknz\Slack\SlackServiceProvider',
|
||||
'Schickling\Backup\BackupServiceProvider',
|
||||
'Chumper\Zipper\ZipperServiceProvider',
|
||||
'Fideloper\Proxy\ProxyServiceProvider',
|
||||
|
||||
),
|
||||
|
||||
@@ -156,7 +174,10 @@ return array(
|
||||
'Str' => 'Illuminate\Support\Str',
|
||||
'URL' => 'Illuminate\Support\Facades\URL',
|
||||
'Validator' => 'Illuminate\Support\Facades\Validator',
|
||||
'View' => 'Illuminate\Support\Facades\View'
|
||||
'View' => 'Illuminate\Support\Facades\View',
|
||||
'Reader' => 'League\Csv\Reader',
|
||||
'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',
|
||||
|
||||
@@ -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,
|
||||
|
||||
|
||||
);
|
||||
@@ -28,7 +28,7 @@ return array(
|
||||
|
|
||||
*/
|
||||
|
||||
'host' => 'smtp.mailgun.org',
|
||||
'host' => 'smtp.mandrillapp.com',
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
|
||||
@@ -0,0 +1,140 @@
|
||||
<?php
|
||||
|
||||
return array(
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Default Session Driver
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This option controls the default session "driver" that will be used on
|
||||
| requests. By default, we will use the lightweight native driver but
|
||||
| you may specify any of the other wonderful drivers provided here.
|
||||
|
|
||||
| Supported: "file", "cookie", "database", "apc",
|
||||
| "memcached", "redis", "array"
|
||||
|
|
||||
*/
|
||||
|
||||
'driver' => 'file',
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Session Lifetime
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Here you may specify the number of minutes that you wish the session
|
||||
| to be allowed to remain idle before it expires. If you want them
|
||||
| to immediately expire on the browser closing, set that option.
|
||||
|
|
||||
*/
|
||||
|
||||
'lifetime' => 12000,
|
||||
|
||||
'expire_on_close' => false,
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Session File Location
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| When using the native session driver, we need a location where session
|
||||
| files may be stored. A default has been set for you but a different
|
||||
| location may be specified. This is only needed for file sessions.
|
||||
|
|
||||
*/
|
||||
|
||||
'files' => storage_path().'/sessions',
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Session Database Connection
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| When using the "database" or "redis" session drivers, you may specify a
|
||||
| connection that should be used to manage these sessions. This should
|
||||
| correspond to a connection in your database configuration options.
|
||||
|
|
||||
*/
|
||||
|
||||
'connection' => null,
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Session Database Table
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| When using the "database" session driver, you may specify the table we
|
||||
| should use to manage the sessions. Of course, a sensible default is
|
||||
| provided for you; however, you are free to change this as needed.
|
||||
|
|
||||
*/
|
||||
|
||||
'table' => 'sessions',
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Session Sweeping Lottery
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Some session drivers must manually sweep their storage location to get
|
||||
| rid of old sessions from storage. Here are the chances that it will
|
||||
| happen on a given request. By default, the odds are 2 out of 100.
|
||||
|
|
||||
*/
|
||||
|
||||
'lottery' => array(2, 100),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Session Cookie Name
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Here you may change the name of the cookie used to identify a session
|
||||
| instance by ID. The name specified here will get used every time a
|
||||
| new session cookie is created by the framework for every driver.
|
||||
|
|
||||
*/
|
||||
|
||||
'cookie' => 'snipeit_session',
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Session Cookie Path
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| The session cookie path determines the path for which the cookie will
|
||||
| be regarded as available. Typically, this will be the root path of
|
||||
| your application but you are free to change this when necessary.
|
||||
|
|
||||
*/
|
||||
|
||||
'path' => '/',
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Session Cookie Domain
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Here you may change the domain of the cookie used to identify a session
|
||||
| in your application. This will determine which domains the cookie is
|
||||
| available to in your application. A sensible default has been set.
|
||||
|
|
||||
*/
|
||||
|
||||
'domain' => null,
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| HTTPS Only Cookies
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| By setting this option to true, session cookies will only be sent back
|
||||
| to the server if the browser has a HTTPS connection. This will keep
|
||||
| the cookie from being sent to you if it can not be done securely.
|
||||
|
|
||||
*/
|
||||
|
||||
'secure' => false,
|
||||
|
||||
);
|
||||
@@ -46,7 +46,7 @@ return array(
|
||||
|
|
||||
*/
|
||||
|
||||
'hasher' => 'native',
|
||||
'hasher' => 'bcrypt',
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
@@ -134,7 +134,7 @@ return array(
|
||||
|
|
||||
*/
|
||||
|
||||
'login_attribute' => 'email',
|
||||
'login_attribute' => 'username',
|
||||
|
||||
),
|
||||
|
||||
|
||||
@@ -0,0 +1,210 @@
|
||||
<?php
|
||||
|
||||
return array(
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Table specific configuration options.
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
*/
|
||||
|
||||
'table' => array(
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Table class
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Class(es) added to the table
|
||||
| Supported: string
|
||||
|
|
||||
*/
|
||||
|
||||
'class' => 'table table-bordered',
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Table ID
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| ID given to the table. Used for connecting the table and the Datatables
|
||||
| jQuery plugin. If left empty a random ID will be generated.
|
||||
| Supported: string
|
||||
|
|
||||
*/
|
||||
|
||||
'id' => '',
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| DataTable options
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| jQuery dataTable plugin options. The array will be json_encoded and
|
||||
| passed through to the plugin. See https://datatables.net/usage/options
|
||||
| for more information.
|
||||
| Supported: array
|
||||
|
|
||||
*/
|
||||
|
||||
'options' => array(
|
||||
|
||||
"pagingType" => "full_numbers",
|
||||
'processing'=>true,
|
||||
'language'=>array(
|
||||
'processing'=>'<i class="fa fa-spinner fa-spin"></i> Loading...'
|
||||
),
|
||||
'deferRender'=> true,
|
||||
'stateSave'=> true,
|
||||
'paging'=>true,
|
||||
'pageLength'=> Setting::getSettings()->per_page,
|
||||
'lengthMenu'=>array(array(10,25,50,75,100,125,150,-1), array(10,25,50,75,100,125,150,'All')),
|
||||
'tableTools' => array(
|
||||
'sSwfPath'=> Config::get('app.url').'/assets/swf/copy_csv_xls_pdf.swf',
|
||||
'aButtons'=>array(
|
||||
array(
|
||||
'sExtends'=>'copy',
|
||||
'sButtonText'=>'Copy',
|
||||
'mColumns'=>'visible',
|
||||
'bFooter'=>false,
|
||||
),
|
||||
array(
|
||||
'sExtends'=>'print',
|
||||
'sButtonText'=>'Print',
|
||||
'mColumns'=>'visible',
|
||||
'bShowAll'=>true,
|
||||
),
|
||||
array(
|
||||
'sExtends'=>'collection',
|
||||
'sButtonText'=>'Export',
|
||||
'aButtons'=>array(
|
||||
array(
|
||||
'sExtends'=>'csv',
|
||||
'sButtonText'=>'csv',
|
||||
'mColumns'=>'visible',
|
||||
'bFooter'=>false,
|
||||
),
|
||||
array(
|
||||
'sExtends'=>'xls',
|
||||
'sButtonText'=>'XLS',
|
||||
'mColumns'=>'visible',
|
||||
'bFooter'=>false,
|
||||
),
|
||||
array(
|
||||
'sExtends'=>'pdf',
|
||||
'sButtonText'=>'PDF',
|
||||
'mColumns'=>'visible',
|
||||
'bFooter'=>false,
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
),
|
||||
|
||||
),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| DataTable callbacks
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| jQuery dataTable plugin callbacks. The array will be json_encoded and
|
||||
| passed through to the plugin. See https://datatables.net/usage/callbacks
|
||||
| for more information.
|
||||
| Supported: array
|
||||
|
|
||||
*/
|
||||
|
||||
'callbacks' => array(
|
||||
"stateSaveCallback"=>"function (oSettings, oData) {
|
||||
localStorage.setItem('DataTables_'+window.location.pathname, JSON.stringify(oData));
|
||||
}",
|
||||
"stateLoadCallback"=>"function (oSettings) {
|
||||
return JSON.parse(localStorage.getItem('DataTables_'+window.location.pathname));
|
||||
}",
|
||||
),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Skip javascript in table template
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Determines if the template should echo the javascript
|
||||
| Supported: boolean
|
||||
|
|
||||
*/
|
||||
|
||||
'noScript' => false,
|
||||
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Table view
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Template used to render the table
|
||||
| Supported: string
|
||||
|
|
||||
*/
|
||||
|
||||
'table_view' => 'datatable::template',
|
||||
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Script view
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Template used to render the javascript
|
||||
| Supported: string
|
||||
|
|
||||
*/
|
||||
|
||||
'script_view' => 'datatable::javascript',
|
||||
|
||||
|
||||
),
|
||||
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Engine specific configuration options.
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
*/
|
||||
|
||||
'engine' => array(
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Search for exact words
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| If the search should be done with exact matching
|
||||
| Supported: boolean
|
||||
|
|
||||
*/
|
||||
|
||||
'exactWordSearch' => false,
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Enable to display all records.
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Be careful! It may be overloaded with large record.
|
||||
| Supported: boolean
|
||||
|
|
||||
*/
|
||||
'enableDisplayAll' => false,
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Limit display when iDisplayLength invaild
|
||||
|--------------------------------------------------------------------------
|
||||
*/
|
||||
'defaultDisplayLength' => 10,
|
||||
)
|
||||
|
||||
|
||||
);
|
||||
@@ -0,0 +1,31 @@
|
||||
<?php
|
||||
return array(
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Trusted Proxies
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Set an array of trusted proxies, so Laravel knows to grab the client's
|
||||
| information via the X-Forwarded-* headers.
|
||||
|
|
||||
| To trust all proxies, use the value '*':
|
||||
|
|
||||
| 'proxies' => '*'
|
||||
|
|
||||
|
|
||||
| To trust only specific proxies (recommended), set an array of those
|
||||
| proxies' IP addresses:
|
||||
|
|
||||
| 'proxies' => array('192.168.1.1', '192.168.1.2')
|
||||
|
|
||||
|
|
||||
| Or use CIDR notation:
|
||||
|
|
||||
| 'proxies' => array('192.168.12.0/23')
|
||||
|
|
||||
*/
|
||||
|
||||
'proxies' => '*',
|
||||
|
||||
);
|
||||
@@ -0,0 +1,122 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
|-------------------------------------------------------------
|
||||
| Incoming webhook endpoint
|
||||
|-------------------------------------------------------------
|
||||
|
|
||||
| The endpoint which Slack generates when creating a
|
||||
| new incoming webhook. It will look something like
|
||||
| https://hooks.slack.com/services/XXXXXXXX/XXXXXXXX/XXXXXXXXXXXXXX
|
||||
|
|
||||
*/
|
||||
|
||||
'endpoint' => '',
|
||||
|
||||
/*
|
||||
|-------------------------------------------------------------
|
||||
| Default channel
|
||||
|-------------------------------------------------------------
|
||||
|
|
||||
| The default channel we should post to. The channel can either be a
|
||||
| channel like #general, a private #group, or a @username. Set to
|
||||
| null to use the default set on the Slack webhook
|
||||
|
|
||||
*/
|
||||
|
||||
'channel' => '#general',
|
||||
|
||||
/*
|
||||
|-------------------------------------------------------------
|
||||
| Default username
|
||||
|-------------------------------------------------------------
|
||||
|
|
||||
| The default username we should post as. Set to null to use
|
||||
| the default set on the Slack webhook
|
||||
|
|
||||
*/
|
||||
|
||||
'username' => 'Snipe-IT Bot',
|
||||
|
||||
/*
|
||||
|-------------------------------------------------------------
|
||||
| Default icon
|
||||
|-------------------------------------------------------------
|
||||
|
|
||||
| The default icon to use. This can either be a URL to an image or Slack
|
||||
| emoji like :ghost: or :heart_eyes:. Set to null to use the default
|
||||
| set on the Slack webhook
|
||||
|
|
||||
*/
|
||||
|
||||
'icon' => null,
|
||||
|
||||
/*
|
||||
|-------------------------------------------------------------
|
||||
| Link names
|
||||
|-------------------------------------------------------------
|
||||
|
|
||||
| Whether names like @regan should be converted into links
|
||||
| by Slack
|
||||
|
|
||||
*/
|
||||
|
||||
'link_names' => false,
|
||||
|
||||
/*
|
||||
|-------------------------------------------------------------
|
||||
| Unfurl links
|
||||
|-------------------------------------------------------------
|
||||
|
|
||||
| Whether Slack should unfurl links to text-based content
|
||||
|
|
||||
*/
|
||||
|
||||
'unfurl_links' => false,
|
||||
|
||||
/*
|
||||
|-------------------------------------------------------------
|
||||
| Unfurl media
|
||||
|-------------------------------------------------------------
|
||||
|
|
||||
| Whether Slack should unfurl links to media content such
|
||||
| as images and YouTube videos
|
||||
|
|
||||
*/
|
||||
|
||||
'unfurl_media' => true,
|
||||
|
||||
/*
|
||||
|-------------------------------------------------------------
|
||||
| Markdown in message text
|
||||
|-------------------------------------------------------------
|
||||
|
|
||||
| Whether message text should be interpreted in Slack's Markdown-like
|
||||
| language. For formatting options, see Slack's help article: http://goo.gl/r4fsdO
|
||||
|
|
||||
*/
|
||||
|
||||
'allow_markdown' => true,
|
||||
|
||||
/*
|
||||
|-------------------------------------------------------------
|
||||
| Markdown in attachments
|
||||
|-------------------------------------------------------------
|
||||
|
|
||||
| Which attachment fields should be interpreted in Slack's Markdown-like
|
||||
| language. By default, Slack assumes that no fields in an attachment
|
||||
| should be formatted as Markdown.
|
||||
|
|
||||
*/
|
||||
|
||||
'markdown_in_attachments' => [],
|
||||
|
||||
// Allow Markdown in just the text and title fields
|
||||
// 'markdown_in_attachments' => ['text', 'title']
|
||||
|
||||
// Allow Markdown in all fields
|
||||
// 'markdown_in_attachments' => ['pretext', 'text', 'title', 'fields', 'fallback']
|
||||
|
||||
];
|
||||
@@ -0,0 +1,15 @@
|
||||
<?php
|
||||
return array(
|
||||
'path' => 'app/storage/dumps/',
|
||||
|
||||
'mysql' => array(
|
||||
'dump_command_path' => '',
|
||||
'restore_command_path' => '',
|
||||
),
|
||||
|
||||
's3' => array(
|
||||
'path' => ''
|
||||
),
|
||||
|
||||
'compress' => false,
|
||||
);
|
||||
@@ -6,6 +6,7 @@ return array(
|
||||
array(
|
||||
'permission' => 'superuser',
|
||||
'label' => 'Super User',
|
||||
'note' => 'Determines whether the user has full access to all aspects of the admin. ',
|
||||
),
|
||||
),
|
||||
|
||||
@@ -13,6 +14,7 @@ return array(
|
||||
array(
|
||||
'permission' => 'admin',
|
||||
'label' => 'Admin Rights',
|
||||
'note' => 'Determines whether the user has access to most aspects of the admin.',
|
||||
),
|
||||
),
|
||||
|
||||
@@ -20,6 +22,15 @@ return array(
|
||||
array(
|
||||
'permission' => 'reports',
|
||||
'label' => 'View Reports',
|
||||
'note' => 'Determines whether the user has the abiity to view reports.',
|
||||
),
|
||||
),
|
||||
|
||||
'Licenses' => array(
|
||||
array(
|
||||
'permission' => 'license_keys',
|
||||
'label' => 'View License Keys',
|
||||
'note' => 'Determines whether the user has the ability to view the license keys assigned to them in their own profile. (Usually granted for lower-level permissions that wouldn\'t normally have access.)',
|
||||
),
|
||||
),
|
||||
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
app.php
|
||||
mail.php
|
||||
database.php
|
||||
ldap.php
|
||||
@@ -13,7 +13,7 @@ return array(
|
||||
|
|
||||
*/
|
||||
|
||||
'debug' => true,
|
||||
'debug' => false,
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
@@ -26,7 +26,20 @@ return array(
|
||||
|
|
||||
*/
|
||||
|
||||
'url' => 'http://staging.yourserver.com',
|
||||
'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',
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
|
||||
@@ -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,
|
||||
|
||||
|
||||
);
|
||||
@@ -28,7 +28,7 @@ return array(
|
||||
|
|
||||
*/
|
||||
|
||||
'host' => 'smtp.mailgun.org',
|
||||
'host' => 'smtp.mandrillapp.com',
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
|
||||
@@ -0,0 +1,154 @@
|
||||
<?php
|
||||
|
||||
return array(
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Default Session Driver
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This option controls the default session "driver" that will be used on
|
||||
| requests. By default, we will use the lightweight native driver but
|
||||
| you may specify any of the other wonderful drivers provided here.
|
||||
|
|
||||
| Supported: "file", "cookie", "database", "apc",
|
||||
| "memcached", "redis", "array"
|
||||
|
|
||||
*/
|
||||
|
||||
'driver' => 'file',
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Session Lifetime
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Here you may specify the number of minutes that you wish the session
|
||||
| to be allowed to remain idle before it expires. If you want them
|
||||
| to immediately expire on the browser closing, set that option.
|
||||
|
|
||||
*/
|
||||
|
||||
'lifetime' => 12000,
|
||||
|
||||
'expire_on_close' => false,
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Session File Location
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| When using the native session driver, we need a location where session
|
||||
| files may be stored. A default has been set for you but a different
|
||||
| location may be specified. This is only needed for file sessions.
|
||||
|
|
||||
*/
|
||||
|
||||
'files' => storage_path().'/sessions',
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Session Database Connection
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| When using the "database" or "redis" session drivers, you may specify a
|
||||
| connection that should be used to manage these sessions. This should
|
||||
| correspond to a connection in your database configuration options.
|
||||
|
|
||||
*/
|
||||
|
||||
'connection' => null,
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Session Database Table
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| When using the "database" session driver, you may specify the table we
|
||||
| should use to manage the sessions. Of course, a sensible default is
|
||||
| provided for you; however, you are free to change this as needed.
|
||||
|
|
||||
*/
|
||||
|
||||
'table' => 'sessions',
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Session Sweeping Lottery
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Some session drivers must manually sweep their storage location to get
|
||||
| rid of old sessions from storage. Here are the chances that it will
|
||||
| happen on a given request. By default, the odds are 2 out of 100.
|
||||
|
|
||||
*/
|
||||
|
||||
'lottery' => array(2, 100),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Session Cookie Name
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Here you may change the name of the cookie used to identify a session
|
||||
| instance by ID. The name specified here will get used every time a
|
||||
| new session cookie is created by the framework for every driver.
|
||||
|
|
||||
*/
|
||||
|
||||
'cookie' => 'snipeit_session',
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Session Cookie Path
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| The session cookie path determines the path for which the cookie will
|
||||
| be regarded as available. Typically, this will be the root path of
|
||||
| your application but you are free to change this when necessary.
|
||||
|
|
||||
*/
|
||||
|
||||
'path' => '/',
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Session Cookie Domain
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Here you may change the domain of the cookie used to identify a session
|
||||
| in your application. This will determine which domains the cookie is
|
||||
| available to in your application. A sensible default has been set.
|
||||
|
|
||||
*/
|
||||
|
||||
'domain' => null,
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| HTTPS Only Cookies
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| By setting this option to true, session cookies will only be sent back
|
||||
| to the server if the browser has a HTTPS connection. This will keep
|
||||
| the cookie from being sent to you if it can not be done securely.
|
||||
|
|
||||
*/
|
||||
|
||||
'secure' => false,
|
||||
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Allow multiple logins from different devices at the same time
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| By default, if a user logs into an account where someone is already
|
||||
| logged in, the previous user will be logged out. We recommend leaving
|
||||
| this set to false for security reasons.
|
||||
|
|
||||
*/
|
||||
|
||||
'multi_login' => false,
|
||||
|
||||
);
|
||||
@@ -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
|
||||
|
||||
@@ -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,
|
||||
|
||||
|
||||
);
|
||||
@@ -28,7 +28,7 @@ return array(
|
||||
|
|
||||
*/
|
||||
|
||||
'host' => 'smtp.mailgun.org',
|
||||
'host' => 'smtp.mandrillapp.com',
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
|
||||
@@ -0,0 +1,154 @@
|
||||
<?php
|
||||
|
||||
return array(
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Default Session Driver
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This option controls the default session "driver" that will be used on
|
||||
| requests. By default, we will use the lightweight native driver but
|
||||
| you may specify any of the other wonderful drivers provided here.
|
||||
|
|
||||
| Supported: "file", "cookie", "database", "apc",
|
||||
| "memcached", "redis", "array"
|
||||
|
|
||||
*/
|
||||
|
||||
'driver' => 'file',
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Session Lifetime
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Here you may specify the number of minutes that you wish the session
|
||||
| to be allowed to remain idle before it expires. If you want them
|
||||
| to immediately expire on the browser closing, set that option.
|
||||
|
|
||||
*/
|
||||
|
||||
'lifetime' => 12000,
|
||||
|
||||
'expire_on_close' => false,
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Session File Location
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| When using the native session driver, we need a location where session
|
||||
| files may be stored. A default has been set for you but a different
|
||||
| location may be specified. This is only needed for file sessions.
|
||||
|
|
||||
*/
|
||||
|
||||
'files' => storage_path().'/sessions',
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Session Database Connection
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| When using the "database" or "redis" session drivers, you may specify a
|
||||
| connection that should be used to manage these sessions. This should
|
||||
| correspond to a connection in your database configuration options.
|
||||
|
|
||||
*/
|
||||
|
||||
'connection' => null,
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Session Database Table
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| When using the "database" session driver, you may specify the table we
|
||||
| should use to manage the sessions. Of course, a sensible default is
|
||||
| provided for you; however, you are free to change this as needed.
|
||||
|
|
||||
*/
|
||||
|
||||
'table' => 'sessions',
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Session Sweeping Lottery
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Some session drivers must manually sweep their storage location to get
|
||||
| rid of old sessions from storage. Here are the chances that it will
|
||||
| happen on a given request. By default, the odds are 2 out of 100.
|
||||
|
|
||||
*/
|
||||
|
||||
'lottery' => array(2, 100),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Session Cookie Name
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Here you may change the name of the cookie used to identify a session
|
||||
| instance by ID. The name specified here will get used every time a
|
||||
| new session cookie is created by the framework for every driver.
|
||||
|
|
||||
*/
|
||||
|
||||
'cookie' => 'snipeit_session',
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Session Cookie Path
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| The session cookie path determines the path for which the cookie will
|
||||
| be regarded as available. Typically, this will be the root path of
|
||||
| your application but you are free to change this when necessary.
|
||||
|
|
||||
*/
|
||||
|
||||
'path' => '/',
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Session Cookie Domain
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Here you may change the domain of the cookie used to identify a session
|
||||
| in your application. This will determine which domains the cookie is
|
||||
| available to in your application. A sensible default has been set.
|
||||
|
|
||||
*/
|
||||
|
||||
'domain' => null,
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| HTTPS Only Cookies
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| By setting this option to true, session cookies will only be sent back
|
||||
| to the server if the browser has a HTTPS connection. This will keep
|
||||
| the cookie from being sent to you if it can not be done securely.
|
||||
|
|
||||
*/
|
||||
|
||||
'secure' => true,
|
||||
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Allow multiple logins from different devices at the same time
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| By default, if a user logs into an account where someone is already
|
||||
| logged in, the previous user will be logged out. We recommend leaving
|
||||
| this set to false for security reasons.
|
||||
|
|
||||
*/
|
||||
|
||||
'multi_login' => true,
|
||||
|
||||
);
|
||||
@@ -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',
|
||||
|
||||
@@ -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,
|
||||
|
||||
|
||||
);
|
||||
@@ -28,7 +28,7 @@ return array(
|
||||
|
|
||||
*/
|
||||
|
||||
'host' => 'smtp.mailgun.org',
|
||||
'host' => 'smtp.mandrillapp.com',
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
|
||||
Executable
+45
@@ -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',
|
||||
|
||||
);
|
||||
Executable
+20
@@ -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',
|
||||
|
||||
);
|
||||
Executable
+103
@@ -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,
|
||||
),
|
||||
|
||||
),
|
||||
|
||||
);
|
||||
@@ -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,
|
||||
|
||||
|
||||
);
|
||||
Executable
+124
@@ -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,
|
||||
|
||||
);
|
||||
@@ -0,0 +1,5 @@
|
||||
<?php
|
||||
return array (
|
||||
'app_version' => 'v2.1.1',
|
||||
'hash_version' => 'v2.1.1-55-g701c16f',
|
||||
);
|
||||
@@ -14,6 +14,8 @@ class AdminController extends AuthorizedController
|
||||
// Apply the admin auth filter
|
||||
//$this->beforeFilter('admin-auth', array('except' => $this->whitelist));
|
||||
|
||||
// CSRF Protection
|
||||
$this->beforeFilter('csrf', array('on' => 'post'));
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -18,6 +18,122 @@ 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 = Setting::getSettings()->ldap_server;
|
||||
$ldaprdn = Setting::getSettings()->ldap_uname;
|
||||
$ldappass = Crypt::decrypt(Setting::getSettings()->ldap_pword);
|
||||
$baseDn = Setting::getSettings()->ldap_basedn;
|
||||
$filterQuery = Setting::getSettings()->ldap_auth_filter_query . $username;
|
||||
$ldapversion = Setting::getSettings()->ldap_version;
|
||||
$ldap_server_cert_ignore = Setting::getSettings()->ldap_server_cert_ignore;
|
||||
|
||||
// If we are ignoring the SSL cert we need to setup the environment variable
|
||||
// before we create the connection
|
||||
if($ldap_server_cert_ignore) {
|
||||
putenv('LDAPTLS_REQCERT=never');
|
||||
}
|
||||
|
||||
// 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 = Setting::getSettings()->ldap_username_field;
|
||||
$ldap_result_emp_num = Setting::getSettings()->ldap_emp_num;
|
||||
$ldap_result_last_name = Setting::getSettings()->ldap_lname_field;
|
||||
$ldap_result_first_name = Setting::getSettings()->ldap_fname_field;
|
||||
$ldap_result_email = Setting::getSettings()->ldap_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"])) {
|
||||
//$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' => Input::get("password"), //$pass,
|
||||
'activated' => 1,
|
||||
'location_id' => null,
|
||||
'permissions' => ["user" => 1], //'{"user":1}',
|
||||
'notes' => 'Imported from LDAP'
|
||||
);
|
||||
Sentry::createUser($newuser);
|
||||
/*DB::table('users')->insert($newuser);
|
||||
$updateuser = Sentry::findUserByLogin($item["username"]);
|
||||
$updateuser->setHasher(new Cartalyst\Sentry\Hashing\BcryptHasher);
|
||||
|
||||
// Update the user details
|
||||
$updateuser->password = Input::get('password');
|
||||
|
||||
// Update the user
|
||||
$updateuser->save(); */
|
||||
} else {
|
||||
throw new Cartalyst\Sentry\Users\UserNotFoundException();
|
||||
}
|
||||
|
||||
//$item["note"] = "<strong>created</strong>";
|
||||
$credentials = array(
|
||||
'username' => $item["username"],
|
||||
'password' => Input::get("password")//$pass,
|
||||
);
|
||||
return $credentials;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Account sign in form processing.
|
||||
*
|
||||
@@ -27,7 +143,7 @@ class AuthController extends BaseController
|
||||
{
|
||||
// Declare the rules for the form validation
|
||||
$rules = array(
|
||||
'email' => 'required|email',
|
||||
'username' => 'required',
|
||||
'password' => 'required',
|
||||
);
|
||||
|
||||
@@ -39,10 +155,55 @@ class AuthController extends BaseController
|
||||
// Ooops.. something went wrong
|
||||
return Redirect::back()->withInput()->withErrors($validator);
|
||||
}
|
||||
|
||||
try {
|
||||
|
||||
// Should we even check for LDAP users?
|
||||
if (Setting::getSettings()->ldap_enabled=='1') {
|
||||
|
||||
LOG::debug("LDAP is enabled.");
|
||||
// Check if the user exists in the database
|
||||
$user = User::where('username','=',Input::get('username'))->whereNull('deleted_at')->first();
|
||||
LOG::debug("Sentry lookup complete");
|
||||
|
||||
|
||||
// The user does not exist in the database. Try to get them from LDAP.
|
||||
// If user does not exist and authenticates sucessfully with LDAP we
|
||||
// will create it on the fly and sign in with default permissions
|
||||
if(!$user){
|
||||
LOG::debug("Local user ".Input::get('username')." does not exist");
|
||||
if($userattr = $this->ldap(Input::get('username'), Input::get('password'),true) ){
|
||||
LOG::debug("Creating local user from authenticated LDAP user.");
|
||||
$credentials = $this->createUserFromLdap($userattr);
|
||||
} else {
|
||||
LOG::debug("User did not authenticate correctly against LDAP. No local user was created.");
|
||||
}
|
||||
|
||||
// If the user exists and they were imported from LDAP already
|
||||
} else {
|
||||
|
||||
LOG::debug("Local user ".Input::get('username')." exists in database. Authenticating existing user against LDAP.");
|
||||
|
||||
if ($this->ldap(Input::get('username'), Input::get('password')) ) {
|
||||
LOG::debug("Valid LDAP login. Updating the local data.");
|
||||
$sentryuser=Sentry::findUserById($user->id); //need the Sentry object, not the Eloquent object, to access critical password hashing functions
|
||||
$sentryuser->password = Input::get('password');
|
||||
$sentryuser->save();
|
||||
|
||||
} else {
|
||||
LOG::debug("User did not authenticate correctly against LDAP. Local user was not updated.");
|
||||
}// End LDAP auth
|
||||
|
||||
} // End if(!user)
|
||||
|
||||
// NO LDAP enabled - just try to login the user normally
|
||||
}
|
||||
|
||||
LOG::debug("Authenticating user against database.");
|
||||
// Try to log the user in
|
||||
Sentry::authenticate(Input::only('email', 'password'), Input::get('remember-me', 0));
|
||||
if (!Sentry::authenticate(Input::only('username', 'password'), Input::get('remember-me', 0))) {
|
||||
LOG::debug("Local authentication failed.");
|
||||
throw new Cartalyst\Sentry\Users\UserNotFoundException();
|
||||
}
|
||||
|
||||
// Get the page we were before
|
||||
$redirect = Session::get('loginRedirect', 'account');
|
||||
@@ -52,92 +213,32 @@ class AuthController extends BaseController
|
||||
|
||||
// Redirect to the users page
|
||||
return Redirect::to($redirect)->with('success', Lang::get('auth/message.signin.success'));
|
||||
|
||||
} catch (Cartalyst\Sentry\Users\UserNotFoundException $e) {
|
||||
$this->messageBag->add('email', Lang::get('auth/message.account_not_found'));
|
||||
LOG::debug("Local authentication: User ".Input::get('username')." not found");
|
||||
$this->messageBag->add('username', Lang::get('auth/message.account_not_found'));
|
||||
|
||||
} catch (Cartalyst\Sentry\Users\WrongPasswordException $e) {
|
||||
LOG::debug("Local authentication: Password for ".Input::get('username')." is incorrect.");
|
||||
$this->messageBag->add('username', Lang::get('auth/message.account_not_found'));
|
||||
|
||||
} catch (Cartalyst\Sentry\Users\UserNotActivatedException $e) {
|
||||
$this->messageBag->add('email', Lang::get('auth/message.account_not_activated'));
|
||||
LOG::debug("Local authentication: User not activated");
|
||||
$this->messageBag->add('username', Lang::get('auth/message.account_not_activated'));
|
||||
|
||||
} catch (Cartalyst\Sentry\Throttling\UserSuspendedException $e) {
|
||||
$this->messageBag->add('email', Lang::get('auth/message.account_suspended'));
|
||||
LOG::debug("Local authentication: Account suspended");
|
||||
$this->messageBag->add('username', Lang::get('auth/message.account_suspended'));
|
||||
|
||||
} catch (Cartalyst\Sentry\Throttling\UserBannedException $e) {
|
||||
$this->messageBag->add('email', Lang::get('auth/message.account_banned'));
|
||||
LOG::debug("Local authentication: Account banned.");
|
||||
$this->messageBag->add('username', Lang::get('auth/message.account_banned'));
|
||||
}
|
||||
|
||||
// Ooops.. something went wrong
|
||||
return Redirect::back()->withInput()->withErrors($this->messageBag);
|
||||
}
|
||||
|
||||
/**
|
||||
* Account sign up.
|
||||
*
|
||||
* @return View
|
||||
*/
|
||||
public function getSignup()
|
||||
{
|
||||
// Is the user logged in?
|
||||
if (Sentry::check()) {
|
||||
return Redirect::route('account');
|
||||
}
|
||||
|
||||
// Show the page
|
||||
return View::make('frontend.auth.signup');
|
||||
}
|
||||
|
||||
/**
|
||||
* Account sign up form processing.
|
||||
*
|
||||
* @return Redirect
|
||||
*/
|
||||
public function postSignup()
|
||||
{
|
||||
// Declare the rules for the form validation
|
||||
$rules = array(
|
||||
'first_name' => 'required|min:2',
|
||||
'last_name' => 'required|min:2',
|
||||
'email' => 'required|email|unique:users',
|
||||
'email_confirm' => 'required|email|same:email',
|
||||
'password' => 'required|between:10,32',
|
||||
'password_confirm' => 'required|same:password',
|
||||
);
|
||||
|
||||
// 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);
|
||||
}
|
||||
|
||||
try {
|
||||
// Register the user
|
||||
$user = Sentry::register(array(
|
||||
'first_name' => Input::get('first_name'),
|
||||
'last_name' => Input::get('last_name'),
|
||||
'email' => Input::get('email'),
|
||||
'password' => Input::get('password'),
|
||||
));
|
||||
|
||||
// Data to be used on the email view
|
||||
$data = array(
|
||||
'user' => $user,
|
||||
'activationUrl' => URL::route('activate', $user->getActivationCode()),
|
||||
);
|
||||
|
||||
// Send the activation code through email
|
||||
Mail::send('emails.register-activate', $data, function ($m) use ($user) {
|
||||
$m->to($user->email, $user->first_name . ' ' . $user->last_name);
|
||||
$m->subject('Welcome ' . $user->first_name);
|
||||
});
|
||||
|
||||
// Redirect to the register page
|
||||
return Redirect::back()->with('success', Lang::get('auth/message.signup.success'));
|
||||
} catch (Cartalyst\Sentry\Users\UserExistsException $e) {
|
||||
$this->messageBag->add('email', Lang::get('auth/message.account_already_exists'));
|
||||
}
|
||||
|
||||
// Ooops.. something went wrong
|
||||
return Redirect::back()->withInput()->withErrors($this->messageBag);
|
||||
}
|
||||
|
||||
/**
|
||||
* User account activation page.
|
||||
@@ -192,7 +293,7 @@ class AuthController extends BaseController
|
||||
{
|
||||
// Declare the rules for the validator
|
||||
$rules = array(
|
||||
'email' => 'required|email',
|
||||
'username' => 'required',
|
||||
);
|
||||
|
||||
// Create a new validator instance from our dynamic rules
|
||||
@@ -206,22 +307,34 @@ class AuthController extends BaseController
|
||||
|
||||
try {
|
||||
// Get the user password recovery code
|
||||
$user = Sentry::getUserProvider()->findByLogin(Input::get('email'));
|
||||
if (!$user = Sentry::getUserProvider()->findByLogin(Input::get('username'))) {
|
||||
$user = User::where('email','=',Input::get('username'));
|
||||
}
|
||||
|
||||
// Data to be used on the email view
|
||||
$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 email
|
||||
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');
|
||||
});
|
||||
$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 email was not found, we will pretend
|
||||
// we have sent the password reset code through email,
|
||||
return Redirect::route('forgot-password')->withInput()->with('error', $e->getMessage());
|
||||
// Even though the username was not found, we will pretend
|
||||
// we have sent the password reset code through username,
|
||||
// this is a security measure against hackers.
|
||||
}
|
||||
|
||||
@@ -237,12 +350,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
|
||||
|
||||
@@ -6,6 +6,8 @@ use Redirect;
|
||||
use Sentry;
|
||||
use Validator;
|
||||
use View;
|
||||
use Config;
|
||||
use Lang;
|
||||
|
||||
class ChangeEmailController extends AuthorizedController
|
||||
{
|
||||
@@ -30,40 +32,47 @@ class ChangeEmailController extends AuthorizedController
|
||||
*/
|
||||
public function postIndex()
|
||||
{
|
||||
// Declare the rules for the form validation
|
||||
$rules = array(
|
||||
'current_password' => 'required|between:3,32',
|
||||
'email' => 'required|email|unique:users,email,'.Sentry::getUser()->email.',email',
|
||||
'email_confirm' => 'required|same:email',
|
||||
);
|
||||
|
||||
|
||||
if (Config::get('app.lock_passwords')) {
|
||||
return Redirect::route('change-password')->with('error', Lang::get('admin/users/table.lock_passwords'));
|
||||
} else {
|
||||
|
||||
// Declare the rules for the form validation
|
||||
$rules = array(
|
||||
'current_password' => 'required|between:3,32',
|
||||
'email' => 'required|email|unique:users,email,'.Sentry::getUser()->email.',email',
|
||||
'email_confirm' => 'required|same:email',
|
||||
);
|
||||
|
||||
// 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);
|
||||
}
|
||||
|
||||
// Grab the user
|
||||
$user = Sentry::getUser();
|
||||
|
||||
// Check the user current password
|
||||
if ( ! $user->checkPassword(Input::get('current_password'))) {
|
||||
// Set the error message
|
||||
$this->messageBag->add('current_password', 'Your current password is incorrect');
|
||||
|
||||
// Redirect to the change email page
|
||||
return Redirect::route('change-email')->withErrors($this->messageBag);
|
||||
}
|
||||
|
||||
// Update the user email
|
||||
$user->email = Input::get('email');
|
||||
$user->save();
|
||||
|
||||
// Redirect to the settings page
|
||||
return Redirect::route('change-email')->with('success', 'Email successfully updated');
|
||||
// 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);
|
||||
}
|
||||
|
||||
// Grab the user
|
||||
$user = Sentry::getUser();
|
||||
|
||||
// Check the user current password
|
||||
if ( ! $user->checkPassword(Input::get('current_password'))) {
|
||||
// Set the error message
|
||||
$this->messageBag->add('current_password', 'Your current password is incorrect');
|
||||
|
||||
// Redirect to the change email page
|
||||
return Redirect::route('change-email')->withErrors($this->messageBag);
|
||||
}
|
||||
|
||||
// Update the user email
|
||||
$user->email = Input::get('email');
|
||||
$user->save();
|
||||
|
||||
// Redirect to the settings page
|
||||
return Redirect::route('change-email')->with('success', 'Email successfully updated');
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -6,6 +6,8 @@ use Redirect;
|
||||
use Sentry;
|
||||
use Validator;
|
||||
use View;
|
||||
use Config;
|
||||
use Lang;
|
||||
|
||||
class ChangePasswordController extends AuthorizedController
|
||||
{
|
||||
@@ -30,13 +32,19 @@ class ChangePasswordController extends AuthorizedController
|
||||
*/
|
||||
protected function postIndex()
|
||||
{
|
||||
// Declare the rules for the form validation
|
||||
|
||||
|
||||
if (Config::get('app.lock_passwords')) {
|
||||
return Redirect::route('change-password')->with('error', Lang::get('admin/users/table.lock_passwords'));
|
||||
} else {
|
||||
|
||||
// Declare the rules for the form validation
|
||||
$rules = array(
|
||||
'old_password' => 'required|min:6',
|
||||
'password' => 'required|min:6',
|
||||
'password_confirm' => 'required|same:password',
|
||||
);
|
||||
|
||||
|
||||
// Create a new validator instance from our validation rules
|
||||
$validator = Validator::make(Input::all(), $rules);
|
||||
|
||||
@@ -61,6 +69,7 @@ class ChangePasswordController extends AuthorizedController
|
||||
// Update the user password
|
||||
$user->password = Input::get('password');
|
||||
$user->save();
|
||||
}
|
||||
|
||||
// Redirect to the change-password page
|
||||
return Redirect::route('change-password')->with('success', 'Password successfully updated');
|
||||
|
||||
@@ -20,12 +20,7 @@ class ProfileController extends AuthorizedController
|
||||
{
|
||||
// Get the user information
|
||||
$user = Sentry::getUser();
|
||||
|
||||
// Show the page
|
||||
|
||||
$location_list = array('' => 'Select One') + Location::lists('name', 'id');
|
||||
|
||||
// Show the page
|
||||
$location_list = locationsList();
|
||||
return View::make('frontend/account/profile', compact('user'))->with('location_list',$location_list);
|
||||
}
|
||||
|
||||
@@ -63,7 +58,7 @@ class ProfileController extends AuthorizedController
|
||||
$user->website = Input::get('website');
|
||||
$user->location_id = Input::get('location_id');
|
||||
$user->gravatar = Input::get('gravatar');
|
||||
|
||||
|
||||
if (Input::file('avatar')) {
|
||||
$image = Input::file('avatar');
|
||||
$file_name = $user->first_name."-".$user->last_name.".".$image->getClientOriginalExtension();
|
||||
@@ -75,7 +70,7 @@ class ProfileController extends AuthorizedController
|
||||
if (Input::get('avatar_delete') == 1 && Input::file('avatar') == "") {
|
||||
$user->avatar = NULL;
|
||||
}
|
||||
|
||||
|
||||
$user->save();
|
||||
|
||||
// Redirect to the settings page
|
||||
|
||||
@@ -8,6 +8,17 @@ use Validator;
|
||||
use Location;
|
||||
use View;
|
||||
use Asset;
|
||||
use Actionlog;
|
||||
use Company;
|
||||
use Lang;
|
||||
use Accessory;
|
||||
use DB;
|
||||
use Slack;
|
||||
use Setting;
|
||||
use Config;
|
||||
use Mail;
|
||||
use User;
|
||||
|
||||
|
||||
class ViewAssetsController extends AuthorizedController
|
||||
{
|
||||
@@ -18,18 +29,22 @@ class ViewAssetsController extends AuthorizedController
|
||||
*/
|
||||
public function getIndex()
|
||||
{
|
||||
$user = Sentry::getUser();
|
||||
|
||||
$user = User::with('assets', 'assets.model', 'consumables', 'accessories', 'licenses', 'userloc')->withTrashed()->find(Sentry::getUser()->id);
|
||||
|
||||
$userlog = $user->userlog->load('assetlog', 'consumablelog', 'assetlog.model', 'licenselog', 'accessorylog', 'userlog', 'adminlog');
|
||||
|
||||
|
||||
if (isset($user->id)) {
|
||||
return View::make('frontend/account/view-assets', compact('user'));
|
||||
} else {
|
||||
// Prepare the error message
|
||||
$error = Lang::get('admin/users/message.user_not_found', compact('id' ));
|
||||
|
||||
// Redirect to the user management page
|
||||
return Redirect::route('users')->with('error', $error);
|
||||
}
|
||||
if (isset($user->id)) {
|
||||
return View::make('frontend/account/view-assets', compact('user', 'userlog'));
|
||||
} else {
|
||||
// Prepare the error message
|
||||
$error = Lang::get('admin/users/message.user_not_found', compact('id' ));
|
||||
|
||||
// Redirect to the user management page
|
||||
return Redirect::route('users')->with('error', $error);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -37,24 +52,213 @@ class ViewAssetsController extends AuthorizedController
|
||||
public function getRequestableIndex() {
|
||||
|
||||
$assets = Asset::with('model','defaultLoc')->Hardware()->RequestableAssets()->get();
|
||||
|
||||
return View::make('frontend/account/requestable-assets', compact('user','assets'));
|
||||
}
|
||||
|
||||
|
||||
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('hardware')->with('error', Lang::get('admin/hardware/message.does_not_exist'));
|
||||
} else {
|
||||
return Redirect::route('requestable-assets')->with('error', Lang::get('admin/hardware/message.does_not_exist_or_not_requestable'));
|
||||
}
|
||||
else if (!Company::isCurrentUserHasAccess($asset)) {
|
||||
return Redirect::route('requestable-assets')->with('error', Lang::get('general.insufficient_permissions'));
|
||||
}
|
||||
else {
|
||||
|
||||
$logaction = new Actionlog();
|
||||
$logaction->asset_id = $data['asset_id'] = $asset->id;
|
||||
$logaction->asset_type = $data['asset_type'] = 'hardware';
|
||||
$logaction->created_at = $data['requested_date'] = date("Y-m-d h:i:s");
|
||||
|
||||
if ($user->location_id) {
|
||||
$logaction->location_id = $user->location_id;
|
||||
}
|
||||
$logaction->user_id = $data['user_id'] = Sentry::getUser()->id;
|
||||
$log = $logaction->logaction('requested');
|
||||
|
||||
$data['requested_by'] = $user->fullName();
|
||||
$data['asset_name'] = $asset->showAssetName();
|
||||
|
||||
$settings = Setting::getSettings();
|
||||
|
||||
if (($settings->alert_email!='') && ($settings->alerts_enabled=='1') && (!Config::get('app.lock_passwords'))) {
|
||||
Mail::send('emails.asset-requested', $data, function ($m) use ($user, $settings) {
|
||||
$m->to($settings->alert_email, $settings->site_name);
|
||||
$m->subject('Asset Requested');
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
return View::make('frontend/account/view-asset', compact('asset'));
|
||||
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'));
|
||||
}
|
||||
|
||||
$user = Sentry::getUser();
|
||||
|
||||
if ($user->id != $findlog->checkedout_to) {
|
||||
return Redirect::to('account/view-assets')->with('error', Lang::get('admin/users/message.error.incorrect_user_accepted'));
|
||||
}
|
||||
|
||||
// Asset
|
||||
if (($findlog->asset_id!='') && ($findlog->asset_type=='hardware')) {
|
||||
$item = Asset::find($findlog->asset_id);
|
||||
|
||||
// software
|
||||
} elseif (($findlog->asset_id!='') && ($findlog->asset_type=='software')) {
|
||||
$item = License::find($findlog->asset_id);
|
||||
// accessories
|
||||
} elseif ($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'));
|
||||
}
|
||||
else if (!Company::isCurrentUserHasAccess($item)) {
|
||||
return Redirect::route('requestable-assets')->with('error', Lang::get('general.insufficient_permissions'));
|
||||
}
|
||||
else {
|
||||
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'));
|
||||
}
|
||||
|
||||
// NOTE: make sure the global scope is applied
|
||||
$is_unauthorized = is_null(Actionlog::where('id', '=', $logID)->first());
|
||||
if ($is_unauthorized) {
|
||||
return Redirect::route('requestable-assets')->with('error', Lang::get('general.insufficient_permissions'));
|
||||
}
|
||||
|
||||
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();
|
||||
|
||||
if ($user->id != $findlog->checkedout_to) {
|
||||
return Redirect::to('account/view-assets')->with('error', Lang::get('admin/users/message.error.incorrect_user_accepted'));
|
||||
}
|
||||
|
||||
$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';
|
||||
|
||||
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
|
||||
} elseif ($findlog->accessory_id!='') {
|
||||
$logaction->asset_id = NULL;
|
||||
$logaction->accessory_id = $findlog->accessory_id;
|
||||
$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($logaction_msg);
|
||||
|
||||
$update_checkout = DB::table('asset_logs')
|
||||
->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', $return_msg);
|
||||
|
||||
} else {
|
||||
return Redirect::to('account/view-assets')->with('error', 'Something went wrong ');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+643
@@ -0,0 +1,643 @@
|
||||
<?php namespace Controllers\Admin;
|
||||
|
||||
use AdminController;
|
||||
use Input;
|
||||
use Lang;
|
||||
use Accessory;
|
||||
use Redirect;
|
||||
use Setting;
|
||||
use DB;
|
||||
use Sentry;
|
||||
use Str;
|
||||
use Validator;
|
||||
use View;
|
||||
use User;
|
||||
use Actionlog;
|
||||
use Company;
|
||||
use Mail;
|
||||
use Datatable;
|
||||
use Slack;
|
||||
use Config;
|
||||
|
||||
class AccessoriesController extends AdminController
|
||||
{
|
||||
/**
|
||||
* Show a list of all the accessories.
|
||||
*
|
||||
* @return View
|
||||
*/
|
||||
|
||||
public function getIndex()
|
||||
{
|
||||
return View::make('backend/accessories/index');
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Accessory create.
|
||||
*
|
||||
* @return View
|
||||
*/
|
||||
public function getCreate()
|
||||
{
|
||||
// Show the page
|
||||
$category_list = array('' => '') + DB::table('categories')->where('category_type','=','accessory')->whereNull('deleted_at')->orderBy('name','ASC')->lists('name', 'id');
|
||||
$company_list = companyList();
|
||||
$location_list = locationsList();
|
||||
return View::make('backend/accessories/edit')
|
||||
->with('accessory', new Accessory)
|
||||
->with('category_list', $category_list)
|
||||
->with('company_list', $company_list)
|
||||
->with('location_list', $location_list);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Accessory create form processing.
|
||||
*
|
||||
* @return Redirect
|
||||
*/
|
||||
public function postCreate()
|
||||
{
|
||||
|
||||
// create a new model instance
|
||||
$accessory = new Accessory();
|
||||
|
||||
$validator = Validator::make(Input::all(), $accessory->rules);
|
||||
|
||||
if ($validator->fails())
|
||||
{
|
||||
// The given data did not pass validation
|
||||
return Redirect::back()->withInput()->withErrors($validator->messages());
|
||||
}
|
||||
else{
|
||||
|
||||
// Update the accessory data
|
||||
$accessory->name = e(Input::get('name'));
|
||||
$accessory->category_id = e(Input::get('category_id'));
|
||||
$accessory->location_id = e(Input::get('location_id'));
|
||||
$accessory->company_id = Company::getIdForCurrentUser(Input::get('company_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();
|
||||
|
||||
// Was the accessory created?
|
||||
if($accessory->save()) {
|
||||
// Redirect to the new accessory page
|
||||
return Redirect::to("admin/accessories")->with('success', Lang::get('admin/accessories/message.create.success'));
|
||||
}
|
||||
}
|
||||
|
||||
// Redirect to the accessory create page
|
||||
return Redirect::to('admin/accessories/create')->with('error', Lang::get('admin/accessories/message.create.error'));
|
||||
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Accessory update.
|
||||
*
|
||||
* @param int $accessoryId
|
||||
* @return View
|
||||
*/
|
||||
public function getEdit($accessoryId = null)
|
||||
{
|
||||
// Check if the accessory exists
|
||||
if (is_null($accessory = Accessory::find($accessoryId))) {
|
||||
// Redirect to the blogs management page
|
||||
return Redirect::to('admin/accessories')->with('error', Lang::get('admin/accessories/message.does_not_exist'));
|
||||
}
|
||||
else if (!Company::isCurrentUserHasAccess($accessory)) {
|
||||
return Redirect::to('admin/accessories')->with('error', Lang::get('general.insufficient_permissions'));
|
||||
}
|
||||
|
||||
$category_list = array('' => '') + DB::table('categories')->where('category_type','=','accessory')->whereNull('deleted_at')->orderBy('name','ASC')->lists('name', 'id');
|
||||
$company_list = companyList();
|
||||
$location_list = locationsList();
|
||||
|
||||
return View::make('backend/accessories/edit', compact('accessory'))
|
||||
->with('category_list',$category_list)
|
||||
->with('company_list', $company_list)
|
||||
->with('location_list', $location_list);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Accessory update form processing page.
|
||||
*
|
||||
* @param int $accessoryId
|
||||
* @return Redirect
|
||||
*/
|
||||
public function postEdit($accessoryId = null)
|
||||
{
|
||||
// Check if the blog post exists
|
||||
if (is_null($accessory = Accessory::find($accessoryId))) {
|
||||
// Redirect to the blogs management page
|
||||
return Redirect::to('admin/accessories')->with('error', Lang::get('admin/accessories/message.does_not_exist'));
|
||||
}
|
||||
else if (!Company::isCurrentUserHasAccess($accessory)) {
|
||||
return Redirect::to('admin/accessories')->with('error', Lang::get('general.insufficient_permissions'));
|
||||
}
|
||||
|
||||
|
||||
// get the POST data
|
||||
$new = Input::all();
|
||||
|
||||
// attempt validation
|
||||
$validator = Validator::make(Input::all(), $accessory->validationRules($accessoryId));
|
||||
|
||||
|
||||
if ($validator->fails())
|
||||
{
|
||||
// The given data did not pass validation
|
||||
return Redirect::back()->withInput()->withErrors($validator->messages());
|
||||
}
|
||||
// attempt validation
|
||||
else {
|
||||
|
||||
// Update the accessory data
|
||||
$accessory->name = e(Input::get('name'));
|
||||
|
||||
if (e(Input::get('location_id')) == '') {
|
||||
$accessory->location_id = NULL;
|
||||
} else {
|
||||
$accessory->location_id = e(Input::get('location_id'));
|
||||
}
|
||||
|
||||
$accessory->category_id = e(Input::get('category_id'));
|
||||
$accessory->company_id = Company::getIdForCurrentUser(Input::get('company_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?
|
||||
if($accessory->save()) {
|
||||
// Redirect to the new accessory page
|
||||
return Redirect::to("admin/accessories")->with('success', Lang::get('admin/accessories/message.update.success'));
|
||||
}
|
||||
}
|
||||
|
||||
// Redirect to the accessory management page
|
||||
return Redirect::to("admin/accessories/$accessoryID/edit")->with('error', Lang::get('admin/accessories/message.update.error'));
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete the given accessory.
|
||||
*
|
||||
* @param int $accessoryId
|
||||
* @return Redirect
|
||||
*/
|
||||
public function getDelete($accessoryId)
|
||||
{
|
||||
// Check if the blog post exists
|
||||
if (is_null($accessory = Accessory::find($accessoryId))) {
|
||||
// Redirect to the blogs management page
|
||||
return Redirect::to('admin/accessories')->with('error', Lang::get('admin/accessories/message.not_found'));
|
||||
}
|
||||
else if (!Company::isCurrentUserHasAccess($accessory)) {
|
||||
return Redirect::to('admin/accessories')->with('error', Lang::get('general.insufficient_permissions'));
|
||||
}
|
||||
|
||||
|
||||
if ($accessory->hasUsers() > 0) {
|
||||
return Redirect::to('admin/accessories')->with('error', Lang::get('admin/accessories/message.assoc_users', array('count'=> $accessory->hasUsers())));
|
||||
} else {
|
||||
$accessory->delete();
|
||||
|
||||
// Redirect to the locations management page
|
||||
return Redirect::to('admin/accessories')->with('success', Lang::get('admin/accessories/message.delete.success'));
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Get the accessory information to present to the accessory view page
|
||||
*
|
||||
* @param int $accessoryId
|
||||
* @return View
|
||||
**/
|
||||
public function getView($accessoryID = null)
|
||||
{
|
||||
$accessory = Accessory::find($accessoryID);
|
||||
|
||||
if (isset($accessory->id)) {
|
||||
|
||||
if (!Company::isCurrentUserHasAccess($accessory)) {
|
||||
return Redirect::to('admin/accessories')->with('error', Lang::get('general.insufficient_permissions'));
|
||||
}
|
||||
else {
|
||||
return View::make('backend/accessories/view', compact('accessory'));
|
||||
}
|
||||
} else {
|
||||
// Prepare the error message
|
||||
$error = Lang::get('admin/accessories/message.does_not_exist', compact('id'));
|
||||
|
||||
// Redirect to the user management page
|
||||
return Redirect::route('accessories')->with('error', $error);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Check out the accessory to a person
|
||||
**/
|
||||
public function getCheckout($accessoryId)
|
||||
{
|
||||
// Check if the accessory exists
|
||||
if (is_null($accessory = Accessory::find($accessoryId))) {
|
||||
// Redirect to the accessory management page with error
|
||||
return Redirect::to('accessories')->with('error', Lang::get('admin/accessories/message.not_found'));
|
||||
}
|
||||
else if (!Company::isCurrentUserHasAccess($accessory)) {
|
||||
return Redirect::to('admin/accessories')->with('error', Lang::get('general.insufficient_permissions'));
|
||||
}
|
||||
|
||||
// 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," (",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);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Check out the accessory to a person
|
||||
**/
|
||||
public function postCheckout($accessoryId)
|
||||
{
|
||||
// Check if the accessory exists
|
||||
if (is_null($accessory = Accessory::find($accessoryId))) {
|
||||
// Redirect to the accessory management page with error
|
||||
return Redirect::to('accessories')->with('error', Lang::get('admin/accessories/message.not_found'));
|
||||
}
|
||||
else if (!Company::isCurrentUserHasAccess($accessory)) {
|
||||
return Redirect::to('admin/accessories')->with('error', Lang::get('general.insufficient_permissions'));
|
||||
}
|
||||
|
||||
$admin_user = Sentry::getUser();
|
||||
$assigned_to = e(Input::get('assigned_to'));
|
||||
|
||||
|
||||
// Declare the rules for the form validation
|
||||
$rules = array(
|
||||
'assigned_to' => 'required|min:1'
|
||||
);
|
||||
|
||||
// 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 accessory management page with error
|
||||
return Redirect::to('admin/accessories')->with('error', Lang::get('admin/accessories/message.user_does_not_exist'));
|
||||
}
|
||||
|
||||
// Update the accessory data
|
||||
$accessory->assigned_to = e(Input::get('assigned_to'));
|
||||
|
||||
$accessory->users()->attach($accessory->id, array(
|
||||
'accessory_id' => $accessory->id,
|
||||
'assigned_to' => e(Input::get('assigned_to'))));
|
||||
|
||||
$logaction = new Actionlog();
|
||||
$logaction->accessory_id = $accessory->id;
|
||||
$logaction->checkedout_to = $accessory->assigned_to;
|
||||
$logaction->asset_type = 'accessory';
|
||||
$logaction->location_id = $user->location_id;
|
||||
$logaction->user_id = Sentry::getUser()->id;
|
||||
$logaction->note = e(Input::get('note'));
|
||||
|
||||
$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' => 'Checked Out:',
|
||||
'value' => strtoupper($logaction->asset_type).' <'.Config::get('app.url').'/admin/accessories/'.$accessory->id.'/view'.'|'.$accessory->name.'> checked out to <'.Config::get('app.url').'/admin/users/'.$user->id.'/view|'.$user->fullName().'> by <'.Config::get('app.url').'/admin/users/'.$admin_user->id.'/view'.'|'.$admin_user->fullName().'>.'
|
||||
],
|
||||
[
|
||||
'title' => 'Note:',
|
||||
'value' => e($logaction->note)
|
||||
],
|
||||
|
||||
|
||||
|
||||
]
|
||||
])->send('Accessory Checked Out');
|
||||
|
||||
} catch (Exception $e) {
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
$log = $logaction->logaction('checkout');
|
||||
|
||||
$accessory_user = DB::table('accessories_users')->where('assigned_to','=',$accessory->assigned_to)->where('accessory_id','=',$accessory->id)->first();
|
||||
|
||||
$data['log_id'] = $logaction->id;
|
||||
$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();
|
||||
|
||||
|
||||
if (($accessory->requireAcceptance()=='1') || ($accessory->getEula())) {
|
||||
|
||||
Mail::send('emails.accept-asset', $data, function ($m) use ($user) {
|
||||
$m->to($user->email, $user->first_name . ' ' . $user->last_name);
|
||||
$m->subject('Confirm accessory delivery');
|
||||
});
|
||||
}
|
||||
|
||||
// Redirect to the new accessory page
|
||||
return Redirect::to("admin/accessories")->with('success', Lang::get('admin/accessories/message.checkout.success'));
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Check the accessory back into inventory
|
||||
*
|
||||
* @param int $accessoryId
|
||||
* @return View
|
||||
**/
|
||||
public function getCheckin($accessoryUserId = null, $backto = null)
|
||||
{
|
||||
// Check if the accessory exists
|
||||
if (is_null($accessory_user = DB::table('accessories_users')->find($accessoryUserId))) {
|
||||
// Redirect to the accessory management page with error
|
||||
return Redirect::to('admin/accessories')->with('error', Lang::get('admin/accessories/message.not_found'));
|
||||
}
|
||||
|
||||
$accessory = Accessory::find($accessory_user->accessory_id);
|
||||
|
||||
if (!Company::isCurrentUserHasAccess($accessory)) {
|
||||
return Redirect::to('admin/accessories')->with('error', Lang::get('general.insufficient_permissions'));
|
||||
}
|
||||
else {
|
||||
return View::make('backend/accessories/checkin', compact('accessory'))->with('backto',$backto);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Check in the item so that it can be checked out again to someone else
|
||||
*
|
||||
* @param int $accessoryId
|
||||
* @return View
|
||||
**/
|
||||
public function postCheckin($accessoryUserId = null, $backto = null)
|
||||
{
|
||||
// Check if the accessory exists
|
||||
if (is_null($accessory_user = DB::table('accessories_users')->find($accessoryUserId))) {
|
||||
// Redirect to the accessory management page with error
|
||||
return Redirect::to('admin/accessories')->with('error', Lang::get('admin/accessories/message.not_found'));
|
||||
}
|
||||
|
||||
|
||||
$accessory = Accessory::find($accessory_user->accessory_id);
|
||||
|
||||
if (!Company::isCurrentUserHasAccess($accessory)) {
|
||||
return Redirect::to('admin/accessories')->with('error', Lang::get('general.insufficient_permissions'));
|
||||
}
|
||||
|
||||
$logaction = new Actionlog();
|
||||
$logaction->checkedout_to = $accessory_user->assigned_to;
|
||||
$return_to = $accessory_user->assigned_to;
|
||||
$admin_user = Sentry::getUser();
|
||||
|
||||
|
||||
// Was the accessory updated?
|
||||
if(DB::table('accessories_users')->where('id', '=', $accessory_user->id)->delete()) {
|
||||
|
||||
$logaction->accessory_id = $accessory->id;
|
||||
$logaction->location_id = NULL;
|
||||
$logaction->asset_type = 'accessory';
|
||||
$logaction->user_id = $admin_user->id;
|
||||
$logaction->note = e(Input::get('note'));
|
||||
|
||||
$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' => 'Checked In:',
|
||||
'value' => strtoupper($logaction->asset_type).' <'.Config::get('app.url').'/admin/accessories/'.$accessory->id.'/view'.'|'.$accessory->name.'> checked in by <'.Config::get('app.url').'/admin/users/'.$admin_user->id.'/view'.'|'.$admin_user->fullName().'>.'
|
||||
],
|
||||
[
|
||||
'title' => 'Note:',
|
||||
'value' => e($logaction->note)
|
||||
],
|
||||
|
||||
]
|
||||
])->send('Accessory Checked In');
|
||||
|
||||
} catch (Exception $e) {
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
$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 {
|
||||
return Redirect::to("admin/accessories/".$accessory->id."/view")->with('success', Lang::get('admin/accessories/message.checkin.success'));
|
||||
}
|
||||
}
|
||||
|
||||
// Redirect to the accessory management page with error
|
||||
return Redirect::to("admin/accessories")->with('error', Lang::get('admin/accessories/message.checkin.error'));
|
||||
}
|
||||
|
||||
public function getDatatable()
|
||||
{
|
||||
$accessories = Accessory::select('accessories.*')->with('category', 'company')
|
||||
->whereNull('accessories.deleted_at');
|
||||
|
||||
if (Input::has('search')) {
|
||||
$accessories = $accessories->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 = ['name','order_number','purchase_date','purchase_cost','companyName','category'];
|
||||
$order = Input::get('order') === 'asc' ? 'asc' : 'desc';
|
||||
$sort = in_array(Input::get('sort'), $allowed_columns) ? Input::get('sort') : 'created_at';
|
||||
|
||||
switch ($sort)
|
||||
{
|
||||
case 'category':
|
||||
$accessories = $accessories->OrderCategory($order);
|
||||
break;
|
||||
case 'companyName':
|
||||
$accessories = $accessories->OrderCompany($order);
|
||||
break;
|
||||
default:
|
||||
$accessories = $accessories->orderBy($sort, $order);
|
||||
break;
|
||||
}
|
||||
|
||||
$accessCount = $accessories->count();
|
||||
$accessories = $accessories->skip($offset)->take($limit)->get();
|
||||
|
||||
$rows = array();
|
||||
|
||||
foreach ($accessories as $accessory) {
|
||||
$actions = '<nobr><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></nobr>';
|
||||
$company = $accessory->company;
|
||||
|
||||
$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,
|
||||
'location' => ($accessory->location) ? $accessory->location->name: '',
|
||||
'purchase_date' => $accessory->purchase_date,
|
||||
'purchase_cost' => $accessory->purchase_cost,
|
||||
'numRemaining' => $accessory->numRemaining(),
|
||||
'actions' => $actions,
|
||||
'companyName' => is_null($company) ? '' : e($company->name)
|
||||
);
|
||||
}
|
||||
|
||||
$data = array('total'=>$accessCount, 'rows'=>$rows);
|
||||
|
||||
return $data;
|
||||
}
|
||||
|
||||
public function getDataView($accessoryID)
|
||||
{
|
||||
$accessory = Accessory::find($accessoryID);
|
||||
|
||||
if (!Company::isCurrentUserHasAccess($accessory)) {
|
||||
return ['total' => 0, 'rows' => []];
|
||||
}
|
||||
|
||||
$accessory_users = $accessory->users;
|
||||
$count = $accessory_users->count();
|
||||
|
||||
$rows = array();
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,504 @@
|
||||
<?php
|
||||
|
||||
namespace Controllers\Admin;
|
||||
|
||||
use AdminController;
|
||||
use AssetMaintenance;
|
||||
use Carbon\Carbon;
|
||||
use Company;
|
||||
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;
|
||||
use Asset;
|
||||
|
||||
class AssetMaintenancesController extends AdminController
|
||||
{
|
||||
private static function getInsufficientPermissionsRedirect()
|
||||
{
|
||||
return Redirect::to( 'admin/asset_maintenances')
|
||||
->with('error', Lang::get( 'general.insufficient_permissions' ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* 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','asset.company')
|
||||
->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/asset_maintenance', $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;
|
||||
}
|
||||
|
||||
$company = $maintenance->asset->company;
|
||||
|
||||
$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,
|
||||
'asset_maintenance_time' => $maintenance->asset_maintenance_time,
|
||||
'completion_date' => $maintenance->completion_date,
|
||||
'actions' => $actions,
|
||||
'companyName' => is_null($company) ? '' : $company->name
|
||||
);
|
||||
}
|
||||
|
||||
$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 = Company::scopeCompanyables( DB::table( 'assets' ), 'assets.company_id' )
|
||||
->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' ) );
|
||||
}
|
||||
|
||||
$asset = Asset::find( e( Input::get( 'asset_id' ) ) );
|
||||
|
||||
if (!Company::isCurrentUserHasAccess($asset)) {
|
||||
return static::getInsufficientPermissionsRedirect();
|
||||
}
|
||||
|
||||
// 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->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 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' ) );
|
||||
}
|
||||
else if (!Company::isCurrentUserHasAccess( $assetMaintenance->asset )) {
|
||||
return static::getInsufficientPermissionsRedirect();
|
||||
}
|
||||
|
||||
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 = Company::scopeCompanyables( DB::table( 'assets' ), 'assets.company_id' )
|
||||
->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' ) );
|
||||
}
|
||||
else if (!Company::isCurrentUserHasAccess( $assetMaintenance->asset )) {
|
||||
return static::getInsufficientPermissionsRedirect();
|
||||
}
|
||||
|
||||
// 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' ) );
|
||||
}
|
||||
|
||||
$asset = Asset::find( e( Input::get( 'asset_id' ) ) );
|
||||
|
||||
if (!Company::isCurrentUserHasAccess($asset)) {
|
||||
return static::getInsufficientPermissionsRedirect();
|
||||
}
|
||||
|
||||
// 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' ) );
|
||||
}
|
||||
else if (!Company::isCurrentUserHasAccess( $assetMaintenance->asset )) {
|
||||
return static::getInsufficientPermissionsRedirect();
|
||||
}
|
||||
|
||||
// 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' ) );
|
||||
}
|
||||
else if (!Company::isCurrentUserHasAccess( $assetMaintenance->asset )) {
|
||||
return static::getInsufficientPermissionsRedirect();
|
||||
}
|
||||
|
||||
return View::make( 'backend/asset_maintenances/view')->with('assetMaintenance', $assetMaintenance);
|
||||
}
|
||||
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -4,6 +4,7 @@ use AdminController;
|
||||
use Input;
|
||||
use Lang;
|
||||
use Category;
|
||||
use Company;
|
||||
use Redirect;
|
||||
use Setting;
|
||||
use DB;
|
||||
@@ -22,11 +23,8 @@ class CategoriesController extends AdminController
|
||||
|
||||
public function getIndex()
|
||||
{
|
||||
// Grab all the categories
|
||||
$categories = Category::orderBy('created_at', 'DESC')->get();
|
||||
|
||||
// Show the page
|
||||
return View::make('backend/categories/index', compact('categories'));
|
||||
return View::make('backend/categories/index');
|
||||
}
|
||||
|
||||
|
||||
@@ -38,7 +36,9 @@ class CategoriesController extends AdminController
|
||||
public function getCreate()
|
||||
{
|
||||
// Show the page
|
||||
return View::make('backend/categories/edit')->with('category',new Category);
|
||||
$category_types= categoryTypeList();
|
||||
return View::make('backend/categories/edit')->with('category',new Category)
|
||||
->with('category_types',$category_types);
|
||||
}
|
||||
|
||||
|
||||
@@ -63,8 +63,13 @@ class CategoriesController extends AdminController
|
||||
else{
|
||||
|
||||
// Update the category data
|
||||
$category->name = e(Input::get('name'));
|
||||
$category->user_id = Sentry::getId();
|
||||
$category->name = e(Input::get('name'));
|
||||
$category->category_type = e(Input::get('category_type'));
|
||||
$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?
|
||||
if($category->save()) {
|
||||
@@ -97,7 +102,11 @@ class CategoriesController extends AdminController
|
||||
//$category_options = array('' => 'Top Level') + Category::lists('name', 'id');
|
||||
|
||||
$category_options = array('' => 'Top Level') + DB::table('categories')->where('id', '!=', $categoryId)->lists('name', 'id');
|
||||
return View::make('backend/categories/edit', compact('category'))->with('category_options',$category_options);
|
||||
$category_types= array('' => '', 'asset' => 'Asset', 'accessory' => 'Accessory', 'consumable' => 'Consumable');
|
||||
|
||||
return View::make('backend/categories/edit', compact('category'))
|
||||
->with('category_options',$category_options)
|
||||
->with('category_types',$category_types);
|
||||
}
|
||||
|
||||
|
||||
@@ -133,6 +142,11 @@ class CategoriesController extends AdminController
|
||||
|
||||
// Update the category data
|
||||
$category->name = e(Input::get('name'));
|
||||
$category->category_type = e(Input::get('category_type'));
|
||||
$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()) {
|
||||
@@ -154,23 +168,28 @@ class CategoriesController extends AdminController
|
||||
*/
|
||||
public function getDelete($categoryId)
|
||||
{
|
||||
// Check if the blog post exists
|
||||
// Check if the category exists
|
||||
if (is_null($category = Category::find($categoryId))) {
|
||||
// Redirect to the blogs management page
|
||||
return Redirect::to('admin/settings/categories')->with('error', Lang::get('admin/categories/message.not_found'));
|
||||
return Redirect::route('categories')->with('error', Lang::get('admin/categories/message.not_found'));
|
||||
}
|
||||
|
||||
|
||||
if ($category->has_models() > 0) {
|
||||
return Redirect::route('categories')->with('error', Lang::get('admin/categories/message.assoc_models'));
|
||||
|
||||
} elseif ($category->accessories()->count() > 0) {
|
||||
return Redirect::route('categories')->with('error', Lang::get('admin/categories/message.assoc_accessories'));
|
||||
|
||||
} elseif ($category->consumables()->count() > 0) {
|
||||
return Redirect::route('categories')->with('error', Lang::get('admin/categories/message.assoc_consumables'));
|
||||
|
||||
// Redirect to the asset management page
|
||||
return Redirect::to('admin/settings/categories')->with('error', Lang::get('admin/categories/message.assoc_users'));
|
||||
} else {
|
||||
|
||||
$category->delete();
|
||||
|
||||
// Redirect to the locations management page
|
||||
return Redirect::to('admin/settings/categories')->with('success', Lang::get('admin/categories/message.delete.success'));
|
||||
return Redirect::route('categories')->with('success', Lang::get('admin/categories/message.delete.success'));
|
||||
}
|
||||
|
||||
|
||||
@@ -201,7 +220,231 @@ class CategoriesController extends AdminController
|
||||
|
||||
}
|
||||
|
||||
public function getDatatable()
|
||||
{
|
||||
// Grab all the categories
|
||||
$categories = Category::with('assets', 'accessories');
|
||||
|
||||
if (Input::has('search')) {
|
||||
$categories = $categories->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','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->itemCount(),
|
||||
'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 getDataViewAssets($categoryID) {
|
||||
|
||||
$category = Category::with('assets.company')->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 {
|
||||
$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,
|
||||
'companyName' => Company::getName($asset),
|
||||
);
|
||||
}
|
||||
|
||||
$data = array('total' => $count, 'rows' => $rows);
|
||||
return $data;
|
||||
}
|
||||
|
||||
|
||||
|
||||
public function getDataViewAccessories($categoryID) {
|
||||
|
||||
$category = Category::with('accessories.company')->find($categoryID);
|
||||
$category_assets = $category->accessories;
|
||||
|
||||
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('update/accessory', $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/accessory', $asset->id).'" data-content="'.Lang::get('admin/hardware/message.delete.confirm').'" data-title="'.Lang::get('general.delete').' '.htmlspecialchars($asset->name).'?" onClick="return false;"><i class="fa fa-trash icon-white"></i></a></div>';
|
||||
}
|
||||
|
||||
|
||||
|
||||
$rows[] = array(
|
||||
'id' => $asset->id,
|
||||
'name' => link_to_route('view/accessory', $asset->name, [$asset->id]),
|
||||
'actions' => $actions,
|
||||
'companyName' => Company::getName($asset),
|
||||
);
|
||||
}
|
||||
|
||||
$data = array('total' => $count, 'rows' => $rows);
|
||||
return $data;
|
||||
}
|
||||
|
||||
|
||||
public function getDataViewConsumables($categoryID) {
|
||||
|
||||
$category = Category::with('accessories.company')->find($categoryID);
|
||||
$category_assets = $category->consumables;
|
||||
|
||||
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('update/consumable', $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/consumable', $asset->id).'" data-content="'.Lang::get('admin/hardware/message.delete.confirm').'" data-title="'.Lang::get('general.delete').' '.htmlspecialchars($asset->name).'?" onClick="return false;"><i class="fa fa-trash icon-white"></i></a></div>';
|
||||
}
|
||||
|
||||
|
||||
|
||||
$rows[] = array(
|
||||
'id' => $asset->id,
|
||||
'name' => link_to_route('view/consumable', $asset->name, [$asset->id]),
|
||||
'actions' => $actions,
|
||||
'companyName' => Company::getName($asset),
|
||||
);
|
||||
}
|
||||
|
||||
$data = array('total' => $count, 'rows' => $rows);
|
||||
return $data;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,127 @@
|
||||
<?php namespace Controllers\Admin;
|
||||
|
||||
use AdminController;
|
||||
use Company;
|
||||
|
||||
use Input;
|
||||
use Lang;
|
||||
use Redirect;
|
||||
use Validator;
|
||||
use View;
|
||||
|
||||
final class CompaniesController extends AdminController
|
||||
{
|
||||
public function getIndex()
|
||||
{
|
||||
return View::make('backend/companies/index')->with('companies', Company::all());
|
||||
}
|
||||
|
||||
public function getCreate()
|
||||
{
|
||||
return View::make('backend/companies/edit')->with('company', new Company);
|
||||
}
|
||||
|
||||
public function postCreate()
|
||||
{
|
||||
$company = new Company;
|
||||
|
||||
if ($company->validate(Input::all()))
|
||||
{
|
||||
$company->name = e(Input::get('name'));
|
||||
|
||||
if($company->save())
|
||||
{
|
||||
return Redirect::to('admin/settings/companies')
|
||||
->with('success', Lang::get('admin/companies/message.create.success'));
|
||||
}
|
||||
else
|
||||
{
|
||||
return Redirect::to('admin/settings/companies/create')
|
||||
->with('error', Lang::get('admin/companies/message.create.error'));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
return Redirect::back()->withInput()->withErrors($company->errors());
|
||||
}
|
||||
}
|
||||
|
||||
public function getEdit($companyId)
|
||||
{
|
||||
if (is_null($company = Company::find($companyId)))
|
||||
{
|
||||
return Redirect::to('admin/settings/companies')
|
||||
->with('error', Lang::get('admin/companies/message.does_not_exist'));
|
||||
}
|
||||
else
|
||||
{
|
||||
return View::make('backend/companies/edit')->with('company', $company);
|
||||
}
|
||||
}
|
||||
|
||||
public function postEdit($companyId)
|
||||
{
|
||||
if (is_null($company = Company::find($companyId)))
|
||||
{
|
||||
return Redirect::to('admin/settings/companies')->with('error', Lang::get('admin/companies/message.does_not_exist'));
|
||||
}
|
||||
else
|
||||
{
|
||||
$validator = Validator::make(Input::all(), $company->validationRules($companyId));
|
||||
|
||||
if ($validator->fails())
|
||||
{
|
||||
return Redirect::back()->withInput()->withErrors($validator->messages());
|
||||
}
|
||||
else
|
||||
{
|
||||
$company->name = e(Input::get('name'));
|
||||
|
||||
if($company->save())
|
||||
{
|
||||
return Redirect::to('admin/settings/companies')
|
||||
->with('success', Lang::get('admin/companies/message.update.success'));
|
||||
}
|
||||
else
|
||||
{
|
||||
return Redirect::to("admin/settings/companies/$companyId/edit")
|
||||
->with('error', Lang::get('admin/companies/message.update.error'));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public function postDelete($companyId)
|
||||
{
|
||||
if (is_null($company = Company::find($companyId)))
|
||||
{
|
||||
return Redirect::to('admin/settings/companies')
|
||||
->with('error', Lang::get('admin/companies/message.not_found'));
|
||||
}
|
||||
else
|
||||
{
|
||||
try
|
||||
{
|
||||
$company->delete();
|
||||
return Redirect::to('admin/settings/companies')
|
||||
->with('success', Lang::get('admin/companies/message.delete.success'));
|
||||
}
|
||||
catch (\Illuminate\Database\QueryException $exception)
|
||||
{
|
||||
/*
|
||||
* NOTE: This happens when there's a foreign key constraint violation
|
||||
* For example when rows in other tables are referencing this company
|
||||
*/
|
||||
if ($exception->getCode() == 23000)
|
||||
{
|
||||
return Redirect::to('admin/settings/companies')
|
||||
->with('error', Lang::get('admin/companies/message.assoc_users'));
|
||||
}
|
||||
else
|
||||
{
|
||||
throw $exception;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,504 @@
|
||||
<?php namespace Controllers\Admin;
|
||||
|
||||
use AdminController;
|
||||
use Input;
|
||||
use Lang;
|
||||
use Redirect;
|
||||
use Setting;
|
||||
use DB;
|
||||
use Sentry;
|
||||
use Consumable;
|
||||
use Company;
|
||||
use Str;
|
||||
use Validator;
|
||||
use View;
|
||||
use User;
|
||||
use Actionlog;
|
||||
use Mail;
|
||||
use Datatable;
|
||||
use Slack;
|
||||
use Config;
|
||||
|
||||
class ConsumablesController extends AdminController
|
||||
{
|
||||
/**
|
||||
* Show a list of all the consumables.
|
||||
*
|
||||
* @return View
|
||||
*/
|
||||
|
||||
public function getIndex()
|
||||
{
|
||||
return View::make('backend/consumables/index');
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Consumable create.
|
||||
*
|
||||
* @return View
|
||||
*/
|
||||
public function getCreate()
|
||||
{
|
||||
// Show the page
|
||||
$category_list = array('' => '') + DB::table('categories')->where('category_type','=','consumable')->whereNull('deleted_at')->orderBy('name','ASC')->lists('name', 'id');
|
||||
$company_list = companyList();
|
||||
$location_list = locationsList();
|
||||
|
||||
return View::make('backend/consumables/edit')
|
||||
->with('consumable', new Consumable)
|
||||
->with('category_list', $category_list)
|
||||
->with('company_list', $company_list)
|
||||
->with('location_list', $location_list);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Consumable create form processing.
|
||||
*
|
||||
* @return Redirect
|
||||
*/
|
||||
public function postCreate()
|
||||
{
|
||||
|
||||
// create a new model instance
|
||||
$consumable = new Consumable();
|
||||
|
||||
$validator = Validator::make(Input::all(), $consumable->rules);
|
||||
|
||||
if ($validator->fails())
|
||||
{
|
||||
// The given data did not pass validation
|
||||
return Redirect::back()->withInput()->withErrors($validator->messages());
|
||||
}
|
||||
else{
|
||||
|
||||
// Update the consumable data
|
||||
$consumable->name = e(Input::get('name'));
|
||||
$consumable->category_id = e(Input::get('category_id'));
|
||||
$consumable->location_id = e(Input::get('location_id'));
|
||||
$consumable->company_id = Company::getIdForCurrentUser(Input::get('company_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()) {
|
||||
// Redirect to the new consumable page
|
||||
return Redirect::to("admin/consumables")->with('success', Lang::get('admin/consumables/message.create.success'));
|
||||
}
|
||||
}
|
||||
|
||||
// Redirect to the consumable create page
|
||||
return Redirect::to('admin/consumables/create')->with('error', Lang::get('admin/consumables/message.create.error'));
|
||||
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Consumable update.
|
||||
*
|
||||
* @param int $consumableId
|
||||
* @return View
|
||||
*/
|
||||
public function getEdit($consumableId = null)
|
||||
{
|
||||
// Check if the consumable exists
|
||||
if (is_null($consumable = Consumable::find($consumableId))) {
|
||||
// Redirect to the blogs management page
|
||||
return Redirect::to('admin/consumables')->with('error', Lang::get('admin/consumables/message.does_not_exist'));
|
||||
}
|
||||
else if (!Company::isCurrentUserHasAccess($consumable)) {
|
||||
return Redirect::to('admin/consumables')->with('error', Lang::get('general.insufficient_permissions'));
|
||||
}
|
||||
|
||||
$category_list = array('' => '') + DB::table('categories')->where('category_type','=','consumable')->whereNull('deleted_at')->orderBy('name','ASC')->lists('name', 'id');
|
||||
$company_list = companyList();
|
||||
$location_list = locationsList();
|
||||
|
||||
return View::make('backend/consumables/edit', compact('consumable'))
|
||||
->with('category_list', $category_list)
|
||||
->with('company_list', $company_list)
|
||||
->with('location_list', $location_list);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Consumable update form processing page.
|
||||
*
|
||||
* @param int $consumableId
|
||||
* @return Redirect
|
||||
*/
|
||||
public function postEdit($consumableId = null)
|
||||
{
|
||||
// Check if the blog post exists
|
||||
if (is_null($consumable = Consumable::find($consumableId))) {
|
||||
// Redirect to the blogs management page
|
||||
return Redirect::to('admin/consumables')->with('error', Lang::get('admin/consumables/message.does_not_exist'));
|
||||
}
|
||||
else if (!Company::isCurrentUserHasAccess($consumable)) {
|
||||
return Redirect::to('admin/consumables')->with('error', Lang::get('general.insufficient_permissions'));
|
||||
}
|
||||
|
||||
|
||||
// get the POST data
|
||||
$new = Input::all();
|
||||
|
||||
// attempt validation
|
||||
$validator = Validator::make(Input::all(), $consumable->validationRules($consumableId));
|
||||
|
||||
|
||||
if ($validator->fails())
|
||||
{
|
||||
// The given data did not pass validation
|
||||
return Redirect::back()->withInput()->withErrors($validator->messages());
|
||||
}
|
||||
// attempt validation
|
||||
else {
|
||||
|
||||
// Update the consumable data
|
||||
$consumable->name = e(Input::get('name'));
|
||||
$consumable->category_id = e(Input::get('category_id'));
|
||||
$consumable->location_id = e(Input::get('location_id'));
|
||||
$consumable->company_id = Company::getIdForCurrentUser(Input::get('company_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()) {
|
||||
// Redirect to the new consumable page
|
||||
return Redirect::to("admin/consumables")->with('success', Lang::get('admin/consumables/message.update.success'));
|
||||
}
|
||||
}
|
||||
|
||||
// Redirect to the consumable management page
|
||||
return Redirect::to("admin/consumables/$consumableID/edit")->with('error', Lang::get('admin/consumables/message.update.error'));
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete the given consumable.
|
||||
*
|
||||
* @param int $consumableId
|
||||
* @return Redirect
|
||||
*/
|
||||
public function getDelete($consumableId)
|
||||
{
|
||||
// Check if the blog post exists
|
||||
if (is_null($consumable = Consumable::find($consumableId))) {
|
||||
// Redirect to the blogs management page
|
||||
return Redirect::to('admin/consumables')->with('error', Lang::get('admin/consumables/message.not_found'));
|
||||
}
|
||||
else if (!Company::isCurrentUserHasAccess($consumable)) {
|
||||
return Redirect::to('admin/consumables')->with('error', Lang::get('general.insufficient_permissions'));
|
||||
}
|
||||
|
||||
$consumable->delete();
|
||||
|
||||
// Redirect to the locations management page
|
||||
return Redirect::to('admin/consumables')->with('success', Lang::get('admin/consumables/message.delete.success'));
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Get the consumable information to present to the consumable view page
|
||||
*
|
||||
* @param int $consumableId
|
||||
* @return View
|
||||
**/
|
||||
public function getView($consumableID = null)
|
||||
{
|
||||
$consumable = Consumable::find($consumableID);
|
||||
|
||||
if (isset($consumable->id)) {
|
||||
|
||||
|
||||
if (!Company::isCurrentUserHasAccess($consumable)) {
|
||||
return Redirect::to('admin/consumables')->with('error', Lang::get('general.insufficient_permissions'));
|
||||
}
|
||||
else {
|
||||
return View::make('backend/consumables/view', compact('consumable'));
|
||||
}
|
||||
} else {
|
||||
// Prepare the error message
|
||||
$error = Lang::get('admin/consumables/message.does_not_exist', compact('id'));
|
||||
|
||||
// Redirect to the user management page
|
||||
return Redirect::route('consumables')->with('error', $error);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Check out the consumable to a person
|
||||
**/
|
||||
public function getCheckout($consumableId)
|
||||
{
|
||||
// Check if the consumable exists
|
||||
if (is_null($consumable = Consumable::find($consumableId))) {
|
||||
// Redirect to the consumable management page with error
|
||||
return Redirect::to('consumables')->with('error', Lang::get('admin/consumables/message.not_found'));
|
||||
}
|
||||
else if (!Company::isCurrentUserHasAccess($consumable)) {
|
||||
return Redirect::to('admin/consumables')->with('error', Lang::get('general.insufficient_permissions'));
|
||||
}
|
||||
|
||||
// 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," (",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);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Check out the consumable to a person
|
||||
**/
|
||||
public function postCheckout($consumableId)
|
||||
{
|
||||
// Check if the consumable exists
|
||||
if (is_null($consumable = Consumable::find($consumableId))) {
|
||||
// Redirect to the consumable management page with error
|
||||
return Redirect::to('consumables')->with('error', Lang::get('admin/consumables/message.not_found'));
|
||||
}
|
||||
else if (!Company::isCurrentUserHasAccess($consumable)) {
|
||||
return Redirect::to('admin/consumables')->with('error', Lang::get('general.insufficient_permissions'));
|
||||
}
|
||||
|
||||
$admin_user = Sentry::getUser();
|
||||
$assigned_to = e(Input::get('assigned_to'));
|
||||
|
||||
|
||||
// Declare the rules for the form validation
|
||||
$rules = array(
|
||||
'assigned_to' => 'required|min:1'
|
||||
);
|
||||
|
||||
// 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 consumable management page with error
|
||||
return Redirect::to('admin/consumables')->with('error', Lang::get('admin/consumables/message.user_does_not_exist'));
|
||||
}
|
||||
|
||||
// Update the consumable data
|
||||
$consumable->assigned_to = e(Input::get('assigned_to'));
|
||||
|
||||
$consumable->users()->attach($consumable->id, array(
|
||||
'consumable_id' => $consumable->id,
|
||||
'user_id' => $admin_user->id,
|
||||
'assigned_to' => e(Input::get('assigned_to'))));
|
||||
|
||||
$logaction = new Actionlog();
|
||||
$logaction->consumable_id = $consumable->id;
|
||||
$logaction->checkedout_to = $consumable->assigned_to;
|
||||
$logaction->asset_type = 'consumable';
|
||||
$logaction->location_id = $user->location_id;
|
||||
$logaction->user_id = Sentry::getUser()->id;
|
||||
$logaction->note = e(Input::get('note'));
|
||||
|
||||
$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' => 'Checked Out:',
|
||||
'value' => strtoupper($logaction->asset_type).' <'.Config::get('app.url').'/admin/consumables/'.$consumable->id.'/view'.'|'.$consumable->name.'> checked out to <'.Config::get('app.url').'/admin/users/'.$user->id.'/view|'.$user->fullName().'> by <'.Config::get('app.url').'/admin/users/'.$admin_user->id.'/view'.'|'.$admin_user->fullName().'>.'
|
||||
],
|
||||
[
|
||||
'title' => 'Note:',
|
||||
'value' => e($logaction->note)
|
||||
],
|
||||
]
|
||||
])->send('Consumable Checked Out');
|
||||
|
||||
} catch (Exception $e) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
$log = $logaction->logaction('checkout');
|
||||
|
||||
$consumable_user = DB::table('consumables_users')->where('assigned_to','=',$consumable->assigned_to)->where('consumable_id','=',$consumable->id)->first();
|
||||
|
||||
$data['log_id'] = $logaction->id;
|
||||
$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();
|
||||
|
||||
|
||||
if (($consumable->requireAcceptance()=='1') || ($consumable->getEula())) {
|
||||
|
||||
Mail::send('emails.accept-asset', $data, function ($m) use ($user) {
|
||||
$m->to($user->email, $user->first_name . ' ' . $user->last_name);
|
||||
$m->subject('Confirm consumable delivery');
|
||||
});
|
||||
}
|
||||
|
||||
// Redirect to the new consumable page
|
||||
return Redirect::to("admin/consumables")->with('success', Lang::get('admin/consumables/message.checkout.success'));
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
public function getDatatable()
|
||||
{
|
||||
$consumables = Consumable::select('consumables.*')->whereNull('consumables.deleted_at')
|
||||
->with('company','location','category','users');
|
||||
|
||||
if (Input::has('search')) {
|
||||
$consumables = $consumables->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','order_number','purchase_date','purchase_cost','companyName','category'];
|
||||
$order = Input::get('order') === 'asc' ? 'asc' : 'desc';
|
||||
$sort = in_array(Input::get('sort'), $allowed_columns) ? Input::get('sort') : 'created_at';
|
||||
|
||||
switch ($sort)
|
||||
{
|
||||
case 'category':
|
||||
$consumables = $consumables->OrderCategory($order);
|
||||
break;
|
||||
case 'location':
|
||||
$consumables = $consumables->OrderLocation($order);
|
||||
break;
|
||||
case 'companyName':
|
||||
$consumables = $consumables->OrderCompany($order);
|
||||
break;
|
||||
default:
|
||||
$consumables = $consumables->orderBy($sort, $order);
|
||||
break;
|
||||
}
|
||||
|
||||
$consumCount = $consumables->count();
|
||||
$consumables = $consumables->skip($offset)->take($limit)->get();
|
||||
|
||||
$rows = array();
|
||||
|
||||
foreach($consumables as $consumable) {
|
||||
$actions = '<nobr><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></nobr>';
|
||||
$company = $consumable->company;
|
||||
|
||||
$rows[] = array(
|
||||
'id' => $consumable->id,
|
||||
'name' => link_to('admin/consumables/'.$consumable->id.'/view', $consumable->name),
|
||||
'location' => ($consumable->location) ? e($consumable->location->name) : '',
|
||||
'qty' => $consumable->qty,
|
||||
'category' => ($consumable->category) ? $consumable->category->name : 'Missing category',
|
||||
'order_number' => $consumable->order_number,
|
||||
'purchase_date' => $consumable->purchase_date,
|
||||
'purchase_cost' => ($consumable->purchase_cost!='') ? number_format($consumable->purchase_cost,2): '' ,
|
||||
'numRemaining' => $consumable->numRemaining(),
|
||||
'actions' => $actions,
|
||||
'companyName' => is_null($company) ? '' : e($company->name),
|
||||
);
|
||||
}
|
||||
|
||||
$data = array('total' => $consumCount, 'rows' => $rows);
|
||||
|
||||
return $data;
|
||||
|
||||
}
|
||||
|
||||
public function getDataView($consumableID)
|
||||
{
|
||||
//$consumable = Consumable::find($consumableID);
|
||||
$consumable = Consumable::with(array('consumableAssigments'=>
|
||||
function($query) {
|
||||
$query->orderBy('created_at','DESC');
|
||||
},
|
||||
'consumableAssigments.admin'=> function($query) {},
|
||||
'consumableAssigments.user'=> function($query) {},
|
||||
))->find($consumableID);
|
||||
|
||||
// $consumable->load('consumableAssigments.admin','consumableAssigments.user');
|
||||
|
||||
if (!Company::isCurrentUserHasAccess($consumable)) {
|
||||
return ['total' => 0, 'rows' => []];
|
||||
}
|
||||
|
||||
$rows = array();
|
||||
|
||||
foreach ($consumable->consumableAssigments as $consumable_assignment) {
|
||||
$rows[] = array(
|
||||
'name' => link_to('/admin/users/'.$consumable_assignment->user->id.'/view', $consumable_assignment->user->fullName()),
|
||||
'created_at' => ($consumable_assignment->created_at->format('Y-m-d H:i:s')=='-0001-11-30 00:00:00') ? '' : $consumable_assignment->created_at->format('Y-m-d H:i:s'),
|
||||
'admin' => ($consumable_assignment->admin) ? $consumable_assignment->admin->fullName() : '',
|
||||
);
|
||||
}
|
||||
|
||||
$consumableCount = $consumable->users->count();
|
||||
$data = array('total' => $consumableCount, 'rows' => $rows);
|
||||
return $data;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,194 @@
|
||||
<?php namespace Controllers\Admin;
|
||||
|
||||
use View;
|
||||
use CustomFieldset;
|
||||
use CustomField;
|
||||
use Input;
|
||||
use Validator;
|
||||
use Redirect;
|
||||
use Model;
|
||||
use Lang;
|
||||
use Sentry;
|
||||
|
||||
class CustomFieldsController extends \BaseController {
|
||||
|
||||
/**
|
||||
* Display a listing of the resource.
|
||||
*
|
||||
* @return Response
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
//
|
||||
$fieldsets=CustomFieldset::with("fields","models")->get();
|
||||
//$fieldsets=CustomFieldset::all();
|
||||
$fields=CustomField::with("fieldset")->get();
|
||||
//$fields=CustomField::all();
|
||||
return View::make("backend.custom_fields.index")->with("custom_fieldsets",$fieldsets)->with("custom_fields",$fields);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Show the form for creating a new resource.
|
||||
*
|
||||
* @return Response
|
||||
*/
|
||||
public function create()
|
||||
{
|
||||
//
|
||||
return View::make("backend.custom_fields.create");
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Store a newly created resource in storage.
|
||||
*
|
||||
* @return Response
|
||||
*/
|
||||
public function store()
|
||||
{
|
||||
//
|
||||
$cfset=new CustomFieldset(["name" => Input::get("name"),"user_id" => Sentry::getUser()->id]);
|
||||
$validator=Validator::make(Input::all(),$cfset->rules);
|
||||
if($validator->passes()) {
|
||||
$cfset->save();
|
||||
return Redirect::route("admin.custom_fields.show",[$cfset->id])->with('success',Lang::get('admin/custom_fields/message.fieldset.create.success'));
|
||||
} else {
|
||||
return Redirect::back()->withInput()->withErrors($validator);
|
||||
}
|
||||
}
|
||||
|
||||
public function associate($id)
|
||||
{
|
||||
|
||||
$set = CustomFieldset::find($id);
|
||||
|
||||
foreach($set->fields AS $field) {
|
||||
if($field->id == Input::get('field_id')) {
|
||||
return Redirect::route("admin.custom_fields.show",[$id])->withInput()->withErrors(['field_id' => Lang::get('admin/custom_fields/message.field.already_added')]);
|
||||
}
|
||||
}
|
||||
|
||||
$results=$set->fields()->attach(Input::get('field_id'),["required" => (Input::get('required') == "on"),"order" => Input::get('order')]);
|
||||
|
||||
return Redirect::route("admin.custom_fields.show",[$id])->with("success",Lang::get('admin/custom_fields/message.field.create.assoc_success'));
|
||||
}
|
||||
|
||||
public function createField()
|
||||
{
|
||||
return View::make("backend.custom_fields.create_field");
|
||||
}
|
||||
|
||||
public function storeField()
|
||||
{
|
||||
$field=new CustomField(["name" => Input::get("name"),"element" => Input::get("element"),"user_id" => Sentry::getUser()->id]);
|
||||
if(!in_array(Input::get('format'),["ALPHA","NUMERIC","MAC","IP"])) {
|
||||
$field->format=Input::get("custom_format");
|
||||
} else {
|
||||
$field->format=Input::get('format');
|
||||
}
|
||||
|
||||
$validator=Validator::make(Input::all(),$field->rules);
|
||||
if($validator->passes()) {
|
||||
$results=$field->save();
|
||||
//return "postCreateField: $results";
|
||||
if ($results) {
|
||||
return Redirect::route("admin.custom_fields.index")->with("success",Lang::get('admin/custom_fields/message.field.create.success'));
|
||||
} else {
|
||||
return Redirect::back()->withInput()->with('error', Lang::get('admin/custom_fields/message.field.create.error'));
|
||||
}
|
||||
} else {
|
||||
return Redirect::back()->withInput()->withErrors($validator);
|
||||
}
|
||||
}
|
||||
|
||||
public function deleteField($field_id)
|
||||
{
|
||||
$field=CustomField::find($field_id);
|
||||
|
||||
if($field->fieldset->count()>0) {
|
||||
return Redirect::back()->withErrors(['message' => "Field is in-use"]);
|
||||
} else {
|
||||
$field->delete();
|
||||
return Redirect::route("admin.custom_fields.index")->with("success",Lang::get('admin/custom_fields/message.field.delete.success'));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Display the specified resource.
|
||||
*
|
||||
* @param int $id
|
||||
* @return Response
|
||||
*/
|
||||
public function show($id)
|
||||
{
|
||||
//$id=$parameters[0];
|
||||
$cfset=CustomFieldset::find($id);
|
||||
|
||||
//print_r($parameters);
|
||||
//
|
||||
$custom_fields_list=["" => "Add New Field to Fieldset"] + CustomField::lists("name","id");
|
||||
// print_r($custom_fields_list);
|
||||
$maxid=0;
|
||||
foreach($cfset->fields AS $field) {
|
||||
// print "Looking for: ".$field->id;
|
||||
if($field->pivot->order > $maxid) {
|
||||
$maxid=$field->pivot->order;
|
||||
}
|
||||
if(isset($custom_fields_list[$field->id])) {
|
||||
// print "Found ".$field->id.", so removing it.<br>";
|
||||
unset($custom_fields_list[$field->id]);
|
||||
}
|
||||
}
|
||||
|
||||
return View::make("backend.custom_fields.show")->with("custom_fieldset",$cfset)->with("maxid",$maxid+1)->with("custom_fields_list",$custom_fields_list);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Show the form for editing the specified resource.
|
||||
*
|
||||
* @param int $id
|
||||
* @return Response
|
||||
*/
|
||||
public function edit($id)
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Update the specified resource in storage.
|
||||
*
|
||||
* @param int $id
|
||||
* @return Response
|
||||
*/
|
||||
public function update($id)
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Remove the specified resource from storage.
|
||||
*
|
||||
* @param int $id
|
||||
* @return Response
|
||||
*/
|
||||
public function destroy($id)
|
||||
{
|
||||
//
|
||||
$fieldset=CustomFieldset::find($id);
|
||||
|
||||
$models=Model::where("fieldset_id","=",$id);
|
||||
if($models->count()==0) {
|
||||
$fieldset->delete();
|
||||
return Redirect::route("admin.custom_fields.index")->with("success",Lang::get('admin/custom_fields/message.fieldset.delete.success'));
|
||||
}
|
||||
else {
|
||||
return Redirect::route("admin.custom_fields.index")->with("error",Lang::get('admin/custom_fields/message.fieldset.delete.in_use')); //->with("models",$models);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -2,6 +2,9 @@
|
||||
|
||||
use AdminController;
|
||||
use View;
|
||||
use Asset;
|
||||
use Actionlog;
|
||||
use Company;
|
||||
|
||||
class DashboardController extends AdminController
|
||||
{
|
||||
@@ -13,7 +16,60 @@ class DashboardController extends AdminController
|
||||
public function getIndex()
|
||||
{
|
||||
// Show the page
|
||||
return View::make('backend/dashboard');
|
||||
|
||||
$recent_activity = Actionlog::orderBy('created_at','DESC')
|
||||
->with('accessorylog','consumablelog','licenselog','assetlog','adminlog','userlog')
|
||||
->take(7)
|
||||
->get();
|
||||
|
||||
|
||||
$asset_stats['total'] = Asset::Hardware()->count();
|
||||
|
||||
$asset_stats['rtd']['total'] = Asset::Hardware()->RTD()->count();
|
||||
|
||||
if ($asset_stats['rtd']['total'] > 0) {
|
||||
$asset_stats['rtd']['percent'] = round(($asset_stats['rtd']['total']/$asset_stats['total']) * 100);
|
||||
} else {
|
||||
$asset_stats['rtd']['percent'] = 0;
|
||||
}
|
||||
|
||||
|
||||
$asset_stats['pending']['total'] = Asset::Hardware()->Pending()->count();
|
||||
|
||||
if ($asset_stats['pending']['total'] > 0) {
|
||||
$asset_stats['pending']['percent'] = round(($asset_stats['pending']['total']/$asset_stats['total']) * 100);
|
||||
} else {
|
||||
$asset_stats['pending']['percent'] = 0;
|
||||
}
|
||||
|
||||
|
||||
$asset_stats['deployed']['total'] = Asset::Hardware()->Deployed()->count();
|
||||
|
||||
if ($asset_stats['deployed']['total'] > 0) {
|
||||
$asset_stats['deployed']['percent'] = round(($asset_stats['deployed']['total']/$asset_stats['total']) * 100);
|
||||
} else {
|
||||
$asset_stats['deployed']['percent'] = 0;
|
||||
}
|
||||
|
||||
|
||||
$asset_stats['undeployable']['total'] = Asset::Hardware()->Undeployable()->count();
|
||||
|
||||
if ($asset_stats['undeployable']['total'] > 0) {
|
||||
$asset_stats['undeployable']['percent'] = round(($asset_stats['undeployable']['total']/$asset_stats['total']) * 100);
|
||||
} else {
|
||||
$asset_stats['undeployable']['percent'] = 0;
|
||||
}
|
||||
|
||||
$asset_stats['archived']['total'] = Asset::Hardware()->Archived()->count();
|
||||
|
||||
if ($asset_stats['archived']['total'] > 0) {
|
||||
$asset_stats['archived']['percent'] = round(($asset_stats['archived']['total']/$asset_stats['total']) * 100);
|
||||
} else {
|
||||
$asset_stats['archived']['percent'] = 0;
|
||||
}
|
||||
|
||||
|
||||
return View::make('backend/dashboard')->with('asset_stats',$asset_stats)->with('recent_activity',$recent_activity);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -22,9 +22,6 @@ class GroupsController extends AdminController
|
||||
*/
|
||||
public function getIndex()
|
||||
{
|
||||
// Grab all the groups
|
||||
$groups = Sentry::getGroupProvider()->createModel()->paginate();
|
||||
|
||||
// Show the page
|
||||
return View::make('backend/groups/index', compact('groups'));
|
||||
}
|
||||
@@ -81,7 +78,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
|
||||
@@ -161,21 +158,27 @@ class GroupsController extends AdminController
|
||||
return Redirect::back()->withInput()->withErrors($validator);
|
||||
}
|
||||
|
||||
try {
|
||||
// Update the group data
|
||||
$group->name = Input::get('name');
|
||||
$group->permissions = Input::get('permissions');
|
||||
if (!Config::get('app.lock_passwords')) {
|
||||
|
||||
// Was the group updated?
|
||||
if ($group->save()) {
|
||||
// Redirect to the group page
|
||||
return Redirect::route('update/group', $id)->with('success', Lang::get('admin/groups/message.success.update'));
|
||||
} else {
|
||||
// Redirect to the group page
|
||||
return Redirect::route('update/group', $id)->with('error', Lang::get('admin/groups/message.error.update'));
|
||||
try {
|
||||
// Update the group data
|
||||
$group->name = Input::get('name');
|
||||
$group->permissions = Input::get('permissions');
|
||||
|
||||
// Was the group updated?
|
||||
if ($group->save()) {
|
||||
// Redirect to the group page
|
||||
return Redirect::route('update/group', $id)->with('success', Lang::get('admin/groups/message.success.update'));
|
||||
} else {
|
||||
// Redirect to the group page
|
||||
return Redirect::route('update/group', $id)->with('error', Lang::get('admin/groups/message.error.update'));
|
||||
}
|
||||
} catch (NameRequiredException $e) {
|
||||
$error = Lang::get('admin/group/message.group_name_required');
|
||||
}
|
||||
} catch (NameRequiredException $e) {
|
||||
$error = Lang::get('admin/group/message.group_name_required');
|
||||
|
||||
} else {
|
||||
return Redirect::route('update/group', $id)->withInput()->with('error', 'Denied! Editing groups is not allowed in the demo.');
|
||||
}
|
||||
|
||||
// Redirect to the group page
|
||||
@@ -190,19 +193,97 @@ 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'));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
public function getDatatable($status = null)
|
||||
{
|
||||
|
||||
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::get('sort')=='name') {
|
||||
$sort = 'first_name';
|
||||
} else {
|
||||
$sort = e(Input::get('sort'));
|
||||
}
|
||||
|
||||
// Grab all the groups
|
||||
$groups = Sentry::getGroupProvider()->createModel();
|
||||
//$users = Company::scopeCompanyables($users);
|
||||
|
||||
if (Input::has('search')) {
|
||||
$groups = $users->TextSearch(Input::get('search'));
|
||||
}
|
||||
|
||||
$order = Input::get('order') === 'asc' ? 'asc' : 'desc';
|
||||
|
||||
$allowed_columns =
|
||||
[
|
||||
'name','created_at'
|
||||
];
|
||||
|
||||
$sort = in_array($sort, $allowed_columns) ? $sort : 'name';
|
||||
$groups = $groups->orderBy($sort, $order);
|
||||
|
||||
$groupsCount = $groups->count();
|
||||
$groups = $groups->skip($offset)->take($limit)->get();
|
||||
$rows = array();
|
||||
|
||||
foreach ($groups as $group)
|
||||
{
|
||||
$group_names = '';
|
||||
$inout = '';
|
||||
$actions = '<nobr>';
|
||||
|
||||
$actions .= '<a href="' . route('update/group', $group->id) . '" class="btn btn-warning btn-sm"><i class="fa fa-pencil icon-white"></i></a> ';
|
||||
|
||||
if (!Config::get('app.lock_passwords')) {
|
||||
$actions .= '<a data-html="false" class="btn delete-asset btn-danger btn-sm" data-toggle="modal" href="' . route('delete/group', $group->id) . '" data-content="'.Lang::get('admin/groups/message.delete.confirm').'" data-title="Delete ' . htmlspecialchars($group->name) . '?" onClick="return false;"><i class="fa fa-trash icon-white"></i></a> ';
|
||||
} else {
|
||||
$actions .= ' <span class="btn delete-asset btn-danger btn-sm disabled"><i class="fa fa-trash icon-white"></i></span>';
|
||||
}
|
||||
|
||||
$actions .= '</nobr>';
|
||||
|
||||
$rows[] = array(
|
||||
'id' => $group->id,
|
||||
'name' => $group->name,
|
||||
'users' => $group->users->count(),
|
||||
'created_at' => $group->created_at->format('Y-m-d H:i:s'),
|
||||
'actions' => ($actions) ? $actions : '',
|
||||
);
|
||||
}
|
||||
|
||||
$data = array('total'=>$groupsCount, 'rows'=>$rows);
|
||||
return $data;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -12,6 +12,7 @@ use DB;
|
||||
use Redirect;
|
||||
use LicenseSeat;
|
||||
use Depreciation;
|
||||
use Company;
|
||||
use Setting;
|
||||
use Sentry;
|
||||
use Str;
|
||||
@@ -19,6 +20,10 @@ use Supplier;
|
||||
use Validator;
|
||||
use View;
|
||||
use Response;
|
||||
use Datatable;
|
||||
use Slack;
|
||||
use Config;
|
||||
use Session;
|
||||
|
||||
class LicensesController extends AdminController
|
||||
{
|
||||
@@ -33,11 +38,8 @@ class LicensesController extends AdminController
|
||||
|
||||
public function getIndex()
|
||||
{
|
||||
// Grab all the licenses
|
||||
$licenses = License::orderBy('created_at', 'DESC')->get();
|
||||
|
||||
// Show the page
|
||||
return View::make('backend/licenses/index', compact('licenses'));
|
||||
return View::make('backend/licenses/index');
|
||||
}
|
||||
|
||||
|
||||
@@ -54,11 +56,14 @@ class LicensesController extends AdminController
|
||||
$depreciation_list = array('0' => Lang::get('admin/licenses/form.no_depreciation')) + Depreciation::lists('name', 'id');
|
||||
$supplier_list = array('' => 'Select Supplier') + Supplier::orderBy('name', 'asc')->lists('name', 'id');
|
||||
$maintained_list = array('' => 'Maintained', '1' => 'Yes', '0' => 'No');
|
||||
$company_list = companyList();
|
||||
|
||||
return View::make('backend/licenses/edit')
|
||||
->with('license_options',$license_options)
|
||||
->with('depreciation_list',$depreciation_list)
|
||||
->with('supplier_list',$supplier_list)
|
||||
->with('maintained_list',$maintained_list)
|
||||
->with('company_list', $company_list)
|
||||
->with('license',new License);
|
||||
}
|
||||
|
||||
@@ -100,6 +105,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 {
|
||||
@@ -117,6 +128,7 @@ class LicensesController extends AdminController
|
||||
$license->purchase_date = e(Input::get('purchase_date'));
|
||||
$license->purchase_order = e(Input::get('purchase_order'));
|
||||
$license->depreciation_id = e(Input::get('depreciation_id'));
|
||||
$license->company_id = Company::getIdForCurrentUser(Input::get('company_id'));
|
||||
$license->expiration_date = e(Input::get('expiration_date'));
|
||||
$license->user_id = Sentry::getId();
|
||||
|
||||
@@ -134,6 +146,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++) {
|
||||
@@ -173,6 +186,9 @@ class LicensesController extends AdminController
|
||||
// Redirect to the blogs management page
|
||||
return Redirect::to('admin/licenses')->with('error', Lang::get('admin/licenses/message.does_not_exist'));
|
||||
}
|
||||
else if (!Company::isCurrentUserHasAccess($license)) {
|
||||
return Redirect::to('admin/licenses')->with('error', Lang::get('general.insufficient_permissions'));
|
||||
}
|
||||
|
||||
if ($license->purchase_date == "0000-00-00") {
|
||||
$license->purchase_date = NULL;
|
||||
@@ -187,10 +203,13 @@ class LicensesController extends AdminController
|
||||
$depreciation_list = array('0' => Lang::get('admin/licenses/form.no_depreciation')) + Depreciation::lists('name', 'id');
|
||||
$supplier_list = array('' => 'Select Supplier') + Supplier::orderBy('name', 'asc')->lists('name', 'id');
|
||||
$maintained_list = array('' => 'Maintained', '1' => 'Yes', '0' => 'No');
|
||||
$company_list = companyList();
|
||||
|
||||
return View::make('backend/licenses/edit', compact('license'))
|
||||
->with('license_options',$license_options)
|
||||
->with('depreciation_list',$depreciation_list)
|
||||
->with('supplier_list',$supplier_list)
|
||||
->with('company_list', $company_list)
|
||||
->with('maintained_list',$maintained_list);
|
||||
}
|
||||
|
||||
@@ -208,6 +227,9 @@ class LicensesController extends AdminController
|
||||
// Redirect to the blogs management page
|
||||
return Redirect::to('admin/licenses')->with('error', Lang::get('admin/licenses/message.does_not_exist'));
|
||||
}
|
||||
else if (!Company::isCurrentUserHasAccess($license)) {
|
||||
return Redirect::to('admin/licenses')->with('error', Lang::get('general.insufficient_permissions'));
|
||||
}
|
||||
|
||||
|
||||
// get the POST data
|
||||
@@ -226,8 +248,10 @@ class LicensesController extends AdminController
|
||||
$license->notes = e(Input::get('notes'));
|
||||
$license->order_number = e(Input::get('order_number'));
|
||||
$license->depreciation_id = e(Input::get('depreciation_id'));
|
||||
$license->company_id = Company::getIdForCurrentUser(Input::get('company_id'));
|
||||
$license->purchase_order = e(Input::get('purchase_order'));
|
||||
$license->maintained = e(Input::get('maintained'));
|
||||
$license->reassignable = e(Input::get('reassignable'));
|
||||
|
||||
if ( e(Input::get('supplier_id')) == '') {
|
||||
$license->supplier_id = NULL;
|
||||
@@ -268,6 +292,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 {
|
||||
@@ -359,6 +389,9 @@ class LicensesController extends AdminController
|
||||
// Redirect to the license management page
|
||||
return Redirect::to('admin/licenses')->with('error', Lang::get('admin/licenses/message.not_found'));
|
||||
}
|
||||
else if (!Company::isCurrentUserHasAccess($license)) {
|
||||
return Redirect::to('admin/licenses')->with('error', Lang::get('general.insufficient_permissions'));
|
||||
}
|
||||
|
||||
if (($license->assignedcount()) && ($license->assignedcount() > 0)) {
|
||||
|
||||
@@ -397,9 +430,12 @@ 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'));
|
||||
}
|
||||
else if (!Company::isCurrentUserHasAccess($licenseseat->license)) {
|
||||
return Redirect::to('admin/licenses')->with('error', Lang::get('general.insufficient_permissions'));
|
||||
}
|
||||
|
||||
// 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
|
||||
@@ -407,7 +443,7 @@ class LicensesController extends AdminController
|
||||
->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'))
|
||||
DB::raw('concat(first_name," ",last_name) as full_name, assets.id as id, models.name as modelname'))
|
||||
->whereNull('assets.deleted_at')
|
||||
->get();
|
||||
|
||||
@@ -438,9 +474,14 @@ class LicensesController extends AdminController
|
||||
public function postCheckout($seatId)
|
||||
{
|
||||
|
||||
|
||||
$licenseseat = LicenseSeat::find($seatId);
|
||||
$assigned_to = e(Input::get('assigned_to'));
|
||||
$asset_id = e(Input::get('asset_id'));
|
||||
$user = Sentry::getUser();
|
||||
|
||||
if (!Company::isCurrentUserHasAccess($licenseseat->license)) {
|
||||
return Redirect::to('admin/licenses')->with('error', Lang::get('general.insufficient_permissions'));
|
||||
}
|
||||
|
||||
// Declare the rules for the form validation
|
||||
$rules = array(
|
||||
@@ -482,13 +523,13 @@ class LicensesController extends AdminController
|
||||
|
||||
|
||||
|
||||
// Check if the asset exists
|
||||
if (is_null($licenseseat = LicenseSeat::find($seatId))) {
|
||||
// Check if the asset exists
|
||||
if (is_null($licenseseat)) {
|
||||
// Redirect to the asset management page with error
|
||||
return Redirect::to('admin/licenses')->with('error', Lang::get('admin/licenses/message.not_found'));
|
||||
}
|
||||
|
||||
if ( e(Input::get('asset_id')) == '') {
|
||||
if (Input::get('asset_id') == '') {
|
||||
$licenseseat->asset_id = NULL;
|
||||
} else {
|
||||
$licenseseat->asset_id = e(Input::get('asset_id'));
|
||||
@@ -511,15 +552,59 @@ class LicensesController extends AdminController
|
||||
$logaction->asset_type = 'software';
|
||||
$logaction->user_id = Sentry::getUser()->id;
|
||||
$logaction->note = e(Input::get('note'));
|
||||
$logaction->asset_id = $licenseseat->license_id;
|
||||
|
||||
|
||||
$license = License::find($licenseseat->license_id);
|
||||
$settings = Setting::getSettings();
|
||||
|
||||
|
||||
// Update the asset data
|
||||
if ( e(Input::get('assigned_to')) == '') {
|
||||
$logaction->checkedout_to = NULL;
|
||||
$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',
|
||||
'fields' => [
|
||||
[
|
||||
'title' => 'Checked Out:',
|
||||
'value' => $slack_msg
|
||||
],
|
||||
[
|
||||
'title' => 'Note:',
|
||||
'value' => e($logaction->note)
|
||||
],
|
||||
|
||||
|
||||
|
||||
]
|
||||
])->send('License Checked Out');
|
||||
|
||||
} catch (Exception $e) {
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
$log = $logaction->logaction('checkout');
|
||||
|
||||
|
||||
@@ -535,14 +620,17 @@ class LicensesController extends AdminController
|
||||
/**
|
||||
* Check the license back into inventory
|
||||
**/
|
||||
public function getCheckin($seatId)
|
||||
public function getCheckin($seatId = null, $backto = null)
|
||||
{
|
||||
// Check if the asset exists
|
||||
if (is_null($licenseseat = LicenseSeat::find($seatId))) {
|
||||
// Redirect to the asset management page with error
|
||||
return Redirect::to('admin/licenses')->with('error', Lang::get('admin/licenses/message.not_found'));
|
||||
}
|
||||
return View::make('backend/licenses/checkin', compact('licenseseat'));
|
||||
else if (!Company::isCurrentUserHasAccess($licenseseat->license)) {
|
||||
return Redirect::to('admin/licenses')->with('error', Lang::get('general.insufficient_permissions'));
|
||||
}
|
||||
return View::make('backend/licenses/checkin', compact('licenseseat'))->with('backto',$backto);
|
||||
|
||||
}
|
||||
|
||||
@@ -551,7 +639,7 @@ class LicensesController extends AdminController
|
||||
/**
|
||||
* Check in the item so that it can be checked out again to someone else
|
||||
**/
|
||||
public function postCheckin($seatId)
|
||||
public function postCheckin($seatId = null, $backto = null)
|
||||
{
|
||||
// Check if the asset exists
|
||||
if (is_null($licenseseat = LicenseSeat::find($seatId))) {
|
||||
@@ -559,6 +647,18 @@ class LicensesController extends AdminController
|
||||
return Redirect::to('admin/licenses')->with('error', Lang::get('admin/licenses/message.not_found'));
|
||||
}
|
||||
|
||||
$license = License::find($licenseseat->license_id);
|
||||
|
||||
if (!Company::isCurrentUserHasAccess($license)) {
|
||||
return Redirect::to('admin/licenses')->with('error', Lang::get('general.insufficient_permissions'));
|
||||
}
|
||||
|
||||
if(!$license->reassignable) {
|
||||
// Not allowed to checkin
|
||||
Session::flash('error', 'License not reassignable.');
|
||||
return Redirect::back()->withInput();
|
||||
}
|
||||
|
||||
// Declare the rules for the form validation
|
||||
$rules = array(
|
||||
'note' => 'alpha_space',
|
||||
@@ -573,7 +673,7 @@ class LicensesController extends AdminController
|
||||
// Ooops.. something went wrong
|
||||
return Redirect::back()->withInput()->withErrors($validator);
|
||||
}
|
||||
|
||||
$return_to = $licenseseat->assigned_to;
|
||||
$logaction = new Actionlog();
|
||||
$logaction->checkedout_to = $licenseseat->assigned_to;
|
||||
|
||||
@@ -581,17 +681,62 @@ class LicensesController extends AdminController
|
||||
$licenseseat->assigned_to = NULL;
|
||||
$licenseseat->asset_id = NULL;
|
||||
|
||||
$user = Sentry::getUser();
|
||||
|
||||
// Was the asset updated?
|
||||
if($licenseseat->save()) {
|
||||
$logaction->asset_id = NULL;
|
||||
$logaction->asset_id = $licenseseat->license_id;
|
||||
$logaction->location_id = NULL;
|
||||
$logaction->asset_type = 'software';
|
||||
$logaction->note = e(Input::get('note'));
|
||||
$logaction->user_id = Sentry::getUser()->id;
|
||||
$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',
|
||||
'fields' => [
|
||||
[
|
||||
'title' => 'Checked In:',
|
||||
'value' => strtoupper($logaction->asset_type).' <'.Config::get('app.url').'/admin/licenses/'.$license->id.'/view'.'|'.$license->name.'> checked in by <'.Config::get('app.url').'/admin/users/'.$user->id.'/view'.'|'.$user->fullName().'>.'
|
||||
],
|
||||
[
|
||||
'title' => 'Note:',
|
||||
'value' => e($logaction->note)
|
||||
],
|
||||
|
||||
]
|
||||
])->send('License Checked In');
|
||||
|
||||
} catch (Exception $e) {
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
$log = $logaction->logaction('checkin from');
|
||||
|
||||
// Redirect to the license page
|
||||
return Redirect::to("admin/licenses")->with('success', Lang::get('admin/licenses/message.checkin.success'));
|
||||
|
||||
|
||||
if ($backto=='user') {
|
||||
return Redirect::to("admin/users/".$return_to.'/view')->with('success', Lang::get('admin/licenses/message.checkin.success'));
|
||||
} else {
|
||||
return Redirect::to("admin/licenses/".$licenseseat->license_id."/view")->with('success', Lang::get('admin/licenses/message.checkin.success'));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// Redirect to the license page with error
|
||||
@@ -601,7 +746,7 @@ class LicensesController extends AdminController
|
||||
/**
|
||||
* Get the asset information to present to the asset view page
|
||||
*
|
||||
* @param int $assetId
|
||||
* @param int $licenseId
|
||||
* @return View
|
||||
**/
|
||||
public function getView($licenseId = null)
|
||||
@@ -609,6 +754,10 @@ class LicensesController extends AdminController
|
||||
$license = License::find($licenseId);
|
||||
|
||||
if (isset($license->id)) {
|
||||
|
||||
if (!Company::isCurrentUserHasAccess($license)) {
|
||||
return Redirect::to('admin/licenses')->with('error', Lang::get('general.insufficient_permissions'));
|
||||
}
|
||||
return View::make('backend/licenses/view', compact('license'));
|
||||
} else {
|
||||
// Prepare the error message
|
||||
@@ -626,10 +775,14 @@ class LicensesController extends AdminController
|
||||
// Redirect to the blogs management page
|
||||
return Redirect::to('admin/licenses')->with('error', Lang::get('admin/licenses/message.does_not_exist'));
|
||||
}
|
||||
else if (!Company::isCurrentUserHasAccess($license_to_clone)) {
|
||||
return Redirect::to('admin/licenses')->with('error', Lang::get('general.insufficient_permissions'));
|
||||
}
|
||||
|
||||
// Show the page
|
||||
$license_options = array('0' => 'Top Level') + License::lists('name', 'id');
|
||||
$maintained_list = array('' => 'Maintained', '1' => 'Yes', '0' => 'No');
|
||||
$maintained_list = array('' => 'Maintained', '1' => 'Yes', '0' => 'No');
|
||||
$company_list = companyList();
|
||||
//clone the orig
|
||||
$license = clone $license_to_clone;
|
||||
$license->id = null;
|
||||
@@ -638,7 +791,13 @@ class LicensesController extends AdminController
|
||||
// Show the page
|
||||
$depreciation_list = array('0' => Lang::get('admin/licenses/form.no_depreciation')) + Depreciation::lists('name', 'id');
|
||||
$supplier_list = array('' => 'Select Supplier') + Supplier::orderBy('name', 'asc')->lists('name', 'id');
|
||||
return View::make('backend/licenses/edit')->with('license_options',$license_options)->with('depreciation_list',$depreciation_list)->with('supplier_list',$supplier_list)->with('license',$license)->with('maintained_list',$maintained_list);
|
||||
return View::make('backend/licenses/edit')
|
||||
->with('license_options',$license_options)
|
||||
->with('depreciation_list',$depreciation_list)
|
||||
->with('supplier_list',$supplier_list)
|
||||
->with('license',$license)
|
||||
->with('maintained_list',$maintained_list)
|
||||
->with('company_list',$company_list);
|
||||
|
||||
}
|
||||
|
||||
@@ -646,7 +805,7 @@ class LicensesController extends AdminController
|
||||
/**
|
||||
* Upload the file to the server
|
||||
*
|
||||
* @param int $assetId
|
||||
* @param int $licenseId
|
||||
* @return View
|
||||
**/
|
||||
public function postUpload($licenseId = null)
|
||||
@@ -658,12 +817,17 @@ class LicensesController extends AdminController
|
||||
|
||||
if (isset($license->id)) {
|
||||
|
||||
|
||||
if (!Company::isCurrentUserHasAccess($license)) {
|
||||
return Redirect::to('admin/licenses')->with('error', Lang::get('general.insufficient_permissions'));
|
||||
}
|
||||
|
||||
if (Input::hasFile('licensefile')) {
|
||||
|
||||
foreach(Input::file('licensefile') as $file) {
|
||||
|
||||
$rules = array(
|
||||
'licensefile' => 'required|mimes:png,gif,jpg,jpeg,doc,docx,pdf,txt|max:2000'
|
||||
'licensefile' => 'required|mimes:png,gif,jpg,jpeg,doc,docx,pdf,txt,zip,rar|max:2000'
|
||||
);
|
||||
$validator = Validator::make(array('licensefile'=> $file), $rules);
|
||||
|
||||
@@ -698,7 +862,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'));
|
||||
}
|
||||
|
||||
|
||||
@@ -718,7 +882,8 @@ class LicensesController extends AdminController
|
||||
/**
|
||||
* Delete the associated file
|
||||
*
|
||||
* @param int $assetId
|
||||
* @param int $licenseId
|
||||
* @param int $fileId
|
||||
* @return View
|
||||
**/
|
||||
public function getDeleteFile($licenseId = null, $fileId = null)
|
||||
@@ -729,6 +894,11 @@ class LicensesController extends AdminController
|
||||
// the license is valid
|
||||
if (isset($license->id)) {
|
||||
|
||||
|
||||
if (!Company::isCurrentUserHasAccess($license)) {
|
||||
return Redirect::to('admin/licenses')->with('error', Lang::get('general.insufficient_permissions'));
|
||||
}
|
||||
|
||||
$log = Actionlog::find($fileId);
|
||||
$full_filename = $destinationPath.'/'.$log->filename;
|
||||
if (file_exists($full_filename)) {
|
||||
@@ -751,7 +921,8 @@ class LicensesController extends AdminController
|
||||
/**
|
||||
* Display/download the uploaded file
|
||||
*
|
||||
* @param int $assetId
|
||||
* @param int $licenseId
|
||||
* @param int $fileId
|
||||
* @return View
|
||||
**/
|
||||
public function displayFile($licenseId = null, $fileId = null)
|
||||
@@ -761,6 +932,11 @@ class LicensesController extends AdminController
|
||||
|
||||
// the license is valid
|
||||
if (isset($license->id)) {
|
||||
|
||||
if (!Company::isCurrentUserHasAccess($license)) {
|
||||
return Redirect::to('admin/licenses')->with('error', Lang::get('general.insufficient_permissions'));
|
||||
}
|
||||
|
||||
$log = Actionlog::find($fileId);
|
||||
$file = $log->get_src();
|
||||
return Response::download($file);
|
||||
@@ -772,4 +948,52 @@ class LicensesController extends AdminController
|
||||
return Redirect::route('licenses')->with('error', $error);
|
||||
}
|
||||
}
|
||||
|
||||
public function getDatatable() {
|
||||
$licenses = License::select('id','name','serial','purchase_date','seats', 'company_id')->with('company');
|
||||
|
||||
if (Input::has('search')) {
|
||||
$licenses = $licenses->TextSearch(Input::get('search'));
|
||||
}
|
||||
|
||||
$allowed_columns = ['id','name','serial'];
|
||||
$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,
|
||||
'companyName' => is_null($license->company) ? '' : e($license->company->name)
|
||||
);
|
||||
}
|
||||
|
||||
$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
|
||||
{
|
||||
/**
|
||||
@@ -23,7 +25,7 @@ class LocationsController extends AdminController
|
||||
public function getIndex()
|
||||
{
|
||||
// Grab all the locations
|
||||
$locations = Location::orderBy('created_at', 'DESC')->get();
|
||||
$locations = Location::orderBy('created_at', 'DESC')->with('parent','assets','assignedassets')->get();
|
||||
|
||||
// Show the page
|
||||
return View::make('backend/locations/index', compact('locations'));
|
||||
@@ -37,9 +39,15 @@ class LocationsController extends AdminController
|
||||
*/
|
||||
public function getCreate()
|
||||
{
|
||||
// Show the page
|
||||
$location_options = array('0' => 'Top Level') + Location::lists('name', 'id');
|
||||
return View::make('backend/locations/edit')->with('location_options',$location_options)->with('location',new Location);
|
||||
$locations = Location::orderBy('name','ASC')->get();
|
||||
|
||||
$location_options_array = Location::getLocationHierarchy($locations);
|
||||
$location_options = Location::flattenLocationsArray($location_options_array);
|
||||
$location_options = array('' => 'Top Level') + $location_options;
|
||||
|
||||
return View::make('backend/locations/edit')
|
||||
->with('location_options',$location_options)
|
||||
->with('location',new Location);
|
||||
}
|
||||
|
||||
|
||||
@@ -62,12 +70,18 @@ class LocationsController extends AdminController
|
||||
|
||||
// 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 = 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->zip = e(Input::get('zip'));
|
||||
$location->user_id = Sentry::getId();
|
||||
|
||||
// Was the asset created?
|
||||
@@ -86,6 +100,53 @@ 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
|
||||
/** @noinspection PhpUnreachableStatementInspection Known to be unreachable but kept following discussion: https://github.com/snipe/snipe-it/pull/1423 */
|
||||
return Redirect::to('admin/settings/locations/create')->with('error', Lang::get('admin/locations/message.create.error'));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Location update.
|
||||
@@ -97,14 +158,15 @@ class LocationsController extends AdminController
|
||||
{
|
||||
// Check if the location exists
|
||||
if (is_null($location = Location::find($locationId))) {
|
||||
// Redirect to the blogs management page
|
||||
return Redirect::to('admin/settings/locations')->with('error', Lang::get('admin/locations/message.does_not_exist'));
|
||||
}
|
||||
|
||||
// Show the page
|
||||
//$location_options = array('' => 'Top Level') + Location::lists('name', 'id');
|
||||
$locations = Location::orderBy('name','ASC')->get();
|
||||
$location_options_array = Location::getLocationHierarchy($locations);
|
||||
$location_options = Location::flattenLocationsArray($location_options_array);
|
||||
$location_options = array('' => 'Top Level') + $location_options;
|
||||
|
||||
$location_options = array('' => 'Top Level') + DB::table('locations')->where('id', '!=', $locationId)->lists('name', 'id');
|
||||
return View::make('backend/locations/edit', compact('location'))->with('location_options',$location_options);
|
||||
}
|
||||
|
||||
@@ -128,27 +190,33 @@ class LocationsController 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
|
||||
else {
|
||||
|
||||
// Update the location data
|
||||
$location->name = e(Input::get('name'));
|
||||
$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 = 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->country = e(Input::get('country'));
|
||||
$location->zip = e(Input::get('zip'));
|
||||
|
||||
// Was the asset created?
|
||||
if($location->save()) {
|
||||
// Redirect to the saved location page
|
||||
return Redirect::to("admin/settings/locations/")->with('success', Lang::get('admin/locations/message.update.success'));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Redirect to the location management page
|
||||
return Redirect::to("admin/settings/locations/$locationId/edit")->with('error', Lang::get('admin/locations/message.update.error'));
|
||||
@@ -170,15 +238,16 @@ class LocationsController extends AdminController
|
||||
}
|
||||
|
||||
|
||||
if ($location->has_users() > 0) {
|
||||
|
||||
// Redirect to the asset management page
|
||||
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_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();
|
||||
|
||||
// Redirect to the locations management page
|
||||
return Redirect::to('admin/settings/locations')->with('success', Lang::get('admin/locations/message.delete.success'));
|
||||
}
|
||||
|
||||
@@ -187,5 +256,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;
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
<?php namespace Controllers\Admin;
|
||||
|
||||
use AdminController;
|
||||
use Company;
|
||||
use Input;
|
||||
use Lang;
|
||||
use Manufacturer;
|
||||
@@ -20,9 +21,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 +190,124 @@ 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/manufacturer', $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::with('assets.company')->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>';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$row = 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()): '',
|
||||
'actions' => $actions,
|
||||
'companyName' => Company::getName($asset),
|
||||
);
|
||||
|
||||
if (isset($inout)) { $row['change'] = $inout; }
|
||||
|
||||
$rows[] = $row;
|
||||
}
|
||||
|
||||
$data = array('total' => $count, 'rows' => $rows);
|
||||
return $data;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -14,6 +14,13 @@ use Manufacturer;
|
||||
use Str;
|
||||
use Validator;
|
||||
use View;
|
||||
use Datatable;
|
||||
use Asset;
|
||||
use Company;
|
||||
use Config;
|
||||
|
||||
//use Symfony\Component\HttpFoundation\Response;
|
||||
use Symfony\Component\HttpFoundation\JsonResponse;
|
||||
|
||||
class ModelsController extends AdminController
|
||||
{
|
||||
@@ -24,11 +31,8 @@ class ModelsController extends AdminController
|
||||
*/
|
||||
public function getIndex()
|
||||
{
|
||||
// Grab all the models
|
||||
$models = Model::orderBy('created_at', 'DESC')->get();
|
||||
|
||||
// Show the page
|
||||
return View::make('backend/models/index', compact('models'));
|
||||
return View::make('backend/models/index');
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -39,9 +43,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);
|
||||
@@ -59,14 +63,40 @@ class ModelsController extends AdminController
|
||||
public function postCreate()
|
||||
{
|
||||
|
||||
// get the POST data
|
||||
$new = Input::all();
|
||||
|
||||
// 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 ($model->validate($new)) {
|
||||
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
|
||||
if ($validator->fails())
|
||||
{
|
||||
// The given data did not pass validation
|
||||
return Redirect::back()->withInput()->withErrors($validator->messages());
|
||||
}
|
||||
// attempt validation
|
||||
else {
|
||||
|
||||
if ( e(Input::get('depreciation_id')) == '') {
|
||||
$model->depreciation_id = 0;
|
||||
@@ -74,7 +104,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'));
|
||||
@@ -85,8 +115,13 @@ class ModelsController extends AdminController
|
||||
$model->modelno = e(Input::get('modelno'));
|
||||
$model->manufacturer_id = e(Input::get('manufacturer_id'));
|
||||
$model->category_id = e(Input::get('category_id'));
|
||||
$model->note = e(Input::get('note'));
|
||||
$model->user_id = Sentry::getId();
|
||||
$model->show_mac_address = e(Input::get('show_mac_address', '0'));
|
||||
if (Input::get('custom_fieldset')!='') {
|
||||
$model->fieldset_id = e(Input::get('custom_fieldset'));
|
||||
}
|
||||
|
||||
//$model->show_mac_address = e(Input::get('show_mac_address', '0'));
|
||||
|
||||
|
||||
if (Input::file('image')) {
|
||||
@@ -105,10 +140,6 @@ class ModelsController extends AdminController
|
||||
// Redirect to the new model page
|
||||
return Redirect::to("hardware/models")->with('success', Lang::get('admin/models/message.create.success'));
|
||||
}
|
||||
} else {
|
||||
// failure
|
||||
$errors = $model->errors();
|
||||
return Redirect::back()->withInput()->withErrors($errors);
|
||||
}
|
||||
|
||||
// Redirect to the model create page
|
||||
@@ -116,6 +147,37 @@ 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->note = e(Input::get('note'));
|
||||
$model->eol=0;
|
||||
|
||||
if($model->save()) {
|
||||
return JsonResponse::create($model);
|
||||
} else {
|
||||
return JsonResponse::create(["error" => "Couldn't save Model"],500);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Model update.
|
||||
*
|
||||
@@ -132,7 +194,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);
|
||||
@@ -183,7 +245,12 @@ class ModelsController extends AdminController
|
||||
$model->modelno = e(Input::get('modelno'));
|
||||
$model->manufacturer_id = e(Input::get('manufacturer_id'));
|
||||
$model->category_id = e(Input::get('category_id'));
|
||||
$model->show_mac_address = e(Input::get('show_mac_address', '0'));
|
||||
$model->note = e(Input::get('note'));
|
||||
if (Input::get('custom_fieldset')=='') {
|
||||
$model->fieldset_id = null;
|
||||
} else {
|
||||
$model->fieldset_id = e(Input::get('custom_fieldset'));
|
||||
}
|
||||
|
||||
if (Input::file('image')) {
|
||||
$image = Input::file('image');
|
||||
@@ -239,16 +306,39 @@ class ModelsController extends AdminController
|
||||
}
|
||||
}
|
||||
|
||||
public function getRestore($modelId = null)
|
||||
{
|
||||
|
||||
// Get user information
|
||||
$model = Model::withTrashed()->find($modelId);
|
||||
|
||||
if (isset($model->id)) {
|
||||
|
||||
// Restore the model
|
||||
$model->restore();
|
||||
|
||||
// Prepare the success message
|
||||
$success = Lang::get('admin/models/message.restore.success');
|
||||
|
||||
// Redirect back
|
||||
return Redirect::back()->with('success', $success);
|
||||
|
||||
} else {
|
||||
return Redirect::back()->with('error', Lang::get('admin/models/message.not_found'));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 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
|
||||
* @param int $modelId
|
||||
* @return View
|
||||
**/
|
||||
public function getView($modelId = null)
|
||||
{
|
||||
$model = Model::find($modelId);
|
||||
$model = Model::withTrashed()->find($modelId);
|
||||
|
||||
if (isset($model->id)) {
|
||||
return View::make('backend/models/view', compact('model'));
|
||||
@@ -263,7 +353,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))) {
|
||||
@@ -289,4 +386,154 @@ class ModelsController extends AdminController
|
||||
}
|
||||
|
||||
|
||||
public function getCustomFields($modelId)
|
||||
{
|
||||
$model=Model::find($modelId);
|
||||
return View::make("backend.models.custom_fields_form")->with("model",$model);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Get the JSON response for the bootstrap table list view
|
||||
*
|
||||
* @param string $status
|
||||
* @return JSON
|
||||
**/
|
||||
|
||||
public function getDatatable($status = null)
|
||||
{
|
||||
$models = Model::with('category','assets','depreciation');
|
||||
|
||||
switch ($status) {
|
||||
case 'Deleted':
|
||||
$models->withTrashed()->Deleted();
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
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 {
|
||||
$actions = '<a href="'.route('restore/model', $model->id).'" class="btn btn-warning btn-sm"><i class="fa fa-recycle icon-white"></i></a>';
|
||||
}
|
||||
|
||||
$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),
|
||||
'image' => ($model->image!='') ? '<img src="'.Config::get('app.url').'/uploads/models/'.$model->image.'" height=50 width=50>' : '',
|
||||
'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') : '',
|
||||
'note' => $model->getNote(),
|
||||
'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)
|
||||
{
|
||||
$assets = Asset::where('model_id','=',$modelID)->withTrashed()->with('company');
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
$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) {
|
||||
$actions = '';
|
||||
|
||||
if ($asset->assetstatus) {
|
||||
if ($asset->assetstatus->deployable != 0) {
|
||||
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>';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$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,
|
||||
'companyName' => Company::getName($asset)
|
||||
);
|
||||
}
|
||||
|
||||
$data = array('total' => $assetsCount, 'rows' => $rows);
|
||||
|
||||
return $data;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,18 +1,79 @@
|
||||
<?php namespace Controllers\Admin;
|
||||
|
||||
use Accessory;
|
||||
use Actionlog;
|
||||
use AdminController;
|
||||
use Input;
|
||||
use Lang;
|
||||
use License;
|
||||
use Asset;
|
||||
use User;
|
||||
use View;
|
||||
use AssetMaintenance;
|
||||
use Carbon\Carbon;
|
||||
use Category;
|
||||
use Company;
|
||||
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 Response;
|
||||
use Setting;
|
||||
use User;
|
||||
|
||||
class ReportsController extends AdminController
|
||||
{
|
||||
|
||||
/**
|
||||
* Show Report for Accessories
|
||||
*
|
||||
* @return View
|
||||
*/
|
||||
public function getAccessoryReport()
|
||||
{
|
||||
$accessories = Accessory::orderBy('created_at', 'DESC')->with('company')->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
|
||||
*
|
||||
@@ -21,8 +82,12 @@ 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', 'company' )
|
||||
->orderBy( 'created_at', 'DESC' )
|
||||
->get();
|
||||
|
||||
return View::make( 'backend/reports/asset', compact( 'assets' ) );
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -33,44 +98,50 @@ class ReportsController extends AdminController
|
||||
public function exportAssetReport()
|
||||
{
|
||||
// Grab all the assets
|
||||
$assets = Asset::orderBy('created_at', 'DESC')->get();
|
||||
$assets = Asset::orderBy( 'created_at', 'DESC' )->get();
|
||||
|
||||
$rows = array();
|
||||
$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('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.status')
|
||||
);
|
||||
$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) {
|
||||
$row[] = $asset->assetstatus->name;
|
||||
} else {
|
||||
$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 {
|
||||
@@ -83,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 ($location->name) {
|
||||
if (( $asset->assigned_to > 0 ) && ( $asset->assigneduser->location_id > 0 )) {
|
||||
$location = Location::find( $asset->assigneduser->location_id );
|
||||
if ($location) {
|
||||
$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 {
|
||||
@@ -107,24 +178,20 @@ class ReportsController extends AdminController
|
||||
$row[] = ''; // Empty string if location is not set
|
||||
}
|
||||
|
||||
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;
|
||||
if ($asset->notes) {
|
||||
$row[] = '"' . $asset->notes . '"';
|
||||
} else {
|
||||
$row[] = '';
|
||||
}
|
||||
|
||||
$rows[] = implode($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;
|
||||
}
|
||||
@@ -136,9 +203,12 @@ 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', 'company' )
|
||||
->orderBy( 'created_at', 'DESC' )->get();
|
||||
|
||||
return View::make( 'backend/reports/depreciation', compact( 'assets' ) );
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -148,47 +218,50 @@ class ReportsController extends AdminController
|
||||
*/
|
||||
public function exportDeprecationReport()
|
||||
{
|
||||
// @todo - It may be worthwhile creating a separate controller for reporting
|
||||
|
||||
// Grab all the assets
|
||||
$assets = Asset::orderBy('created_at', 'DESC')->get();
|
||||
$assets = Asset::with( 'model', 'assigneduser', 'assetstatus', 'defaultLoc', 'assetlog' )
|
||||
->orderBy( 'created_at', 'DESC' )->get();
|
||||
|
||||
$rows = array();
|
||||
$csv = \League\Csv\Writer::createFromFileObject( new \SplTempFileObject() );
|
||||
$csv->setOutputBOM( Reader::BOM_UTF16_BE );
|
||||
|
||||
$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 = array_map('trim', $header);
|
||||
$rows[] = implode($header, ',');
|
||||
$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 );
|
||||
|
||||
// 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.'"';
|
||||
$row[] = $location->city . ', ' . $location->state;
|
||||
} elseif ($location->name) {
|
||||
$row[] = $location->name;
|
||||
} else {
|
||||
@@ -198,22 +271,41 @@ class ReportsController extends AdminController
|
||||
$row[] = ''; // Empty string if location is not set
|
||||
}
|
||||
|
||||
$depreciation = $asset->depreciate();
|
||||
if ($asset->assetloc) {
|
||||
$currency = $asset->assetloc->currency;
|
||||
} else {
|
||||
$currency = Setting::first()->default_currency;
|
||||
}
|
||||
|
||||
$row[] = $asset->purchase_date;
|
||||
$row[] = '"'.number_format($asset->purchase_cost).'"';
|
||||
$row[] = '"'.number_format($depreciation).'"';
|
||||
$row[] = '"'.number_format($asset->purchase_cost - $depreciation).'"';
|
||||
$rows[] = implode($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 );
|
||||
}
|
||||
|
||||
// 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->output( 'depreciation-report-' . date( 'Y-m-d' ) . '.csv' );
|
||||
die;
|
||||
|
||||
return $response;
|
||||
}
|
||||
|
||||
/**
|
||||
* Show Report for Activity
|
||||
*
|
||||
* @return View
|
||||
*/
|
||||
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' ) );
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -223,8 +315,12 @@ 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' )
|
||||
->with( 'company' )
|
||||
->get();
|
||||
|
||||
return View::make( 'backend/reports/licenses', compact( 'licenses' ) );
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -234,199 +330,190 @@ 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')
|
||||
);
|
||||
$licenses = License::orderBy( 'created_at', 'DESC' )->get();
|
||||
|
||||
$header = array_map('trim', $header);
|
||||
$rows[] = implode($header, ', ');
|
||||
$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();
|
||||
$assets = Asset::orderBy( 'created_at', 'DESC' )->get();
|
||||
|
||||
if (e(Input::get('asset_name')) == '1')
|
||||
{
|
||||
$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') && (e(Input::get('depreciation')) == '0')) {
|
||||
$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 ($location->name) {
|
||||
$row[] = $location->name;
|
||||
if (e( Input::get( 'location' ) ) == '1') {
|
||||
$show_loc = '';
|
||||
if (( $asset->assigned_to > 0 ) && ( $asset->assigneduser->location_id !='' )) {
|
||||
$location = Location::find( $asset->assigneduser->location_id );
|
||||
if ($location) {
|
||||
$show_loc .= $location->name;
|
||||
} else {
|
||||
$row[] = '';
|
||||
$show_loc .= 'User location '.$asset->assigneduser->location_id.' is invalid';
|
||||
}
|
||||
} elseif ($asset->rtd_location_id) {
|
||||
$location = Location::find($asset->rtd_location_id);
|
||||
if ($location->name) {
|
||||
$row[] = $location->name;
|
||||
} elseif ($asset->rtd_location_id!='') {
|
||||
$location = Location::find( $asset->rtd_location_id );
|
||||
if ($location) {
|
||||
$show_loc .= $location->name;
|
||||
} else {
|
||||
$row[] = '';
|
||||
$show_loc .= 'Default location '.$asset->rtd_location_id.' is invalid';
|
||||
}
|
||||
} else {
|
||||
$row[] = ''; // Empty string if location is not set
|
||||
}
|
||||
|
||||
$row[] = $show_loc;
|
||||
|
||||
}
|
||||
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();
|
||||
@@ -435,24 +522,244 @@ class ReportsController extends AdminController
|
||||
$row[] = '';
|
||||
}
|
||||
}
|
||||
if (e(Input::get('depreciation')) == '1') {
|
||||
$depreciation = $asset->depreciate();
|
||||
$row[] = '"'.number_format($asset->purchase_cost).'"';
|
||||
$row[] = '"'.number_format($depreciation).'"';
|
||||
$row[] = '"'.number_format($asset->purchase_cost - $depreciation).'"';
|
||||
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 ) . '"';
|
||||
}
|
||||
$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', 'asset.company' )
|
||||
->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()->with( 'company' )->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 )
|
||||
{
|
||||
$assets = Asset::deployed()
|
||||
->inModelList( $modelsInCategoriesThatRequireAcceptance )
|
||||
->select( 'id' )
|
||||
->get()
|
||||
->toArray();
|
||||
|
||||
return array_pluck( $assets, '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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,6 +10,12 @@ use Sentry;
|
||||
use Str;
|
||||
use Validator;
|
||||
use View;
|
||||
use Image;
|
||||
use Config;
|
||||
use Response;
|
||||
use Artisan;
|
||||
use Crypt;
|
||||
|
||||
|
||||
class SettingsController extends AdminController
|
||||
{
|
||||
@@ -31,22 +37,30 @@ class SettingsController extends AdminController
|
||||
|
||||
/**
|
||||
* Setting update.
|
||||
*
|
||||
* @param int $settingId
|
||||
* @return View
|
||||
*/
|
||||
public function getEdit()
|
||||
{
|
||||
$settings = Setting::orderBy('created_at', 'DESC')->paginate(10);
|
||||
$setting = Setting::first();
|
||||
$is_gd_installed = extension_loaded('gd');
|
||||
return View::make('backend/settings/edit', compact('settings', 'is_gd_installed'));
|
||||
|
||||
// echo '<pre>';
|
||||
// print_r($settings);
|
||||
// echo '</pre>';
|
||||
// exit;
|
||||
|
||||
if ($setting->ldap_pword!='') {
|
||||
$show_ldap_pword = Crypt::decrypt($setting->ldap_pword);
|
||||
} else {
|
||||
$show_ldap_pword = '';
|
||||
}
|
||||
return View::make('backend/settings/edit', compact('setting'))->with('is_gd_installed',$is_gd_installed)->with('show_ldap_pword',$show_ldap_pword);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Setting update form processing page.
|
||||
*
|
||||
* @param int $settingId
|
||||
* @return Redirect
|
||||
*/
|
||||
public function postEdit()
|
||||
@@ -62,11 +76,32 @@ class SettingsController extends AdminController
|
||||
|
||||
|
||||
// Declare the rules for the form validation
|
||||
|
||||
$rules = array(
|
||||
"site_name" => 'required|min:3',
|
||||
"per_page" => 'required|min:1|numeric',
|
||||
"qr_text" => 'min:1|max:31'
|
||||
);
|
||||
"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',
|
||||
"slack_channel" => 'regex:/(?<!\w)#\w+/',
|
||||
"slack_botname" => 'alpha_dash',
|
||||
"ldap_server" => 'sometimes|required_if:ldap_enabled,1|url',
|
||||
"ldap_uname" => 'sometimes|required_if:ldap_enabled,1',
|
||||
"ldap_pword" => 'sometimes|required_if:ldap_enabled,1',
|
||||
"ldap_basedn" => 'sometimes|required_if:ldap_enabled,1',
|
||||
"ldap_filter" => 'sometimes|required_if:ldap_enabled,1',
|
||||
"ldap_username_field" => 'sometimes|required_if:ldap_enabled,1',
|
||||
"ldap_lname_field" => 'sometimes|required_if:ldap_enabled,1',
|
||||
"ldap_auth_filter_query" => 'sometimes|required_if:ldap_enabled,1',
|
||||
"ldap_version" => 'sometimes|required_if:ldap_enabled,1',
|
||||
);
|
||||
|
||||
if (Config::get('app.lock_passwords')==false) {
|
||||
$rules['site_name'] = 'required|min:3';
|
||||
}
|
||||
|
||||
// Create a new validator instance from our validation rules
|
||||
$validator = Validator::make(Input::all(), $rules);
|
||||
@@ -78,18 +113,66 @@ class SettingsController extends AdminController
|
||||
return Redirect::back()->withInput()->withErrors($validator);
|
||||
}
|
||||
|
||||
if (Input::get('clear_logo')=='1') {
|
||||
$setting->logo = NULL;
|
||||
} elseif (Input::file('logo')) {
|
||||
if (!Config::get('app.lock_passwords')) {
|
||||
$image = Input::file('logo');
|
||||
$file_name = "logo.".$image->getClientOriginalExtension();
|
||||
$path = public_path('uploads/'.$file_name);
|
||||
Image::make($image->getRealPath())->resize(null, 40, function ($constraint) {
|
||||
$constraint->aspectRatio();
|
||||
$constraint->upsize();
|
||||
})->save($path);
|
||||
$setting->logo = $file_name;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Update the asset data
|
||||
$setting->id = '1';
|
||||
$setting->site_name = e(Input::get('site_name'));
|
||||
$setting->display_asset_name = e(Input::get('display_asset_name', '0'));
|
||||
$setting->display_checkout_date = e(Input::get('display_checkout_date', '0'));
|
||||
|
||||
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->display_eol = e(Input::get('display_eol', '0'));
|
||||
$setting->barcode_type = e(Input::get('barcode_type'));
|
||||
$setting->load_remote = e(Input::get('load_remote', '0'));
|
||||
$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'));
|
||||
$setting->alert_email = e(Input::get('alert_email'));
|
||||
$setting->alerts_enabled = e(Input::get('alerts_enabled', '0'));
|
||||
$setting->header_color = e(Input::get('header_color'));
|
||||
$setting->default_eula_text = e(Input::get('default_eula_text'));
|
||||
$setting->slack_endpoint = e(Input::get('slack_endpoint'));
|
||||
$setting->slack_channel = e(Input::get('slack_channel'));
|
||||
$setting->slack_botname = e(Input::get('slack_botname'));
|
||||
$setting->ldap_enabled = Input::get('ldap_enabled', '0');
|
||||
$setting->ldap_server = Input::get('ldap_server');
|
||||
$setting->ldap_server_cert_ignore = Input::get('ldap_server_cert_ignore', false);
|
||||
$setting->ldap_uname = Input::get('ldap_uname');
|
||||
$setting->ldap_pword = Crypt::encrypt(Input::get('ldap_pword'));
|
||||
$setting->ldap_basedn = Input::get('ldap_basedn');
|
||||
$setting->ldap_filter = Input::get('ldap_filter');
|
||||
$setting->ldap_username_field = Input::get('ldap_username_field');
|
||||
$setting->ldap_lname_field = Input::get('ldap_lname_field');
|
||||
$setting->ldap_fname_field = Input::get('ldap_fname_field');
|
||||
$setting->ldap_auth_filter_query = Input::get('ldap_auth_filter_query');
|
||||
$setting->ldap_version = Input::get('ldap_version');
|
||||
$setting->ldap_active_flag = Input::get('ldap_active_flag');
|
||||
$setting->ldap_emp_num = Input::get('ldap_emp_num');
|
||||
$setting->ldap_email = Input::get('ldap_email');
|
||||
|
||||
if (Sentry::getUser()->isSuperUser()) {
|
||||
$setting->full_multiple_companies_support = e(Input::get('full_multiple_companies_support', '0'));
|
||||
}
|
||||
|
||||
|
||||
// Was the asset updated?
|
||||
if($setting->save()) {
|
||||
@@ -103,6 +186,110 @@ class SettingsController extends AdminController
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Generate the backup page
|
||||
*
|
||||
* @return View
|
||||
**/
|
||||
|
||||
public function getBackups()
|
||||
{
|
||||
$path = Config::get('backup::path');
|
||||
$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)=='zip') {
|
||||
$files[] = array(
|
||||
'filename' => $entry,
|
||||
'filesize' => Setting::fileSizeConvert(filesize(Config::get('backup::path').$entry)),
|
||||
'modified' => filemtime(Config::get('backup::path').$entry)
|
||||
);
|
||||
}
|
||||
|
||||
}
|
||||
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
|
||||
*
|
||||
* @param string|null $filename
|
||||
* @return View
|
||||
*/
|
||||
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 {
|
||||
|
||||
// Redirect to the backup page
|
||||
return Redirect::route('settings/backups')->with('error', Lang::get('admin/settings/message.backup.file_not_found'));
|
||||
}
|
||||
} else {
|
||||
// Redirect to the backup page
|
||||
return Redirect::route('settings/backups')->with('error', Lang::get('general.feature_disabled'));
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Download the dump file
|
||||
*
|
||||
* @param string|null $filename
|
||||
* @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/supplier', $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
@@ -18,6 +18,7 @@ class CreateModelsTable extends Migration
|
||||
$table->integer('manufacturer_id')->nullable();
|
||||
$table->integer('category_id')->nullable();
|
||||
$table->timestamps();
|
||||
$table->engine = 'InnoDB';
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -16,6 +16,7 @@ class CreateCategoriesTable extends Migration
|
||||
$table->string('name');
|
||||
$table->integer('parent')->default(0);
|
||||
$table->timestamps();
|
||||
$table->engine = 'InnoDB';
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -15,6 +15,7 @@ class CreateManufacturersTable extends Migration
|
||||
$table->increments('id');
|
||||
$table->string('name');
|
||||
$table->timestamps();
|
||||
$table->engine = 'InnoDB';
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -24,6 +24,7 @@ class CreateAssetsTable extends Migration
|
||||
$table->text('notes');
|
||||
$table->integer('user_id');
|
||||
$table->timestamps();
|
||||
$table->engine = 'InnoDB';
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -25,6 +25,7 @@ class CreateLicensesTable extends Migration
|
||||
$table->text('notes');
|
||||
$table->integer('user_id');
|
||||
$table->timestamps();
|
||||
$table->engine = 'InnoDB';
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -17,6 +17,7 @@ class CreateDepreciationsTable extends Migration
|
||||
$table->integer('months');
|
||||
$table->timestamps();
|
||||
$table->integer('user_id');
|
||||
$table->engine = 'InnoDB';
|
||||
//$table->foreign('user_id')->references('id')->on('users');
|
||||
});
|
||||
}
|
||||
|
||||
@@ -19,6 +19,7 @@ class CreateLocationsTable extends Migration
|
||||
$table->string('country',2);
|
||||
$table->timestamps();
|
||||
$table->integer('user_id');
|
||||
$table->engine = 'InnoDB';
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -17,6 +17,7 @@ class CreateHistoryTable extends Migration
|
||||
$table->integer('location_id')->nullable;
|
||||
$table->timestamps();
|
||||
$table->integer('user_id');
|
||||
$table->engine = 'InnoDB';
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -18,6 +18,7 @@ class CreateSettingsTable extends Migration
|
||||
$table->string('option_value');
|
||||
$table->timestamps();
|
||||
$table->integer('user_id');
|
||||
$table->engine = 'InnoDB';
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -11,9 +11,8 @@ class EditLocationIdAssetLogsTable extends Migration
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
$prefix=DB::getTablePrefix();
|
||||
DB::statement('ALTER TABLE '.$prefix.'asset_logs MODIFY location_id int(11) null');
|
||||
DB::statement('ALTER TABLE '.$prefix.'asset_logs MODIFY added_on timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP');
|
||||
DB::statement('ALTER TABLE '.DB::getTablePrefix().'asset_logs MODIFY location_id int(11) null');
|
||||
DB::statement('ALTER TABLE '.DB::getTablePrefix().'asset_logs MODIFY added_on timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP');
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -17,6 +17,7 @@ class CreateStatusLabels extends Migration
|
||||
$table->integer('user_id');
|
||||
$table->timestamps();
|
||||
$table->softDeletes();
|
||||
$table->engine = 'InnoDB';
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -19,6 +19,7 @@ class AddUploadsTable extends Migration
|
||||
$table->string('filenotes')->nullable;
|
||||
$table->timestamps();
|
||||
$table->softDeletes();
|
||||
$table->engine = 'InnoDB';
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -25,6 +25,7 @@ class ReCreateLicensesTable extends Migration
|
||||
$table->integer('depreciation_id');
|
||||
$table->timestamps();
|
||||
$table->softDeletes();
|
||||
$table->engine = 'InnoDB';
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -20,6 +20,7 @@ class CreateLicenseSeatsTable extends Migration
|
||||
$table->integer('user_id');
|
||||
$table->timestamps();
|
||||
$table->softDeletes();
|
||||
$table->engine = 'InnoDB';
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -25,6 +25,7 @@ class CreateNewLicensesTable extends Migration
|
||||
$table->integer('depreciation_id');
|
||||
$table->timestamps();
|
||||
$table->softDeletes();
|
||||
$table->engine = 'InnoDB';
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -28,6 +28,7 @@ class AddSuppliers extends Migration
|
||||
$table->timestamps();
|
||||
$table->integer('user_id');
|
||||
$table->softDeletes();
|
||||
$table->engine = 'InnoDB';
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,37 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
|
||||
class AddLogoAndColorsToSettings extends Migration {
|
||||
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
//
|
||||
Schema::table('settings', function ($table) {
|
||||
$table->string('logo')->nullable()->default(NULL);
|
||||
$table->string('header_color')->nullable()->default(NULL);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
//
|
||||
Schema::table('settings', function ($table) {
|
||||
$table->dropColumn('logo');
|
||||
$table->dropColumn('header_color');
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
|
||||
class AddAlertsToSettings extends Migration {
|
||||
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
//
|
||||
Schema::table('settings', function ($table) {
|
||||
$table->string('alert_email')->nullable()->default(NULL);
|
||||
$table->boolean('alerts_enabled')->default(1);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
//
|
||||
Schema::table('settings', function ($table) {
|
||||
$table->dropColumn('alert_email');
|
||||
$table->dropColumn('alerts_enabled');
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,69 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
|
||||
class AddEulaFields extends Migration {
|
||||
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
//
|
||||
Schema::table('settings', function ($table) {
|
||||
$table->longText('default_eula_text')->nullable()->default(NULL);
|
||||
});
|
||||
|
||||
Schema::table('categories', function ($table) {
|
||||
$table->longText('eula_text')->nullable()->default(NULL);
|
||||
$table->boolean('use_default_eula')->default(0);
|
||||
$table->boolean('require_acceptance')->default(0);
|
||||
});
|
||||
|
||||
Schema::table('asset_logs', function ($table) {
|
||||
$table->dateTime('requested_at')->nullable()->default(NULL);
|
||||
$table->dateTime('accepted_at')->nullable()->default(NULL);
|
||||
});
|
||||
|
||||
|
||||
Schema::create('requested_assets', function ($table) {
|
||||
$table->increments('id');
|
||||
$table->integer('asset_id')->default(NULL);
|
||||
$table->integer('user_id')->default(NULL);
|
||||
$table->dateTime('accepted_at')->nullable()->default(NULL);
|
||||
$table->dateTime('denied_at')->nullable()->default(NULL);
|
||||
$table->string('notes')->default(NULL);
|
||||
$table->timestamps();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
//
|
||||
Schema::table('settings', function ($table) {
|
||||
$table->dropColumn('default_eula_text');
|
||||
});
|
||||
|
||||
Schema::table('categories', function ($table) {
|
||||
$table->dropColumn('eula_text');
|
||||
$table->dropColumn('use_default_eula');
|
||||
$table->dropColumn('require_acceptance');
|
||||
});
|
||||
|
||||
Schema::table('asset_logs', function ($table) {
|
||||
$table->dropColumn('requested_at');
|
||||
$table->dropColumn('accepted_at');
|
||||
});
|
||||
|
||||
Schema::drop('requested_assets');
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
|
||||
class AddAccessoriesTable extends Migration {
|
||||
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
//
|
||||
Schema::create('accessories', function ($table) {
|
||||
$table->increments('id');
|
||||
$table->string('name')->nullable()->default(NULL);
|
||||
$table->integer('category_id')->nullable()->default(NULL);
|
||||
$table->integer('user_id')->nullable()->default(NULL);
|
||||
$table->integer('qty')->default(0);
|
||||
$table->boolean('requestable')->default(0);
|
||||
$table->timestamps();
|
||||
$table->softDeletes();
|
||||
$table->engine = 'InnoDB';
|
||||
});
|
||||
|
||||
Schema::table('asset_logs', function ($table) {
|
||||
$table->integer('accessory_id')->nullable()->default(NULL);
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
//
|
||||
Schema::drop('accessories');
|
||||
|
||||
Schema::table('asset_logs', function ($table) {
|
||||
$table->dropColumn('accessory_id');
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
|
||||
class AddAccessoriesUserTable extends Migration {
|
||||
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
//
|
||||
Schema::create('accessories_users', function ($table) {
|
||||
$table->increments('id');
|
||||
$table->integer('user_id')->nullable()->default(NULL);
|
||||
$table->integer('accessory_id')->nullable()->default(NULL);
|
||||
$table->integer('assigned_to')->nullable()->default(NULL);
|
||||
$table->timestamps();
|
||||
});
|
||||
|
||||
Schema::table('accessories', function ($table) {
|
||||
$table->integer('location_id')->nullable()->default(NULL);
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
//
|
||||
Schema::drop('accessories_users');
|
||||
|
||||
Schema::table('accessories', function ($table) {
|
||||
$table->dropColumn('location_id');
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
|
||||
class AddDeletedAtModels extends Migration {
|
||||
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
Schema::table('models', function ($table){
|
||||
$table->softDeletes();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
Schema::table('models', function ($table){
|
||||
$table->dropColumn('deleted_at');
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
|
||||
class AddCategoryType extends Migration {
|
||||
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
//
|
||||
Schema::table('categories', function ($table) {
|
||||
$table->string('category_type')->nullable()->default('asset');
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
//
|
||||
Schema::table('categories', function ($table) {
|
||||
$table->dropColumn('category_type');
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
|
||||
class UpdateAcceptedAtToAcceptanceId extends Migration {
|
||||
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
//
|
||||
|
||||
Schema::table('asset_logs', function ($table) {
|
||||
$table->integer('accepted_id')->nullable()->default(NULL);
|
||||
});
|
||||
|
||||
$results = DB::select('select invitation.id AS invitation_id, acceptance.id AS acceptance_id FROM asset_logs invitation INNER JOIN asset_logs acceptance ON (invitation.checkedout_to=acceptance.checkedout_to AND invitation.asset_id=acceptance.asset_id) WHERE invitation.action_type="checkout" AND acceptance.action_type="accepted"');
|
||||
|
||||
|
||||
foreach ($results as $result) {
|
||||
$update = DB::update('update asset_logs set accepted_id=? where id=?', [$result->acceptance_id, $result->invitation_id]);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
//
|
||||
Schema::table('asset_logs', function ($table) {
|
||||
$table->dropColumn('accepted_id');
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
|
||||
class AddQrTypeToSettings extends Migration {
|
||||
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
//
|
||||
Schema::table('settings', function ($table) {
|
||||
$table->string('barcode_type')->nullable()->default('QRCODE');
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
//
|
||||
Schema::table('settings', function ($table) {
|
||||
$table->dropColumn('barcode_type');
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
|
||||
class AddNoteToUser extends Migration {
|
||||
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
Schema::table('users', function ($table) {
|
||||
$table->text('notes');
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
Schema::table('users', function ($table) {
|
||||
$table->dropColumn('notes');
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
|
||||
class AddSlackToSettings extends Migration {
|
||||
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
Schema::table('settings', function(Blueprint $table)
|
||||
{
|
||||
$table->string('slack_endpoint')->nullable()->default(NULL);
|
||||
$table->string('slack_channel')->nullable()->default(NULL);
|
||||
$table->string('slack_botname')->nullable()->default(NULL);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
Schema::table('settings', function(Blueprint $table)
|
||||
{
|
||||
//
|
||||
$table->dropColumn('slack_endpoint');
|
||||
$table->dropColumn('slack_channel');
|
||||
$table->dropColumn('slack_botname');
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user