Merge branch 'develop' into remove_mcrypt
This commit is contained in:
commit
4800f4c853
1152 changed files with 16643 additions and 7030 deletions
|
@ -3271,6 +3271,15 @@
|
||||||
"contributions": [
|
"contributions": [
|
||||||
"code"
|
"code"
|
||||||
]
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "addex12",
|
||||||
|
"name": "Adugna Gizaw",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/18550946?v=4",
|
||||||
|
"profile": "https://orbalia.pythonanywhere.com/",
|
||||||
|
"contributions": [
|
||||||
|
"translation"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,7 +11,7 @@ MYSQL_ROOT_PASSWORD=changeme1234
|
||||||
# REQUIRED: BASIC APP SETTINGS
|
# REQUIRED: BASIC APP SETTINGS
|
||||||
# --------------------------------------------
|
# --------------------------------------------
|
||||||
APP_ENV=develop
|
APP_ENV=develop
|
||||||
APP_DEBUG=false
|
APP_DEBUG=true
|
||||||
# please regenerate the APP_KEY value by calling `docker-compose run --rm snipeit bash` and then `php artisan key:generate --show` and then copy paste the value here
|
# please regenerate the APP_KEY value by calling `docker-compose run --rm snipeit bash` and then `php artisan key:generate --show` and then copy paste the value here
|
||||||
APP_KEY=base64:3ilviXqB9u6DX1NRcyWGJ+sjySF+H18CPDGb3+IVwMQ=
|
APP_KEY=base64:3ilviXqB9u6DX1NRcyWGJ+sjySF+H18CPDGb3+IVwMQ=
|
||||||
APP_URL=http://localhost:8000
|
APP_URL=http://localhost:8000
|
||||||
|
@ -158,7 +158,7 @@ RESET_PASSWORD_LINK_EXPIRES=900
|
||||||
# --------------------------------------------
|
# --------------------------------------------
|
||||||
# OPTIONAL: MISC
|
# OPTIONAL: MISC
|
||||||
# --------------------------------------------
|
# --------------------------------------------
|
||||||
LOG_CHANNEL=stderr
|
LOG_CHANNEL=single
|
||||||
LOG_MAX_DAYS=10
|
LOG_MAX_DAYS=10
|
||||||
APP_LOCKED=false
|
APP_LOCKED=false
|
||||||
APP_CIPHER=AES-256-CBC
|
APP_CIPHER=AES-256-CBC
|
||||||
|
|
2
.github/workflows/tests-mysql.yml
vendored
2
.github/workflows/tests-mysql.yml
vendored
|
@ -25,9 +25,9 @@ jobs:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
php-version:
|
php-version:
|
||||||
- "8.1"
|
|
||||||
- "8.2"
|
- "8.2"
|
||||||
- "8.3"
|
- "8.3"
|
||||||
|
- "8.4"
|
||||||
|
|
||||||
name: PHP ${{ matrix.php-version }}
|
name: PHP ${{ matrix.php-version }}
|
||||||
|
|
||||||
|
|
3
.github/workflows/tests-postgres.yml
vendored
3
.github/workflows/tests-postgres.yml
vendored
|
@ -21,9 +21,10 @@ jobs:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
php-version:
|
php-version:
|
||||||
- "8.1"
|
|
||||||
- "8.2"
|
- "8.2"
|
||||||
- "8.3"
|
- "8.3"
|
||||||
|
- "8.4"
|
||||||
|
|
||||||
|
|
||||||
name: PHP ${{ matrix.php-version }}
|
name: PHP ${{ matrix.php-version }}
|
||||||
|
|
||||||
|
|
2
.github/workflows/tests-sqlite.yml
vendored
2
.github/workflows/tests-sqlite.yml
vendored
|
@ -15,7 +15,7 @@ jobs:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
php-version:
|
php-version:
|
||||||
- "8.1.1"
|
- "8.3"
|
||||||
|
|
||||||
name: PHP ${{ matrix.php-version }}
|
name: PHP ${{ matrix.php-version }}
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
"DOC3": "Please don't rely on these versions for planning upgrades unless you've fetched the most recent version",
|
"DOC3": "Please don't rely on these versions for planning upgrades unless you've fetched the most recent version",
|
||||||
"DOC4": "You should really just ignore it and run upgrade.php. Really",
|
"DOC4": "You should really just ignore it and run upgrade.php. Really",
|
||||||
"php_min_version": "8.1.0",
|
"php_min_version": "8.1.0",
|
||||||
"php_max_major_minor": "8.3",
|
"php_max_major_minor": "8.4",
|
||||||
"php_max_wontwork": "8.4.0",
|
"php_max_wontwork": "8.5.0",
|
||||||
"current_snipeit_version": "7.0"
|
"current_snipeit_version": "8.0"
|
||||||
}
|
}
|
||||||
|
|
|
@ -53,7 +53,7 @@ Thanks goes to all of these wonderful people ([emoji key](https://github.com/ken
|
||||||
| [<img src="https://avatars.githubusercontent.com/u/55590532?v=4" width="110px;"/><br /><sub>squintfox</sub>](https://github.com/squintfox)<br />[💻](https://github.com/snipe/snipe-it/commits?author=squintfox "Code") | [<img src="https://avatars.githubusercontent.com/u/1380084?v=4" width="110px;"/><br /><sub>Jeff Clay</sub>](https://github.com/jeffclay)<br />[💻](https://github.com/snipe/snipe-it/commits?author=jeffclay "Code") | [<img src="https://avatars.githubusercontent.com/u/52716446?v=4" width="110px;"/><br /><sub>Phil J R</sub>](https://github.com/PP-JN-RL)<br />[💻](https://github.com/snipe/snipe-it/commits?author=PP-JN-RL "Code") | [<img src="https://avatars.githubusercontent.com/u/1496725?v=4" width="110px;"/><br /><sub>i_virus</sub>](https://www.corelight.com/)<br />[💻](https://github.com/snipe/snipe-it/commits?author=chandanchowdhury "Code") | [<img src="https://avatars.githubusercontent.com/u/1020541?v=4" width="110px;"/><br /><sub>Paul Grime</sub>](https://github.com/gitgrimbo)<br />[💻](https://github.com/snipe/snipe-it/commits?author=gitgrimbo "Code") | [<img src="https://avatars.githubusercontent.com/u/922815?v=4" width="110px;"/><br /><sub>Lee Porte</sub>](https://leeporte.co.uk)<br />[💻](https://github.com/snipe/snipe-it/commits?author=LeePorte "Code") | [<img src="https://avatars.githubusercontent.com/u/23613427?v=4" width="110px;"/><br /><sub>BRYAN </sub>](https://github.com/bryanlopezinc)<br />[💻](https://github.com/snipe/snipe-it/commits?author=bryanlopezinc "Code") [⚠️](https://github.com/snipe/snipe-it/commits?author=bryanlopezinc "Tests") |
|
| [<img src="https://avatars.githubusercontent.com/u/55590532?v=4" width="110px;"/><br /><sub>squintfox</sub>](https://github.com/squintfox)<br />[💻](https://github.com/snipe/snipe-it/commits?author=squintfox "Code") | [<img src="https://avatars.githubusercontent.com/u/1380084?v=4" width="110px;"/><br /><sub>Jeff Clay</sub>](https://github.com/jeffclay)<br />[💻](https://github.com/snipe/snipe-it/commits?author=jeffclay "Code") | [<img src="https://avatars.githubusercontent.com/u/52716446?v=4" width="110px;"/><br /><sub>Phil J R</sub>](https://github.com/PP-JN-RL)<br />[💻](https://github.com/snipe/snipe-it/commits?author=PP-JN-RL "Code") | [<img src="https://avatars.githubusercontent.com/u/1496725?v=4" width="110px;"/><br /><sub>i_virus</sub>](https://www.corelight.com/)<br />[💻](https://github.com/snipe/snipe-it/commits?author=chandanchowdhury "Code") | [<img src="https://avatars.githubusercontent.com/u/1020541?v=4" width="110px;"/><br /><sub>Paul Grime</sub>](https://github.com/gitgrimbo)<br />[💻](https://github.com/snipe/snipe-it/commits?author=gitgrimbo "Code") | [<img src="https://avatars.githubusercontent.com/u/922815?v=4" width="110px;"/><br /><sub>Lee Porte</sub>](https://leeporte.co.uk)<br />[💻](https://github.com/snipe/snipe-it/commits?author=LeePorte "Code") | [<img src="https://avatars.githubusercontent.com/u/23613427?v=4" width="110px;"/><br /><sub>BRYAN </sub>](https://github.com/bryanlopezinc)<br />[💻](https://github.com/snipe/snipe-it/commits?author=bryanlopezinc "Code") [⚠️](https://github.com/snipe/snipe-it/commits?author=bryanlopezinc "Tests") |
|
||||||
| [<img src="https://avatars.githubusercontent.com/u/64061710?v=4" width="110px;"/><br /><sub>U-H-T</sub>](https://github.com/U-H-T)<br />[💻](https://github.com/snipe/snipe-it/commits?author=U-H-T "Code") | [<img src="https://avatars.githubusercontent.com/u/5395363?v=4" width="110px;"/><br /><sub>Matt Tyree</sub>](https://github.com/Tyree)<br />[📖](https://github.com/snipe/snipe-it/commits?author=Tyree "Documentation") | [<img src="https://avatars.githubusercontent.com/u/292081?v=4" width="110px;"/><br /><sub>Florent Bervas</sub>](http://spoontux.net)<br />[💻](https://github.com/snipe/snipe-it/commits?author=FlorentDotMe "Code") | [<img src="https://avatars.githubusercontent.com/u/4498077?v=4" width="110px;"/><br /><sub>Daniel Albertsen</sub>](https://ditscheri.com)<br />[💻](https://github.com/snipe/snipe-it/commits?author=dbakan "Code") | [<img src="https://avatars.githubusercontent.com/u/100710244?v=4" width="110px;"/><br /><sub>r-xyz</sub>](https://github.com/r-xyz)<br />[💻](https://github.com/snipe/snipe-it/commits?author=r-xyz "Code") | [<img src="https://avatars.githubusercontent.com/u/47491036?v=4" width="110px;"/><br /><sub>Steven Mainor</sub>](https://github.com/DrekiDegga)<br />[💻](https://github.com/snipe/snipe-it/commits?author=DrekiDegga "Code") | [<img src="https://avatars.githubusercontent.com/u/65785975?v=4" width="110px;"/><br /><sub>arne-kroeger</sub>](https://github.com/arne-kroeger)<br />[💻](https://github.com/snipe/snipe-it/commits?author=arne-kroeger "Code") |
|
| [<img src="https://avatars.githubusercontent.com/u/64061710?v=4" width="110px;"/><br /><sub>U-H-T</sub>](https://github.com/U-H-T)<br />[💻](https://github.com/snipe/snipe-it/commits?author=U-H-T "Code") | [<img src="https://avatars.githubusercontent.com/u/5395363?v=4" width="110px;"/><br /><sub>Matt Tyree</sub>](https://github.com/Tyree)<br />[📖](https://github.com/snipe/snipe-it/commits?author=Tyree "Documentation") | [<img src="https://avatars.githubusercontent.com/u/292081?v=4" width="110px;"/><br /><sub>Florent Bervas</sub>](http://spoontux.net)<br />[💻](https://github.com/snipe/snipe-it/commits?author=FlorentDotMe "Code") | [<img src="https://avatars.githubusercontent.com/u/4498077?v=4" width="110px;"/><br /><sub>Daniel Albertsen</sub>](https://ditscheri.com)<br />[💻](https://github.com/snipe/snipe-it/commits?author=dbakan "Code") | [<img src="https://avatars.githubusercontent.com/u/100710244?v=4" width="110px;"/><br /><sub>r-xyz</sub>](https://github.com/r-xyz)<br />[💻](https://github.com/snipe/snipe-it/commits?author=r-xyz "Code") | [<img src="https://avatars.githubusercontent.com/u/47491036?v=4" width="110px;"/><br /><sub>Steven Mainor</sub>](https://github.com/DrekiDegga)<br />[💻](https://github.com/snipe/snipe-it/commits?author=DrekiDegga "Code") | [<img src="https://avatars.githubusercontent.com/u/65785975?v=4" width="110px;"/><br /><sub>arne-kroeger</sub>](https://github.com/arne-kroeger)<br />[💻](https://github.com/snipe/snipe-it/commits?author=arne-kroeger "Code") |
|
||||||
| [<img src="https://avatars.githubusercontent.com/u/167117705?v=4" width="110px;"/><br /><sub>Glukose1</sub>](https://github.com/Glukose1)<br />[💻](https://github.com/snipe/snipe-it/commits?author=Glukose1 "Code") | [<img src="https://avatars.githubusercontent.com/u/1197791?v=4" width="110px;"/><br /><sub>Scarzy</sub>](https://github.com/Scarzy)<br />[💻](https://github.com/snipe/snipe-it/commits?author=Scarzy "Code") | [<img src="https://avatars.githubusercontent.com/u/37372069?v=4" width="110px;"/><br /><sub>setpill</sub>](https://github.com/setpill)<br />[💻](https://github.com/snipe/snipe-it/commits?author=setpill "Code") | [<img src="https://avatars.githubusercontent.com/u/3755203?v=4" width="110px;"/><br /><sub>swift2512</sub>](https://github.com/swift2512)<br />[🐛](https://github.com/snipe/snipe-it/issues?q=author%3Aswift2512 "Bug reports") | [<img src="https://avatars.githubusercontent.com/u/6136439?v=4" width="110px;"/><br /><sub>Darren Rainey</sub>](https://darrenraineys.co.uk)<br />[💻](https://github.com/snipe/snipe-it/commits?author=DarrenRainey "Code") | [<img src="https://avatars.githubusercontent.com/u/133033121?v=4" width="110px;"/><br /><sub>maciej-poleszczyk</sub>](https://github.com/maciej-poleszczyk)<br />[💻](https://github.com/snipe/snipe-it/commits?author=maciej-poleszczyk "Code") | [<img src="https://avatars.githubusercontent.com/u/143394709?v=4" width="110px;"/><br /><sub>Sebastian Groß</sub>](https://github.com/sgross-emlix)<br />[💻](https://github.com/snipe/snipe-it/commits?author=sgross-emlix "Code") |
|
| [<img src="https://avatars.githubusercontent.com/u/167117705?v=4" width="110px;"/><br /><sub>Glukose1</sub>](https://github.com/Glukose1)<br />[💻](https://github.com/snipe/snipe-it/commits?author=Glukose1 "Code") | [<img src="https://avatars.githubusercontent.com/u/1197791?v=4" width="110px;"/><br /><sub>Scarzy</sub>](https://github.com/Scarzy)<br />[💻](https://github.com/snipe/snipe-it/commits?author=Scarzy "Code") | [<img src="https://avatars.githubusercontent.com/u/37372069?v=4" width="110px;"/><br /><sub>setpill</sub>](https://github.com/setpill)<br />[💻](https://github.com/snipe/snipe-it/commits?author=setpill "Code") | [<img src="https://avatars.githubusercontent.com/u/3755203?v=4" width="110px;"/><br /><sub>swift2512</sub>](https://github.com/swift2512)<br />[🐛](https://github.com/snipe/snipe-it/issues?q=author%3Aswift2512 "Bug reports") | [<img src="https://avatars.githubusercontent.com/u/6136439?v=4" width="110px;"/><br /><sub>Darren Rainey</sub>](https://darrenraineys.co.uk)<br />[💻](https://github.com/snipe/snipe-it/commits?author=DarrenRainey "Code") | [<img src="https://avatars.githubusercontent.com/u/133033121?v=4" width="110px;"/><br /><sub>maciej-poleszczyk</sub>](https://github.com/maciej-poleszczyk)<br />[💻](https://github.com/snipe/snipe-it/commits?author=maciej-poleszczyk "Code") | [<img src="https://avatars.githubusercontent.com/u/143394709?v=4" width="110px;"/><br /><sub>Sebastian Groß</sub>](https://github.com/sgross-emlix)<br />[💻](https://github.com/snipe/snipe-it/commits?author=sgross-emlix "Code") |
|
||||||
| [<img src="https://avatars.githubusercontent.com/u/41107778?v=4" width="110px;"/><br /><sub>Anouar Touati</sub>](https://github.com/AnouarTouati)<br />[💻](https://github.com/snipe/snipe-it/commits?author=AnouarTouati "Code") | [<img src="https://avatars.githubusercontent.com/u/25596663?v=4" width="110px;"/><br /><sub>aHVzY2g</sub>](https://github.com/aHVzY2g)<br />[💻](https://github.com/snipe/snipe-it/commits?author=aHVzY2g "Code") | [<img src="https://avatars.githubusercontent.com/u/13408130?v=4" width="110px;"/><br /><sub>林博仁 Buo-ren Lin</sub>](https://brlin.me)<br />[💻](https://github.com/snipe/snipe-it/commits?author=brlin-tw "Code") |
|
| [<img src="https://avatars.githubusercontent.com/u/41107778?v=4" width="110px;"/><br /><sub>Anouar Touati</sub>](https://github.com/AnouarTouati)<br />[💻](https://github.com/snipe/snipe-it/commits?author=AnouarTouati "Code") | [<img src="https://avatars.githubusercontent.com/u/25596663?v=4" width="110px;"/><br /><sub>aHVzY2g</sub>](https://github.com/aHVzY2g)<br />[💻](https://github.com/snipe/snipe-it/commits?author=aHVzY2g "Code") | [<img src="https://avatars.githubusercontent.com/u/13408130?v=4" width="110px;"/><br /><sub>林博仁 Buo-ren Lin</sub>](https://brlin.me)<br />[💻](https://github.com/snipe/snipe-it/commits?author=brlin-tw "Code") | [<img src="https://avatars.githubusercontent.com/u/18550946?v=4" width="110px;"/><br /><sub>Adugna Gizaw</sub>](https://orbalia.pythonanywhere.com/)<br />[🌍](#translation-addex12 "Translation") |
|
||||||
<!-- ALL-CONTRIBUTORS-LIST:END -->
|
<!-- ALL-CONTRIBUTORS-LIST:END -->
|
||||||
|
|
||||||
This project follows the [all-contributors](https://github.com/kentcdodds/all-contributors) specification. Contributions of any kind welcome!
|
This project follows the [all-contributors](https://github.com/kentcdodds/all-contributors) specification. Contributions of any kind welcome!
|
||||||
|
|
31
Dockerfile
31
Dockerfile
|
@ -1,4 +1,4 @@
|
||||||
FROM ubuntu:22.04
|
FROM ubuntu:24.04
|
||||||
LABEL maintainer="Brady Wetherington <bwetherington@grokability.com>"
|
LABEL maintainer="Brady Wetherington <bwetherington@grokability.com>"
|
||||||
|
|
||||||
# No need to add `apt-get clean` here, reference:
|
# No need to add `apt-get clean` here, reference:
|
||||||
|
@ -14,16 +14,16 @@ RUN export DEBIAN_FRONTEND=noninteractive; \
|
||||||
apt-utils \
|
apt-utils \
|
||||||
apache2 \
|
apache2 \
|
||||||
apache2-bin \
|
apache2-bin \
|
||||||
libapache2-mod-php8.1 \
|
libapache2-mod-php8.3 \
|
||||||
php8.1-curl \
|
php8.3-curl \
|
||||||
php8.1-ldap \
|
php8.3-ldap \
|
||||||
php8.1-mysql \
|
php8.3-mysql \
|
||||||
php8.1-gd \
|
php8.3-gd \
|
||||||
php8.1-xml \
|
php8.3-xml \
|
||||||
php8.1-mbstring \
|
php8.3-mbstring \
|
||||||
php8.1-zip \
|
php8.3-zip \
|
||||||
php8.1-bcmath \
|
php8.3-bcmath \
|
||||||
php8.1-redis \
|
php8.3-redis \
|
||||||
php-memcached \
|
php-memcached \
|
||||||
patch \
|
patch \
|
||||||
curl \
|
curl \
|
||||||
|
@ -40,7 +40,8 @@ autoconf \
|
||||||
libc-dev \
|
libc-dev \
|
||||||
libldap-common \
|
libldap-common \
|
||||||
pkg-config \
|
pkg-config \
|
||||||
php8.1-dev \
|
libmcrypt-dev \
|
||||||
|
php8.3-dev \
|
||||||
ca-certificates \
|
ca-certificates \
|
||||||
unzip \
|
unzip \
|
||||||
dnsutils \
|
dnsutils \
|
||||||
|
@ -53,10 +54,10 @@ RUN php go-pear.phar
|
||||||
RUN phpenmod gd
|
RUN phpenmod gd
|
||||||
RUN phpenmod bcmath
|
RUN phpenmod bcmath
|
||||||
|
|
||||||
RUN sed -i 's/variables_order = .*/variables_order = "EGPCS"/' /etc/php/8.1/apache2/php.ini
|
RUN sed -i 's/variables_order = .*/variables_order = "EGPCS"/' /etc/php/8.3/apache2/php.ini
|
||||||
RUN sed -i 's/variables_order = .*/variables_order = "EGPCS"/' /etc/php/8.1/cli/php.ini
|
RUN sed -i 's/variables_order = .*/variables_order = "EGPCS"/' /etc/php/8.3/cli/php.ini
|
||||||
|
|
||||||
RUN useradd -m --uid 1000 --gid 50 docker
|
RUN useradd -m --uid 10000 --gid 50 docker
|
||||||
|
|
||||||
RUN echo export APACHE_RUN_USER=docker >> /etc/apache2/envvars
|
RUN echo export APACHE_RUN_USER=docker >> /etc/apache2/envvars
|
||||||
RUN echo export APACHE_RUN_GROUP=staff >> /etc/apache2/envvars
|
RUN echo export APACHE_RUN_GROUP=staff >> /etc/apache2/envvars
|
||||||
|
|
|
@ -73,7 +73,7 @@ RUN mkdir -p /var/www/.composer && chown apache /var/www/.composer
|
||||||
|
|
||||||
# Install dependencies
|
# Install dependencies
|
||||||
USER apache
|
USER apache
|
||||||
RUN COMPOSER_CACHE_DIR=/dev/null composer install --no-dev --working-dir=/var/www/html
|
RUN COMPOSER_CACHE_DIR=/dev/null composer install --working-dir=/var/www/html
|
||||||
|
|
||||||
USER root
|
USER root
|
||||||
|
|
||||||
|
|
|
@ -65,7 +65,7 @@ class ResetDemoSettings extends Command
|
||||||
$settings->thumbnail_max_h = '30';
|
$settings->thumbnail_max_h = '30';
|
||||||
$settings->locale = 'en-US';
|
$settings->locale = 'en-US';
|
||||||
$settings->version_footer = 'on';
|
$settings->version_footer = 'on';
|
||||||
$settings->support_footer = null;
|
$settings->support_footer = 'on';
|
||||||
$settings->saml_enabled = '0';
|
$settings->saml_enabled = '0';
|
||||||
$settings->saml_sp_x509cert = null;
|
$settings->saml_sp_x509cert = null;
|
||||||
$settings->saml_idp_metadata = null;
|
$settings->saml_idp_metadata = null;
|
||||||
|
|
|
@ -2,13 +2,13 @@
|
||||||
|
|
||||||
namespace App\Console\Commands;
|
namespace App\Console\Commands;
|
||||||
|
|
||||||
|
use App\Mail\ExpiringAssetsMail;
|
||||||
|
use App\Mail\ExpiringLicenseMail;
|
||||||
use App\Models\Asset;
|
use App\Models\Asset;
|
||||||
use App\Models\License;
|
use App\Models\License;
|
||||||
use App\Models\Recipients\AlertRecipient;
|
|
||||||
use App\Models\Setting;
|
use App\Models\Setting;
|
||||||
use App\Notifications\ExpiringAssetsNotification;
|
|
||||||
use App\Notifications\ExpiringLicenseNotification;
|
|
||||||
use Illuminate\Console\Command;
|
use Illuminate\Console\Command;
|
||||||
|
use Illuminate\Support\Facades\Mail;
|
||||||
|
|
||||||
class SendExpirationAlerts extends Command
|
class SendExpirationAlerts extends Command
|
||||||
{
|
{
|
||||||
|
@ -47,22 +47,22 @@ class SendExpirationAlerts extends Command
|
||||||
if (($settings->alert_email != '') && ($settings->alerts_enabled == 1)) {
|
if (($settings->alert_email != '') && ($settings->alerts_enabled == 1)) {
|
||||||
|
|
||||||
// Send a rollup to the admin, if settings dictate
|
// Send a rollup to the admin, if settings dictate
|
||||||
$recipients = collect(explode(',', $settings->alert_email))->map(function ($item, $key) {
|
$recipients = collect(explode(',', $settings->alert_email))
|
||||||
return new AlertRecipient($item);
|
->map(fn($item) => trim($item)) // Trim each email
|
||||||
});
|
->all();
|
||||||
|
|
||||||
// Expiring Assets
|
// Expiring Assets
|
||||||
$assets = Asset::getExpiringWarrantee($threshold);
|
$assets = Asset::getExpiringWarrantee($threshold);
|
||||||
|
|
||||||
if ($assets->count() > 0) {
|
if ($assets->count() > 0) {
|
||||||
$this->info(trans_choice('mail.assets_warrantee_alert', $assets->count(), ['count' => $assets->count(), 'threshold' => $threshold]));
|
$this->info(trans_choice('mail.assets_warrantee_alert', $assets->count(), ['count' => $assets->count(), 'threshold' => $threshold]));
|
||||||
\Notification::send($recipients, new ExpiringAssetsNotification($assets, $threshold));
|
Mail::to($recipients)->send(new ExpiringAssetsMail($assets, $threshold));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Expiring licenses
|
// Expiring licenses
|
||||||
$licenses = License::getExpiringLicenses($threshold);
|
$licenses = License::getExpiringLicenses($threshold);
|
||||||
if ($licenses->count() > 0) {
|
if ($licenses->count() > 0) {
|
||||||
$this->info(trans_choice('mail.license_expiring_alert', $licenses->count(), ['count' => $licenses->count(), 'threshold' => $threshold]));
|
$this->info(trans_choice('mail.license_expiring_alert', $licenses->count(), ['count' => $licenses->count(), 'threshold' => $threshold]));
|
||||||
\Notification::send($recipients, new ExpiringLicenseNotification($licenses, $threshold));
|
Mail::to($recipients)->send(new ExpiringLicenseMail($licenses, $threshold));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if ($settings->alert_email == '') {
|
if ($settings->alert_email == '') {
|
||||||
|
|
|
@ -122,6 +122,27 @@ class Handler extends ExceptionHandler
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// This is traaaaash but it handles models that are not found while using route model binding :(
|
||||||
|
// The only alternative is to set that at *each* route, which is crazypants
|
||||||
|
if ($e instanceof \Illuminate\Database\Eloquent\ModelNotFoundException) {
|
||||||
|
$model_name = last(explode('\\', $e->getModel()));
|
||||||
|
$route = str_plural(strtolower(last(explode('\\', $e->getModel())))).'.index';
|
||||||
|
|
||||||
|
// Sigh.
|
||||||
|
if ($route == 'assets.index') {
|
||||||
|
$route = 'hardware.index';
|
||||||
|
} elseif ($route == 'reporttemplates.index') {
|
||||||
|
$route = 'reports/custom';
|
||||||
|
} elseif ($route == 'assetmodels.index') {
|
||||||
|
$route = 'models.index';
|
||||||
|
} elseif ($route == 'predefinedkits.index') {
|
||||||
|
$route = 'kits.index';
|
||||||
|
}
|
||||||
|
|
||||||
|
return redirect()
|
||||||
|
->route($route)
|
||||||
|
->withError(trans('general.generic_model_not_found', ['model' => $model_name]));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
if ($this->isHttpException($e) && (isset($statusCode)) && ($statusCode == '404' )) {
|
if ($this->isHttpException($e) && (isset($statusCode)) && ($statusCode == '404' )) {
|
||||||
|
|
|
@ -1520,11 +1520,11 @@ class Helper
|
||||||
if ($redirect_option == 'target') {
|
if ($redirect_option == 'target') {
|
||||||
switch ($checkout_to_type) {
|
switch ($checkout_to_type) {
|
||||||
case 'user':
|
case 'user':
|
||||||
return route('users.show', ['user' => $request->assigned_user]);
|
return route('users.show', $request->assigned_user);
|
||||||
case 'location':
|
case 'location':
|
||||||
return route('locations.show', ['location' => $request->assigned_location]);
|
return route('locations.show', $request->assigned_location);
|
||||||
case 'asset':
|
case 'asset':
|
||||||
return route('hardware.show', ['hardware' => $request->assigned_asset]);
|
return route('hardware.show', $request->assigned_asset);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return redirect()->back()->with('error', trans('admin/hardware/message.checkout.error'));
|
return redirect()->back()->with('error', trans('admin/hardware/message.checkout.error'));
|
||||||
|
|
|
@ -59,6 +59,8 @@ class IconHelper
|
||||||
return 'fas fa-cog';
|
return 'fas fa-cog';
|
||||||
case 'angle-left':
|
case 'angle-left':
|
||||||
return 'fas fa-angle-left';
|
return 'fas fa-angle-left';
|
||||||
|
case 'angle-right':
|
||||||
|
return 'fas fa-angle-right';
|
||||||
case 'warning':
|
case 'warning':
|
||||||
return 'fas fa-exclamation-triangle';
|
return 'fas fa-exclamation-triangle';
|
||||||
case 'kits':
|
case 'kits':
|
||||||
|
@ -184,7 +186,11 @@ class IconHelper
|
||||||
return 'fa-regular fa-id-card';
|
return 'fa-regular fa-id-card';
|
||||||
case 'department' :
|
case 'department' :
|
||||||
return 'fa-solid fa-building-user';
|
return 'fa-solid fa-building-user';
|
||||||
|
case 'home' :
|
||||||
|
return 'fa-solid fa-house';
|
||||||
|
case 'note':
|
||||||
|
case 'notes':
|
||||||
|
return 'fas fa-sticky-note';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -95,16 +95,10 @@ class AccessoriesController extends Controller
|
||||||
* @author [A. Gianotto] [<snipe@snipe.net>]
|
* @author [A. Gianotto] [<snipe@snipe.net>]
|
||||||
* @param int $accessoryId
|
* @param int $accessoryId
|
||||||
*/
|
*/
|
||||||
public function edit($accessoryId = null) : View | RedirectResponse
|
public function edit(Accessory $accessory) : View | RedirectResponse
|
||||||
{
|
{
|
||||||
|
$this->authorize('update', Accessory::class);
|
||||||
if ($item = Accessory::find($accessoryId)) {
|
return view('accessories.edit')->with('item', $accessory)->with('category_type', 'accessory');
|
||||||
$this->authorize($item);
|
|
||||||
return view('accessories.edit', compact('item'))->with('category_type', 'accessory');
|
|
||||||
}
|
|
||||||
|
|
||||||
return redirect()->route('accessories.index')->with('error', trans('admin/accessories/message.does_not_exist'));
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -114,19 +108,12 @@ class AccessoriesController extends Controller
|
||||||
* @param int $accessoryId
|
* @param int $accessoryId
|
||||||
* @since [v6.0]
|
* @since [v6.0]
|
||||||
*/
|
*/
|
||||||
public function getClone($accessoryId = null) : View | RedirectResponse
|
public function getClone(Accessory $accessory) : View | RedirectResponse
|
||||||
{
|
{
|
||||||
|
|
||||||
$this->authorize('create', Accessory::class);
|
$this->authorize('create', Accessory::class);
|
||||||
|
|
||||||
// Check if the asset exists
|
$accessory = clone $accessory;
|
||||||
if (is_null($accessory_to_clone = Accessory::find($accessoryId))) {
|
|
||||||
// Redirect to the asset management page
|
|
||||||
return redirect()->route('accessories.index')
|
|
||||||
->with('error', trans('admin/accessories/message.does_not_exist', ['id' => $accessoryId]));
|
|
||||||
}
|
|
||||||
|
|
||||||
$accessory = clone $accessory_to_clone;
|
|
||||||
$accessory->id = null;
|
$accessory->id = null;
|
||||||
$accessory->location_id = null;
|
$accessory->location_id = null;
|
||||||
|
|
||||||
|
@ -142,9 +129,9 @@ class AccessoriesController extends Controller
|
||||||
* @param ImageUploadRequest $request
|
* @param ImageUploadRequest $request
|
||||||
* @param int $accessoryId
|
* @param int $accessoryId
|
||||||
*/
|
*/
|
||||||
public function update(ImageUploadRequest $request, $accessoryId = null) : RedirectResponse
|
public function update(ImageUploadRequest $request, Accessory $accessory) : RedirectResponse
|
||||||
{
|
{
|
||||||
if ($accessory = Accessory::withCount('checkouts as checkouts_count')->find($accessoryId)) {
|
if ($accessory = Accessory::withCount('checkouts as checkouts_count')->find($accessory->id)) {
|
||||||
|
|
||||||
$this->authorize($accessory);
|
$this->authorize($accessory);
|
||||||
|
|
||||||
|
@ -231,14 +218,10 @@ class AccessoriesController extends Controller
|
||||||
* @see AccessoriesController::getDataView() method that generates the JSON response
|
* @see AccessoriesController::getDataView() method that generates the JSON response
|
||||||
* @since [v1.0]
|
* @since [v1.0]
|
||||||
*/
|
*/
|
||||||
public function show($accessoryID = null) : View | RedirectResponse
|
public function show(Accessory $accessory) : View | RedirectResponse
|
||||||
{
|
{
|
||||||
$accessory = Accessory::withCount('checkouts as checkouts_count')->find($accessoryID);
|
$accessory = Accessory::withCount('checkouts as checkouts_count')->find($accessory->id);
|
||||||
$this->authorize('view', $accessory);
|
$this->authorize('view', $accessory);
|
||||||
if (isset($accessory->id)) {
|
return view('accessories.view', compact('accessory'));
|
||||||
return view('accessories.view', compact('accessory'));
|
|
||||||
}
|
|
||||||
|
|
||||||
return redirect()->route('accessories.index')->with('error', trans('admin/accessories/message.does_not_exist', ['id' => $accessoryID]));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -51,15 +51,15 @@ class AccessoriesFilesController extends Controller
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
return redirect()->route('accessories.show', $accessory->id)->with('success', trans('general.file_upload_success'));
|
return redirect()->route('accessories.show', $accessory->id)->withFragment('files')->with('success', trans('general.file_upload_success'));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return redirect()->route('accessories.show', $accessory->id)->with('error', trans('general.no_files_uploaded'));
|
return redirect()->route('accessories.show', $accessory->id)->withFragment('files')->with('error', trans('general.no_files_uploaded'));
|
||||||
}
|
}
|
||||||
// Prepare the error message
|
// Prepare the error message
|
||||||
return redirect()->route('accessories.index')
|
return redirect()->route('accessories.index')->with('error', trans('admin/accessories/message.does_not_exist'));
|
||||||
->with('error', trans('general.file_does_not_exist'));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -72,30 +72,27 @@ class AccessoriesFilesController extends Controller
|
||||||
*/
|
*/
|
||||||
public function destroy($accessoryId = null, $fileId = null) : RedirectResponse
|
public function destroy($accessoryId = null, $fileId = null) : RedirectResponse
|
||||||
{
|
{
|
||||||
$accessory = Accessory::find($accessoryId);
|
if ($accessory = Accessory::find($accessoryId)) {
|
||||||
|
|
||||||
// the asset is valid
|
|
||||||
if (isset($accessory->id)) {
|
|
||||||
$this->authorize('update', $accessory);
|
$this->authorize('update', $accessory);
|
||||||
$log = Actionlog::find($fileId);
|
|
||||||
|
|
||||||
// Remove the file if one exists
|
if ($log = Actionlog::find($fileId)) {
|
||||||
if (Storage::exists('accessories/'.$log->filename)) {
|
|
||||||
try {
|
if (Storage::exists('private_uploads/accessories/'.$log->filename)) {
|
||||||
Storage::delete('accessories/'.$log->filename);
|
try {
|
||||||
} catch (\Exception $e) {
|
Storage::delete('private_uploads/accessories/' . $log->filename);
|
||||||
Log::debug($e);
|
$log->delete();
|
||||||
|
return redirect()->back()->withFragment('files')->with('success', trans('admin/hardware/message.deletefile.success'));
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
Log::debug($e);
|
||||||
|
return redirect()->route('accessories.index')->with('error', trans('general.file_does_not_exist'));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
return redirect()->route('accessories.show', ['accessory' => $accessory])->withFragment('files')->with('error', trans('general.log_record_not_found'));
|
||||||
$log->delete();
|
|
||||||
|
|
||||||
return redirect()->back()
|
|
||||||
->with('success', trans('admin/hardware/message.deletefile.success'));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Redirect to the licence management page
|
return redirect()->route('accessories.index')->with('error', trans('admin/accessories/message.does_not_exist'));
|
||||||
return redirect()->route('accessories.index')->with('error', trans('general.file_does_not_exist'));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -125,10 +122,11 @@ class AccessoriesFilesController extends Controller
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return redirect()->route('accessories.show', ['accessory' => $accessory])->with('error', trans('general.log_record_not_found'));
|
return redirect()->route('accessories.show', ['accessory' => $accessory])->withFragment('files')->with('error', trans('general.log_record_not_found'));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return redirect()->route('accessories.index')->with('error', trans('general.file_not_found'));
|
return redirect()->route('accessories.index')->with('error', trans('admin/accessories/message.does_not_exist'));
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,10 +40,13 @@ class ActionlogController extends Controller
|
||||||
public function getStoredEula($filename) : Response | BinaryFileResponse | RedirectResponse
|
public function getStoredEula($filename) : Response | BinaryFileResponse | RedirectResponse
|
||||||
{
|
{
|
||||||
$this->authorize('view', \App\Models\Asset::class);
|
$this->authorize('view', \App\Models\Asset::class);
|
||||||
$file = config('app.private_uploads').'/eula-pdfs/'.$filename;
|
|
||||||
|
if (config('filesystems.default') == 's3_private') {
|
||||||
|
return redirect()->away(Storage::disk('s3_private')->temporaryUrl('private_uploads/eula-pdfs/'.$filename, now()->addMinutes(5)));
|
||||||
|
}
|
||||||
|
|
||||||
if (Storage::exists('private_uploads/eula-pdfs/'.$filename)) {
|
if (Storage::exists('private_uploads/eula-pdfs/'.$filename)) {
|
||||||
return response()->download($file);
|
return response()->download(config('app.private_uploads').'/eula-pdfs/'.$filename);
|
||||||
}
|
}
|
||||||
|
|
||||||
return redirect()->back()->with('error', trans('general.file_does_not_exist'));
|
return redirect()->back()->with('error', trans('general.file_does_not_exist'));
|
||||||
|
|
|
@ -9,6 +9,7 @@ use App\Http\Controllers\Controller;
|
||||||
use App\Models\AssetModel;
|
use App\Models\AssetModel;
|
||||||
use App\Models\Actionlog;
|
use App\Models\Actionlog;
|
||||||
use App\Http\Requests\UploadFileRequest;
|
use App\Http\Requests\UploadFileRequest;
|
||||||
|
use App\Http\Transformers\AssetModelsTransformer;
|
||||||
use Illuminate\Http\JsonResponse;
|
use Illuminate\Http\JsonResponse;
|
||||||
use Illuminate\Support\Facades\Log;
|
use Illuminate\Support\Facades\Log;
|
||||||
use Symfony\Component\HttpFoundation\StreamedResponse;
|
use Symfony\Component\HttpFoundation\StreamedResponse;
|
||||||
|
@ -68,37 +69,15 @@ class AssetModelFilesController extends Controller
|
||||||
/**
|
/**
|
||||||
* List the files for an asset.
|
* List the files for an asset.
|
||||||
*
|
*
|
||||||
* @param int $assetModelId
|
* @param int $assetmodel
|
||||||
* @since [v7.0.12]
|
* @since [v7.0.12]
|
||||||
* @author [r-xyz]
|
* @author [r-xyz]
|
||||||
*/
|
*/
|
||||||
public function list($assetModelId = null) : JsonResponse
|
public function list($assetmodel_id) : JsonResponse | array
|
||||||
{
|
{
|
||||||
// Start by checking if the asset being acted upon exists
|
$assetmodel = AssetModel::with('uploads')->find($assetmodel_id);
|
||||||
if (! $assetModel = AssetModel::find($assetModelId)) {
|
$this->authorize('view', $assetmodel);
|
||||||
return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/models/message.does_not_exist')), 404);
|
return (new AssetModelsTransformer)->transformAssetModelFiles($assetmodel, $assetmodel->uploads()->count());
|
||||||
}
|
|
||||||
|
|
||||||
// the asset is valid
|
|
||||||
if (isset($assetModel->id)) {
|
|
||||||
$this->authorize('view', $assetModel);
|
|
||||||
|
|
||||||
// Check that there are some uploads on this asset that can be listed
|
|
||||||
if ($assetModel->uploads->count() > 0) {
|
|
||||||
$files = array();
|
|
||||||
foreach ($assetModel->uploads as $upload) {
|
|
||||||
array_push($files, $upload);
|
|
||||||
}
|
|
||||||
// Give the list of files back to the user
|
|
||||||
return response()->json(Helper::formatStandardApiResponse('success', $files, trans('admin/models/message.upload.success')));
|
|
||||||
}
|
|
||||||
|
|
||||||
// There are no files.
|
|
||||||
return response()->json(Helper::formatStandardApiResponse('success', array(), trans('admin/models/message.upload.success')));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Send back an error message
|
|
||||||
return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/models/message.download.error')), 500);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -765,9 +765,13 @@ class AssetsController extends Controller
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($problems_updating_encrypted_custom_fields) {
|
if ($problems_updating_encrypted_custom_fields) {
|
||||||
return response()->json(Helper::formatStandardApiResponse('success', (new AssetsTransformer)->transformAsset($asset), trans('admin/hardware/message.update.encrypted_warning')));
|
return response()->json(Helper::formatStandardApiResponse('success', $asset, trans('admin/hardware/message.update.encrypted_warning')));
|
||||||
|
// Below is the *correct* return since it uses the transformer, but we have to use the old, flat return for now until we can update Jamf2Snipe and Kanji2Snipe
|
||||||
|
// return response()->json(Helper::formatStandardApiResponse('success', (new AssetsTransformer)->transformAsset($asset), trans('admin/hardware/message.update.encrypted_warning')));
|
||||||
} else {
|
} else {
|
||||||
return response()->json(Helper::formatStandardApiResponse('success', (new AssetsTransformer)->transformAsset($asset), trans('admin/hardware/message.update.success')));
|
return response()->json(Helper::formatStandardApiResponse('success', $asset, trans('admin/hardware/message.update.success')));
|
||||||
|
// Below is the *correct* return since it uses the transformer, but we have to use the old, flat return for now until we can update Jamf2Snipe and Kanji2Snipe
|
||||||
|
/// return response()->json(Helper::formatStandardApiResponse('success', (new AssetsTransformer)->transformAsset($asset), trans('admin/hardware/message.update.success')));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return response()->json(Helper::formatStandardApiResponse('error', null, $asset->getErrors()), 200);
|
return response()->json(Helper::formatStandardApiResponse('error', null, $asset->getErrors()), 200);
|
||||||
|
@ -1226,7 +1230,10 @@ class AssetsController extends Controller
|
||||||
{
|
{
|
||||||
$this->authorize('view', Asset::class);
|
$this->authorize('view', Asset::class);
|
||||||
$this->authorize('view', $asset);
|
$this->authorize('view', $asset);
|
||||||
$accessory_checkouts = AccessoryCheckout::AssetsAssigned()->with('adminuser')->with('accessories');
|
$accessory_checkouts = AccessoryCheckout::AssetsAssigned()
|
||||||
|
->where('assigned_to', $asset->id)
|
||||||
|
->with('adminuser')
|
||||||
|
->with('accessories');
|
||||||
|
|
||||||
$offset = ($request->input('offset') > $accessory_checkouts->count()) ? $accessory_checkouts->count() : app('api_offset_value');
|
$offset = ($request->input('offset') > $accessory_checkouts->count()) ? $accessory_checkouts->count() : app('api_offset_value');
|
||||||
$limit = app('api_limit_value');
|
$limit = app('api_limit_value');
|
||||||
|
@ -1235,6 +1242,8 @@ class AssetsController extends Controller
|
||||||
$accessory_checkouts = $accessory_checkouts->skip($offset)->take($limit)->get();
|
$accessory_checkouts = $accessory_checkouts->skip($offset)->take($limit)->get();
|
||||||
return (new AssetsTransformer)->transformCheckedoutAccessories($accessory_checkouts, $total);
|
return (new AssetsTransformer)->transformCheckedoutAccessories($accessory_checkouts, $total);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generate asset labels by tag
|
* Generate asset labels by tag
|
||||||
*
|
*
|
||||||
|
|
|
@ -39,6 +39,7 @@ class CategoriesController extends Controller
|
||||||
'components_count',
|
'components_count',
|
||||||
'licenses_count',
|
'licenses_count',
|
||||||
'image',
|
'image',
|
||||||
|
'notes',
|
||||||
];
|
];
|
||||||
|
|
||||||
$categories = Category::select([
|
$categories = Category::select([
|
||||||
|
@ -52,6 +53,7 @@ class CategoriesController extends Controller
|
||||||
'require_acceptance',
|
'require_acceptance',
|
||||||
'checkin_email',
|
'checkin_email',
|
||||||
'image',
|
'image',
|
||||||
|
'notes',
|
||||||
])
|
])
|
||||||
->with('adminuser')
|
->with('adminuser')
|
||||||
->withCount('accessories as accessories_count', 'consumables as consumables_count', 'components as components_count', 'licenses as licenses_count');
|
->withCount('accessories as accessories_count', 'consumables as consumables_count', 'components as components_count', 'licenses as licenses_count');
|
||||||
|
|
|
@ -38,11 +38,12 @@ class CompaniesController extends Controller
|
||||||
'accessories_count',
|
'accessories_count',
|
||||||
'consumables_count',
|
'consumables_count',
|
||||||
'components_count',
|
'components_count',
|
||||||
|
'notes',
|
||||||
];
|
];
|
||||||
|
|
||||||
$companies = Company::withCount(['assets as assets_count' => function ($query) {
|
$companies = Company::withCount(['assets as assets_count' => function ($query) {
|
||||||
$query->AssetsForShow();
|
$query->AssetsForShow();
|
||||||
}])->withCount('assets as assets_count', 'licenses as licenses_count', 'accessories as accessories_count', 'consumables as consumables_count', 'components as components_count', 'users as users_count');
|
}])->withCount('licenses as licenses_count', 'accessories as accessories_count', 'consumables as consumables_count', 'components as components_count', 'users as users_count');
|
||||||
|
|
||||||
if ($request->filled('search')) {
|
if ($request->filled('search')) {
|
||||||
$companies->TextSearch($request->input('search'));
|
$companies->TextSearch($request->input('search'));
|
||||||
|
|
|
@ -48,7 +48,8 @@ class ComponentsController extends Controller
|
||||||
];
|
];
|
||||||
|
|
||||||
$components = Component::select('components.*')
|
$components = Component::select('components.*')
|
||||||
->with('company', 'location', 'category', 'assets', 'supplier', 'adminuser', 'manufacturer');
|
->with('company', 'location', 'category', 'assets', 'supplier', 'adminuser', 'manufacturer', 'uncontrainedAssets')
|
||||||
|
->withSum('uncontrainedAssets', 'components_assets.assigned_qty');
|
||||||
|
|
||||||
if ($request->filled('search')) {
|
if ($request->filled('search')) {
|
||||||
$components = $components->TextSearch($request->input('search'));
|
$components = $components->TextSearch($request->input('search'));
|
||||||
|
@ -197,6 +198,11 @@ class ComponentsController extends Controller
|
||||||
$this->authorize('delete', Component::class);
|
$this->authorize('delete', Component::class);
|
||||||
$component = Component::findOrFail($id);
|
$component = Component::findOrFail($id);
|
||||||
$this->authorize('delete', $component);
|
$this->authorize('delete', $component);
|
||||||
|
|
||||||
|
if ($component->numCheckedOut() > 0) {
|
||||||
|
return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/components/message.delete.error_qty')));
|
||||||
|
}
|
||||||
|
|
||||||
$component->delete();
|
$component->delete();
|
||||||
|
|
||||||
return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/components/message.delete.success')));
|
return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/components/message.delete.success')));
|
||||||
|
|
|
@ -23,7 +23,7 @@ class DepartmentsController extends Controller
|
||||||
public function index(Request $request) : JsonResponse | array
|
public function index(Request $request) : JsonResponse | array
|
||||||
{
|
{
|
||||||
$this->authorize('view', Department::class);
|
$this->authorize('view', Department::class);
|
||||||
$allowed_columns = ['id', 'name', 'image', 'users_count'];
|
$allowed_columns = ['id', 'name', 'image', 'users_count', 'notes'];
|
||||||
|
|
||||||
$departments = Department::select(
|
$departments = Department::select(
|
||||||
'departments.id',
|
'departments.id',
|
||||||
|
@ -35,7 +35,8 @@ class DepartmentsController extends Controller
|
||||||
'departments.manager_id',
|
'departments.manager_id',
|
||||||
'departments.created_at',
|
'departments.created_at',
|
||||||
'departments.updated_at',
|
'departments.updated_at',
|
||||||
'departments.image'
|
'departments.image',
|
||||||
|
'departments.notes',
|
||||||
)->with('users')->with('location')->with('manager')->with('company')->withCount('users as users_count');
|
)->with('users')->with('location')->with('manager')->with('company')->withCount('users as users_count');
|
||||||
|
|
||||||
if ($request->filled('search')) {
|
if ($request->filled('search')) {
|
||||||
|
|
|
@ -24,7 +24,7 @@ class GroupsController extends Controller
|
||||||
|
|
||||||
$this->authorize('view', Group::class);
|
$this->authorize('view', Group::class);
|
||||||
|
|
||||||
$groups = Group::select('id', 'name', 'permissions', 'created_at', 'updated_at', 'created_by')->with('adminuser')->withCount('users as users_count');
|
$groups = Group::select('id', 'name', 'permissions', 'notes', 'created_at', 'updated_at', 'created_by')->with('adminuser')->withCount('users as users_count');
|
||||||
|
|
||||||
if ($request->filled('search')) {
|
if ($request->filled('search')) {
|
||||||
$groups = $groups->TextSearch($request->input('search'));
|
$groups = $groups->TextSearch($request->input('search'));
|
||||||
|
@ -81,6 +81,7 @@ class GroupsController extends Controller
|
||||||
|
|
||||||
$group->name = $request->input('name');
|
$group->name = $request->input('name');
|
||||||
$group->created_by = auth()->id();
|
$group->created_by = auth()->id();
|
||||||
|
$group->notes = $request->input('notes');
|
||||||
$group->permissions = json_encode($request->input('permissions', $groupPermissions));
|
$group->permissions = json_encode($request->input('permissions', $groupPermissions));
|
||||||
|
|
||||||
if ($group->save()) {
|
if ($group->save()) {
|
||||||
|
@ -118,6 +119,7 @@ class GroupsController extends Controller
|
||||||
$group = Group::findOrFail($id);
|
$group = Group::findOrFail($id);
|
||||||
|
|
||||||
$group->name = $request->input('name');
|
$group->name = $request->input('name');
|
||||||
|
$group->notes = $request->input('notes');
|
||||||
$group->permissions = $request->input('permissions'); // Todo - some JSON validation stuff here
|
$group->permissions = $request->input('permissions'); // Todo - some JSON validation stuff here
|
||||||
|
|
||||||
if ($group->save()) {
|
if ($group->save()) {
|
||||||
|
|
|
@ -9,12 +9,14 @@ use App\Http\Transformers\ImportsTransformer;
|
||||||
use App\Models\Asset;
|
use App\Models\Asset;
|
||||||
use App\Models\Company;
|
use App\Models\Company;
|
||||||
use App\Models\Import;
|
use App\Models\Import;
|
||||||
|
use Illuminate\Http\UploadedFile;
|
||||||
use Illuminate\Support\Facades\Artisan;
|
use Illuminate\Support\Facades\Artisan;
|
||||||
use Illuminate\Database\Eloquent\JsonEncodingException;
|
use Illuminate\Database\Eloquent\JsonEncodingException;
|
||||||
use Illuminate\Support\Facades\Request;
|
use Illuminate\Support\Facades\Request;
|
||||||
use Illuminate\Support\Facades\Session;
|
use Illuminate\Support\Facades\Session;
|
||||||
use Illuminate\Support\Facades\Storage;
|
use Illuminate\Support\Facades\Storage;
|
||||||
use League\Csv\Reader;
|
use League\Csv\Reader;
|
||||||
|
use Onnov\DetectEncoding\EncodingDetector;
|
||||||
use Symfony\Component\HttpFoundation\File\Exception\FileException;
|
use Symfony\Component\HttpFoundation\File\Exception\FileException;
|
||||||
use Illuminate\Support\Facades\Log;
|
use Illuminate\Support\Facades\Log;
|
||||||
use Illuminate\Http\JsonResponse;
|
use Illuminate\Http\JsonResponse;
|
||||||
|
@ -45,6 +47,8 @@ class ImportController extends Controller
|
||||||
$path = config('app.private_uploads').'/imports';
|
$path = config('app.private_uploads').'/imports';
|
||||||
$results = [];
|
$results = [];
|
||||||
$import = new Import;
|
$import = new Import;
|
||||||
|
$detector = new EncodingDetector();
|
||||||
|
|
||||||
foreach ($files as $file) {
|
foreach ($files as $file) {
|
||||||
if (! in_array($file->getMimeType(), [
|
if (! in_array($file->getMimeType(), [
|
||||||
'application/vnd.ms-excel',
|
'application/vnd.ms-excel',
|
||||||
|
@ -55,7 +59,6 @@ class ImportController extends Controller
|
||||||
'text/comma-separated-values',
|
'text/comma-separated-values',
|
||||||
'text/tsv', ])) {
|
'text/tsv', ])) {
|
||||||
$results['error'] = 'File type must be CSV. Uploaded file is '.$file->getMimeType();
|
$results['error'] = 'File type must be CSV. Uploaded file is '.$file->getMimeType();
|
||||||
|
|
||||||
return response()->json(Helper::formatStandardApiResponse('error', null, $results['error']), 422);
|
return response()->json(Helper::formatStandardApiResponse('error', null, $results['error']), 422);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -63,7 +66,25 @@ class ImportController extends Controller
|
||||||
if (! ini_get('auto_detect_line_endings')) {
|
if (! ini_get('auto_detect_line_endings')) {
|
||||||
ini_set('auto_detect_line_endings', '1');
|
ini_set('auto_detect_line_endings', '1');
|
||||||
}
|
}
|
||||||
|
$file_contents = $file->getContent(); //TODO - this *does* load the whole file in RAM, but we need that to be able to 'iconv' it?
|
||||||
|
$encoding = $detector->getEncoding($file_contents);
|
||||||
|
$reader = null;
|
||||||
|
if (strcasecmp($encoding, 'UTF-8') != 0) {
|
||||||
|
$transliterated = iconv($encoding, 'UTF-8', $file_contents);
|
||||||
|
if ($transliterated !== false) {
|
||||||
|
$tmpname = tempnam(sys_get_temp_dir(), '');
|
||||||
|
$tmpresults = file_put_contents($tmpname, $transliterated);
|
||||||
|
if ($tmpresults !== false) {
|
||||||
|
$transliterated = null; //save on memory?
|
||||||
|
$newfile = new UploadedFile($tmpname, $file->getClientOriginalName(), null, null, true); //WARNING: this is enabling 'test mode' - which is gross, but otherwise the file won't be treated as 'uploaded'
|
||||||
|
if ($newfile->isValid()) {
|
||||||
|
$file = $newfile;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
$reader = Reader::createFromFileObject($file->openFile('r')); //file pointer leak?
|
$reader = Reader::createFromFileObject($file->openFile('r')); //file pointer leak?
|
||||||
|
$file_contents = null; //try to save on memory, I guess?
|
||||||
|
|
||||||
try {
|
try {
|
||||||
$import->header_row = $reader->fetchOne(0);
|
$import->header_row = $reader->fetchOne(0);
|
||||||
|
|
|
@ -53,6 +53,7 @@ class LocationsController extends Controller
|
||||||
'updated_at',
|
'updated_at',
|
||||||
'users_count',
|
'users_count',
|
||||||
'zip',
|
'zip',
|
||||||
|
'notes',
|
||||||
];
|
];
|
||||||
|
|
||||||
$locations = Location::with('parent', 'manager', 'children')->select([
|
$locations = Location::with('parent', 'manager', 'children')->select([
|
||||||
|
@ -73,6 +74,7 @@ class LocationsController extends Controller
|
||||||
'locations.image',
|
'locations.image',
|
||||||
'locations.ldap_ou',
|
'locations.ldap_ou',
|
||||||
'locations.currency',
|
'locations.currency',
|
||||||
|
'locations.notes',
|
||||||
])
|
])
|
||||||
->withCount('assignedAssets as assigned_assets_count')
|
->withCount('assignedAssets as assigned_assets_count')
|
||||||
->withCount('assets as assets_count')
|
->withCount('assets as assets_count')
|
||||||
|
@ -190,6 +192,7 @@ class LocationsController extends Controller
|
||||||
'locations.updated_at',
|
'locations.updated_at',
|
||||||
'locations.image',
|
'locations.image',
|
||||||
'locations.currency',
|
'locations.currency',
|
||||||
|
'locations.notes',
|
||||||
])
|
])
|
||||||
->withCount('assignedAssets as assigned_assets_count')
|
->withCount('assignedAssets as assigned_assets_count')
|
||||||
->withCount('assets as assets_count')
|
->withCount('assets as assets_count')
|
||||||
|
@ -255,7 +258,7 @@ class LocationsController extends Controller
|
||||||
{
|
{
|
||||||
$this->authorize('view', Accessory::class);
|
$this->authorize('view', Accessory::class);
|
||||||
$this->authorize('view', $location);
|
$this->authorize('view', $location);
|
||||||
$accessory_checkouts = AccessoryCheckout::LocationAssigned()->with('adminuser')->with('accessories');
|
$accessory_checkouts = AccessoryCheckout::LocationAssigned()->where('assigned_to', $location->id)->with('adminuser')->with('accessories');
|
||||||
|
|
||||||
$offset = ($request->input('offset') > $accessory_checkouts->count()) ? $accessory_checkouts->count() : app('api_offset_value');
|
$offset = ($request->input('offset') > $accessory_checkouts->count()) ? $accessory_checkouts->count() : app('api_offset_value');
|
||||||
$limit = app('api_limit_value');
|
$limit = app('api_limit_value');
|
||||||
|
|
|
@ -39,7 +39,8 @@ class ManufacturersController extends Controller
|
||||||
'assets_count',
|
'assets_count',
|
||||||
'consumables_count',
|
'consumables_count',
|
||||||
'components_count',
|
'components_count',
|
||||||
'licenses_count'
|
'licenses_count',
|
||||||
|
'notes',
|
||||||
];
|
];
|
||||||
|
|
||||||
$manufacturers = Manufacturer::select([
|
$manufacturers = Manufacturer::select([
|
||||||
|
@ -55,6 +56,7 @@ class ManufacturersController extends Controller
|
||||||
'updated_at',
|
'updated_at',
|
||||||
'image',
|
'image',
|
||||||
'deleted_at',
|
'deleted_at',
|
||||||
|
'notes',
|
||||||
])
|
])
|
||||||
->with('adminuser')
|
->with('adminuser')
|
||||||
->withCount('assets as assets_count')
|
->withCount('assets as assets_count')
|
||||||
|
|
|
@ -139,19 +139,12 @@ class AssetMaintenancesController extends Controller
|
||||||
* @version v1.0
|
* @version v1.0
|
||||||
* @since [v1.8]
|
* @since [v1.8]
|
||||||
*/
|
*/
|
||||||
public function edit($assetMaintenanceId = null) : View | RedirectResponse
|
public function edit(AssetMaintenance $maintenance) : View | RedirectResponse
|
||||||
{
|
{
|
||||||
$this->authorize('update', Asset::class);
|
$this->authorize('update', Asset::class);
|
||||||
// Check if the asset maintenance exists
|
if ((!$maintenance->asset) || ($maintenance->asset->deleted_at!='')) {
|
||||||
$this->authorize('update', Asset::class);
|
|
||||||
// Check if the asset maintenance exists
|
|
||||||
if (is_null($assetMaintenance = AssetMaintenance::find($assetMaintenanceId))) {
|
|
||||||
// Redirect to the asset maintenance management page
|
|
||||||
return redirect()->route('maintenances.index')->with('error', trans('admin/asset_maintenances/message.not_found'));
|
|
||||||
} elseif ((!$assetMaintenance->asset) || ($assetMaintenance->asset->deleted_at!='')) {
|
|
||||||
// Redirect to the asset maintenance management page
|
|
||||||
return redirect()->route('maintenances.index')->with('error', 'asset does not exist');
|
return redirect()->route('maintenances.index')->with('error', 'asset does not exist');
|
||||||
} elseif (! Company::isCurrentUserHasAccess($assetMaintenance->asset)) {
|
} elseif (! Company::isCurrentUserHasAccess($maintenance->asset)) {
|
||||||
return static::getInsufficientPermissionsRedirect();
|
return static::getInsufficientPermissionsRedirect();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -161,7 +154,7 @@ class AssetMaintenancesController extends Controller
|
||||||
return view('asset_maintenances/edit')
|
return view('asset_maintenances/edit')
|
||||||
->with('selectedAsset', null)
|
->with('selectedAsset', null)
|
||||||
->with('assetMaintenanceType', $assetMaintenanceType)
|
->with('assetMaintenanceType', $assetMaintenanceType)
|
||||||
->with('item', $assetMaintenance);
|
->with('item', $maintenance);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -174,24 +167,20 @@ class AssetMaintenancesController extends Controller
|
||||||
* @version v1.0
|
* @version v1.0
|
||||||
* @since [v1.8]
|
* @since [v1.8]
|
||||||
*/
|
*/
|
||||||
public function update(Request $request, $assetMaintenanceId = null) : View | RedirectResponse
|
public function update(Request $request, AssetMaintenance $maintenance) : View | RedirectResponse
|
||||||
{
|
{
|
||||||
$this->authorize('update', Asset::class);
|
$this->authorize('update', Asset::class);
|
||||||
// Check if the asset maintenance exists
|
|
||||||
if (is_null($assetMaintenance = AssetMaintenance::find($assetMaintenanceId))) {
|
if ((!$maintenance->asset) || ($maintenance->asset->deleted_at!='')) {
|
||||||
// Redirect to the asset maintenance management page
|
|
||||||
return redirect()->route('maintenances.index')->with('error', trans('admin/asset_maintenances/message.not_found'));
|
|
||||||
} elseif ((!$assetMaintenance->asset) || ($assetMaintenance->asset->deleted_at!='')) {
|
|
||||||
// Redirect to the asset maintenance management page
|
|
||||||
return redirect()->route('maintenances.index')->with('error', 'asset does not exist');
|
return redirect()->route('maintenances.index')->with('error', 'asset does not exist');
|
||||||
} elseif (! Company::isCurrentUserHasAccess($assetMaintenance->asset)) {
|
} elseif (! Company::isCurrentUserHasAccess($maintenance->asset)) {
|
||||||
return static::getInsufficientPermissionsRedirect();
|
return static::getInsufficientPermissionsRedirect();
|
||||||
}
|
}
|
||||||
|
|
||||||
$assetMaintenance->supplier_id = $request->input('supplier_id');
|
$maintenance->supplier_id = $request->input('supplier_id');
|
||||||
$assetMaintenance->is_warranty = $request->input('is_warranty');
|
$maintenance->is_warranty = $request->input('is_warranty');
|
||||||
$assetMaintenance->cost = $request->input('cost');
|
$maintenance->cost = $request->input('cost');
|
||||||
$assetMaintenance->notes = $request->input('notes');
|
$maintenance->notes = $request->input('notes');
|
||||||
|
|
||||||
$asset = Asset::find(request('asset_id'));
|
$asset = Asset::find(request('asset_id'));
|
||||||
|
|
||||||
|
@ -200,39 +189,39 @@ class AssetMaintenancesController extends Controller
|
||||||
}
|
}
|
||||||
|
|
||||||
// Save the asset maintenance data
|
// Save the asset maintenance data
|
||||||
$assetMaintenance->asset_id = $request->input('asset_id');
|
$maintenance->asset_id = $request->input('asset_id');
|
||||||
$assetMaintenance->asset_maintenance_type = $request->input('asset_maintenance_type');
|
$maintenance->asset_maintenance_type = $request->input('asset_maintenance_type');
|
||||||
$assetMaintenance->title = $request->input('title');
|
$maintenance->title = $request->input('title');
|
||||||
$assetMaintenance->start_date = $request->input('start_date');
|
$maintenance->start_date = $request->input('start_date');
|
||||||
$assetMaintenance->completion_date = $request->input('completion_date');
|
$maintenance->completion_date = $request->input('completion_date');
|
||||||
|
|
||||||
if (($assetMaintenance->completion_date == null)
|
if (($maintenance->completion_date == null)
|
||||||
) {
|
) {
|
||||||
if (($assetMaintenance->asset_maintenance_time !== 0)
|
if (($maintenance->asset_maintenance_time !== 0)
|
||||||
|| (! is_null($assetMaintenance->asset_maintenance_time))
|
|| (! is_null($maintenance->asset_maintenance_time))
|
||||||
) {
|
) {
|
||||||
$assetMaintenance->asset_maintenance_time = null;
|
$maintenance->asset_maintenance_time = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (($assetMaintenance->completion_date !== null)
|
if (($maintenance->completion_date !== null)
|
||||||
&& ($assetMaintenance->start_date !== '')
|
&& ($maintenance->start_date !== '')
|
||||||
&& ($assetMaintenance->start_date !== '0000-00-00')
|
&& ($maintenance->start_date !== '0000-00-00')
|
||||||
) {
|
) {
|
||||||
$startDate = Carbon::parse($assetMaintenance->start_date);
|
$startDate = Carbon::parse($maintenance->start_date);
|
||||||
$completionDate = Carbon::parse($assetMaintenance->completion_date);
|
$completionDate = Carbon::parse($maintenance->completion_date);
|
||||||
$assetMaintenance->asset_maintenance_time = $completionDate->diffInDays($startDate);
|
$maintenance->asset_maintenance_time = $completionDate->diffInDays($startDate);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Was the asset maintenance created?
|
// Was the asset maintenance created?
|
||||||
if ($assetMaintenance->save()) {
|
if ($maintenance->save()) {
|
||||||
|
|
||||||
// Redirect to the new asset maintenance page
|
// Redirect to the new asset maintenance page
|
||||||
return redirect()->route('maintenances.index')
|
return redirect()->route('maintenances.index')
|
||||||
->with('success', trans('admin/asset_maintenances/message.edit.success'));
|
->with('success', trans('admin/asset_maintenances/message.edit.success'));
|
||||||
}
|
}
|
||||||
|
|
||||||
return redirect()->back()->withInput()->withErrors($assetMaintenance->getErrors());
|
return redirect()->back()->withInput()->withErrors($maintenance->getErrors());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -271,19 +260,13 @@ class AssetMaintenancesController extends Controller
|
||||||
* @version v1.0
|
* @version v1.0
|
||||||
* @since [v1.8]
|
* @since [v1.8]
|
||||||
*/
|
*/
|
||||||
public function show($assetMaintenanceId) : View | RedirectResponse
|
public function show(AssetMaintenance $maintenance) : View | RedirectResponse
|
||||||
{
|
{
|
||||||
$this->authorize('view', Asset::class);
|
$this->authorize('view', Asset::class);
|
||||||
|
if (! Company::isCurrentUserHasAccess($maintenance->asset)) {
|
||||||
// Check if the asset maintenance exists
|
|
||||||
if (is_null($assetMaintenance = AssetMaintenance::find($assetMaintenanceId))) {
|
|
||||||
// Redirect to the asset maintenance management page
|
|
||||||
return redirect()->route('maintenances.index')
|
|
||||||
->with('error', trans('admin/asset_maintenances/message.not_found'));
|
|
||||||
} elseif (! Company::isCurrentUserHasAccess($assetMaintenance->asset)) {
|
|
||||||
return static::getInsufficientPermissionsRedirect();
|
return static::getInsufficientPermissionsRedirect();
|
||||||
}
|
}
|
||||||
|
|
||||||
return view('asset_maintenances/view')->with('assetMaintenance', $assetMaintenance);
|
return view('asset_maintenances/view')->with('assetMaintenance', $maintenance);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -109,16 +109,11 @@ class AssetModelsController extends Controller
|
||||||
* @since [v1.0]
|
* @since [v1.0]
|
||||||
* @param int $modelId
|
* @param int $modelId
|
||||||
*/
|
*/
|
||||||
public function edit($modelId = null) : View | RedirectResponse
|
public function edit(AssetModel $model) : View | RedirectResponse
|
||||||
{
|
{
|
||||||
$this->authorize('update', AssetModel::class);
|
$this->authorize('update', AssetModel::class);
|
||||||
if ($item = AssetModel::find($modelId)) {
|
$category_type = 'asset';
|
||||||
$category_type = 'asset';
|
return view('models/edit', compact('category_type'))->with('item', $model)->with('depreciation_list', Helper::depreciationList());
|
||||||
return view('models/edit', compact('item', 'category_type'))->with('depreciation_list', Helper::depreciationList());
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
return redirect()->route('models.index')->with('error', trans('admin/models/message.does_not_exist'));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -133,16 +128,11 @@ class AssetModelsController extends Controller
|
||||||
* @return \Illuminate\Http\RedirectResponse
|
* @return \Illuminate\Http\RedirectResponse
|
||||||
* @throws \Illuminate\Auth\Access\AuthorizationException
|
* @throws \Illuminate\Auth\Access\AuthorizationException
|
||||||
*/
|
*/
|
||||||
public function update(StoreAssetModelRequest $request, $modelId) : RedirectResponse
|
public function update(StoreAssetModelRequest $request, AssetModel $model) : RedirectResponse
|
||||||
{
|
{
|
||||||
$this->authorize('update', AssetModel::class);
|
$this->authorize('update', AssetModel::class);
|
||||||
|
|
||||||
if (is_null($model = AssetModel::find($modelId))) {
|
|
||||||
return redirect()->route('models.index')->with('error', trans('admin/models/message.does_not_exist'));
|
|
||||||
}
|
|
||||||
|
|
||||||
$model = $request->handleImages($model);
|
$model = $request->handleImages($model);
|
||||||
|
|
||||||
$model->depreciation_id = $request->input('depreciation_id');
|
$model->depreciation_id = $request->input('depreciation_id');
|
||||||
$model->eol = $request->input('eol');
|
$model->eol = $request->input('eol');
|
||||||
$model->name = $request->input('name');
|
$model->name = $request->input('name');
|
||||||
|
@ -188,28 +178,16 @@ class AssetModelsController extends Controller
|
||||||
* @since [v1.0]
|
* @since [v1.0]
|
||||||
* @param int $modelId
|
* @param int $modelId
|
||||||
*/
|
*/
|
||||||
public function destroy($modelId) : RedirectResponse
|
public function destroy(AssetModel $model) : RedirectResponse
|
||||||
{
|
{
|
||||||
$this->authorize('delete', AssetModel::class);
|
$this->authorize('delete', AssetModel::class);
|
||||||
// Check if the model exists
|
|
||||||
if (is_null($model = AssetModel::find($modelId))) {
|
|
||||||
return redirect()->route('models.index')->with('error', trans('admin/models/message.does_not_exist'));
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($model->assets()->count() > 0) {
|
if ($model->assets()->count() > 0) {
|
||||||
// Throw an error that this model is associated with assets
|
// Throw an error that this model is associated with assets
|
||||||
return redirect()->route('models.index')->with('error', trans('admin/models/message.assoc_users'));
|
return redirect()->route('models.index')->with('error', trans('admin/models/message.assoc_users'));
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($model->image) {
|
|
||||||
try {
|
|
||||||
Storage::disk('public')->delete('models/'.$model->image);
|
|
||||||
$model->update(['image' => null]);
|
|
||||||
} catch (\Exception $e) {
|
|
||||||
Log::info($e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Delete the model
|
// Delete the model
|
||||||
$model->delete();
|
$model->delete();
|
||||||
|
|
||||||
|
@ -267,16 +245,10 @@ class AssetModelsController extends Controller
|
||||||
* @since [v1.0]
|
* @since [v1.0]
|
||||||
* @param int $modelId
|
* @param int $modelId
|
||||||
*/
|
*/
|
||||||
public function show($modelId = null) : View | RedirectResponse
|
public function show(AssetModel $model) : View | RedirectResponse
|
||||||
{
|
{
|
||||||
$this->authorize('view', AssetModel::class);
|
$this->authorize('view', AssetModel::class);
|
||||||
$model = AssetModel::withTrashed()->find($modelId);
|
return view('models/view', compact('model'));
|
||||||
|
|
||||||
if (isset($model->id)) {
|
|
||||||
return view('models/view', compact('model'));
|
|
||||||
}
|
|
||||||
|
|
||||||
return redirect()->route('models.index')->with('error', trans('admin/models/message.does_not_exist'));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -286,23 +258,20 @@ class AssetModelsController extends Controller
|
||||||
* @since [v1.0]
|
* @since [v1.0]
|
||||||
* @param int $modelId
|
* @param int $modelId
|
||||||
*/
|
*/
|
||||||
public function getClone($modelId = null) : View | RedirectResponse
|
public function getClone(AssetModel $model) : View | RedirectResponse
|
||||||
{
|
{
|
||||||
$this->authorize('create', AssetModel::class);
|
$this->authorize('create', AssetModel::class);
|
||||||
// Check if the model exists
|
|
||||||
if (is_null($model_to_clone = AssetModel::find($modelId))) {
|
|
||||||
return redirect()->route('models.index')->with('error', trans('admin/models/message.does_not_exist'));
|
|
||||||
}
|
|
||||||
|
|
||||||
$model = clone $model_to_clone;
|
$cloned_model = clone $model;
|
||||||
$model->id = null;
|
$model->id = null;
|
||||||
|
$model->deleted_at = null;
|
||||||
|
|
||||||
// Show the page
|
// Show the page
|
||||||
return view('models/edit')
|
return view('models/edit')
|
||||||
->with('depreciation_list', Helper::depreciationList())
|
->with('depreciation_list', Helper::depreciationList())
|
||||||
->with('item', $model)
|
->with('item', $model)
|
||||||
->with('model_id', $model_to_clone->id)
|
->with('model_id', $model->id)
|
||||||
->with('clone_model', $model_to_clone);
|
->with('clone_model', $cloned_model);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -321,7 +290,7 @@ class AssetModelsController extends Controller
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns a view that allows the user to bulk edit model attrbutes
|
* Returns a view that allows the user to bulk edit model attributes
|
||||||
*
|
*
|
||||||
* @author [A. Gianotto] [<snipe@snipe.net>]
|
* @author [A. Gianotto] [<snipe@snipe.net>]
|
||||||
* @since [v1.7]
|
* @since [v1.7]
|
||||||
|
|
|
@ -44,10 +44,10 @@ class AssetModelsFilesController extends Controller
|
||||||
$model->logUpload($file_name, $request->get('notes'));
|
$model->logUpload($file_name, $request->get('notes'));
|
||||||
}
|
}
|
||||||
|
|
||||||
return redirect()->back()->with('success', trans('general.file_upload_success'));
|
return redirect()->back()->withFragment('files')->with('success', trans('general.file_upload_success'));
|
||||||
}
|
}
|
||||||
|
|
||||||
return redirect()->back()->with('error', trans('admin/hardware/message.upload.nofiles'));
|
return redirect()->back()->withFragment('files')->with('error', trans('admin/hardware/message.upload.nofiles'));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -58,11 +58,9 @@ class AssetModelsFilesController extends Controller
|
||||||
* @param int $fileId
|
* @param int $fileId
|
||||||
* @since [v1.0]
|
* @since [v1.0]
|
||||||
*/
|
*/
|
||||||
public function show($modelId = null, $fileId = null) : StreamedResponse | Response | RedirectResponse | BinaryFileResponse
|
public function show(AssetModel $model, $fileId = null) : StreamedResponse | Response | RedirectResponse | BinaryFileResponse
|
||||||
{
|
{
|
||||||
$model = AssetModel::find($modelId);
|
|
||||||
// the asset is valid
|
|
||||||
if (isset($model->id)) {
|
|
||||||
$this->authorize('view', $model);
|
$this->authorize('view', $model);
|
||||||
|
|
||||||
if (! $log = Actionlog::find($fileId)) {
|
if (! $log = Actionlog::find($fileId)) {
|
||||||
|
@ -87,12 +85,6 @@ class AssetModelsFilesController extends Controller
|
||||||
}
|
}
|
||||||
|
|
||||||
return StorageHelper::downloader($file);
|
return StorageHelper::downloader($file);
|
||||||
}
|
|
||||||
// Prepare the error message
|
|
||||||
$error = trans('admin/hardware/message.does_not_exist', ['id' => $fileId]);
|
|
||||||
|
|
||||||
// Redirect to the hardware management page
|
|
||||||
return redirect()->route('hardware.index')->with('error', $error);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -103,30 +95,21 @@ class AssetModelsFilesController extends Controller
|
||||||
* @param int $fileId
|
* @param int $fileId
|
||||||
* @since [v1.0]
|
* @since [v1.0]
|
||||||
*/
|
*/
|
||||||
public function destroy($modelId = null, $fileId = null) : RedirectResponse
|
public function destroy(AssetModel $model, $fileId = null) : RedirectResponse
|
||||||
{
|
{
|
||||||
$model = AssetModel::find($modelId);
|
|
||||||
$this->authorize('update', $model);
|
|
||||||
$rel_path = 'private_uploads/assetmodels';
|
$rel_path = 'private_uploads/assetmodels';
|
||||||
|
$this->authorize('update', $model);
|
||||||
// the asset is valid
|
$log = Actionlog::find($fileId);
|
||||||
if (isset($model->id)) {
|
if ($log) {
|
||||||
$this->authorize('update', $model);
|
if (Storage::exists($rel_path.'/'.$log->filename)) {
|
||||||
$log = Actionlog::find($fileId);
|
Storage::delete($rel_path.'/'.$log->filename);
|
||||||
if ($log) {
|
|
||||||
if (Storage::exists($rel_path.'/'.$log->filename)) {
|
|
||||||
Storage::delete($rel_path.'/'.$log->filename);
|
|
||||||
}
|
|
||||||
$log->delete();
|
|
||||||
|
|
||||||
return redirect()->back()->with('success', trans('admin/hardware/message.deletefile.success'));
|
|
||||||
}
|
}
|
||||||
|
$log->delete();
|
||||||
|
|
||||||
return redirect()->back()
|
return redirect()->back()->withFragment('files')->with('success', trans('admin/hardware/message.deletefile.success'));
|
||||||
->with('success', trans('admin/hardware/message.deletefile.success'));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Redirect to the hardware management page
|
return redirect()->back()->withFragment('files')->with('success', trans('admin/hardware/message.deletefile.success'));
|
||||||
return redirect()->route('hardware.index')->with('error', trans('admin/hardware/message.does_not_exist'));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,18 +27,12 @@ class AssetCheckinController extends Controller
|
||||||
* @param string $backto
|
* @param string $backto
|
||||||
* @since [v1.0]
|
* @since [v1.0]
|
||||||
*/
|
*/
|
||||||
public function create($assetId, $backto = null) : View | RedirectResponse
|
public function create(Asset $asset, $backto = null) : View | RedirectResponse
|
||||||
{
|
{
|
||||||
// Check if the asset exists
|
|
||||||
if (is_null($asset = Asset::find($assetId))) {
|
|
||||||
// Redirect to the asset management page with error
|
|
||||||
return redirect()->route('hardware.index')->with('error', trans('admin/hardware/message.does_not_exist'));
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->authorize('checkin', $asset);
|
$this->authorize('checkin', $asset);
|
||||||
|
|
||||||
// This asset is already checked in, redirect
|
// This asset is already checked in, redirect
|
||||||
|
|
||||||
if (is_null($asset->assignedTo)) {
|
if (is_null($asset->assignedTo)) {
|
||||||
return redirect()->route('hardware.index')->with('error', trans('admin/hardware/message.checkin.already_checked_in'));
|
return redirect()->route('hardware.index')->with('error', trans('admin/hardware/message.checkin.already_checked_in'));
|
||||||
}
|
}
|
||||||
|
@ -47,7 +41,11 @@ class AssetCheckinController extends Controller
|
||||||
return redirect()->route('hardware.show', $asset->id)->with('error', trans('admin/hardware/general.model_invalid_fix'));
|
return redirect()->route('hardware.show', $asset->id)->with('error', trans('admin/hardware/general.model_invalid_fix'));
|
||||||
}
|
}
|
||||||
|
|
||||||
return view('hardware/checkin', compact('asset'))->with('statusLabel_list', Helper::statusLabelList())->with('backto', $backto)->with('table_name', 'Assets');
|
return view('hardware/checkin', compact('asset'))
|
||||||
|
->with('item', $asset)
|
||||||
|
->with('statusLabel_list', Helper::statusLabelList())
|
||||||
|
->with('backto', $backto)
|
||||||
|
->with('table_name', 'Assets');
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -91,6 +89,9 @@ class AssetCheckinController extends Controller
|
||||||
$asset->status_id = e($request->get('status_id'));
|
$asset->status_id = e($request->get('status_id'));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Add any custom fields that should be included in the checkout
|
||||||
|
$asset->customFieldsForCheckinCheckout('display_checkin');
|
||||||
|
|
||||||
$this->migrateLegacyLocations($asset);
|
$this->migrateLegacyLocations($asset);
|
||||||
|
|
||||||
$asset->location_id = $asset->rtd_location_id;
|
$asset->location_id = $asset->rtd_location_id;
|
||||||
|
@ -128,6 +129,9 @@ class AssetCheckinController extends Controller
|
||||||
|
|
||||||
session()->put('redirect_option', $request->get('redirect_option'));
|
session()->put('redirect_option', $request->get('redirect_option'));
|
||||||
|
|
||||||
|
// Add any custom fields that should be included in the checkout
|
||||||
|
$asset->customFieldsForCheckinCheckout('display_checkin');
|
||||||
|
|
||||||
if ($asset->save()) {
|
if ($asset->save()) {
|
||||||
|
|
||||||
event(new CheckoutableCheckedIn($asset, $target, auth()->user(), $request->input('note'), $checkin_at, $originalValues));
|
event(new CheckoutableCheckedIn($asset, $target, auth()->user(), $request->input('note'), $checkin_at, $originalValues));
|
||||||
|
|
|
@ -26,27 +26,25 @@ class AssetCheckoutController extends Controller
|
||||||
* @since [v1.0]
|
* @since [v1.0]
|
||||||
* @return \Illuminate\Contracts\View\View
|
* @return \Illuminate\Contracts\View\View
|
||||||
*/
|
*/
|
||||||
public function create($assetId) : View | RedirectResponse
|
public function create(Asset $asset) : View | RedirectResponse
|
||||||
{
|
{
|
||||||
// Check if the asset exists
|
|
||||||
if (is_null($asset = Asset::with('company')->find(e($assetId)))) {
|
|
||||||
return redirect()->route('hardware.index')->with('error', trans('admin/hardware/message.does_not_exist'));
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->authorize('checkout', $asset);
|
$this->authorize('checkout', $asset);
|
||||||
|
|
||||||
if (!$asset->model) {
|
if (!$asset->model) {
|
||||||
return redirect()->route('hardware.show', $asset->id)->with('error', trans('admin/hardware/general.model_invalid_fix'));
|
return redirect()->route('hardware.show', $asset)
|
||||||
|
->with('error', trans('admin/hardware/general.model_invalid_fix'));
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($asset->availableForCheckout()) {
|
if ($asset->availableForCheckout()) {
|
||||||
return view('hardware/checkout', compact('asset'))
|
return view('hardware/checkout', compact('asset'))
|
||||||
->with('statusLabel_list', Helper::deployableStatusLabelList())
|
->with('statusLabel_list', Helper::deployableStatusLabelList())
|
||||||
->with('table_name', 'Assets');
|
->with('table_name', 'Assets')
|
||||||
|
->with('item', $asset);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return redirect()->route('hardware.index')
|
||||||
return redirect()->route('hardware.index')->with('error', trans('admin/hardware/message.checkout.not_available'));
|
->with('error', trans('admin/hardware/message.checkout.not_available'));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -68,7 +66,7 @@ class AssetCheckoutController extends Controller
|
||||||
$this->authorize('checkout', $asset);
|
$this->authorize('checkout', $asset);
|
||||||
|
|
||||||
if (!$asset->model) {
|
if (!$asset->model) {
|
||||||
return redirect()->route('hardware.show', $asset->id)->with('error', trans('admin/hardware/general.model_invalid_fix'));
|
return redirect()->route('hardware.show', $asset)->with('error', trans('admin/hardware/general.model_invalid_fix'));
|
||||||
}
|
}
|
||||||
|
|
||||||
$admin = auth()->user();
|
$admin = auth()->user();
|
||||||
|
@ -91,6 +89,7 @@ class AssetCheckoutController extends Controller
|
||||||
$asset->status_id = $request->get('status_id');
|
$asset->status_id = $request->get('status_id');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if(!empty($asset->licenseseats->all())){
|
if(!empty($asset->licenseseats->all())){
|
||||||
if(request('checkout_to_type') == 'user') {
|
if(request('checkout_to_type') == 'user') {
|
||||||
foreach ($asset->licenseseats as $seat){
|
foreach ($asset->licenseseats as $seat){
|
||||||
|
@ -100,23 +99,26 @@ class AssetCheckoutController extends Controller
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Add any custom fields that should be included in the checkout
|
||||||
|
$asset->customFieldsForCheckinCheckout('display_checkout');
|
||||||
|
|
||||||
$settings = \App\Models\Setting::getSettings();
|
$settings = \App\Models\Setting::getSettings();
|
||||||
|
|
||||||
// We have to check whether $target->company_id is null here since locations don't have a company yet
|
// We have to check whether $target->company_id is null here since locations don't have a company yet
|
||||||
if (($settings->full_multiple_companies_support) && ((!is_null($target->company_id)) && (!is_null($asset->company_id)))) {
|
if (($settings->full_multiple_companies_support) && ((!is_null($target->company_id)) && (!is_null($asset->company_id)))) {
|
||||||
if ($target->company_id != $asset->company_id){
|
if ($target->company_id != $asset->company_id){
|
||||||
return redirect()->to("hardware/$assetId/checkout")->with('error', trans('general.error_user_company'));
|
return redirect()->route('hardware.checkout.create', $asset)->with('error', trans('general.error_user_company'));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
session()->put(['redirect_option' => $request->get('redirect_option'), 'checkout_to_type' => $request->get('checkout_to_type')]);
|
session()->put(['redirect_option' => $request->get('redirect_option'), 'checkout_to_type' => $request->get('checkout_to_type')]);
|
||||||
|
|
||||||
if ($asset->checkOut($target, $admin, $checkout_at, $expected_checkin, $request->get('note'), $request->get('name'))) {
|
if ($asset->checkOut($target, $admin, $checkout_at, $expected_checkin, $request->get('note'), $request->get('name'))) {
|
||||||
return redirect()->to(Helper::getRedirectOption($request, $asset->id, 'Assets'))
|
return redirect()->to(Helper::getRedirectOption($request, $asset->id, 'Assets'))
|
||||||
->with('success', trans('admin/hardware/message.checkout.success'));
|
->with('success', trans('admin/hardware/message.checkout.success'));
|
||||||
}
|
}
|
||||||
// Redirect to the asset management page with error
|
// Redirect to the asset management page with error
|
||||||
return redirect()->to("hardware/$assetId/checkout")->with('error', trans('admin/hardware/message.checkout.error').$asset->getErrors());
|
return redirect()->route("hardware.checkout.create", $asset)->with('error', trans('admin/hardware/message.checkout.error').$asset->getErrors());
|
||||||
} catch (ModelNotFoundException $e) {
|
} catch (ModelNotFoundException $e) {
|
||||||
return redirect()->back()->with('error', trans('admin/hardware/message.checkout.error'))->withErrors($asset->getErrors());
|
return redirect()->back()->with('error', trans('admin/hardware/message.checkout.error'))->withErrors($asset->getErrors());
|
||||||
} catch (CheckoutNotAllowed $e) {
|
} catch (CheckoutNotAllowed $e) {
|
||||||
|
|
|
@ -26,11 +26,8 @@ class AssetFilesController extends Controller
|
||||||
*@since [v1.0]
|
*@since [v1.0]
|
||||||
* @author [A. Gianotto] [<snipe@snipe.net>]
|
* @author [A. Gianotto] [<snipe@snipe.net>]
|
||||||
*/
|
*/
|
||||||
public function store(UploadFileRequest $request, $assetId = null) : RedirectResponse
|
public function store(UploadFileRequest $request, Asset $asset) : RedirectResponse
|
||||||
{
|
{
|
||||||
if (! $asset = Asset::find($assetId)) {
|
|
||||||
return redirect()->route('hardware.index')->with('error', trans('admin/hardware/message.does_not_exist'));
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->authorize('update', $asset);
|
$this->authorize('update', $asset);
|
||||||
|
|
||||||
|
@ -45,7 +42,7 @@ class AssetFilesController extends Controller
|
||||||
$asset->logUpload($file_name, $request->get('notes'));
|
$asset->logUpload($file_name, $request->get('notes'));
|
||||||
}
|
}
|
||||||
|
|
||||||
return redirect()->back()->with('success', trans('admin/hardware/message.upload.success'));
|
return redirect()->back()->withFragment('files')->with('success', trans('admin/hardware/message.upload.success'));
|
||||||
}
|
}
|
||||||
|
|
||||||
return redirect()->back()->with('error', trans('admin/hardware/message.upload.nofiles'));
|
return redirect()->back()->with('error', trans('admin/hardware/message.upload.nofiles'));
|
||||||
|
@ -59,31 +56,28 @@ class AssetFilesController extends Controller
|
||||||
* @param int $fileId
|
* @param int $fileId
|
||||||
* @since [v1.0]
|
* @since [v1.0]
|
||||||
*/
|
*/
|
||||||
public function show($assetId = null, $fileId = null) : View | RedirectResponse | Response | StreamedResponse | BinaryFileResponse
|
public function show(Asset $asset, $fileId = null) : View | RedirectResponse | Response | StreamedResponse | BinaryFileResponse
|
||||||
{
|
{
|
||||||
if ($asset = Asset::find($assetId)) {
|
|
||||||
|
|
||||||
$this->authorize('view', $asset);
|
$this->authorize('view', $asset);
|
||||||
|
|
||||||
if ($log = Actionlog::whereNotNull('filename')->where('item_id', $asset->id)->find($fileId)) {
|
if ($log = Actionlog::whereNotNull('filename')->where('item_id', $asset->id)->find($fileId)) {
|
||||||
$file = 'private_uploads/assets/'.$log->filename;
|
$file = 'private_uploads/assets/'.$log->filename;
|
||||||
|
|
||||||
if ($log->action_type == 'audit') {
|
|
||||||
$file = 'private_uploads/audits/'.$log->filename;
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
return StorageHelper::showOrDownloadFile($file, $log->filename);
|
|
||||||
} catch (\Exception $e) {
|
|
||||||
return redirect()->route('hardware.show', ['hardware' => $asset])->with('error', trans('general.file_not_found'));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
if ($log->action_type == 'audit') {
|
||||||
|
$file = 'private_uploads/audits/'.$log->filename;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
return StorageHelper::showOrDownloadFile($file, $log->filename);
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
return redirect()->route('hardware.show', ['hardware' => $asset])->with('error', trans('general.file_not_found'));
|
||||||
}
|
}
|
||||||
|
|
||||||
return redirect()->route('hardware.show', ['hardware' => $asset])->with('error', trans('general.log_record_not_found'));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return redirect()->route('hardware.index')->with('error', trans('admin/hardware/message.does_not_exist'));
|
return redirect()->route('hardware.show', ['hardware' => $asset])->with('error', trans('general.log_record_not_found'));
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -95,29 +89,20 @@ class AssetFilesController extends Controller
|
||||||
* @param int $fileId
|
* @param int $fileId
|
||||||
* @since [v1.0]
|
* @since [v1.0]
|
||||||
*/
|
*/
|
||||||
public function destroy($assetId = null, $fileId = null) : RedirectResponse
|
public function destroy(Asset $asset, $fileId = null) : RedirectResponse
|
||||||
{
|
{
|
||||||
$asset = Asset::find($assetId);
|
|
||||||
$this->authorize('update', $asset);
|
$this->authorize('update', $asset);
|
||||||
$rel_path = 'private_uploads/assets';
|
$rel_path = 'private_uploads/assets';
|
||||||
|
|
||||||
// the asset is valid
|
if ($log = Actionlog::find($fileId)) {
|
||||||
if (isset($asset->id)) {
|
if (Storage::exists($rel_path.'/'.$log->filename)) {
|
||||||
$this->authorize('update', $asset);
|
Storage::delete($rel_path.'/'.$log->filename);
|
||||||
$log = Actionlog::find($fileId);
|
|
||||||
if ($log) {
|
|
||||||
if (Storage::exists($rel_path.'/'.$log->filename)) {
|
|
||||||
Storage::delete($rel_path.'/'.$log->filename);
|
|
||||||
}
|
|
||||||
$log->delete();
|
|
||||||
|
|
||||||
return redirect()->back()->with('success', trans('admin/hardware/message.deletefile.success'));
|
|
||||||
}
|
}
|
||||||
|
$log->delete();
|
||||||
return redirect()->back()
|
return redirect()->back()->withFragment('files')->with('success', trans('admin/hardware/message.deletefile.success'));
|
||||||
->with('success', trans('admin/hardware/message.deletefile.success'));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return redirect()->route('hardware.index')->with('error', trans('admin/hardware/message.does_not_exist'));
|
return redirect()->route('hardware.show', ['hardware' => $asset])->with('error', trans('general.log_record_not_found'));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,6 +30,7 @@ use Illuminate\Http\Response;
|
||||||
use Illuminate\Contracts\View\View;
|
use Illuminate\Contracts\View\View;
|
||||||
use Illuminate\Http\RedirectResponse;
|
use Illuminate\Http\RedirectResponse;
|
||||||
use Symfony\Component\HttpFoundation\BinaryFileResponse;
|
use Symfony\Component\HttpFoundation\BinaryFileResponse;
|
||||||
|
use TypeError;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This class controls all actions related to assets for
|
* This class controls all actions related to assets for
|
||||||
|
@ -201,7 +202,7 @@ class AssetsController extends Controller
|
||||||
$asset->checkOut($target, auth()->user(), date('Y-m-d H:i:s'), $request->input('expected_checkin', null), 'Checked out on asset creation', $request->get('name'), $location);
|
$asset->checkOut($target, auth()->user(), date('Y-m-d H:i:s'), $request->input('expected_checkin', null), 'Checked out on asset creation', $request->get('name'), $location);
|
||||||
}
|
}
|
||||||
|
|
||||||
$successes[] = "<a href='" . route('hardware.show', ['hardware' => $asset->id]) . "' style='color: white;'>" . e($asset->asset_tag) . "</a>";
|
$successes[] = "<a href='" . route('hardware.show', $asset) . "' style='color: white;'>" . e($asset->asset_tag) . "</a>";
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
$failures[] = join(",", $asset->getErrors()->all());
|
$failures[] = join(",", $asset->getErrors()->all());
|
||||||
|
@ -222,7 +223,7 @@ class AssetsController extends Controller
|
||||||
//the most common case, keeping it so we don't have to make every use of that translation string be trans_choice'ed
|
//the most common case, keeping it so we don't have to make every use of that translation string be trans_choice'ed
|
||||||
//and re-translated
|
//and re-translated
|
||||||
return redirect()->to(Helper::getRedirectOption($request, $asset->id, 'Assets'))
|
return redirect()->to(Helper::getRedirectOption($request, $asset->id, 'Assets'))
|
||||||
->with('success-unescaped', trans('admin/hardware/message.create.success_linked', ['link' => route('hardware.show', ['hardware' => $asset->id]), 'id', 'tag' => e($asset->asset_tag)]));
|
->with('success-unescaped', trans('admin/hardware/message.create.success_linked', ['link' => route('hardware.show', $asset), 'id', 'tag' => e($asset->asset_tag)]));
|
||||||
} else {
|
} else {
|
||||||
//multi-success
|
//multi-success
|
||||||
return redirect()->to(Helper::getRedirectOption($request, $asset->id, 'Assets'))
|
return redirect()->to(Helper::getRedirectOption($request, $asset->id, 'Assets'))
|
||||||
|
@ -240,20 +241,14 @@ class AssetsController extends Controller
|
||||||
* Returns a view that presents a form to edit an existing asset.
|
* Returns a view that presents a form to edit an existing asset.
|
||||||
*
|
*
|
||||||
* @author [A. Gianotto] [<snipe@snipe.net>]
|
* @author [A. Gianotto] [<snipe@snipe.net>]
|
||||||
* @param int $assetId
|
|
||||||
* @since [v1.0]
|
* @since [v1.0]
|
||||||
* @return \Illuminate\Contracts\View\View
|
* @return \Illuminate\Contracts\View\View
|
||||||
*/
|
*/
|
||||||
public function edit($assetId = null) : View | RedirectResponse
|
public function edit(Asset $asset) : View | RedirectResponse
|
||||||
{
|
{
|
||||||
if (! $item = Asset::find($assetId)) {
|
$this->authorize($asset);
|
||||||
// Redirect to the asset management page with error
|
return view('hardware/edit')
|
||||||
return redirect()->route('hardware.index')->with('error', trans('admin/hardware/message.does_not_exist'));
|
->with('item', $asset)
|
||||||
}
|
|
||||||
//Handles company checks and permissions.
|
|
||||||
$this->authorize($item);
|
|
||||||
|
|
||||||
return view('hardware/edit', compact('item'))
|
|
||||||
->with('statuslabel_list', Helper::statusLabelList())
|
->with('statuslabel_list', Helper::statusLabelList())
|
||||||
->with('statuslabel_types', Helper::statusTypeList());
|
->with('statuslabel_types', Helper::statusTypeList());
|
||||||
}
|
}
|
||||||
|
@ -267,15 +262,14 @@ class AssetsController extends Controller
|
||||||
* @since [v1.0]
|
* @since [v1.0]
|
||||||
* @return \Illuminate\Contracts\View\View
|
* @return \Illuminate\Contracts\View\View
|
||||||
*/
|
*/
|
||||||
public function show($assetId = null) : View | RedirectResponse
|
public function show(Asset $asset) : View | RedirectResponse
|
||||||
{
|
{
|
||||||
$asset = Asset::withTrashed()->find($assetId);
|
|
||||||
$this->authorize('view', $asset);
|
$this->authorize('view', $asset);
|
||||||
$settings = Setting::getSettings();
|
$settings = Setting::getSettings();
|
||||||
|
|
||||||
if (isset($asset)) {
|
if (isset($asset)) {
|
||||||
$audit_log = Actionlog::where('action_type', '=', 'audit')
|
$audit_log = Actionlog::where('action_type', '=', 'audit')
|
||||||
->where('item_id', '=', $assetId)
|
->where('item_id', '=', $asset->id)
|
||||||
->where('item_type', '=', Asset::class)
|
->where('item_type', '=', Asset::class)
|
||||||
->orderBy('created_at', 'DESC')->first();
|
->orderBy('created_at', 'DESC')->first();
|
||||||
|
|
||||||
|
@ -291,7 +285,7 @@ class AssetsController extends Controller
|
||||||
|
|
||||||
$qr_code = (object) [
|
$qr_code = (object) [
|
||||||
'display' => $settings->qr_code == '1',
|
'display' => $settings->qr_code == '1',
|
||||||
'url' => route('qr_code/hardware', $asset->id),
|
'url' => route('qr_code/hardware', $asset),
|
||||||
];
|
];
|
||||||
|
|
||||||
return view('hardware/view', compact('asset', 'qr_code', 'settings'))
|
return view('hardware/view', compact('asset', 'qr_code', 'settings'))
|
||||||
|
@ -308,14 +302,9 @@ class AssetsController extends Controller
|
||||||
* @since [v1.0]
|
* @since [v1.0]
|
||||||
* @author [A. Gianotto] [<snipe@snipe.net>]
|
* @author [A. Gianotto] [<snipe@snipe.net>]
|
||||||
*/
|
*/
|
||||||
public function update(ImageUploadRequest $request, $assetId = null) : RedirectResponse
|
public function update(ImageUploadRequest $request, Asset $asset) : RedirectResponse
|
||||||
{
|
{
|
||||||
|
|
||||||
// Check if the asset exists
|
|
||||||
if (! $asset = Asset::find($assetId)) {
|
|
||||||
// Redirect to the asset management page with error
|
|
||||||
return redirect()->route('hardware.index')->with('error', trans('admin/hardware/message.does_not_exist'));
|
|
||||||
}
|
|
||||||
$this->authorize($asset);
|
$this->authorize($asset);
|
||||||
|
|
||||||
$asset->status_id = $request->input('status_id', null);
|
$asset->status_id = $request->input('status_id', null);
|
||||||
|
@ -430,7 +419,7 @@ class AssetsController extends Controller
|
||||||
session()->put(['redirect_option' => $request->get('redirect_option'), 'checkout_to_type' => $request->get('checkout_to_type')]);
|
session()->put(['redirect_option' => $request->get('redirect_option'), 'checkout_to_type' => $request->get('checkout_to_type')]);
|
||||||
|
|
||||||
if ($asset->save()) {
|
if ($asset->save()) {
|
||||||
return redirect()->to(Helper::getRedirectOption($request, $assetId, 'Assets'))
|
return redirect()->to(Helper::getRedirectOption($request, $asset->id, 'Assets'))
|
||||||
->with('success', trans('admin/hardware/message.update.success'));
|
->with('success', trans('admin/hardware/message.update.success'));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -531,12 +520,12 @@ class AssetsController extends Controller
|
||||||
* @param int $assetId
|
* @param int $assetId
|
||||||
* @since [v1.0]
|
* @since [v1.0]
|
||||||
*/
|
*/
|
||||||
public function getQrCode($assetId = null) : Response | BinaryFileResponse | string | bool
|
public function getQrCode(Asset $asset) : Response | BinaryFileResponse | string | bool
|
||||||
{
|
{
|
||||||
$settings = Setting::getSettings();
|
$settings = Setting::getSettings();
|
||||||
|
|
||||||
if ($settings->qr_code == '1') {
|
if (($settings->qr_code == '1') && ($settings->label2_2d_type !== 'none')) {
|
||||||
$asset = Asset::withTrashed()->find($assetId);
|
|
||||||
if ($asset) {
|
if ($asset) {
|
||||||
$size = Helper::barcodeDimensions($settings->label2_2d_type);
|
$size = Helper::barcodeDimensions($settings->label2_2d_type);
|
||||||
$qr_file = public_path().'/uploads/barcodes/qr-'.str_slug($asset->asset_tag).'-'.str_slug($asset->id).'.png';
|
$qr_file = public_path().'/uploads/barcodes/qr-'.str_slug($asset->asset_tag).'-'.str_slug($asset->id).'.png';
|
||||||
|
@ -590,7 +579,7 @@ class AssetsController extends Controller
|
||||||
file_put_contents($barcode_file, $barcode_obj->getPngData());
|
file_put_contents($barcode_file, $barcode_obj->getPngData());
|
||||||
|
|
||||||
return response($barcode_obj->getPngData())->header('Content-type', 'image/png');
|
return response($barcode_obj->getPngData())->header('Content-type', 'image/png');
|
||||||
} catch (\Exception $e) {
|
} catch (\Exception|TypeError $e) {
|
||||||
Log::debug('The barcode format is invalid.');
|
Log::debug('The barcode format is invalid.');
|
||||||
|
|
||||||
return response(file_get_contents(public_path('uploads/barcodes/invalid_barcode.gif')))->header('Content-type', 'image/gif');
|
return response(file_get_contents(public_path('uploads/barcodes/invalid_barcode.gif')))->header('Content-type', 'image/gif');
|
||||||
|
@ -865,8 +854,8 @@ class AssetsController extends Controller
|
||||||
public function quickScan()
|
public function quickScan()
|
||||||
{
|
{
|
||||||
$this->authorize('audit', Asset::class);
|
$this->authorize('audit', Asset::class);
|
||||||
$dt = Carbon::now()->addMonths(12)->toDateString();
|
$settings = Setting::getSettings();
|
||||||
|
$dt = Carbon::now()->addMonths($settings->audit_interval)->toDateString();
|
||||||
return view('hardware/quickscan')->with('next_audit_date', $dt);
|
return view('hardware/quickscan')->with('next_audit_date', $dt);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -877,13 +866,11 @@ class AssetsController extends Controller
|
||||||
return view('hardware/quickscan-checkin')->with('statusLabel_list', Helper::statusLabelList());
|
return view('hardware/quickscan-checkin')->with('statusLabel_list', Helper::statusLabelList());
|
||||||
}
|
}
|
||||||
|
|
||||||
public function audit($id)
|
public function audit(Asset $asset)
|
||||||
{
|
{
|
||||||
$settings = Setting::getSettings();
|
$settings = Setting::getSettings();
|
||||||
$this->authorize('audit', Asset::class);
|
$this->authorize('audit', Asset::class);
|
||||||
$dt = Carbon::now()->addMonths($settings->audit_interval)->toDateString();
|
$dt = Carbon::now()->addMonths($settings->audit_interval)->toDateString();
|
||||||
$asset = Asset::findOrFail($id);
|
|
||||||
|
|
||||||
return view('hardware/audit')->with('asset', $asset)->with('next_audit_date', $dt)->with('locations_list');
|
return view('hardware/audit')->with('asset', $asset)->with('next_audit_date', $dt)->with('locations_list');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -902,7 +889,7 @@ class AssetsController extends Controller
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public function auditStore(UploadFileRequest $request, $id)
|
public function auditStore(UploadFileRequest $request, Asset $asset)
|
||||||
{
|
{
|
||||||
$this->authorize('audit', Asset::class);
|
$this->authorize('audit', Asset::class);
|
||||||
|
|
||||||
|
@ -917,8 +904,6 @@ class AssetsController extends Controller
|
||||||
return response()->json(Helper::formatStandardApiResponse('error', null, $validator->errors()->all()));
|
return response()->json(Helper::formatStandardApiResponse('error', null, $validator->errors()->all()));
|
||||||
}
|
}
|
||||||
|
|
||||||
$asset = Asset::findOrFail($id);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Even though we do a save() further down, we don't want to log this as a "normal" asset update,
|
* Even though we do a save() further down, we don't want to log this as a "normal" asset update,
|
||||||
* which would trigger the Asset Observer and would log an asset *update* log entry (because the
|
* which would trigger the Asset Observer and would log an asset *update* log entry (because the
|
||||||
|
|
|
@ -525,21 +525,31 @@ class BulkAssetsController extends Controller
|
||||||
$this->authorize('delete', Asset::class);
|
$this->authorize('delete', Asset::class);
|
||||||
|
|
||||||
$bulk_back_url = route('hardware.index');
|
$bulk_back_url = route('hardware.index');
|
||||||
|
|
||||||
if ($request->session()->has('bulk_back_url')) {
|
if ($request->session()->has('bulk_back_url')) {
|
||||||
$bulk_back_url = $request->session()->pull('bulk_back_url');
|
$bulk_back_url = $request->session()->pull('bulk_back_url');
|
||||||
}
|
}
|
||||||
|
$assetIds = $request->get('ids');
|
||||||
|
|
||||||
if ($request->filled('ids')) {
|
if(empty($assetIds)) {
|
||||||
$assets = Asset::find($request->get('ids'));
|
return redirect($bulk_back_url)->with('error', trans('admin/hardware/message.delete.nothing_updated'));
|
||||||
foreach ($assets as $asset) {
|
|
||||||
$asset->delete();
|
|
||||||
} // endforeach
|
|
||||||
|
|
||||||
return redirect($bulk_back_url)->with('success', trans('admin/hardware/message.delete.success'));
|
|
||||||
// no values given, nothing to update
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return redirect($bulk_back_url)->with('error', trans('admin/hardware/message.delete.nothing_updated'));
|
$assignedAssets = Asset::whereIn('id', $assetIds)->whereNotNull('assigned_to')->get();
|
||||||
|
if($assignedAssets->isNotEmpty()) {
|
||||||
|
|
||||||
|
//if assets are checked out, return a list of asset tags that would need to be checked in first.
|
||||||
|
$assetTags = $assignedAssets->pluck('asset_tag')->implode(', ');
|
||||||
|
return redirect($bulk_back_url)->with('error', trans_choice('admin/hardware/message.delete.assigned_to_error', $assignedAssets->count(), ['asset_tag' => $assetTags] ));
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (Asset::wherein('id', $assetIds)->get() as $asset) {
|
||||||
|
$asset->delete();
|
||||||
|
}
|
||||||
|
|
||||||
|
return redirect($bulk_back_url)->with('success', trans('admin/hardware/message.delete.success'));
|
||||||
|
// no values given, nothing to update
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -103,22 +103,24 @@ class ResetPasswordController extends Controller
|
||||||
], $messages);
|
], $messages);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($user->ldap_import != '1') {
|
||||||
|
|
||||||
// set the response
|
// set the response
|
||||||
$response = $broker->reset(
|
$response = $broker->reset(
|
||||||
$this->credentials($request), function ($user, $password) {
|
$this->credentials($request), function ($user, $password) {
|
||||||
$this->resetPassword($user, $password);
|
$this->resetPassword($user, $password);
|
||||||
});
|
});
|
||||||
|
|
||||||
// Check if the password reset above actually worked
|
// Check if the password reset above actually worked
|
||||||
if ($response == \Password::PASSWORD_RESET) {
|
if ($response == \Password::PASSWORD_RESET) {
|
||||||
Log::debug('Password reset for '.$user->username.' worked');
|
Log::debug('Password reset for ' . $user->username . ' worked');
|
||||||
return redirect()->guest('login')->with('success', trans('passwords.reset'));
|
return redirect()->guest('login')->with('success', trans('passwords.reset'));
|
||||||
|
}
|
||||||
|
|
||||||
|
Log::debug('Password reset for ' . $user->username . ' FAILED - this user exists but the token is not valid');
|
||||||
|
return redirect()->back()->withInput($request->only('email'))->with('success', trans('passwords.reset'));
|
||||||
}
|
}
|
||||||
|
|
||||||
Log::debug('Password reset for '.$user->username.' FAILED - this user exists but the token is not valid');
|
|
||||||
return redirect()->back()->withInput($request->only('email'))->with('success', trans('passwords.reset'));
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -69,6 +69,7 @@ class CategoriesController extends Controller
|
||||||
$category->use_default_eula = $request->input('use_default_eula', '0');
|
$category->use_default_eula = $request->input('use_default_eula', '0');
|
||||||
$category->require_acceptance = $request->input('require_acceptance', '0');
|
$category->require_acceptance = $request->input('require_acceptance', '0');
|
||||||
$category->checkin_email = $request->input('checkin_email', '0');
|
$category->checkin_email = $request->input('checkin_email', '0');
|
||||||
|
$category->notes = $request->input('notes');
|
||||||
$category->created_by = auth()->id();
|
$category->created_by = auth()->id();
|
||||||
|
|
||||||
$category = $request->handleImages($category);
|
$category = $request->handleImages($category);
|
||||||
|
@ -87,14 +88,10 @@ class CategoriesController extends Controller
|
||||||
* @param int $categoryId
|
* @param int $categoryId
|
||||||
* @since [v1.0]
|
* @since [v1.0]
|
||||||
*/
|
*/
|
||||||
public function edit($categoryId = null) : RedirectResponse | View
|
public function edit(Category $category) : RedirectResponse | View
|
||||||
{
|
{
|
||||||
$this->authorize('update', Category::class);
|
$this->authorize('update', Category::class);
|
||||||
if (is_null($item = Category::find($categoryId))) {
|
return view('categories/edit')->with('item', $category)
|
||||||
return redirect()->route('categories.index')->with('error', trans('admin/categories/message.does_not_exist'));
|
|
||||||
}
|
|
||||||
|
|
||||||
return view('categories/edit', compact('item'))
|
|
||||||
->with('category_types', Helper::categoryTypeList());
|
->with('category_types', Helper::categoryTypeList());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -107,19 +104,10 @@ class CategoriesController extends Controller
|
||||||
* @param int $categoryId
|
* @param int $categoryId
|
||||||
* @since [v1.0]
|
* @since [v1.0]
|
||||||
*/
|
*/
|
||||||
public function update(ImageUploadRequest $request, $categoryId = null) : RedirectResponse
|
public function update(ImageUploadRequest $request, Category $category) : RedirectResponse
|
||||||
{
|
{
|
||||||
$this->authorize('update', Category::class);
|
$this->authorize('update', Category::class);
|
||||||
if (is_null($category = Category::find($categoryId))) {
|
|
||||||
// Redirect to the categories management page
|
|
||||||
return redirect()->route('categories.index')->with('error', trans('admin/categories/message.does_not_exist'));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Update the category data
|
|
||||||
$category->name = $request->input('name');
|
$category->name = $request->input('name');
|
||||||
// If the item count is > 0, we disable the category type in the edit. Disabled items
|
|
||||||
// don't POST, so if the category_type is blank we just set it to the default.
|
|
||||||
|
|
||||||
|
|
||||||
// Don't allow the user to change the category_type once it's been created
|
// Don't allow the user to change the category_type once it's been created
|
||||||
if (($request->filled('category_type') && ($category->itemCount() > 0))) {
|
if (($request->filled('category_type') && ($category->itemCount() > 0))) {
|
||||||
|
@ -134,6 +122,7 @@ class CategoriesController extends Controller
|
||||||
$category->use_default_eula = $request->input('use_default_eula', '0');
|
$category->use_default_eula = $request->input('use_default_eula', '0');
|
||||||
$category->require_acceptance = $request->input('require_acceptance', '0');
|
$category->require_acceptance = $request->input('require_acceptance', '0');
|
||||||
$category->checkin_email = $request->input('checkin_email', '0');
|
$category->checkin_email = $request->input('checkin_email', '0');
|
||||||
|
$category->notes = $request->input('notes');
|
||||||
|
|
||||||
$category = $request->handleImages($category);
|
$category = $request->handleImages($category);
|
||||||
|
|
||||||
|
@ -179,10 +168,10 @@ class CategoriesController extends Controller
|
||||||
* @param $id
|
* @param $id
|
||||||
* @since [v1.8]
|
* @since [v1.8]
|
||||||
*/
|
*/
|
||||||
public function show($id) : View | RedirectResponse
|
public function show(Category $category) : View | RedirectResponse
|
||||||
{
|
{
|
||||||
$this->authorize('view', Category::class);
|
$this->authorize('view', Category::class);
|
||||||
if ($category = Category::find($id)) {
|
|
||||||
if ($category->category_type == 'asset') {
|
if ($category->category_type == 'asset') {
|
||||||
$category_type = 'hardware';
|
$category_type = 'hardware';
|
||||||
$category_type_route = 'assets';
|
$category_type_route = 'assets';
|
||||||
|
@ -197,8 +186,5 @@ class CategoriesController extends Controller
|
||||||
return view('categories/view', compact('category'))
|
return view('categories/view', compact('category'))
|
||||||
->with('category_type', $category_type)
|
->with('category_type', $category_type)
|
||||||
->with('category_type_route', $category_type_route);
|
->with('category_type_route', $category_type_route);
|
||||||
}
|
|
||||||
|
|
||||||
return redirect()->route('categories.index')->with('error', trans('admin/categories/message.does_not_exist'));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -60,6 +60,7 @@ final class CompaniesController extends Controller
|
||||||
$company->phone = $request->input('phone');
|
$company->phone = $request->input('phone');
|
||||||
$company->fax = $request->input('fax');
|
$company->fax = $request->input('fax');
|
||||||
$company->email = $request->input('email');
|
$company->email = $request->input('email');
|
||||||
|
$company->notes = $request->input('notes');
|
||||||
$company->created_by = auth()->id();
|
$company->created_by = auth()->id();
|
||||||
|
|
||||||
$company = $request->handleImages($company);
|
$company = $request->handleImages($company);
|
||||||
|
@ -79,16 +80,10 @@ final class CompaniesController extends Controller
|
||||||
* @since [v1.8]
|
* @since [v1.8]
|
||||||
* @param int $companyId
|
* @param int $companyId
|
||||||
*/
|
*/
|
||||||
public function edit($companyId) : View | RedirectResponse
|
public function edit(Company $company) : View | RedirectResponse
|
||||||
{
|
{
|
||||||
if (is_null($item = Company::find($companyId))) {
|
$this->authorize('update', $company);
|
||||||
return redirect()->route('companies.index')
|
return view('companies/edit')->with('item', $company);
|
||||||
->with('error', trans('admin/companies/message.does_not_exist'));
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->authorize('update', $item);
|
|
||||||
|
|
||||||
return view('companies/edit')->with('item', $item);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -99,18 +94,15 @@ final class CompaniesController extends Controller
|
||||||
* @param ImageUploadRequest $request
|
* @param ImageUploadRequest $request
|
||||||
* @param int $companyId
|
* @param int $companyId
|
||||||
*/
|
*/
|
||||||
public function update(ImageUploadRequest $request, $companyId) : RedirectResponse
|
public function update(ImageUploadRequest $request, Company $company) : RedirectResponse
|
||||||
{
|
{
|
||||||
if (is_null($company = Company::find($companyId))) {
|
|
||||||
return redirect()->route('companies.index')->with('error', trans('admin/companies/message.does_not_exist'));
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->authorize('update', $company);
|
$this->authorize('update', $company);
|
||||||
|
|
||||||
$company->name = $request->input('name');
|
$company->name = $request->input('name');
|
||||||
$company->phone = $request->input('phone');
|
$company->phone = $request->input('phone');
|
||||||
$company->fax = $request->input('fax');
|
$company->fax = $request->input('fax');
|
||||||
$company->email = $request->input('email');
|
$company->email = $request->input('email');
|
||||||
|
$company->notes = $request->input('notes');
|
||||||
|
|
||||||
$company = $request->handleImages($company);
|
$company = $request->handleImages($company);
|
||||||
|
|
||||||
|
@ -156,15 +148,9 @@ final class CompaniesController extends Controller
|
||||||
->with('success', trans('admin/companies/message.delete.success'));
|
->with('success', trans('admin/companies/message.delete.success'));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function show($id) : View | RedirectResponse
|
public function show(Company $company) : View | RedirectResponse
|
||||||
{
|
{
|
||||||
$this->authorize('view', Company::class);
|
$this->authorize('view', Company::class);
|
||||||
|
|
||||||
if (is_null($company = Company::find($id))) {
|
|
||||||
return redirect()->route('companies.index')
|
|
||||||
->with('error', trans('admin/companies/message.not_found'));
|
|
||||||
}
|
|
||||||
|
|
||||||
return view('companies/view')->with('company', $company);
|
return view('companies/view')->with('company', $company);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -107,15 +107,13 @@ class ComponentsController extends Controller
|
||||||
* @return \Illuminate\Contracts\View\View
|
* @return \Illuminate\Contracts\View\View
|
||||||
* @throws \Illuminate\Auth\Access\AuthorizationException
|
* @throws \Illuminate\Auth\Access\AuthorizationException
|
||||||
*/
|
*/
|
||||||
public function edit($componentId = null)
|
public function edit(Component $component)
|
||||||
{
|
{
|
||||||
if ($item = Component::find($componentId)) {
|
|
||||||
$this->authorize('update', $item);
|
|
||||||
|
|
||||||
return view('components/edit', compact('item'))->with('category_type', 'component');
|
$this->authorize('update', $component);
|
||||||
}
|
return view('components/edit')
|
||||||
|
->with('item', $component)
|
||||||
return redirect()->route('components.index')->with('error', trans('admin/components/message.does_not_exist'));
|
->with('category_type', 'component');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -130,11 +128,8 @@ class ComponentsController extends Controller
|
||||||
* @throws \Illuminate\Auth\Access\AuthorizationException
|
* @throws \Illuminate\Auth\Access\AuthorizationException
|
||||||
* @since [v3.0]
|
* @since [v3.0]
|
||||||
*/
|
*/
|
||||||
public function update(ImageUploadRequest $request, $componentId = null)
|
public function update(ImageUploadRequest $request, Component $component)
|
||||||
{
|
{
|
||||||
if (is_null($component = Component::find($componentId))) {
|
|
||||||
return redirect()->route('components.index')->with('error', trans('admin/components/message.does_not_exist'));
|
|
||||||
}
|
|
||||||
$min = $component->numCheckedOut();
|
$min = $component->numCheckedOut();
|
||||||
$validator = Validator::make($request->all(), [
|
$validator = Validator::make($request->all(), [
|
||||||
'qty' => "required|numeric|min:$min",
|
'qty' => "required|numeric|min:$min",
|
||||||
|
@ -201,6 +196,10 @@ class ComponentsController extends Controller
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($component->numCheckedOut() > 0) {
|
||||||
|
return redirect()->route('components.index')->with('error', trans('admin/components/message.delete.error_qty'));
|
||||||
|
}
|
||||||
|
|
||||||
$component->delete();
|
$component->delete();
|
||||||
|
|
||||||
return redirect()->route('components.index')->with('success', trans('admin/components/message.delete.success'));
|
return redirect()->route('components.index')->with('success', trans('admin/components/message.delete.success'));
|
||||||
|
@ -216,17 +215,9 @@ class ComponentsController extends Controller
|
||||||
* @return \Illuminate\Contracts\View\View
|
* @return \Illuminate\Contracts\View\View
|
||||||
* @throws \Illuminate\Auth\Access\AuthorizationException
|
* @throws \Illuminate\Auth\Access\AuthorizationException
|
||||||
*/
|
*/
|
||||||
public function show($componentId = null)
|
public function show(Component $component)
|
||||||
{
|
{
|
||||||
$component = Component::find($componentId);
|
|
||||||
|
|
||||||
if (isset($component->id)) {
|
|
||||||
$this->authorize('view', $component);
|
$this->authorize('view', $component);
|
||||||
|
|
||||||
return view('components/view', compact('component'));
|
return view('components/view', compact('component'));
|
||||||
}
|
|
||||||
// Redirect to the user management page
|
|
||||||
return redirect()->route('components.index')
|
|
||||||
->with('error', trans('admin/components/message.does_not_exist'));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -50,7 +50,7 @@ class ComponentsFilesController extends Controller
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
return redirect()->route('components.show', $component->id)->with('success', trans('general.file_upload_success'));
|
return redirect()->route('components.show', $component->id)->withFragment('files')->with('success', trans('general.file_upload_success'));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -91,7 +91,7 @@ class ComponentsFilesController extends Controller
|
||||||
|
|
||||||
$log->delete();
|
$log->delete();
|
||||||
|
|
||||||
return redirect()->back()
|
return redirect()->back()->withFragment('files')
|
||||||
->with('success', trans('admin/hardware/message.deletefile.success'));
|
->with('success', trans('admin/hardware/message.deletefile.success'));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -104,15 +104,13 @@ class ConsumablesController extends Controller
|
||||||
* @see ConsumablesController::postEdit() method that stores the form data.
|
* @see ConsumablesController::postEdit() method that stores the form data.
|
||||||
* @since [v1.0]
|
* @since [v1.0]
|
||||||
*/
|
*/
|
||||||
public function edit($consumableId = null) : View | RedirectResponse
|
public function edit(Consumable $consumable) : View | RedirectResponse
|
||||||
{
|
{
|
||||||
if ($item = Consumable::find($consumableId)) {
|
$this->authorize($consumable);
|
||||||
$this->authorize($item);
|
return view('consumables/edit')
|
||||||
|
->with('item', $consumable)
|
||||||
|
->with('category_type', 'consumable');
|
||||||
|
|
||||||
return view('consumables/edit', compact('item'))->with('category_type', 'consumable');
|
|
||||||
}
|
|
||||||
|
|
||||||
return redirect()->route('consumables.index')->with('error', trans('admin/consumables/message.does_not_exist'));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -126,11 +124,8 @@ class ConsumablesController extends Controller
|
||||||
* @see ConsumablesController::getEdit() method that stores the form data.
|
* @see ConsumablesController::getEdit() method that stores the form data.
|
||||||
* @since [v1.0]
|
* @since [v1.0]
|
||||||
*/
|
*/
|
||||||
public function update(StoreConsumableRequest $request, $consumableId = null)
|
public function update(StoreConsumableRequest $request, Consumable $consumable)
|
||||||
{
|
{
|
||||||
if (is_null($consumable = Consumable::find($consumableId))) {
|
|
||||||
return redirect()->route('consumables.index')->with('error', trans('admin/consumables/message.does_not_exist'));
|
|
||||||
}
|
|
||||||
|
|
||||||
$min = $consumable->numCheckedOut();
|
$min = $consumable->numCheckedOut();
|
||||||
$validator = Validator::make($request->all(), [
|
$validator = Validator::make($request->all(), [
|
||||||
|
@ -202,16 +197,11 @@ class ConsumablesController extends Controller
|
||||||
* @return \Illuminate\Contracts\View\View
|
* @return \Illuminate\Contracts\View\View
|
||||||
* @throws \Illuminate\Auth\Access\AuthorizationException
|
* @throws \Illuminate\Auth\Access\AuthorizationException
|
||||||
*/
|
*/
|
||||||
public function show($consumableId = null)
|
public function show(Consumable $consumable)
|
||||||
{
|
{
|
||||||
$consumable = Consumable::withCount('users as users_consumables')->find($consumableId);
|
$consumable = Consumable::withCount('users as users_consumables')->find($consumable->id);
|
||||||
$this->authorize($consumable);
|
$this->authorize($consumable);
|
||||||
if (isset($consumable->id)) {
|
return view('consumables/view', compact('consumable'));
|
||||||
return view('consumables/view', compact('consumable'));
|
|
||||||
}
|
|
||||||
|
|
||||||
return redirect()->route('consumables.index')
|
|
||||||
->with('error', trans('admin/consumables/message.does_not_exist'));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function clone(Consumable $consumable) : View
|
public function clone(Consumable $consumable) : View
|
||||||
|
|
|
@ -48,7 +48,7 @@ class ConsumablesFilesController extends Controller
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
return redirect()->route('consumables.show', $consumable->id)->with('success', trans('general.file_upload_success'));
|
return redirect()->route('consumables.show', $consumable->id)->withFragment('files')->with('success', trans('general.file_upload_success'));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -89,7 +89,7 @@ class ConsumablesFilesController extends Controller
|
||||||
|
|
||||||
$log->delete();
|
$log->delete();
|
||||||
|
|
||||||
return redirect()->back()
|
return redirect()->back()->withFragment('files')
|
||||||
->with('success', trans('admin/hardware/message.deletefile.success'));
|
->with('success', trans('admin/hardware/message.deletefile.success'));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -104,6 +104,8 @@ class CustomFieldsController extends Controller
|
||||||
"auto_add_to_fieldsets" => $request->get("auto_add_to_fieldsets", 0),
|
"auto_add_to_fieldsets" => $request->get("auto_add_to_fieldsets", 0),
|
||||||
"show_in_listview" => $request->get("show_in_listview", 0),
|
"show_in_listview" => $request->get("show_in_listview", 0),
|
||||||
"show_in_requestable_list" => $request->get("show_in_requestable_list", 0),
|
"show_in_requestable_list" => $request->get("show_in_requestable_list", 0),
|
||||||
|
"display_checkin" => $request->get("display_checkin", 0),
|
||||||
|
"display_checkout" => $request->get("display_checkout", 0),
|
||||||
"created_by" => auth()->id()
|
"created_by" => auth()->id()
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
@ -193,10 +195,8 @@ class CustomFieldsController extends Controller
|
||||||
* @param int $id
|
* @param int $id
|
||||||
* @since [v4.0]
|
* @since [v4.0]
|
||||||
*/
|
*/
|
||||||
public function edit(Request $request, $id) : View | RedirectResponse
|
public function edit(Request $request, CustomField $field) : View | RedirectResponse
|
||||||
{
|
{
|
||||||
if ($field = CustomField::find($id)) {
|
|
||||||
|
|
||||||
$this->authorize('update', $field);
|
$this->authorize('update', $field);
|
||||||
$fieldsets = CustomFieldset::get();
|
$fieldsets = CustomFieldset::get();
|
||||||
$customFormat = '';
|
$customFormat = '';
|
||||||
|
@ -210,10 +210,6 @@ class CustomFieldsController extends Controller
|
||||||
'fieldsets' => $fieldsets,
|
'fieldsets' => $fieldsets,
|
||||||
'predefinedFormats' => Helper::predefined_formats(),
|
'predefinedFormats' => Helper::predefined_formats(),
|
||||||
]);
|
]);
|
||||||
}
|
|
||||||
|
|
||||||
return redirect()->route("fields.index")
|
|
||||||
->with("error", trans('admin/custom_fields/message.field.invalid'));
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -229,13 +225,9 @@ class CustomFieldsController extends Controller
|
||||||
* @return \Illuminate\Http\RedirectResponse
|
* @return \Illuminate\Http\RedirectResponse
|
||||||
* @throws \Illuminate\Auth\Access\AuthorizationException
|
* @throws \Illuminate\Auth\Access\AuthorizationException
|
||||||
*/
|
*/
|
||||||
public function update(CustomFieldRequest $request, $id) : RedirectResponse
|
public function update(CustomFieldRequest $request, CustomField $field) : RedirectResponse
|
||||||
{
|
{
|
||||||
$field = CustomField::find($id);
|
|
||||||
|
|
||||||
$this->authorize('update', $field);
|
$this->authorize('update', $field);
|
||||||
|
|
||||||
|
|
||||||
$show_in_email = $request->get("show_in_email", 0);
|
$show_in_email = $request->get("show_in_email", 0);
|
||||||
$display_in_user_view = $request->get("display_in_user_view", 0);
|
$display_in_user_view = $request->get("display_in_user_view", 0);
|
||||||
|
|
||||||
|
@ -256,6 +248,8 @@ class CustomFieldsController extends Controller
|
||||||
$field->auto_add_to_fieldsets = $request->get("auto_add_to_fieldsets", 0);
|
$field->auto_add_to_fieldsets = $request->get("auto_add_to_fieldsets", 0);
|
||||||
$field->show_in_listview = $request->get("show_in_listview", 0);
|
$field->show_in_listview = $request->get("show_in_listview", 0);
|
||||||
$field->show_in_requestable_list = $request->get("show_in_requestable_list", 0);
|
$field->show_in_requestable_list = $request->get("show_in_requestable_list", 0);
|
||||||
|
$field->display_checkin = $request->get("display_checkin", 0);
|
||||||
|
$field->display_checkout = $request->get("display_checkout", 0);
|
||||||
|
|
||||||
if ($request->get('format') == 'CUSTOM REGEX') {
|
if ($request->get('format') == 'CUSTOM REGEX') {
|
||||||
$field->format = e($request->get('custom_format'));
|
$field->format = e($request->get('custom_format'));
|
||||||
|
|
|
@ -35,10 +35,12 @@ class CustomFieldsetsController extends Controller
|
||||||
* @param int $id
|
* @param int $id
|
||||||
* @since [v1.8]
|
* @since [v1.8]
|
||||||
*/
|
*/
|
||||||
public function show($id) : View | RedirectResponse
|
public function show(CustomFieldset $fieldset) : View | RedirectResponse
|
||||||
{
|
{
|
||||||
$cfset = CustomFieldset::with('fields')
|
$cfset = CustomFieldset::with('fields')
|
||||||
->where('id', '=', $id)->orderBy('id', 'ASC')->first();
|
->where('id', '=', $fieldset->id)
|
||||||
|
->orderBy('id', 'ASC')
|
||||||
|
->first();
|
||||||
|
|
||||||
$this->authorize('view', $cfset);
|
$this->authorize('view', $cfset);
|
||||||
|
|
||||||
|
@ -122,16 +124,10 @@ class CustomFieldsetsController extends Controller
|
||||||
* @param int $id
|
* @param int $id
|
||||||
* @since [v6.0.14]
|
* @since [v6.0.14]
|
||||||
*/
|
*/
|
||||||
public function edit($id) : View | RedirectResponse
|
public function edit(CustomFieldset $fieldset) : View | RedirectResponse
|
||||||
{
|
{
|
||||||
$this->authorize('create', CustomField::class);
|
$this->authorize('create', CustomField::class);
|
||||||
|
return view('custom_fields.fieldsets.edit')->with('item', $fieldset);
|
||||||
if ($fieldset = CustomFieldset::find($id)) {
|
|
||||||
return view('custom_fields.fieldsets.edit')->with('item', $fieldset);
|
|
||||||
}
|
|
||||||
|
|
||||||
return redirect()->route('fields.index')->with('error', trans('admin/custom_fields/general.fieldset_does_not_exist', ['id' => $id]));
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -141,23 +137,18 @@ class CustomFieldsetsController extends Controller
|
||||||
* @param int $id
|
* @param int $id
|
||||||
* @since [v6.0.14]
|
* @since [v6.0.14]
|
||||||
*/
|
*/
|
||||||
public function update(Request $request, $id) : RedirectResponse
|
public function update(Request $request, CustomFieldset $fieldset) : RedirectResponse
|
||||||
{
|
{
|
||||||
$this->authorize('create', CustomField::class);
|
$this->authorize('create', CustomField::class);
|
||||||
|
|
||||||
if ($fieldset = CustomFieldset::find($id)) {
|
$fieldset->name = $request->input('name');
|
||||||
|
|
||||||
$fieldset->name = $request->input('name');
|
|
||||||
|
|
||||||
if ($fieldset->save()) {
|
|
||||||
return redirect()->route('fields.index')->with('success', trans('admin/custom_fields/general.fieldset_updated'));
|
|
||||||
}
|
|
||||||
|
|
||||||
return redirect()->back()->withInput()->withErrors($fieldset->getErrors());
|
|
||||||
|
|
||||||
|
if ($fieldset->save()) {
|
||||||
|
return redirect()->route('fields.index')->with('success', trans('admin/custom_fields/general.fieldset_updated'));
|
||||||
}
|
}
|
||||||
|
|
||||||
return redirect()->route('fields.index')->with('error', trans('admin/custom_fields/general.fieldset_does_not_exist', ['id' => $id]));
|
return redirect()->back()->withInput()->withErrors($fieldset->getErrors());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -55,6 +55,7 @@ class DepartmentsController extends Controller
|
||||||
$department->manager_id = ($request->filled('manager_id') ? $request->input('manager_id') : null);
|
$department->manager_id = ($request->filled('manager_id') ? $request->input('manager_id') : null);
|
||||||
$department->location_id = ($request->filled('location_id') ? $request->input('location_id') : null);
|
$department->location_id = ($request->filled('location_id') ? $request->input('location_id') : null);
|
||||||
$department->company_id = ($request->filled('company_id') ? $request->input('company_id') : null);
|
$department->company_id = ($request->filled('company_id') ? $request->input('company_id') : null);
|
||||||
|
$department->notes = $request->input('notes');
|
||||||
$department = $request->handleImages($department);
|
$department = $request->handleImages($department);
|
||||||
|
|
||||||
if ($department->save()) {
|
if ($department->save()) {
|
||||||
|
@ -72,17 +73,10 @@ class DepartmentsController extends Controller
|
||||||
* @param int $id
|
* @param int $id
|
||||||
* @since [v4.0]
|
* @since [v4.0]
|
||||||
*/
|
*/
|
||||||
public function show($id) : View | RedirectResponse
|
public function show(Department $department) : View | RedirectResponse
|
||||||
{
|
{
|
||||||
$department = Department::find($id);
|
|
||||||
|
|
||||||
$this->authorize('view', $department);
|
$this->authorize('view', $department);
|
||||||
|
return view('departments/view', compact('department'));
|
||||||
if (isset($department->id)) {
|
|
||||||
return view('departments/view', compact('department'));
|
|
||||||
}
|
|
||||||
|
|
||||||
return redirect()->route('departments.index')->with('error', trans('admin/departments/message.does_not_exist'));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -138,15 +132,10 @@ class DepartmentsController extends Controller
|
||||||
* @param int $departmentId
|
* @param int $departmentId
|
||||||
* @since [v1.0]
|
* @since [v1.0]
|
||||||
*/
|
*/
|
||||||
public function edit($departmentId = null) : View | RedirectResponse
|
public function edit(Department $department) : View | RedirectResponse
|
||||||
{
|
{
|
||||||
if (is_null($item = Department::find($departmentId))) {
|
$this->authorize('update', $department);
|
||||||
return redirect()->back()->with('error', trans('admin/locations/message.does_not_exist'));
|
return view('departments/edit')->with('item', $department);
|
||||||
}
|
|
||||||
|
|
||||||
$this->authorize('update', $item);
|
|
||||||
|
|
||||||
return view('departments/edit', compact('item'));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -157,11 +146,8 @@ class DepartmentsController extends Controller
|
||||||
* @param int $departmentId
|
* @param int $departmentId
|
||||||
* @since [v1.0]
|
* @since [v1.0]
|
||||||
*/
|
*/
|
||||||
public function update(ImageUploadRequest $request, $id) : RedirectResponse
|
public function update(ImageUploadRequest $request, Department $department) : RedirectResponse
|
||||||
{
|
{
|
||||||
if (is_null($department = Department::find($id))) {
|
|
||||||
return redirect()->route('departments.index')->with('error', trans('admin/departments/message.does_not_exist'));
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->authorize('update', $department);
|
$this->authorize('update', $department);
|
||||||
|
|
||||||
|
@ -171,7 +157,7 @@ class DepartmentsController extends Controller
|
||||||
$department->company_id = ($request->filled('company_id') ? $request->input('company_id') : null);
|
$department->company_id = ($request->filled('company_id') ? $request->input('company_id') : null);
|
||||||
$department->phone = $request->input('phone');
|
$department->phone = $request->input('phone');
|
||||||
$department->fax = $request->input('fax');
|
$department->fax = $request->input('fax');
|
||||||
|
$department->notes = $request->input('notes');
|
||||||
$department = $request->handleImages($department);
|
$department = $request->handleImages($department);
|
||||||
|
|
||||||
if ($department->save()) {
|
if ($department->save()) {
|
||||||
|
|
|
@ -95,17 +95,11 @@ class DepreciationsController extends Controller
|
||||||
* @param int $depreciationId
|
* @param int $depreciationId
|
||||||
* @since [v1.0]
|
* @since [v1.0]
|
||||||
*/
|
*/
|
||||||
public function edit($depreciationId = null) : RedirectResponse | View
|
public function edit(Depreciation $depreciation) : RedirectResponse | View
|
||||||
{
|
{
|
||||||
// Check if the depreciation exists
|
|
||||||
if (is_null($item = Depreciation::find($depreciationId))) {
|
|
||||||
// Redirect to the blogs management page
|
|
||||||
return redirect()->route('depreciations.index')->with('error', trans('admin/depreciations/message.does_not_exist'));
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->authorize('update', $item);
|
$this->authorize('update', $depreciation);
|
||||||
|
return view('depreciations/edit')->with('item', $depreciation);
|
||||||
return view('depreciations/edit', compact('item'));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -117,17 +111,10 @@ class DepreciationsController extends Controller
|
||||||
* @param int $depreciationId
|
* @param int $depreciationId
|
||||||
* @since [v1.0]
|
* @since [v1.0]
|
||||||
*/
|
*/
|
||||||
public function update(Request $request, $depreciationId = null) : RedirectResponse
|
public function update(Request $request, Depreciation $depreciation) : RedirectResponse
|
||||||
{
|
{
|
||||||
// Check if the depreciation exists
|
|
||||||
if (is_null($depreciation = Depreciation::find($depreciationId))) {
|
|
||||||
// Redirect to the blogs management page
|
|
||||||
return redirect()->route('depreciations.index')->with('error', trans('admin/depreciations/message.does_not_exist'));
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->authorize('update', $depreciation);
|
$this->authorize('update', $depreciation);
|
||||||
|
|
||||||
// Depreciation data
|
|
||||||
$depreciation->name = $request->input('name');
|
$depreciation->name = $request->input('name');
|
||||||
$depreciation->months = $request->input('months');
|
$depreciation->months = $request->input('months');
|
||||||
|
|
||||||
|
@ -191,12 +178,12 @@ class DepreciationsController extends Controller
|
||||||
* @param int $depreciationId
|
* @param int $depreciationId
|
||||||
* @since [v1.0]
|
* @since [v1.0]
|
||||||
*/
|
*/
|
||||||
public function show($id) : View | RedirectResponse
|
public function show(Depreciation $depreciation) : View | RedirectResponse
|
||||||
{
|
{
|
||||||
$depreciation = Depreciation::withCount('assets as assets_count')
|
$depreciation = Depreciation::withCount('assets as assets_count')
|
||||||
->withCount('models as models_count')
|
->withCount('models as models_count')
|
||||||
->withCount('licenses as licenses_count')
|
->withCount('licenses as licenses_count')
|
||||||
->find($id);
|
->find($depreciation->id);
|
||||||
|
|
||||||
$this->authorize('view', $depreciation);
|
$this->authorize('view', $depreciation);
|
||||||
|
|
||||||
|
|
|
@ -62,6 +62,7 @@ class GroupsController extends Controller
|
||||||
$group->name = $request->input('name');
|
$group->name = $request->input('name');
|
||||||
$group->permissions = json_encode($request->input('permission'));
|
$group->permissions = json_encode($request->input('permission'));
|
||||||
$group->created_by = auth()->id();
|
$group->created_by = auth()->id();
|
||||||
|
$group->notes = $request->input('notes');
|
||||||
|
|
||||||
if ($group->save()) {
|
if ($group->save()) {
|
||||||
return redirect()->route('groups.index')->with('success', trans('admin/groups/message.success.create'));
|
return redirect()->route('groups.index')->with('success', trans('admin/groups/message.success.create'));
|
||||||
|
@ -78,19 +79,12 @@ class GroupsController extends Controller
|
||||||
* @param int $id
|
* @param int $id
|
||||||
* @since [v1.0]
|
* @since [v1.0]
|
||||||
*/
|
*/
|
||||||
public function edit($id) : View | RedirectResponse
|
public function edit(Group $group) : View | RedirectResponse
|
||||||
{
|
{
|
||||||
$group = Group::find($id);
|
$permissions = config('permissions');
|
||||||
|
$groupPermissions = $group->decodePermissions();
|
||||||
if ($group) {
|
$selected_array = Helper::selectedPermissionsArray($permissions, $groupPermissions);
|
||||||
$permissions = config('permissions');
|
return view('groups.edit', compact('group', 'permissions', 'selected_array', 'groupPermissions'));
|
||||||
$groupPermissions = $group->decodePermissions();
|
|
||||||
$selected_array = Helper::selectedPermissionsArray($permissions, $groupPermissions);
|
|
||||||
|
|
||||||
return view('groups.edit', compact('group', 'permissions', 'selected_array', 'groupPermissions'));
|
|
||||||
}
|
|
||||||
|
|
||||||
return redirect()->route('groups.index')->with('error', trans('admin/groups/message.group_not_found', ['id' => $id]));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -101,13 +95,11 @@ class GroupsController extends Controller
|
||||||
* @param int $id
|
* @param int $id
|
||||||
* @since [v1.0]
|
* @since [v1.0]
|
||||||
*/
|
*/
|
||||||
public function update(Request $request, $id = null) : RedirectResponse
|
public function update(Request $request, Group $group) : RedirectResponse
|
||||||
{
|
{
|
||||||
if (! $group = Group::find($id)) {
|
|
||||||
return redirect()->route('groups.index')->with('error', trans('admin/groups/message.group_not_found', ['id' => $id]));
|
|
||||||
}
|
|
||||||
$group->name = $request->input('name');
|
$group->name = $request->input('name');
|
||||||
$group->permissions = json_encode($request->input('permission'));
|
$group->permissions = json_encode($request->input('permission'));
|
||||||
|
$group->notes = $request->input('notes');
|
||||||
|
|
||||||
if (! config('app.lock_passwords')) {
|
if (! config('app.lock_passwords')) {
|
||||||
if ($group->save()) {
|
if ($group->save()) {
|
||||||
|
@ -149,14 +141,8 @@ class GroupsController extends Controller
|
||||||
* @param $id
|
* @param $id
|
||||||
* @since [v4.0.11]
|
* @since [v4.0.11]
|
||||||
*/
|
*/
|
||||||
public function show($id) : View | RedirectResponse
|
public function show(Group $group) : View | RedirectResponse
|
||||||
{
|
{
|
||||||
$group = Group::find($id);
|
return view('groups/view', compact('group'));
|
||||||
|
|
||||||
if ($group) {
|
|
||||||
return view('groups/view', compact('group'));
|
|
||||||
}
|
|
||||||
|
|
||||||
return redirect()->route('groups.index')->with('error', trans('admin/groups/message.group_not_found', ['id' => $id]));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,10 +4,8 @@ namespace App\Http\Controllers\Kits;
|
||||||
|
|
||||||
use App\Http\Controllers\CheckInOutRequest;
|
use App\Http\Controllers\CheckInOutRequest;
|
||||||
use App\Http\Controllers\Controller;
|
use App\Http\Controllers\Controller;
|
||||||
use App\Models\PredefinedKit;
|
|
||||||
use App\Models\Asset;
|
use App\Models\Asset;
|
||||||
use App\Models\PredefinedLicence;
|
use App\Models\PredefinedKit;
|
||||||
use App\Models\PredefinedModel;
|
|
||||||
use App\Models\User;
|
use App\Models\User;
|
||||||
use App\Services\PredefinedKitCheckoutService;
|
use App\Services\PredefinedKitCheckoutService;
|
||||||
use Illuminate\Http\Request;
|
use Illuminate\Http\Request;
|
||||||
|
@ -35,12 +33,9 @@ class CheckoutKitController extends Controller
|
||||||
* @author [D. Minaev.] [<dmitriy.minaev.v@gmail.com>]
|
* @author [D. Minaev.] [<dmitriy.minaev.v@gmail.com>]
|
||||||
* @return \Illuminate\Contracts\View\View View to checkout
|
* @return \Illuminate\Contracts\View\View View to checkout
|
||||||
*/
|
*/
|
||||||
public function showCheckout($kit_id)
|
public function showCheckout(PredefinedKit $kit)
|
||||||
{
|
{
|
||||||
$this->authorize('checkout', Asset::class);
|
$this->authorize('checkout', Asset::class);
|
||||||
|
|
||||||
$kit = PredefinedKit::findOrFail($kit_id);
|
|
||||||
|
|
||||||
return view('kits/checkout')->with('kit', $kit);
|
return view('kits/checkout')->with('kit', $kit);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -76,17 +76,15 @@ class PredefinedKitsController extends Controller
|
||||||
* @param int $kit_id
|
* @param int $kit_id
|
||||||
* @return \Illuminate\Contracts\View\View
|
* @return \Illuminate\Contracts\View\View
|
||||||
*/
|
*/
|
||||||
public function edit($kit_id = null)
|
public function edit(PredefinedKit $kit)
|
||||||
{
|
{
|
||||||
$this->authorize('update', PredefinedKit::class);
|
$this->authorize('update', PredefinedKit::class);
|
||||||
if ($kit = PredefinedKit::find($kit_id)) {
|
|
||||||
return view('kits/edit')
|
return view('kits/edit')
|
||||||
->with('item', $kit)
|
->with('item', $kit)
|
||||||
->with('models', $kit->models)
|
->with('models', $kit->models)
|
||||||
->with('licenses', $kit->licenses);
|
->with('licenses', $kit->licenses);
|
||||||
}
|
|
||||||
|
|
||||||
return redirect()->route('kits.index')->with('error', trans('admin/kits/general.kit_none'));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -98,15 +96,9 @@ class PredefinedKitsController extends Controller
|
||||||
* @param int $kit_id
|
* @param int $kit_id
|
||||||
* @return \Illuminate\Http\RedirectResponse
|
* @return \Illuminate\Http\RedirectResponse
|
||||||
*/
|
*/
|
||||||
public function update(ImageUploadRequest $request, $kit_id = null)
|
public function update(ImageUploadRequest $request, PredefinedKit $kit)
|
||||||
{
|
{
|
||||||
$this->authorize('update', PredefinedKit::class);
|
$this->authorize('update', PredefinedKit::class);
|
||||||
// Check if the kit exists
|
|
||||||
if (is_null($kit = PredefinedKit::find($kit_id))) {
|
|
||||||
// Redirect to the kits management page
|
|
||||||
return redirect()->route('kits.index')->with('error', trans('admin/kits/general.kit_none'));
|
|
||||||
}
|
|
||||||
|
|
||||||
$kit->name = $request->input('name');
|
$kit->name = $request->input('name');
|
||||||
|
|
||||||
if ($kit->save()) {
|
if ($kit->save()) {
|
||||||
|
@ -153,9 +145,9 @@ class PredefinedKitsController extends Controller
|
||||||
* @param int $modelId
|
* @param int $modelId
|
||||||
* @return \Illuminate\Contracts\View\View
|
* @return \Illuminate\Contracts\View\View
|
||||||
*/
|
*/
|
||||||
public function show($kit_id = null)
|
public function show(PredefinedKit $kit)
|
||||||
{
|
{
|
||||||
return $this->edit($kit_id);
|
return $this->edit($kit);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -28,16 +28,11 @@ class LicenseCheckinController extends Controller
|
||||||
* @return \Illuminate\Contracts\View\View
|
* @return \Illuminate\Contracts\View\View
|
||||||
* @throws \Illuminate\Auth\Access\AuthorizationException
|
* @throws \Illuminate\Auth\Access\AuthorizationException
|
||||||
*/
|
*/
|
||||||
public function create($seatId = null, $backTo = null)
|
public function create(LicenseSeat $licenseSeat, $backTo = null)
|
||||||
{
|
{
|
||||||
// Check if the asset exists
|
// Check if the asset exists
|
||||||
if (is_null($licenseSeat = LicenseSeat::find($seatId)) || is_null($license = License::find($licenseSeat->license_id))) {
|
$license = License::find($licenseSeat->license_id);
|
||||||
// Redirect to the asset management page with error
|
|
||||||
return redirect()->route('licenses.index')->with('error', trans('admin/licenses/message.not_found'));
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->authorize('checkout', $license);
|
$this->authorize('checkout', $license);
|
||||||
|
|
||||||
return view('licenses/checkin', compact('licenseSeat'))->with('backto', $backTo);
|
return view('licenses/checkin', compact('licenseSeat'))->with('backto', $backTo);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -28,33 +28,24 @@ class LicenseCheckoutController extends Controller
|
||||||
* @return \Illuminate\Contracts\View\View
|
* @return \Illuminate\Contracts\View\View
|
||||||
* @throws \Illuminate\Auth\Access\AuthorizationException
|
* @throws \Illuminate\Auth\Access\AuthorizationException
|
||||||
*/
|
*/
|
||||||
public function create($id)
|
public function create(License $license)
|
||||||
{
|
{
|
||||||
|
$this->authorize('checkout', $license);
|
||||||
|
|
||||||
if ($license = License::find($id)) {
|
if ($license->category) {
|
||||||
|
|
||||||
$this->authorize('checkout', $license);
|
// Make sure there is at least one available to checkout
|
||||||
|
if ($license->availCount()->count() < 1) {
|
||||||
if ($license->category) {
|
return redirect()->route('licenses.index')->with('error', trans('admin/licenses/message.checkout.not_enough_seats'));
|
||||||
|
|
||||||
// Make sure there is at least one available to checkout
|
|
||||||
if ($license->availCount()->count() < 1){
|
|
||||||
return redirect()->route('licenses.index')->with('error', trans('admin/licenses/message.checkout.not_enough_seats'));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Return the checkout view
|
|
||||||
return view('licenses/checkout', compact('license'));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Invalid category
|
// Return the checkout view
|
||||||
return redirect()->route('licenses.edit', ['license' => $license->id])
|
return view('licenses/checkout', compact('license'));
|
||||||
->with('error', trans('general.invalid_item_category_single', ['type' => trans('general.license')]));
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Not found
|
// Invalid category
|
||||||
return redirect()->route('licenses.index')->with('error', trans('admin/licenses/message.not_found'));
|
return redirect()->route('licenses.edit', ['license' => $license->id])
|
||||||
|
->with('error', trans('general.invalid_item_category_single', ['type' => trans('general.license')]));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -121,13 +121,10 @@ class LicensesController extends Controller
|
||||||
* @return \Illuminate\Contracts\View\View
|
* @return \Illuminate\Contracts\View\View
|
||||||
* @throws \Illuminate\Auth\Access\AuthorizationException
|
* @throws \Illuminate\Auth\Access\AuthorizationException
|
||||||
*/
|
*/
|
||||||
public function edit($licenseId = null)
|
public function edit(License $license)
|
||||||
{
|
{
|
||||||
if (is_null($item = License::find($licenseId))) {
|
|
||||||
return redirect()->route('licenses.index')->with('error', trans('admin/licenses/message.does_not_exist'));
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->authorize('update', $item);
|
$this->authorize('update', $license);
|
||||||
|
|
||||||
$maintained_list = [
|
$maintained_list = [
|
||||||
'' => 'Maintained',
|
'' => 'Maintained',
|
||||||
|
@ -135,7 +132,8 @@ class LicensesController extends Controller
|
||||||
'0' => 'No',
|
'0' => 'No',
|
||||||
];
|
];
|
||||||
|
|
||||||
return view('licenses/edit', compact('item'))
|
return view('licenses/edit')
|
||||||
|
->with('item', $license)
|
||||||
->with('depreciation_list', Helper::depreciationList())
|
->with('depreciation_list', Helper::depreciationList())
|
||||||
->with('maintained_list', $maintained_list);
|
->with('maintained_list', $maintained_list);
|
||||||
}
|
}
|
||||||
|
@ -153,11 +151,9 @@ class LicensesController extends Controller
|
||||||
* @return \Illuminate\Http\RedirectResponse
|
* @return \Illuminate\Http\RedirectResponse
|
||||||
* @throws \Illuminate\Auth\Access\AuthorizationException
|
* @throws \Illuminate\Auth\Access\AuthorizationException
|
||||||
*/
|
*/
|
||||||
public function update(Request $request, $licenseId = null)
|
public function update(Request $request, License $license)
|
||||||
{
|
{
|
||||||
if (is_null($license = License::find($licenseId))) {
|
|
||||||
return redirect()->route('licenses.index')->with('error', trans('admin/licenses/message.does_not_exist'));
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->authorize('update', $license);
|
$this->authorize('update', $license);
|
||||||
|
|
||||||
|
@ -201,10 +197,10 @@ class LicensesController extends Controller
|
||||||
* @return \Illuminate\Http\RedirectResponse
|
* @return \Illuminate\Http\RedirectResponse
|
||||||
* @throws \Illuminate\Auth\Access\AuthorizationException
|
* @throws \Illuminate\Auth\Access\AuthorizationException
|
||||||
*/
|
*/
|
||||||
public function destroy($licenseId)
|
public function destroy(License $license)
|
||||||
{
|
{
|
||||||
// Check if the license exists
|
// Check if the license exists
|
||||||
if (is_null($license = License::find($licenseId))) {
|
if (is_null($license = License::find($license->id))) {
|
||||||
// Redirect to the license management page
|
// Redirect to the license management page
|
||||||
return redirect()->route('licenses.index')->with('error', trans('admin/licenses/message.not_found'));
|
return redirect()->route('licenses.index')->with('error', trans('admin/licenses/message.not_found'));
|
||||||
}
|
}
|
||||||
|
@ -238,14 +234,9 @@ class LicensesController extends Controller
|
||||||
* @return \Illuminate\Contracts\View\View
|
* @return \Illuminate\Contracts\View\View
|
||||||
* @throws \Illuminate\Auth\Access\AuthorizationException
|
* @throws \Illuminate\Auth\Access\AuthorizationException
|
||||||
*/
|
*/
|
||||||
public function show($licenseId = null)
|
public function show(License $license)
|
||||||
{
|
{
|
||||||
$license = License::with('assignedusers')->find($licenseId);
|
$license = License::with('assignedusers')->find($license->id);
|
||||||
|
|
||||||
if (!$license) {
|
|
||||||
return redirect()->route('licenses.index')
|
|
||||||
->with('error', trans('admin/licenses/message.does_not_exist'));
|
|
||||||
}
|
|
||||||
|
|
||||||
$users_count = User::where('autoassign_licenses', '1')->count();
|
$users_count = User::where('autoassign_licenses', '1')->count();
|
||||||
$total_seats_count = $license->totalSeatsByLicenseID();
|
$total_seats_count = $license->totalSeatsByLicenseID();
|
||||||
|
@ -267,10 +258,10 @@ class LicensesController extends Controller
|
||||||
*
|
*
|
||||||
* @author [A. Gianotto] [<snipe@snipe.net>]
|
* @author [A. Gianotto] [<snipe@snipe.net>]
|
||||||
* @param int $licenseId
|
* @param int $licenseId
|
||||||
* @return \Illuminate\Http\RedirectResponse
|
* @return \Illuminate\Http\RedirectResponse | \Illuminate\Contracts\View\View
|
||||||
* @throws \Illuminate\Auth\Access\AuthorizationException
|
* @throws \Illuminate\Auth\Access\AuthorizationException
|
||||||
*/
|
*/
|
||||||
public function getClone($licenseId = null)
|
public function getClone($licenseId = null) : \Illuminate\Contracts\View\View | \Illuminate\Http\RedirectResponse
|
||||||
{
|
{
|
||||||
if (is_null($license_to_clone = License::find($licenseId))) {
|
if (is_null($license_to_clone = License::find($licenseId))) {
|
||||||
return redirect()->route('licenses.index')->with('error', trans('admin/licenses/message.does_not_exist'));
|
return redirect()->route('licenses.index')->with('error', trans('admin/licenses/message.does_not_exist'));
|
||||||
|
|
|
@ -78,6 +78,7 @@ class LocationsController extends Controller
|
||||||
$location->created_by = auth()->id();
|
$location->created_by = auth()->id();
|
||||||
$location->phone = request('phone');
|
$location->phone = request('phone');
|
||||||
$location->fax = request('fax');
|
$location->fax = request('fax');
|
||||||
|
$location->notes = $request->input('notes');
|
||||||
|
|
||||||
$location = $request->handleImages($location);
|
$location = $request->handleImages($location);
|
||||||
|
|
||||||
|
@ -96,15 +97,10 @@ class LocationsController extends Controller
|
||||||
* @param int $locationId
|
* @param int $locationId
|
||||||
* @since [v1.0]
|
* @since [v1.0]
|
||||||
*/
|
*/
|
||||||
public function edit($locationId = null) : View | RedirectResponse
|
public function edit(Location $location) : View | RedirectResponse
|
||||||
{
|
{
|
||||||
$this->authorize('update', Location::class);
|
$this->authorize('update', Location::class);
|
||||||
// Check if the location exists
|
return view('locations/edit');
|
||||||
if (is_null($item = Location::find($locationId))) {
|
|
||||||
return redirect()->route('locations.index')->with('error', trans('admin/locations/message.does_not_exist'));
|
|
||||||
}
|
|
||||||
|
|
||||||
return view('locations/edit', compact('item'));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -116,15 +112,10 @@ class LocationsController extends Controller
|
||||||
* @param int $locationId
|
* @param int $locationId
|
||||||
* @since [v1.0]
|
* @since [v1.0]
|
||||||
*/
|
*/
|
||||||
public function update(ImageUploadRequest $request, $locationId = null) : RedirectResponse
|
public function update(ImageUploadRequest $request, Location $location) : RedirectResponse
|
||||||
{
|
{
|
||||||
$this->authorize('update', Location::class);
|
$this->authorize('update', Location::class);
|
||||||
// Check if the location exists
|
|
||||||
if (is_null($location = Location::find($locationId))) {
|
|
||||||
return redirect()->route('locations.index')->with('error', trans('admin/locations/message.does_not_exist'));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Update the location data
|
|
||||||
$location->name = $request->input('name');
|
$location->name = $request->input('name');
|
||||||
$location->parent_id = $request->input('parent_id', null);
|
$location->parent_id = $request->input('parent_id', null);
|
||||||
$location->currency = $request->input('currency', '$');
|
$location->currency = $request->input('currency', '$');
|
||||||
|
@ -138,6 +129,7 @@ class LocationsController extends Controller
|
||||||
$location->fax = request('fax');
|
$location->fax = request('fax');
|
||||||
$location->ldap_ou = $request->input('ldap_ou');
|
$location->ldap_ou = $request->input('ldap_ou');
|
||||||
$location->manager_id = $request->input('manager_id');
|
$location->manager_id = $request->input('manager_id');
|
||||||
|
$location->notes = $request->input('notes');
|
||||||
|
|
||||||
$location = $request->handleImages($location);
|
$location = $request->handleImages($location);
|
||||||
|
|
||||||
|
@ -192,7 +184,7 @@ class LocationsController extends Controller
|
||||||
* @param int $id
|
* @param int $id
|
||||||
* @since [v1.0]
|
* @since [v1.0]
|
||||||
*/
|
*/
|
||||||
public function show($id = null) : View | RedirectResponse
|
public function show(Location $location) : View | RedirectResponse
|
||||||
{
|
{
|
||||||
$location = Location::withCount('assignedAssets as assigned_assets_count')
|
$location = Location::withCount('assignedAssets as assigned_assets_count')
|
||||||
->withCount('assets as assets_count')
|
->withCount('assets as assets_count')
|
||||||
|
@ -200,7 +192,7 @@ class LocationsController extends Controller
|
||||||
->withCount('children as children_count')
|
->withCount('children as children_count')
|
||||||
->withCount('users as users_count')
|
->withCount('users as users_count')
|
||||||
->withTrashed()
|
->withTrashed()
|
||||||
->find($id);
|
->find($location->id);
|
||||||
|
|
||||||
if (isset($location->id)) {
|
if (isset($location->id)) {
|
||||||
return view('locations/view', compact('location'));
|
return view('locations/view', compact('location'));
|
||||||
|
|
|
@ -67,6 +67,7 @@ class ManufacturersController extends Controller
|
||||||
$manufacturer->warranty_lookup_url = $request->input('warranty_lookup_url');
|
$manufacturer->warranty_lookup_url = $request->input('warranty_lookup_url');
|
||||||
$manufacturer->support_phone = $request->input('support_phone');
|
$manufacturer->support_phone = $request->input('support_phone');
|
||||||
$manufacturer->support_email = $request->input('support_email');
|
$manufacturer->support_email = $request->input('support_email');
|
||||||
|
$manufacturer->notes = $request->input('notes');
|
||||||
$manufacturer = $request->handleImages($manufacturer);
|
$manufacturer = $request->handleImages($manufacturer);
|
||||||
|
|
||||||
if ($manufacturer->save()) {
|
if ($manufacturer->save()) {
|
||||||
|
@ -84,18 +85,10 @@ class ManufacturersController extends Controller
|
||||||
* @param int $manufacturerId
|
* @param int $manufacturerId
|
||||||
* @since [v1.0]
|
* @since [v1.0]
|
||||||
*/
|
*/
|
||||||
public function edit($manufacturerId = null) : View | RedirectResponse
|
public function edit(Manufacturer $manufacturer) : View | RedirectResponse
|
||||||
{
|
{
|
||||||
// Handles manufacturer checks and permissions.
|
|
||||||
$this->authorize('update', Manufacturer::class);
|
$this->authorize('update', Manufacturer::class);
|
||||||
|
return view('manufacturers/edit')->with('item', $manufacturer);
|
||||||
// Check if the manufacturer exists
|
|
||||||
if (! $item = Manufacturer::find($manufacturerId)) {
|
|
||||||
return redirect()->route('manufacturers.index')->with('error', trans('admin/manufacturers/message.does_not_exist'));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Show the page
|
|
||||||
return view('manufacturers/edit', compact('item'));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -107,22 +100,17 @@ class ManufacturersController extends Controller
|
||||||
* @param int $manufacturerId
|
* @param int $manufacturerId
|
||||||
* @since [v1.0]
|
* @since [v1.0]
|
||||||
*/
|
*/
|
||||||
public function update(ImageUploadRequest $request, $manufacturerId = null) : RedirectResponse
|
public function update(ImageUploadRequest $request, Manufacturer $manufacturer) : RedirectResponse
|
||||||
{
|
{
|
||||||
$this->authorize('update', Manufacturer::class);
|
$this->authorize('update', Manufacturer::class);
|
||||||
// Check if the manufacturer exists
|
|
||||||
if (is_null($manufacturer = Manufacturer::find($manufacturerId))) {
|
|
||||||
// Redirect to the manufacturer page
|
|
||||||
return redirect()->route('manufacturers.index')->with('error', trans('admin/manufacturers/message.does_not_exist'));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Save the data
|
|
||||||
$manufacturer->name = $request->input('name');
|
$manufacturer->name = $request->input('name');
|
||||||
$manufacturer->url = $request->input('url');
|
$manufacturer->url = $request->input('url');
|
||||||
$manufacturer->support_url = $request->input('support_url');
|
$manufacturer->support_url = $request->input('support_url');
|
||||||
$manufacturer->warranty_lookup_url = $request->input('warranty_lookup_url');
|
$manufacturer->warranty_lookup_url = $request->input('warranty_lookup_url');
|
||||||
$manufacturer->support_phone = $request->input('support_phone');
|
$manufacturer->support_phone = $request->input('support_phone');
|
||||||
$manufacturer->support_email = $request->input('support_email');
|
$manufacturer->support_email = $request->input('support_email');
|
||||||
|
$manufacturer->notes = $request->input('notes');
|
||||||
|
|
||||||
// Set the model's image property to null if the image is being deleted
|
// Set the model's image property to null if the image is being deleted
|
||||||
if ($request->input('image_delete') == 1) {
|
if ($request->input('image_delete') == 1) {
|
||||||
|
@ -183,18 +171,10 @@ class ManufacturersController extends Controller
|
||||||
* @param int $manufacturerId
|
* @param int $manufacturerId
|
||||||
* @since [v1.0]
|
* @since [v1.0]
|
||||||
*/
|
*/
|
||||||
public function show($manufacturerId = null) : View | RedirectResponse
|
public function show(Manufacturer $manufacturer) : View | RedirectResponse
|
||||||
{
|
{
|
||||||
$this->authorize('view', Manufacturer::class);
|
$this->authorize('view', Manufacturer::class);
|
||||||
$manufacturer = Manufacturer::find($manufacturerId);
|
return view('manufacturers/view', compact('manufacturer'));
|
||||||
|
|
||||||
if (isset($manufacturer->id)) {
|
|
||||||
return view('manufacturers/view', compact('manufacturer'));
|
|
||||||
}
|
|
||||||
|
|
||||||
$error = trans('admin/manufacturers/message.does_not_exist');
|
|
||||||
// Redirect to the user management page
|
|
||||||
return redirect()->route('manufacturers.index')->with('error', $error);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -33,6 +33,7 @@ class ModalController extends Controller
|
||||||
'supplier',
|
'supplier',
|
||||||
'upload-file',
|
'upload-file',
|
||||||
'user',
|
'user',
|
||||||
|
'add-note',
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|
||||||
|
|
42
app/Http/Controllers/NotesController.php
Normal file
42
app/Http/Controllers/NotesController.php
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Controllers;
|
||||||
|
|
||||||
|
use App\Models\Actionlog;
|
||||||
|
use App\Models\Asset;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
use Illuminate\Support\Facades\Auth;
|
||||||
|
use Illuminate\Validation\Rule;
|
||||||
|
|
||||||
|
class NotesController extends Controller
|
||||||
|
{
|
||||||
|
public function store(Request $request)
|
||||||
|
{
|
||||||
|
$this->authorize('update', Asset::class);
|
||||||
|
|
||||||
|
$validated = $request->validate([
|
||||||
|
'id' => 'required',
|
||||||
|
'note' => 'required|string|max:50000',
|
||||||
|
'type' => [
|
||||||
|
'required',
|
||||||
|
Rule::in(['asset']),
|
||||||
|
],
|
||||||
|
]);
|
||||||
|
|
||||||
|
$item = Asset::findOrFail($validated['id']);
|
||||||
|
|
||||||
|
$this->authorize('update', $item);
|
||||||
|
|
||||||
|
$logaction = new Actionlog;
|
||||||
|
$logaction->item_id = $item->id;
|
||||||
|
$logaction->item_type = get_class($item);
|
||||||
|
$logaction->note = $validated['note'];
|
||||||
|
$logaction->created_by = Auth::id();
|
||||||
|
$logaction->logaction('note added');
|
||||||
|
|
||||||
|
return redirect()
|
||||||
|
->route('hardware.show', $validated['id'])
|
||||||
|
->withFragment('history')
|
||||||
|
->with('success', trans('general.note_added'));
|
||||||
|
}
|
||||||
|
}
|
|
@ -99,9 +99,13 @@ class ProfileController extends Controller
|
||||||
* User change email page.
|
* User change email page.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public function password() : View
|
public function password() : View | RedirectResponse
|
||||||
{
|
{
|
||||||
|
|
||||||
$user = auth()->user();
|
$user = auth()->user();
|
||||||
|
if ($user->ldap_import=='1') {
|
||||||
|
return redirect()->route('account')->with('error', trans('admin/users/message.error.password_ldap'));
|
||||||
|
}
|
||||||
return view('account/change-password', compact('user'));
|
return view('account/change-password', compact('user'));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -116,7 +120,7 @@ class ProfileController extends Controller
|
||||||
|
|
||||||
$user = auth()->user();
|
$user = auth()->user();
|
||||||
if ($user->ldap_import == '1') {
|
if ($user->ldap_import == '1') {
|
||||||
return redirect()->route('account.password.index')->with('error', trans('admin/users/message.error.password_ldap'));
|
return redirect()->route('account')->with('error', trans('admin/users/message.error.password_ldap'));
|
||||||
}
|
}
|
||||||
|
|
||||||
$rules = [
|
$rules = [
|
||||||
|
|
|
@ -11,6 +11,7 @@ use App\Models\AssetModel;
|
||||||
use App\Models\Category;
|
use App\Models\Category;
|
||||||
use App\Models\AssetMaintenance;
|
use App\Models\AssetMaintenance;
|
||||||
use App\Models\CheckoutAcceptance;
|
use App\Models\CheckoutAcceptance;
|
||||||
|
use App\Models\Company;
|
||||||
use App\Models\CustomField;
|
use App\Models\CustomField;
|
||||||
use App\Models\Depreciation;
|
use App\Models\Depreciation;
|
||||||
use App\Models\License;
|
use App\Models\License;
|
||||||
|
@ -18,6 +19,7 @@ use App\Models\ReportTemplate;
|
||||||
use App\Models\Setting;
|
use App\Models\Setting;
|
||||||
use App\Notifications\CheckoutAssetNotification;
|
use App\Notifications\CheckoutAssetNotification;
|
||||||
use Carbon\Carbon;
|
use Carbon\Carbon;
|
||||||
|
use Illuminate\Database\Eloquent\Relations\MorphTo;
|
||||||
use Illuminate\Http\Request;
|
use Illuminate\Http\Request;
|
||||||
use Illuminate\Http\Response;
|
use Illuminate\Http\Response;
|
||||||
use Illuminate\Support\Facades\Mail;
|
use Illuminate\Support\Facades\Mail;
|
||||||
|
@ -1109,28 +1111,31 @@ class ReportsController extends Controller
|
||||||
$this->authorize('reports.view');
|
$this->authorize('reports.view');
|
||||||
$showDeleted = $deleted == 'deleted';
|
$showDeleted = $deleted == 'deleted';
|
||||||
|
|
||||||
/**
|
$query = CheckoutAcceptance::pending()
|
||||||
* Get all assets with pending checkout acceptances
|
->where('checkoutable_type', 'App\Models\Asset')
|
||||||
*/
|
->with([
|
||||||
if($showDeleted) {
|
'checkoutable' => function (MorphTo $query) {
|
||||||
$acceptances = CheckoutAcceptance::pending()->where('checkoutable_type', 'App\Models\Asset')->withTrashed()->with(['assignedTo' , 'checkoutable.assignedTo', 'checkoutable.model'])->get();
|
$query->morphWith([
|
||||||
} else {
|
AssetModel::class => ['model'],
|
||||||
$acceptances = CheckoutAcceptance::pending()->where('checkoutable_type', 'App\Models\Asset')->with(['assignedTo' => function ($query) {
|
Company::class => ['company'],
|
||||||
$query->withTrashed();
|
Asset::class => ['assignedTo'],
|
||||||
}, 'checkoutable.assignedTo', 'checkoutable.model'])->get();
|
])->with('model.category');
|
||||||
|
},
|
||||||
|
'assignedTo' => function($query){
|
||||||
|
$query->withTrashed();
|
||||||
|
}
|
||||||
|
]);
|
||||||
|
|
||||||
|
if ($showDeleted) {
|
||||||
|
$query->withTrashed();
|
||||||
}
|
}
|
||||||
|
|
||||||
$assetsForReport = $acceptances
|
$assetsForReport = $query->get()
|
||||||
->filter(function ($acceptance) {
|
->map(function ($acceptance) {
|
||||||
$acceptance_checkoutable_flag = false;
|
return [
|
||||||
if ($acceptance->checkoutable){
|
'assetItem' => $acceptance->checkoutable,
|
||||||
$acceptance_checkoutable_flag = $acceptance->checkoutable->checkedOutToUser();
|
'acceptance' => $acceptance,
|
||||||
}
|
];
|
||||||
|
|
||||||
return $acceptance->checkoutable_type == 'App\Models\Asset' && $acceptance_checkoutable_flag;
|
|
||||||
})
|
|
||||||
->map(function($acceptance) {
|
|
||||||
return ['assetItem' => $acceptance->checkoutable, 'acceptance' => $acceptance];
|
|
||||||
});
|
});
|
||||||
|
|
||||||
return view('reports/unaccepted_assets', compact('assetsForReport','showDeleted' ));
|
return view('reports/unaccepted_assets', compact('assetsForReport','showDeleted' ));
|
||||||
|
|
|
@ -192,6 +192,7 @@ class SettingsController extends Controller
|
||||||
$settings->next_auto_tag_base = 1;
|
$settings->next_auto_tag_base = 1;
|
||||||
$settings->auto_increment_assets = $request->input('auto_increment_assets', 0);
|
$settings->auto_increment_assets = $request->input('auto_increment_assets', 0);
|
||||||
$settings->auto_increment_prefix = $request->input('auto_increment_prefix');
|
$settings->auto_increment_prefix = $request->input('auto_increment_prefix');
|
||||||
|
$settings->zerofill_count = $request->input('zerofill_count') ?: 0;
|
||||||
|
|
||||||
if ((! $user->isValid()) || (! $settings->isValid())) {
|
if ((! $user->isValid()) || (! $settings->isValid())) {
|
||||||
return redirect()->back()->withInput()->withErrors($user->getErrors())->withErrors($settings->getErrors());
|
return redirect()->back()->withInput()->withErrors($user->getErrors())->withErrors($settings->getErrors());
|
||||||
|
@ -799,6 +800,7 @@ class SettingsController extends Controller
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($setting->save()) {
|
if ($setting->save()) {
|
||||||
|
|
||||||
return redirect()->route('settings.labels.index')
|
return redirect()->route('settings.labels.index')
|
||||||
->with('success', trans('admin/settings/message.update.success'));
|
->with('success', trans('admin/settings/message.update.success'));
|
||||||
}
|
}
|
||||||
|
@ -868,7 +870,6 @@ class SettingsController extends Controller
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($setting->save()) {
|
if ($setting->save()) {
|
||||||
$setting->update_client_side_cert_files();
|
|
||||||
return redirect()->route('settings.ldap.index')
|
return redirect()->route('settings.ldap.index')
|
||||||
->with('success', trans('admin/settings/message.update.success'));
|
->with('success', trans('admin/settings/message.update.success'));
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,14 +26,10 @@ class StatuslabelsController extends Controller
|
||||||
return view('statuslabels.index');
|
return view('statuslabels.index');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function show($id) : View | RedirectResponse
|
public function show(Statuslabel $statuslabel) : View | RedirectResponse
|
||||||
{
|
{
|
||||||
$this->authorize('view', Statuslabel::class);
|
$this->authorize('view', Statuslabel::class);
|
||||||
if ($statuslabel = Statuslabel::find($id)) {
|
return view('statuslabels.view')->with('statuslabel', $statuslabel);
|
||||||
return view('statuslabels.view')->with('statuslabel', $statuslabel);
|
|
||||||
}
|
|
||||||
|
|
||||||
return redirect()->route('statuslabels.index')->with('error', trans('admin/statuslabels/message.does_not_exist'));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -91,20 +87,15 @@ class StatuslabelsController extends Controller
|
||||||
*
|
*
|
||||||
* @param int $statuslabelId
|
* @param int $statuslabelId
|
||||||
*/
|
*/
|
||||||
public function edit($statuslabelId = null) : View | RedirectResponse
|
public function edit(Statuslabel $statuslabel) : View | RedirectResponse
|
||||||
{
|
{
|
||||||
$this->authorize('update', Statuslabel::class);
|
$this->authorize('update', Statuslabel::class);
|
||||||
// Check if the Statuslabel exists
|
|
||||||
if (is_null($item = Statuslabel::find($statuslabelId))) {
|
|
||||||
// Redirect to the blogs management page
|
|
||||||
return redirect()->route('statuslabels.index')->with('error', trans('admin/statuslabels/message.does_not_exist'));
|
|
||||||
}
|
|
||||||
|
|
||||||
$use_statuslabel_type = $item->getStatuslabelType();
|
|
||||||
|
|
||||||
$statuslabel_types = ['' => trans('admin/hardware/form.select_statustype')] + ['undeployable' => trans('admin/hardware/general.undeployable')] + ['pending' => trans('admin/hardware/general.pending')] + ['archived' => trans('admin/hardware/general.archived')] + ['deployable' => trans('admin/hardware/general.deployable')];
|
$statuslabel_types = ['' => trans('admin/hardware/form.select_statustype')] + ['undeployable' => trans('admin/hardware/general.undeployable')] + ['pending' => trans('admin/hardware/general.pending')] + ['archived' => trans('admin/hardware/general.archived')] + ['deployable' => trans('admin/hardware/general.deployable')];
|
||||||
|
|
||||||
return view('statuslabels/edit', compact('item', 'statuslabel_types'))->with('use_statuslabel_type', $use_statuslabel_type);
|
return view('statuslabels/edit', compact('statuslabel_types'))
|
||||||
|
->with('item', $statuslabel)
|
||||||
|
->with('use_statuslabel_type', $statuslabel);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -112,14 +103,9 @@ class StatuslabelsController extends Controller
|
||||||
*
|
*
|
||||||
* @param int $statuslabelId
|
* @param int $statuslabelId
|
||||||
*/
|
*/
|
||||||
public function update(Request $request, $statuslabelId = null) : RedirectResponse
|
public function update(Request $request, Statuslabel $statuslabel) : RedirectResponse
|
||||||
{
|
{
|
||||||
$this->authorize('update', Statuslabel::class);
|
$this->authorize('update', Statuslabel::class);
|
||||||
// Check if the Statuslabel exists
|
|
||||||
if (is_null($statuslabel = Statuslabel::find($statuslabelId))) {
|
|
||||||
// Redirect to the blogs management page
|
|
||||||
return redirect()->route('statuslabels.index')->with('error', trans('admin/statuslabels/message.does_not_exist'));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (! $request->filled('statuslabel_types')) {
|
if (! $request->filled('statuslabel_types')) {
|
||||||
return redirect()->back()->withInput()->withErrors(['statuslabel_types' => trans('validation.statuslabel_type')]);
|
return redirect()->back()->withInput()->withErrors(['statuslabel_types' => trans('validation.statuslabel_type')]);
|
||||||
|
|
|
@ -77,17 +77,10 @@ class SuppliersController extends Controller
|
||||||
*
|
*
|
||||||
* @param int $supplierId
|
* @param int $supplierId
|
||||||
*/
|
*/
|
||||||
public function edit($supplierId = null) : View | RedirectResponse
|
public function edit(Supplier $supplier) : View | RedirectResponse
|
||||||
{
|
{
|
||||||
$this->authorize('update', Supplier::class);
|
$this->authorize('update', Supplier::class);
|
||||||
// Check if the supplier exists
|
return view('suppliers/edit')->with('item', $supplier);
|
||||||
if (is_null($item = Supplier::find($supplierId))) {
|
|
||||||
// Redirect to the supplier page
|
|
||||||
return redirect()->route('suppliers.index')->with('error', trans('admin/suppliers/message.does_not_exist'));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Show the page
|
|
||||||
return view('suppliers/edit', compact('item'));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -95,14 +88,9 @@ class SuppliersController extends Controller
|
||||||
*
|
*
|
||||||
* @param int $supplierId
|
* @param int $supplierId
|
||||||
*/
|
*/
|
||||||
public function update($supplierId, ImageUploadRequest $request) : RedirectResponse
|
public function update(ImageUploadRequest $request, Supplier $supplier) : RedirectResponse
|
||||||
{
|
{
|
||||||
$this->authorize('update', Supplier::class);
|
$this->authorize('update', Supplier::class);
|
||||||
|
|
||||||
if (is_null($supplier = Supplier::find($supplierId))) {
|
|
||||||
return redirect()->route('suppliers.index')->with('error', trans('admin/suppliers/message.does_not_exist'));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Save the data
|
// Save the data
|
||||||
$supplier->name = request('name');
|
$supplier->name = request('name');
|
||||||
$supplier->address = request('address');
|
$supplier->address = request('address');
|
||||||
|
@ -163,15 +151,10 @@ class SuppliersController extends Controller
|
||||||
* @param null $supplierId
|
* @param null $supplierId
|
||||||
* @internal param int $assetId
|
* @internal param int $assetId
|
||||||
*/
|
*/
|
||||||
public function show($supplierId = null) : View | RedirectResponse
|
public function show(Supplier $supplier) : View | RedirectResponse
|
||||||
{
|
{
|
||||||
$this->authorize('view', Supplier::class);
|
$this->authorize('view', Supplier::class);
|
||||||
$supplier = Supplier::find($supplierId);
|
return view('suppliers/view', compact('supplier'));
|
||||||
|
|
||||||
if (isset($supplier->id)) {
|
|
||||||
return view('suppliers/view', compact('supplier'));
|
|
||||||
}
|
|
||||||
|
|
||||||
return redirect()->route('suppliers.index')->with('error', trans('admin/suppliers/message.does_not_exist'));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,6 +15,7 @@ use App\Models\ConsumableAssignment;
|
||||||
use App\Models\Consumable;
|
use App\Models\Consumable;
|
||||||
use App\Models\Setting;
|
use App\Models\Setting;
|
||||||
use App\Models\User;
|
use App\Models\User;
|
||||||
|
use App\Notifications\CurrentInventory;
|
||||||
use Carbon\Carbon;
|
use Carbon\Carbon;
|
||||||
use Illuminate\Http\Request;
|
use Illuminate\Http\Request;
|
||||||
use Illuminate\Support\Collection;
|
use Illuminate\Support\Collection;
|
||||||
|
@ -52,6 +53,28 @@ class BulkUsersController extends Controller
|
||||||
return view('users/bulk-edit', compact('users'))
|
return view('users/bulk-edit', compact('users'))
|
||||||
->with('groups', Group::pluck('name', 'id'));
|
->with('groups', Group::pluck('name', 'id'));
|
||||||
|
|
||||||
|
// bulk send assigned inventory
|
||||||
|
} elseif ($request->input('bulk_actions') == 'send_assigned') {
|
||||||
|
$this->authorize('update', User::class);
|
||||||
|
|
||||||
|
$users_without_email = 0;
|
||||||
|
foreach ($users as $user) {
|
||||||
|
if (empty($user->email)) {
|
||||||
|
$users_without_email++;
|
||||||
|
} else {
|
||||||
|
$user->notify((new CurrentInventory($user)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($users_without_email == 0) {
|
||||||
|
return redirect()->back()->with('success', trans_choice('admin/users/general.users_notified', $users->count()));
|
||||||
|
} else {
|
||||||
|
return redirect()->back()->with('warning', trans_choice('admin/users/general.users_notified_warning', $users->count(), ['no_email' => $users_without_email]));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// bulk delete, display the bulk delete confirmation form
|
// bulk delete, display the bulk delete confirmation form
|
||||||
} elseif ($request->input('bulk_actions') == 'delete') {
|
} elseif ($request->input('bulk_actions') == 'delete') {
|
||||||
$this->authorize('delete', User::class);
|
$this->authorize('delete', User::class);
|
||||||
|
@ -70,7 +93,7 @@ class BulkUsersController extends Controller
|
||||||
// bulk password reset, just do the thing
|
// bulk password reset, just do the thing
|
||||||
} elseif ($request->input('bulk_actions') == 'bulkpasswordreset') {
|
} elseif ($request->input('bulk_actions') == 'bulkpasswordreset') {
|
||||||
foreach ($users as $user) {
|
foreach ($users as $user) {
|
||||||
if (($user->activated == '1') && ($user->email != '')) {
|
if (($user->activated == '1') && ($user->email != '') && ($user->ldap_import != '1')) {
|
||||||
$credentials = ['email' => $user->email];
|
$credentials = ['email' => $user->email];
|
||||||
Password::sendResetLink($credentials/* , function (Message $message) {
|
Password::sendResetLink($credentials/* , function (Message $message) {
|
||||||
$message->subject($this->getEmailSubject()); // TODO - I'm not sure if we still need this, but this second parameter is no longer accepted in later Laravel versions.
|
$message->subject($this->getEmailSubject()); // TODO - I'm not sure if we still need this, but this second parameter is no longer accepted in later Laravel versions.
|
||||||
|
|
|
@ -22,43 +22,34 @@ class UserFilesController extends Controller
|
||||||
*@author [A. Gianotto] [<snipe@snipe.net>]
|
*@author [A. Gianotto] [<snipe@snipe.net>]
|
||||||
* @since [v1.6]
|
* @since [v1.6]
|
||||||
*/
|
*/
|
||||||
public function store(UploadFileRequest $request, $userId = null)
|
public function store(UploadFileRequest $request, User $user)
|
||||||
{
|
{
|
||||||
$user = User::find($userId);
|
$this->authorize('update', $user);
|
||||||
$destinationPath = config('app.private_uploads').'/users';
|
$files = $request->file('file');
|
||||||
|
|
||||||
if (isset($user->id)) {
|
if (is_null($files)) {
|
||||||
$this->authorize('update', $user);
|
return redirect()->back()->with('error', trans('admin/users/message.upload.nofiles'));
|
||||||
|
}
|
||||||
$logActions = [];
|
foreach ($files as $file) {
|
||||||
$files = $request->file('file');
|
$file_name = $request->handleFile('private_uploads/users/', 'user-'.$user->id, $file);
|
||||||
|
|
||||||
if (is_null($files)) {
|
//Log the uploaded file to the log
|
||||||
return redirect()->back()->with('error', trans('admin/users/message.upload.nofiles'));
|
$logAction = new Actionlog();
|
||||||
}
|
$logAction->item_id = $user->id;
|
||||||
foreach ($files as $file) {
|
$logAction->item_type = User::class;
|
||||||
$file_name = $request->handleFile('private_uploads/users/', 'user-'.$user->id, $file);
|
$logAction->created_by = auth()->id();
|
||||||
|
$logAction->note = $request->input('notes');
|
||||||
//Log the uploaded file to the log
|
$logAction->target_id = null;
|
||||||
$logAction = new Actionlog();
|
$logAction->created_at = date("Y-m-d H:i:s");
|
||||||
$logAction->item_id = $user->id;
|
$logAction->filename = $file_name;
|
||||||
$logAction->item_type = User::class;
|
$logAction->action_type = 'uploaded';
|
||||||
$logAction->created_by = auth()->id();
|
|
||||||
$logAction->note = $request->input('notes');
|
if (! $logAction->save()) {
|
||||||
$logAction->target_id = null;
|
return JsonResponse::create(['error' => 'Failed validation: '.print_r($logAction->getErrors(), true)], 500);
|
||||||
$logAction->created_at = date("Y-m-d H:i:s");
|
}
|
||||||
$logAction->filename = $file_name;
|
|
||||||
$logAction->action_type = 'uploaded';
|
return redirect()->back()->withFragment('files')->with('success', trans('admin/users/message.upload.success'));
|
||||||
|
|
||||||
if (! $logAction->save()) {
|
|
||||||
return JsonResponse::create(['error' => 'Failed validation: '.print_r($logAction->getErrors(), true)], 500);
|
|
||||||
}
|
|
||||||
$logActions[] = $logAction;
|
|
||||||
}
|
|
||||||
// dd($logActions);
|
|
||||||
return redirect()->back()->with('success', trans('admin/users/message.upload.success'));
|
|
||||||
}
|
}
|
||||||
return redirect()->back()->with('error', trans('admin/users/message.upload.nofiles'));
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -87,7 +78,7 @@ class UserFilesController extends Controller
|
||||||
|
|
||||||
if (Storage::exists($rel_path.'/'.$filename)) {
|
if (Storage::exists($rel_path.'/'.$filename)) {
|
||||||
Storage::delete($rel_path.'/'.$filename);
|
Storage::delete($rel_path.'/'.$filename);
|
||||||
return redirect()->back()->with('success', trans('admin/users/message.deletefile.success'));
|
return redirect()->back()->withFragment('files')->with('success', trans('admin/users/message.deletefile.success'));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -110,7 +101,7 @@ class UserFilesController extends Controller
|
||||||
* @return mixed
|
* @return mixed
|
||||||
* @throws \Illuminate\Auth\Access\AuthorizationException
|
* @throws \Illuminate\Auth\Access\AuthorizationException
|
||||||
*/
|
*/
|
||||||
public function show($userId = null, $fileId = null)
|
public function show(User $user, $fileId = null)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
||||||
|
@ -118,29 +109,21 @@ class UserFilesController extends Controller
|
||||||
return redirect()->route('users.show')->with('error', 'Invalid file request');
|
return redirect()->route('users.show')->with('error', 'Invalid file request');
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($user = User::find($userId)) {
|
|
||||||
|
|
||||||
$this->authorize('view', $user);
|
$this->authorize('view', $user);
|
||||||
|
|
||||||
if ($log = Actionlog::whereNotNull('filename')->where('item_id', $user->id)->find($fileId)) {
|
if ($log = Actionlog::whereNotNull('filename')->where('item_id', $user->id)->find($fileId)) {
|
||||||
$file = 'private_uploads/users/'.$log->filename;
|
$file = 'private_uploads/users/'.$log->filename;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
return StorageHelper::showOrDownloadFile($file, $log->filename);
|
return StorageHelper::showOrDownloadFile($file, $log->filename);
|
||||||
} catch (\Exception $e) {
|
} catch (\Exception $e) {
|
||||||
return redirect()->route('users.show', ['user' => $user])->with('error', trans('general.file_not_found'));
|
return redirect()->route('users.show', ['user' => $user])->with('error', trans('general.file_not_found'));
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// The log record doesn't exist somehow
|
|
||||||
return redirect()->route('users.show', ['user' => $user])->with('error', trans('general.log_record_not_found'));
|
|
||||||
|
|
||||||
|
|
||||||
return redirect()->back()->with('error', trans('general.file_not_found'));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Redirect to the user management page if the user doesn't exist
|
// The log record doesn't exist somehow
|
||||||
return redirect()->route('users.index')->with('error', trans('admin/users/message.user_not_found', ['id' => $userId]));
|
return redirect()->route('users.show', ['user' => $user])->with('error', trans('general.log_record_not_found'));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -182,11 +182,11 @@ class UsersController extends Controller
|
||||||
* @internal param int $id
|
* @internal param int $id
|
||||||
* @throws \Illuminate\Auth\Access\AuthorizationException
|
* @throws \Illuminate\Auth\Access\AuthorizationException
|
||||||
*/
|
*/
|
||||||
public function edit($id)
|
public function edit(User $user)
|
||||||
{
|
{
|
||||||
|
|
||||||
$this->authorize('update', User::class);
|
$this->authorize('update', User::class);
|
||||||
$user = User::with(['assets', 'assets.model', 'consumables', 'accessories', 'licenses', 'userloc'])->withTrashed()->find($id);
|
$user = User::with(['assets', 'assets.model', 'consumables', 'accessories', 'licenses', 'userloc'])->withTrashed()->find($user->id);
|
||||||
|
|
||||||
if ($user) {
|
if ($user) {
|
||||||
|
|
||||||
|
@ -198,7 +198,7 @@ class UsersController extends Controller
|
||||||
$userPermissions = Helper::selectedPermissionsArray($permissions, $user->permissions);
|
$userPermissions = Helper::selectedPermissionsArray($permissions, $user->permissions);
|
||||||
$permissions = $this->filterDisplayable($permissions);
|
$permissions = $this->filterDisplayable($permissions);
|
||||||
|
|
||||||
return view('users/edit', compact('user', 'groups', 'userGroups', 'permissions', 'userPermissions'))->with('item', $user);
|
return view('users/edit', compact('user', 'groups', 'userGroups', 'permissions', 'userPermissions'));
|
||||||
}
|
}
|
||||||
|
|
||||||
return redirect()->route('users.index')->with('error', trans('admin/users/message.user_not_found', compact('id')));
|
return redirect()->route('users.index')->with('error', trans('admin/users/message.user_not_found', compact('id')));
|
||||||
|
@ -324,7 +324,7 @@ class UsersController extends Controller
|
||||||
* @return \Illuminate\Http\RedirectResponse
|
* @return \Illuminate\Http\RedirectResponse
|
||||||
* @throws \Illuminate\Auth\Access\AuthorizationException
|
* @throws \Illuminate\Auth\Access\AuthorizationException
|
||||||
*/
|
*/
|
||||||
public function destroy(DeleteUserRequest $request, $id = null)
|
public function destroy(DeleteUserRequest $request, $id)
|
||||||
{
|
{
|
||||||
$this->authorize('delete', User::class);
|
$this->authorize('delete', User::class);
|
||||||
|
|
||||||
|
@ -333,13 +333,6 @@ class UsersController extends Controller
|
||||||
$this->authorize('delete', $user);
|
$this->authorize('delete', $user);
|
||||||
|
|
||||||
if ($user->delete()) {
|
if ($user->delete()) {
|
||||||
if (Storage::disk('public')->exists('avatars/' . $user->avatar)) {
|
|
||||||
try {
|
|
||||||
Storage::disk('public')->delete('avatars/' . $user->avatar);
|
|
||||||
} catch (\Exception $e) {
|
|
||||||
Log::debug($e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return redirect()->route('users.index')->with('success', trans('admin/users/message.success.delete'));
|
return redirect()->route('users.index')->with('success', trans('admin/users/message.success.delete'));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -398,23 +391,18 @@ class UsersController extends Controller
|
||||||
* @return \Illuminate\Contracts\View\View
|
* @return \Illuminate\Contracts\View\View
|
||||||
* @throws \Illuminate\Auth\Access\AuthorizationException
|
* @throws \Illuminate\Auth\Access\AuthorizationException
|
||||||
*/
|
*/
|
||||||
public function show($userId = null)
|
public function show(User $user)
|
||||||
{
|
{
|
||||||
// Make sure the user can view users at all
|
// Make sure the user can view users at all
|
||||||
$this->authorize('view', User::class);
|
$this->authorize('view', User::class);
|
||||||
|
|
||||||
$user = User::with('assets', 'assets.model', 'consumables', 'accessories', 'licenses', 'userloc')->withTrashed()->find($userId);
|
$user = User::with('assets', 'assets.model', 'consumables', 'accessories', 'licenses', 'userloc')->withTrashed()->find($user->id);
|
||||||
|
|
||||||
// Make sure they can view this particular user
|
// Make sure they can view this particular user
|
||||||
$this->authorize('view', $user);
|
$this->authorize('view', $user);
|
||||||
|
|
||||||
if ($user) {
|
|
||||||
$userlog = $user->userlog->load('item');
|
$userlog = $user->userlog->load('item');
|
||||||
return view('users/view', compact('user', 'userlog'))->with('settings', Setting::getSettings());
|
return view('users/view', compact('user', 'userlog'))->with('settings', Setting::getSettings());
|
||||||
}
|
|
||||||
|
|
||||||
return redirect()->route('users.index')->with('error', trans('admin/users/message.user_not_found', ['id' => $userId]));
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -428,7 +416,7 @@ class UsersController extends Controller
|
||||||
* @return \Illuminate\Contracts\View\View
|
* @return \Illuminate\Contracts\View\View
|
||||||
* @throws \Illuminate\Auth\Access\AuthorizationException
|
* @throws \Illuminate\Auth\Access\AuthorizationException
|
||||||
*/
|
*/
|
||||||
public function getClone(Request $request, $id = null)
|
public function getClone(Request $request, User $user)
|
||||||
{
|
{
|
||||||
$this->authorize('create', User::class);
|
$this->authorize('create', User::class);
|
||||||
|
|
||||||
|
@ -438,7 +426,7 @@ class UsersController extends Controller
|
||||||
app('request')->request->set('permissions', $permissions);
|
app('request')->request->set('permissions', $permissions);
|
||||||
|
|
||||||
|
|
||||||
$user_to_clone = User::with('assets', 'assets.model', 'consumables', 'accessories', 'licenses', 'userloc')->withTrashed()->find($id);
|
$user_to_clone = User::with('assets', 'assets.model', 'consumables', 'accessories', 'licenses', 'userloc')->withTrashed()->find($user->id);
|
||||||
// Make sure they can view this particular user
|
// Make sure they can view this particular user
|
||||||
$this->authorize('view', $user_to_clone);
|
$this->authorize('view', $user_to_clone);
|
||||||
|
|
||||||
|
|
|
@ -24,7 +24,7 @@ class DeleteUserRequest extends FormRequest
|
||||||
|
|
||||||
public function prepareForValidation(): void
|
public function prepareForValidation(): void
|
||||||
{
|
{
|
||||||
$user_to_delete = User::withTrashed()->find(request()->route('user'));
|
$user_to_delete = User::withTrashed()->with('managesUsers')->find(request()->route('user'));
|
||||||
|
|
||||||
if ($user_to_delete) {
|
if ($user_to_delete) {
|
||||||
$this->merge([
|
$this->merge([
|
||||||
|
@ -61,7 +61,8 @@ class DeleteUserRequest extends FormRequest
|
||||||
public function messages(): array
|
public function messages(): array
|
||||||
{
|
{
|
||||||
|
|
||||||
$user_to_delete = User::withTrashed()->find(request()->route('user'));
|
$user_to_delete = User::withTrashed()->with('managesUsers')->find(request()->route('user'));
|
||||||
|
|
||||||
$messages = [];
|
$messages = [];
|
||||||
|
|
||||||
if ($user_to_delete) {
|
if ($user_to_delete) {
|
||||||
|
|
|
@ -62,7 +62,7 @@ class SettingsSamlRequest extends FormRequest
|
||||||
$custom_privateKey = '';
|
$custom_privateKey = '';
|
||||||
$custom_x509certNew = '';
|
$custom_x509certNew = '';
|
||||||
if (! empty($this->input('saml_custom_settings'))) {
|
if (! empty($this->input('saml_custom_settings'))) {
|
||||||
$req_custom_settings = preg_split('/\r\n|\r|\n/', $this->input('saml_custom_settings'));
|
$req_custom_settings = preg_split('/\r\n|\r|\n/', $this->input('saml_custom_settings', ''));
|
||||||
$custom_settings = [];
|
$custom_settings = [];
|
||||||
|
|
||||||
foreach ($req_custom_settings as $custom_setting) {
|
foreach ($req_custom_settings as $custom_setting) {
|
||||||
|
|
|
@ -2,8 +2,11 @@
|
||||||
|
|
||||||
namespace App\Http\Requests;
|
namespace App\Http\Requests;
|
||||||
|
|
||||||
|
|
||||||
|
use App\Models\Labels\Label;
|
||||||
use Illuminate\Foundation\Http\FormRequest;
|
use Illuminate\Foundation\Http\FormRequest;
|
||||||
use Illuminate\Support\Facades\Gate;
|
use Illuminate\Support\Facades\Gate;
|
||||||
|
use Illuminate\Validation\Rule;
|
||||||
|
|
||||||
class StoreLabelSettings extends FormRequest
|
class StoreLabelSettings extends FormRequest
|
||||||
{
|
{
|
||||||
|
@ -22,6 +25,10 @@ class StoreLabelSettings extends FormRequest
|
||||||
*/
|
*/
|
||||||
public function rules(): array
|
public function rules(): array
|
||||||
{
|
{
|
||||||
|
$names = Label::find()?->map(function ($label) {
|
||||||
|
return $label->getName();
|
||||||
|
})->values()->toArray();
|
||||||
|
|
||||||
return [
|
return [
|
||||||
'labels_per_page' => 'numeric',
|
'labels_per_page' => 'numeric',
|
||||||
'labels_width' => 'numeric',
|
'labels_width' => 'numeric',
|
||||||
|
@ -36,6 +43,10 @@ class StoreLabelSettings extends FormRequest
|
||||||
'labels_pagewidth' => 'numeric|nullable',
|
'labels_pagewidth' => 'numeric|nullable',
|
||||||
'labels_pageheight' => 'numeric|nullable',
|
'labels_pageheight' => 'numeric|nullable',
|
||||||
'qr_text' => 'max:31|nullable',
|
'qr_text' => 'max:31|nullable',
|
||||||
|
'label2_template' => [
|
||||||
|
'required',
|
||||||
|
Rule::in($names),
|
||||||
|
],
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -46,8 +46,6 @@ class UploadFileRequest extends Request
|
||||||
$extension = $file->getClientOriginalExtension();
|
$extension = $file->getClientOriginalExtension();
|
||||||
$file_name = $name_prefix.'-'.str_random(8).'-'.str_slug(basename($file->getClientOriginalName(), '.'.$extension)).'.'.$file->guessExtension();
|
$file_name = $name_prefix.'-'.str_random(8).'-'.str_slug(basename($file->getClientOriginalName(), '.'.$extension)).'.'.$file->guessExtension();
|
||||||
|
|
||||||
|
|
||||||
Log::debug("Your filetype IS: ".$file->getMimeType());
|
|
||||||
// Check for SVG and sanitize it
|
// Check for SVG and sanitize it
|
||||||
if ($file->getMimeType() === 'image/svg+xml') {
|
if ($file->getMimeType() === 'image/svg+xml') {
|
||||||
Log::debug('This is an SVG');
|
Log::debug('This is an SVG');
|
||||||
|
@ -66,7 +64,6 @@ class UploadFileRequest extends Request
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
$put_results = Storage::put($dirname.$file_name, file_get_contents($file));
|
$put_results = Storage::put($dirname.$file_name, file_get_contents($file));
|
||||||
Log::debug("Here are the '$put_results' (should be 0 or 1 or true or false or something?)");
|
|
||||||
}
|
}
|
||||||
return $file_name;
|
return $file_name;
|
||||||
}
|
}
|
||||||
|
|
|
@ -140,13 +140,13 @@ class ActionlogsTransformer
|
||||||
} else {
|
} else {
|
||||||
if ($actionlog->item) {
|
if ($actionlog->item) {
|
||||||
if ($actionlog->itemType() == 'asset') {
|
if ($actionlog->itemType() == 'asset') {
|
||||||
$file_url = route('show/assetfile', ['assetId' => $actionlog->item->id, 'fileId' => $actionlog->id]);
|
$file_url = route('show/assetfile', ['asset' => $actionlog->item->id, 'fileId' => $actionlog->id]);
|
||||||
} elseif ($actionlog->itemType() == 'accessory') {
|
} elseif ($actionlog->itemType() == 'accessory') {
|
||||||
$file_url = route('show.accessoryfile', ['accessoryId' => $actionlog->item->id, 'fileId' => $actionlog->id]);
|
$file_url = route('show.accessoryfile', ['accessoryId' => $actionlog->item->id, 'fileId' => $actionlog->id]);
|
||||||
} elseif ($actionlog->itemType() == 'license') {
|
} elseif ($actionlog->itemType() == 'license') {
|
||||||
$file_url = route('show.licensefile', ['licenseId' => $actionlog->item->id, 'fileId' => $actionlog->id]);
|
$file_url = route('show.licensefile', ['licenseId' => $actionlog->item->id, 'fileId' => $actionlog->id]);
|
||||||
} elseif ($actionlog->itemType() == 'user') {
|
} elseif ($actionlog->itemType() == 'user') {
|
||||||
$file_url = route('show/userfile', ['userId' => $actionlog->item->id, 'fileId' => $actionlog->id]);
|
$file_url = route('show/userfile', ['user' => $actionlog->item->id, 'fileId' => $actionlog->id]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -87,6 +87,41 @@ class AssetModelsTransformer
|
||||||
return $array;
|
return $array;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function transformAssetModelFiles($assetmodel, $total)
|
||||||
|
{
|
||||||
|
|
||||||
|
$array = [];
|
||||||
|
foreach ($assetmodel->uploads as $file) {
|
||||||
|
$array[] = self::transformAssetModelFile($file, $assetmodel);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (new DatatablesTransformer)->transformDatatables($array, $total);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function transformAssetModelFile($file, $assetmodel)
|
||||||
|
{
|
||||||
|
|
||||||
|
$array = [
|
||||||
|
'id' => (int) $file->id,
|
||||||
|
'filename' => e($file->filename),
|
||||||
|
'url' => route('show/modelfile', [$assetmodel->id, $file->id]),
|
||||||
|
'created_by' => ($file->adminuser) ? [
|
||||||
|
'id' => (int) $file->adminuser->id,
|
||||||
|
'name'=> e($file->adminuser->present()->fullName),
|
||||||
|
] : null,
|
||||||
|
'created_at' => Helper::getFormattedDateObject($file->created_at, 'datetime'),
|
||||||
|
'updated_at' => Helper::getFormattedDateObject($file->updated_at, 'datetime'),
|
||||||
|
'deleted_at' => Helper::getFormattedDateObject($file->deleted_at, 'datetime'),
|
||||||
|
];
|
||||||
|
|
||||||
|
$permissions_array['available_actions'] = [
|
||||||
|
'delete' => (Gate::allows('update', AssetModel::class) && ($assetmodel->deleted_at == '')),
|
||||||
|
];
|
||||||
|
|
||||||
|
$array += $permissions_array;
|
||||||
|
return $array;
|
||||||
|
}
|
||||||
|
|
||||||
public function transformAssetModelsDatatable($assetmodels)
|
public function transformAssetModelsDatatable($assetmodels)
|
||||||
{
|
{
|
||||||
return (new DatatablesTransformer)->transformDatatables($assetmodels);
|
return (new DatatablesTransformer)->transformDatatables($assetmodels);
|
||||||
|
|
|
@ -309,6 +309,7 @@ class AssetsTransformer
|
||||||
'id' => $accessory_checkout->accessory->id,
|
'id' => $accessory_checkout->accessory->id,
|
||||||
'name' => $accessory_checkout->accessory->name,
|
'name' => $accessory_checkout->accessory->name,
|
||||||
],
|
],
|
||||||
|
'assigned_to' => $accessory_checkout->assigned_to,
|
||||||
'image' => ($accessory_checkout->accessory->image) ? Storage::disk('public')->url('accessories/'.e($accessory_checkout->accessory->image)) : null,
|
'image' => ($accessory_checkout->accessory->image) ? Storage::disk('public')->url('accessories/'.e($accessory_checkout->accessory->image)) : null,
|
||||||
'note' => $accessory_checkout->note ? e($accessory_checkout->note) : null,
|
'note' => $accessory_checkout->note ? e($accessory_checkout->note) : null,
|
||||||
'created_by' => $accessory_checkout->adminuser ? [
|
'created_by' => $accessory_checkout->adminuser ? [
|
||||||
|
|
|
@ -66,6 +66,7 @@ class CategoriesTransformer
|
||||||
'id' => (int) $category->adminuser->id,
|
'id' => (int) $category->adminuser->id,
|
||||||
'name'=> e($category->adminuser->present()->fullName()),
|
'name'=> e($category->adminuser->present()->fullName()),
|
||||||
] : null,
|
] : null,
|
||||||
|
'notes' => Helper::parseEscapedMarkedownInline($category->notes),
|
||||||
'created_at' => Helper::getFormattedDateObject($category->created_at, 'datetime'),
|
'created_at' => Helper::getFormattedDateObject($category->created_at, 'datetime'),
|
||||||
'updated_at' => Helper::getFormattedDateObject($category->updated_at, 'datetime'),
|
'updated_at' => Helper::getFormattedDateObject($category->updated_at, 'datetime'),
|
||||||
];
|
];
|
||||||
|
|
|
@ -40,6 +40,7 @@ class CompaniesTransformer
|
||||||
'id' => (int) $company->adminuser->id,
|
'id' => (int) $company->adminuser->id,
|
||||||
'name'=> e($company->adminuser->present()->fullName()),
|
'name'=> e($company->adminuser->present()->fullName()),
|
||||||
] : null,
|
] : null,
|
||||||
|
'notes' => Helper::parseEscapedMarkedownInline($company->notes),
|
||||||
'created_at' => Helper::getFormattedDateObject($company->created_at, 'datetime'),
|
'created_at' => Helper::getFormattedDateObject($company->created_at, 'datetime'),
|
||||||
'updated_at' => Helper::getFormattedDateObject($company->updated_at, 'datetime'),
|
'updated_at' => Helper::getFormattedDateObject($company->updated_at, 'datetime'),
|
||||||
];
|
];
|
||||||
|
|
|
@ -62,7 +62,7 @@ class ComponentsTransformer
|
||||||
'checkout' => Gate::allows('checkout', Component::class),
|
'checkout' => Gate::allows('checkout', Component::class),
|
||||||
'checkin' => Gate::allows('checkin', Component::class),
|
'checkin' => Gate::allows('checkin', Component::class),
|
||||||
'update' => Gate::allows('update', Component::class),
|
'update' => Gate::allows('update', Component::class),
|
||||||
'delete' => Gate::allows('delete', Component::class),
|
'delete' => $component->isDeletable(),
|
||||||
];
|
];
|
||||||
$array += $permissions_array;
|
$array += $permissions_array;
|
||||||
|
|
||||||
|
|
|
@ -44,6 +44,7 @@ class DepartmentsTransformer
|
||||||
'name' => e($department->location->name),
|
'name' => e($department->location->name),
|
||||||
] : null,
|
] : null,
|
||||||
'users_count' => e($department->users_count),
|
'users_count' => e($department->users_count),
|
||||||
|
'notes' => Helper::parseEscapedMarkedownInline($department->notes),
|
||||||
'created_at' => Helper::getFormattedDateObject($department->created_at, 'datetime'),
|
'created_at' => Helper::getFormattedDateObject($department->created_at, 'datetime'),
|
||||||
'updated_at' => Helper::getFormattedDateObject($department->updated_at, 'datetime'),
|
'updated_at' => Helper::getFormattedDateObject($department->updated_at, 'datetime'),
|
||||||
];
|
];
|
||||||
|
|
|
@ -61,7 +61,7 @@ class DepreciationReportTransformer
|
||||||
/**
|
/**
|
||||||
* Override the previously set null values if there is a valid model and associated depreciation
|
* Override the previously set null values if there is a valid model and associated depreciation
|
||||||
*/
|
*/
|
||||||
if (($asset->model) && ($asset->model->depreciation)) {
|
if (($asset->model) && ($asset->model->depreciation) && ($asset->model->depreciation->months !== 0)) {
|
||||||
$depreciated_value = Helper::formatCurrencyOutput($asset->getDepreciatedValue());
|
$depreciated_value = Helper::formatCurrencyOutput($asset->getDepreciatedValue());
|
||||||
$monthly_depreciation =Helper::formatCurrencyOutput($asset->purchase_cost / $asset->model->depreciation->months);
|
$monthly_depreciation =Helper::formatCurrencyOutput($asset->purchase_cost / $asset->model->depreciation->months);
|
||||||
$diff = Helper::formatCurrencyOutput(($asset->purchase_cost - $asset->getDepreciatedValue()));
|
$diff = Helper::formatCurrencyOutput(($asset->purchase_cost - $asset->getDepreciatedValue()));
|
||||||
|
|
|
@ -26,6 +26,7 @@ class GroupsTransformer
|
||||||
'name' => e($group->name),
|
'name' => e($group->name),
|
||||||
'permissions' => json_decode($group->permissions),
|
'permissions' => json_decode($group->permissions),
|
||||||
'users_count' => (int) $group->users_count,
|
'users_count' => (int) $group->users_count,
|
||||||
|
'notes' => Helper::parseEscapedMarkedownInline($group->notes),
|
||||||
'created_by' => ($group->adminuser) ? [
|
'created_by' => ($group->adminuser) ? [
|
||||||
'id' => (int) $group->adminuser->id,
|
'id' => (int) $group->adminuser->id,
|
||||||
'name'=> e($group->adminuser->present()->fullName()),
|
'name'=> e($group->adminuser->present()->fullName()),
|
||||||
|
|
|
@ -55,6 +55,7 @@ class LocationsTransformer
|
||||||
'users_count' => (int) $location->users_count,
|
'users_count' => (int) $location->users_count,
|
||||||
'currency' => ($location->currency) ? e($location->currency) : null,
|
'currency' => ($location->currency) ? e($location->currency) : null,
|
||||||
'ldap_ou' => ($location->ldap_ou) ? e($location->ldap_ou) : null,
|
'ldap_ou' => ($location->ldap_ou) ? e($location->ldap_ou) : null,
|
||||||
|
'notes' => Helper::parseEscapedMarkedownInline($location->notes),
|
||||||
'created_at' => Helper::getFormattedDateObject($location->created_at, 'datetime'),
|
'created_at' => Helper::getFormattedDateObject($location->created_at, 'datetime'),
|
||||||
'updated_at' => Helper::getFormattedDateObject($location->updated_at, 'datetime'),
|
'updated_at' => Helper::getFormattedDateObject($location->updated_at, 'datetime'),
|
||||||
'parent' => ($location->parent) ? [
|
'parent' => ($location->parent) ? [
|
||||||
|
@ -99,6 +100,7 @@ class LocationsTransformer
|
||||||
|
|
||||||
$array = [
|
$array = [
|
||||||
'id' => $accessory_checkout->id,
|
'id' => $accessory_checkout->id,
|
||||||
|
'assigned_to' => $accessory_checkout->assigned_to,
|
||||||
'accessory' => [
|
'accessory' => [
|
||||||
'id' => $accessory_checkout->accessory->id,
|
'id' => $accessory_checkout->accessory->id,
|
||||||
'name' => $accessory_checkout->accessory->name,
|
'name' => $accessory_checkout->accessory->name,
|
||||||
|
|
|
@ -37,6 +37,7 @@ class ManufacturersTransformer
|
||||||
'consumables_count' => (int) $manufacturer->consumables_count,
|
'consumables_count' => (int) $manufacturer->consumables_count,
|
||||||
'accessories_count' => (int) $manufacturer->accessories_count,
|
'accessories_count' => (int) $manufacturer->accessories_count,
|
||||||
'components_count' => (int) $manufacturer->components_count,
|
'components_count' => (int) $manufacturer->components_count,
|
||||||
|
'notes' => Helper::parseEscapedMarkedownInline($manufacturer->notes),
|
||||||
'created_by' => ($manufacturer->adminuser) ? [
|
'created_by' => ($manufacturer->adminuser) ? [
|
||||||
'id' => (int) $manufacturer->adminuser->id,
|
'id' => (int) $manufacturer->adminuser->id,
|
||||||
'name'=> e($manufacturer->adminuser->present()->fullName()),
|
'name'=> e($manufacturer->adminuser->present()->fullName()),
|
||||||
|
|
|
@ -39,6 +39,7 @@ abstract class Importer
|
||||||
* @var array
|
* @var array
|
||||||
*/
|
*/
|
||||||
private $defaultFieldMap = [
|
private $defaultFieldMap = [
|
||||||
|
'id' => 'id',
|
||||||
'asset_tag' => 'asset tag',
|
'asset_tag' => 'asset tag',
|
||||||
'activated' => 'activated',
|
'activated' => 'activated',
|
||||||
'category' => 'category',
|
'category' => 'category',
|
||||||
|
|
|
@ -456,14 +456,13 @@ class ItemImporter extends Importer
|
||||||
{
|
{
|
||||||
if (empty($asset_location)) {
|
if (empty($asset_location)) {
|
||||||
$this->log('No location given, so none created.');
|
$this->log('No location given, so none created.');
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
$location = Location::where(['name' => $asset_location])->first();
|
$location = Location::where(['name' => $asset_location])->first();
|
||||||
|
|
||||||
if ($location) {
|
if ($location) {
|
||||||
$this->log('Location '.$asset_location.' already exists');
|
$this->log('Location '.$asset_location.' already exists');
|
||||||
|
|
||||||
return $location->id;
|
return $location->id;
|
||||||
}
|
}
|
||||||
// No matching locations in the collection, create a new one.
|
// No matching locations in the collection, create a new one.
|
||||||
|
|
|
@ -38,8 +38,16 @@ class LocationImporter extends ItemImporter
|
||||||
{
|
{
|
||||||
|
|
||||||
$editingLocation = false;
|
$editingLocation = false;
|
||||||
|
|
||||||
$location = Location::where('name', '=', $this->findCsvMatch($row, 'name'))->first();
|
$location = Location::where('name', '=', $this->findCsvMatch($row, 'name'))->first();
|
||||||
|
|
||||||
|
if ($this->findCsvMatch($row, 'id')!='') {
|
||||||
|
// Override location if an ID was given
|
||||||
|
\Log::debug('Finding location by ID: '.$this->findCsvMatch($row, 'id'));
|
||||||
|
$location = Location::find($this->findCsvMatch($row, 'id'));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
if ($location) {
|
if ($location) {
|
||||||
if (! $this->updating) {
|
if (! $this->updating) {
|
||||||
$this->log('A matching Location '.$this->item['name'].' already exists');
|
$this->log('A matching Location '.$this->item['name'].' already exists');
|
||||||
|
@ -66,6 +74,8 @@ class LocationImporter extends ItemImporter
|
||||||
$this->item['ldap_ou'] = trim($this->findCsvMatch($row, 'ldap_ou'));
|
$this->item['ldap_ou'] = trim($this->findCsvMatch($row, 'ldap_ou'));
|
||||||
$this->item['manager'] = trim($this->findCsvMatch($row, 'manager'));
|
$this->item['manager'] = trim($this->findCsvMatch($row, 'manager'));
|
||||||
$this->item['manager_username'] = trim($this->findCsvMatch($row, 'manager_username'));
|
$this->item['manager_username'] = trim($this->findCsvMatch($row, 'manager_username'));
|
||||||
|
$this->item['notes'] = trim($this->findCsvMatch($row, 'notes'));
|
||||||
|
|
||||||
|
|
||||||
if ($this->findCsvMatch($row, 'parent_location')) {
|
if ($this->findCsvMatch($row, 'parent_location')) {
|
||||||
$this->item['parent_id'] = $this->createOrFetchLocation(trim($this->findCsvMatch($row, 'parent_location')));
|
$this->item['parent_id'] = $this->createOrFetchLocation(trim($this->findCsvMatch($row, 'parent_location')));
|
||||||
|
@ -95,6 +105,7 @@ class LocationImporter extends ItemImporter
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
Log::debug($location->getErrors());
|
Log::debug($location->getErrors());
|
||||||
|
$this->logError($location, 'Location "'.$this->item['name'].'"');
|
||||||
return $location->errors;
|
return $location->errors;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -106,7 +106,13 @@ class CheckoutableListener
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (ClientException $e) {
|
} catch (ClientException $e) {
|
||||||
Log::error("ClientException caught during checkin notification: " . $e->getMessage());
|
if (strpos($e->getMessage(), 'channel_not_found') !== false) {
|
||||||
|
Log::warning(Setting::getSettings()->webhook_selected." notification failed: " . $e->getMessage());
|
||||||
|
return redirect()->back()->with('warning', ucfirst(Setting::getSettings()->webhook_selected) .trans('admin/settings/message.webhook.webhook_channel_not_found') );
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Log::error("ClientException caught during checkin notification: " . $e->getMessage());
|
||||||
|
}
|
||||||
return redirect()->back()->with('warning', ucfirst(Setting::getSettings()->webhook_selected) .trans('admin/settings/message.webhook.webhook_fail') );
|
return redirect()->back()->with('warning', ucfirst(Setting::getSettings()->webhook_selected) .trans('admin/settings/message.webhook.webhook_fail') );
|
||||||
} catch (Exception $e) {
|
} catch (Exception $e) {
|
||||||
Log::error(ucfirst(Setting::getSettings()->webhook_selected) . ' webhook notification failed:', [
|
Log::error(ucfirst(Setting::getSettings()->webhook_selected) . ' webhook notification failed:', [
|
||||||
|
@ -156,7 +162,7 @@ class CheckoutableListener
|
||||||
$ccEmails = array_filter($adminCcEmailsArray);
|
$ccEmails = array_filter($adminCcEmailsArray);
|
||||||
$mailable = $this->getCheckinMailType($event);
|
$mailable = $this->getCheckinMailType($event);
|
||||||
$notifiable = $this->getNotifiables($event);
|
$notifiable = $this->getNotifiables($event);
|
||||||
if ($event->checkedOutTo->locale){
|
if ($event->checkedOutTo?->locale) {
|
||||||
$mailable->locale($event->checkedOutTo->locale);
|
$mailable->locale($event->checkedOutTo->locale);
|
||||||
}
|
}
|
||||||
// Send email notifications
|
// Send email notifications
|
||||||
|
@ -196,8 +202,14 @@ class CheckoutableListener
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (ClientException $e) {
|
} catch (ClientException $e) {
|
||||||
Log::error("ClientException caught during checkin notification: " . $e->getMessage());
|
if (strpos($e->getMessage(), 'channel_not_found') !== false) {
|
||||||
return redirect()->back()->with('warning', ucfirst(Setting::getSettings()->webhook_selected) .trans('admin/settings/message.webhook.webhook_fail'));
|
Log::warning(Setting::getSettings()->webhook_selected." notification failed: " . $e->getMessage());
|
||||||
|
return redirect()->back()->with('warning', ucfirst(Setting::getSettings()->webhook_selected) .trans('admin/settings/message.webhook.webhook_channel_not_found') );
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Log::error("ClientException caught during checkin notification: " . $e->getMessage());
|
||||||
|
return redirect()->back()->with('warning', ucfirst(Setting::getSettings()->webhook_selected) . trans('admin/settings/message.webhook.webhook_fail'));
|
||||||
|
}
|
||||||
} catch (Exception $e) {
|
} catch (Exception $e) {
|
||||||
Log::error(ucfirst(Setting::getSettings()->webhook_selected) . ' webhook notification failed:', [
|
Log::error(ucfirst(Setting::getSettings()->webhook_selected) . ' webhook notification failed:', [
|
||||||
'error' => $e->getMessage(),
|
'error' => $e->getMessage(),
|
||||||
|
|
|
@ -141,6 +141,7 @@ class LogListener
|
||||||
'CheckoutAccepted',
|
'CheckoutAccepted',
|
||||||
'CheckoutDeclined',
|
'CheckoutDeclined',
|
||||||
'UserMerged',
|
'UserMerged',
|
||||||
|
'NoteAdded',
|
||||||
];
|
];
|
||||||
|
|
||||||
foreach ($list as $event) {
|
foreach ($list as $event) {
|
||||||
|
|
|
@ -329,6 +329,7 @@ class Importer extends Component
|
||||||
];
|
];
|
||||||
|
|
||||||
$this->locations_fields = [
|
$this->locations_fields = [
|
||||||
|
'id' => trans('general.id'),
|
||||||
'name' => trans('general.item_name_var', ['item' => trans('general.location')]),
|
'name' => trans('general.item_name_var', ['item' => trans('general.location')]),
|
||||||
'address' => trans('general.address'),
|
'address' => trans('general.address'),
|
||||||
'address2' => trans('general.importer.address2'),
|
'address2' => trans('general.importer.address2'),
|
||||||
|
@ -341,6 +342,7 @@ class Importer extends Component
|
||||||
'manager_username' => trans('general.importer.manager_username'),
|
'manager_username' => trans('general.importer.manager_username'),
|
||||||
'manager' => trans('general.importer.manager_full_name'),
|
'manager' => trans('general.importer.manager_full_name'),
|
||||||
'parent_location' => trans('admin/locations/table.parent'),
|
'parent_location' => trans('admin/locations/table.parent'),
|
||||||
|
'notes' => trans('general.notes'),
|
||||||
];
|
];
|
||||||
|
|
||||||
$this->assetmodels_fields = [
|
$this->assetmodels_fields = [
|
||||||
|
@ -400,7 +402,6 @@ class Importer extends Component
|
||||||
'requestable',
|
'requestable',
|
||||||
'Requestable',
|
'Requestable',
|
||||||
],
|
],
|
||||||
|
|
||||||
'gravatar' =>
|
'gravatar' =>
|
||||||
[
|
[
|
||||||
'gravatar',
|
'gravatar',
|
||||||
|
|
|
@ -159,7 +159,7 @@ class SlackSettingsForm extends Component
|
||||||
]);
|
]);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
$test = $webhook->post($this->webhook_endpoint, ['body' => $payload]);
|
$test = $webhook->post($this->webhook_endpoint, ['body' => $payload, ['headers' => ['Content-Type' => 'application/json']]]);
|
||||||
|
|
||||||
if(($test->getStatusCode() == 302)||($test->getStatusCode() == 301)){
|
if(($test->getStatusCode() == 302)||($test->getStatusCode() == 301)){
|
||||||
return session()->flash('error' , trans('admin/settings/message.webhook.error_redirect', ['endpoint' => $this->webhook_endpoint]));
|
return session()->flash('error' , trans('admin/settings/message.webhook.error_redirect', ['endpoint' => $this->webhook_endpoint]));
|
||||||
|
|
62
app/Mail/ExpiringAssetsMail.php
Normal file
62
app/Mail/ExpiringAssetsMail.php
Normal file
|
@ -0,0 +1,62 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Mail;
|
||||||
|
|
||||||
|
use Illuminate\Bus\Queueable;
|
||||||
|
use Illuminate\Contracts\Queue\ShouldQueue;
|
||||||
|
use Illuminate\Mail\Mailable;
|
||||||
|
use Illuminate\Mail\Mailables\Address;
|
||||||
|
use Illuminate\Mail\Mailables\Content;
|
||||||
|
use Illuminate\Mail\Mailables\Envelope;
|
||||||
|
use Illuminate\Queue\SerializesModels;
|
||||||
|
|
||||||
|
class ExpiringAssetsMail extends Mailable
|
||||||
|
{
|
||||||
|
use Queueable, SerializesModels;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new message instance.
|
||||||
|
*/
|
||||||
|
public function __construct($params, $threshold)
|
||||||
|
{
|
||||||
|
$this->assets = $params;
|
||||||
|
$this->threshold = $threshold;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the message envelope.
|
||||||
|
*/
|
||||||
|
public function envelope(): Envelope
|
||||||
|
{
|
||||||
|
$from = new Address(config('mail.from.address'), config('mail.from.name'));
|
||||||
|
|
||||||
|
return new Envelope(
|
||||||
|
from: $from,
|
||||||
|
subject: trans('mail.Expiring_Assets_Report'),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the message content definition.
|
||||||
|
*/
|
||||||
|
public function content(): Content
|
||||||
|
{
|
||||||
|
return new Content(
|
||||||
|
markdown: 'notifications.markdown.report-expiring-assets',
|
||||||
|
with: [
|
||||||
|
'assets' => $this->assets,
|
||||||
|
'threshold' => $this->threshold,
|
||||||
|
]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the attachments for the message.
|
||||||
|
*
|
||||||
|
* @return array<int, \Illuminate\Mail\Mailables\Attachment>
|
||||||
|
*/
|
||||||
|
public function attachments(): array
|
||||||
|
{
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
}
|
62
app/Mail/ExpiringLicenseMail.php
Normal file
62
app/Mail/ExpiringLicenseMail.php
Normal file
|
@ -0,0 +1,62 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Mail;
|
||||||
|
|
||||||
|
use Illuminate\Bus\Queueable;
|
||||||
|
use Illuminate\Contracts\Queue\ShouldQueue;
|
||||||
|
use Illuminate\Mail\Mailable;
|
||||||
|
use Illuminate\Mail\Mailables\Address;
|
||||||
|
use Illuminate\Mail\Mailables\Content;
|
||||||
|
use Illuminate\Mail\Mailables\Envelope;
|
||||||
|
use Illuminate\Queue\SerializesModels;
|
||||||
|
|
||||||
|
class ExpiringLicenseMail extends Mailable
|
||||||
|
{
|
||||||
|
use Queueable, SerializesModels;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new message instance.
|
||||||
|
*/
|
||||||
|
public function __construct($params, $threshold)
|
||||||
|
{
|
||||||
|
$this->licenses = $params;
|
||||||
|
$this->threshold = $threshold;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the message envelope.
|
||||||
|
*/
|
||||||
|
public function envelope(): Envelope
|
||||||
|
{
|
||||||
|
$from = new Address(config('mail.from.address'), config('mail.from.name'));
|
||||||
|
|
||||||
|
return new Envelope(
|
||||||
|
from: $from,
|
||||||
|
subject: trans('mail.Expiring_Licenses_Report'),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the message content definition.
|
||||||
|
*/
|
||||||
|
public function content(): Content
|
||||||
|
{
|
||||||
|
return new Content(
|
||||||
|
markdown: 'notifications.markdown.report-expiring-licenses',
|
||||||
|
with: [
|
||||||
|
'licenses' => $this->licenses,
|
||||||
|
'threshold' => $this->threshold,
|
||||||
|
]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the attachments for the message.
|
||||||
|
*
|
||||||
|
* @return array<int, \Illuminate\Mail\Mailables\Attachment>
|
||||||
|
*/
|
||||||
|
public function attachments(): array
|
||||||
|
{
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
}
|
|
@ -57,7 +57,7 @@ class AccessoryCheckout extends Model
|
||||||
*/
|
*/
|
||||||
public function adminuser()
|
public function adminuser()
|
||||||
{
|
{
|
||||||
return $this->hasOne(\App\Models\User::class, 'created_by');
|
return $this->hasOne(\App\Models\User::class, 'id', 'created_by');
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -118,7 +118,7 @@ class AccessoryCheckout extends Model
|
||||||
$query->where('assigned_type', '=', Location::class);
|
$query->where('assigned_type', '=', Location::class);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function scopeAssetAssigned(Builder $query): void
|
public function scopeAssetsAssigned(Builder $query): void
|
||||||
{
|
{
|
||||||
$query->where('assigned_type', '=', Asset::class);
|
$query->where('assigned_type', '=', Asset::class);
|
||||||
}
|
}
|
||||||
|
|
|
@ -69,7 +69,7 @@ class Actionlog extends SnipeModel
|
||||||
'company' => ['name'],
|
'company' => ['name'],
|
||||||
'adminuser' => ['first_name','last_name','username', 'email'],
|
'adminuser' => ['first_name','last_name','username', 'email'],
|
||||||
'user' => ['first_name','last_name','username', 'email'],
|
'user' => ['first_name','last_name','username', 'email'],
|
||||||
'assets' => ['asset_tag','name'],
|
'assets' => ['asset_tag','name', 'serial'],
|
||||||
];
|
];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -413,6 +413,17 @@ class Asset extends Depreciable
|
||||||
return $this->rules;
|
return $this->rules;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function customFieldsForCheckinCheckout($checkin_checkout) {
|
||||||
|
// Check to see if any of the custom fields were included on the form and if they have any values
|
||||||
|
if (($this->model) && ($this->model->fieldset) && ($this->model->fieldset->fields)) {
|
||||||
|
foreach ($this->model->fieldset->fields as $field) {
|
||||||
|
if (($field->{$checkin_checkout} == 1) && (request()->has($field->db_column))){
|
||||||
|
$this->{$field->db_column} = request()->get($field->db_column);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Establishes the asset -> depreciation relationship
|
* Establishes the asset -> depreciation relationship
|
||||||
|
@ -523,6 +534,18 @@ class Asset extends Depreciable
|
||||||
return $this->morphMany(self::class, 'assigned', 'assigned_type', 'assigned_to')->withTrashed();
|
return $this->morphMany(self::class, 'assigned', 'assigned_type', 'assigned_to')->withTrashed();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Establishes the accessory -> asset assignment relationship
|
||||||
|
*
|
||||||
|
* @author A. Gianotto <snipe@snipe.net>
|
||||||
|
* @since [v3.0]
|
||||||
|
* @return \Illuminate\Database\Eloquent\Relations\Relation
|
||||||
|
*/
|
||||||
|
public function assignedAccessories()
|
||||||
|
{
|
||||||
|
return $this->morphMany(\App\Models\AccessoryCheckout::class, 'assigned', 'assigned_type', 'assigned_to');
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the asset's location based on the assigned user
|
* Get the asset's location based on the assigned user
|
||||||
|
|
|
@ -71,6 +71,7 @@ class Category extends SnipeModel
|
||||||
'require_acceptance',
|
'require_acceptance',
|
||||||
'use_default_eula',
|
'use_default_eula',
|
||||||
'created_by',
|
'created_by',
|
||||||
|
'notes',
|
||||||
];
|
];
|
||||||
|
|
||||||
use Searchable;
|
use Searchable;
|
||||||
|
@ -80,7 +81,7 @@ class Category extends SnipeModel
|
||||||
*
|
*
|
||||||
* @var array
|
* @var array
|
||||||
*/
|
*/
|
||||||
protected $searchableAttributes = ['name', 'category_type'];
|
protected $searchableAttributes = ['name', 'category_type', 'notes'];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The relations and their attributes that should be included when searching the model.
|
* The relations and their attributes that should be included when searching the model.
|
||||||
|
|
|
@ -35,7 +35,7 @@ class CheckoutAcceptance extends Model
|
||||||
/**
|
/**
|
||||||
* The resource that was is out
|
* The resource that was is out
|
||||||
*
|
*
|
||||||
* @return Illuminate\Database\Eloquent\Relations\MorphTo
|
* @return \Illuminate\Database\Eloquent\Relations\MorphTo
|
||||||
*/
|
*/
|
||||||
public function checkoutable()
|
public function checkoutable()
|
||||||
{
|
{
|
||||||
|
|
|
@ -6,6 +6,7 @@ use App\Models\Traits\Searchable;
|
||||||
use App\Presenters\Presentable;
|
use App\Presenters\Presentable;
|
||||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||||
use Illuminate\Database\Eloquent\SoftDeletes;
|
use Illuminate\Database\Eloquent\SoftDeletes;
|
||||||
|
use Illuminate\Support\Facades\Gate;
|
||||||
use Watson\Validating\ValidatingTrait;
|
use Watson\Validating\ValidatingTrait;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -104,6 +105,13 @@ class Component extends SnipeModel
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|
||||||
|
public function isDeletable()
|
||||||
|
{
|
||||||
|
return Gate::allows('delete', $this)
|
||||||
|
&& ($this->numCheckedOut() === 0)
|
||||||
|
&& ($this->deleted_at == '');
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Establishes the components -> action logs -> uploads relationship
|
* Establishes the components -> action logs -> uploads relationship
|
||||||
*
|
*
|
||||||
|
@ -234,13 +242,24 @@ class Component extends SnipeModel
|
||||||
// In case there are elements checked out to assets that belong to a different company
|
// In case there are elements checked out to assets that belong to a different company
|
||||||
// than this asset and full multiple company support is on we'll remove the global scope,
|
// than this asset and full multiple company support is on we'll remove the global scope,
|
||||||
// so they are included in the count.
|
// so they are included in the count.
|
||||||
foreach ($this->assets()->withoutGlobalScope(new CompanyableScope)->get() as $checkout) {
|
return $this->uncontrainedAssets->sum('pivot.assigned_qty');
|
||||||
$checkedout += $checkout->pivot->assigned_qty;
|
|
||||||
}
|
|
||||||
|
|
||||||
return $checkedout;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
|
||||||
|
*
|
||||||
|
* This allows us to get the assets with assigned components without the company restriction
|
||||||
|
*/
|
||||||
|
public function uncontrainedAssets() {
|
||||||
|
|
||||||
|
return $this->belongsToMany(\App\Models\Asset::class, 'components_assets')
|
||||||
|
->withPivot('id', 'assigned_qty', 'created_at', 'created_by', 'note')
|
||||||
|
->withoutGlobalScope(new CompanyableScope);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Check how many items within a component are remaining
|
* Check how many items within a component are remaining
|
||||||
*
|
*
|
||||||
|
|
|
@ -307,7 +307,7 @@ class CustomField extends Model
|
||||||
public function formatFieldValuesAsArray()
|
public function formatFieldValuesAsArray()
|
||||||
{
|
{
|
||||||
$result = [];
|
$result = [];
|
||||||
$arr = preg_split('/\\r\\n|\\r|\\n/', $this->field_values);
|
$arr = preg_split('/\\r\\n|\\r|\\n/', $this->field_values ?? '');
|
||||||
|
|
||||||
if (($this->element != 'checkbox') && ($this->element != 'radio')) {
|
if (($this->element != 'checkbox') && ($this->element != 'radio')) {
|
||||||
$result[''] = 'Select '.strtolower($this->format);
|
$result[''] = 'Select '.strtolower($this->format);
|
||||||
|
|
|
@ -18,7 +18,8 @@ class Group extends SnipeModel
|
||||||
|
|
||||||
protected $fillable = [
|
protected $fillable = [
|
||||||
'name',
|
'name',
|
||||||
'permissions'
|
'permissions',
|
||||||
|
'notes',
|
||||||
];
|
];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -37,7 +38,7 @@ class Group extends SnipeModel
|
||||||
*
|
*
|
||||||
* @var array
|
* @var array
|
||||||
*/
|
*/
|
||||||
protected $searchableAttributes = ['name', 'created_at'];
|
protected $searchableAttributes = ['name', 'created_at', 'notes'];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The relations and their attributes that should be included when searching the model.
|
* The relations and their attributes that should be included when searching the model.
|
||||||
|
|
|
@ -411,14 +411,14 @@ abstract class Label
|
||||||
/**
|
/**
|
||||||
* Checks the template is internally valid
|
* Checks the template is internally valid
|
||||||
*/
|
*/
|
||||||
public final function validate() {
|
public final function validate() : void {
|
||||||
$this->validateUnits();
|
$this->validateUnits();
|
||||||
$this->validateSize();
|
$this->validateSize();
|
||||||
$this->validateMargins();
|
$this->validateMargins();
|
||||||
$this->validateSupport();
|
$this->validateSupport();
|
||||||
}
|
}
|
||||||
|
|
||||||
private function validateUnits() {
|
private function validateUnits() : void {
|
||||||
$validUnits = [ 'pt', 'mm', 'cm', 'in' ];
|
$validUnits = [ 'pt', 'mm', 'cm', 'in' ];
|
||||||
$unit = $this->getUnit();
|
$unit = $this->getUnit();
|
||||||
if (!in_array(strtolower($unit), $validUnits)) {
|
if (!in_array(strtolower($unit), $validUnits)) {
|
||||||
|
@ -430,7 +430,7 @@ abstract class Label
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private function validateSize() {
|
private function validateSize() : void {
|
||||||
$width = $this->getWidth();
|
$width = $this->getWidth();
|
||||||
if (!is_numeric($width) || is_string($width)) {
|
if (!is_numeric($width) || is_string($width)) {
|
||||||
throw new \UnexpectedValueException(trans('admin/labels/message.invalid_return_type', [
|
throw new \UnexpectedValueException(trans('admin/labels/message.invalid_return_type', [
|
||||||
|
@ -450,7 +450,7 @@ abstract class Label
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private function validateMargins() {
|
private function validateMargins() : void {
|
||||||
$marginTop = $this->getMarginTop();
|
$marginTop = $this->getMarginTop();
|
||||||
if (!is_numeric($marginTop) || is_string($marginTop)) {
|
if (!is_numeric($marginTop) || is_string($marginTop)) {
|
||||||
throw new \UnexpectedValueException(trans('admin/labels/message.invalid_return_type', [
|
throw new \UnexpectedValueException(trans('admin/labels/message.invalid_return_type', [
|
||||||
|
@ -488,7 +488,7 @@ abstract class Label
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private function validateSupport() {
|
private function validateSupport() : void {
|
||||||
$support1D = $this->getSupport1DBarcode();
|
$support1D = $this->getSupport1DBarcode();
|
||||||
if (!is_bool($support1D)) {
|
if (!is_bool($support1D)) {
|
||||||
throw new \UnexpectedValueException(trans('admin/labels/message.invalid_return_type', [
|
throw new \UnexpectedValueException(trans('admin/labels/message.invalid_return_type', [
|
||||||
|
|
|
@ -72,6 +72,7 @@ class Location extends SnipeModel
|
||||||
'currency',
|
'currency',
|
||||||
'manager_id',
|
'manager_id',
|
||||||
'image',
|
'image',
|
||||||
|
'notes',
|
||||||
];
|
];
|
||||||
protected $hidden = ['user_id'];
|
protected $hidden = ['user_id'];
|
||||||
|
|
||||||
|
@ -82,7 +83,7 @@ class Location extends SnipeModel
|
||||||
*
|
*
|
||||||
* @var array
|
* @var array
|
||||||
*/
|
*/
|
||||||
protected $searchableAttributes = ['name', 'address', 'city', 'state', 'zip', 'created_at', 'ldap_ou', 'phone', 'fax'];
|
protected $searchableAttributes = ['name', 'address', 'city', 'state', 'zip', 'created_at', 'ldap_ou', 'phone', 'fax', 'notes'];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The relations and their attributes that should be included when searching the model.
|
* The relations and their attributes that should be included when searching the model.
|
||||||
|
|
|
@ -34,7 +34,11 @@ trait Loggable
|
||||||
*/
|
*/
|
||||||
public function logCheckout($note, $target, $action_date = null, $originalValues = [])
|
public function logCheckout($note, $target, $action_date = null, $originalValues = [])
|
||||||
{
|
{
|
||||||
|
|
||||||
$log = new Actionlog;
|
$log = new Actionlog;
|
||||||
|
|
||||||
|
$fields_array = [];
|
||||||
|
|
||||||
$log = $this->determineLogItemType($log);
|
$log = $this->determineLogItemType($log);
|
||||||
if (auth()->user()) {
|
if (auth()->user()) {
|
||||||
$log->created_by = auth()->id();
|
$log->created_by = auth()->id();
|
||||||
|
@ -55,6 +59,7 @@ trait Loggable
|
||||||
$log->target_type = get_class($target);
|
$log->target_type = get_class($target);
|
||||||
$log->target_id = $target->id;
|
$log->target_id = $target->id;
|
||||||
|
|
||||||
|
|
||||||
// Figure out what the target is
|
// Figure out what the target is
|
||||||
if ($log->target_type == Location::class) {
|
if ($log->target_type == Location::class) {
|
||||||
$log->location_id = $target->id;
|
$log->location_id = $target->id;
|
||||||
|
@ -64,6 +69,21 @@ trait Loggable
|
||||||
$log->location_id = $target->location_id;
|
$log->location_id = $target->location_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (static::class == Asset::class) {
|
||||||
|
if ($asset = Asset::find($log->item_id)) {
|
||||||
|
|
||||||
|
// add the custom fields that were changed
|
||||||
|
if ($asset->model->fieldset) {
|
||||||
|
$fields_array = [];
|
||||||
|
foreach ($asset->model->fieldset->fields as $field) {
|
||||||
|
if ($field->display_checkout == 1) {
|
||||||
|
$fields_array[$field->db_column] = $asset->{$field->db_column};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
$log->note = $note;
|
$log->note = $note;
|
||||||
$log->action_date = $action_date;
|
$log->action_date = $action_date;
|
||||||
|
|
||||||
|
@ -72,7 +92,10 @@ trait Loggable
|
||||||
}
|
}
|
||||||
|
|
||||||
$changed = [];
|
$changed = [];
|
||||||
$originalValues = array_intersect_key($originalValues, array_flip(['action_date','name','status_id','location_id','expected_checkin']));
|
$array_to_flip = array_keys($fields_array);
|
||||||
|
$array_to_flip = array_merge($array_to_flip, ['action_date','name','status_id','location_id','expected_checkin']);
|
||||||
|
$originalValues = array_intersect_key($originalValues, array_flip($array_to_flip));
|
||||||
|
|
||||||
|
|
||||||
foreach ($originalValues as $key => $value) {
|
foreach ($originalValues as $key => $value) {
|
||||||
if ($key == 'action_date' && $value != $action_date) {
|
if ($key == 'action_date' && $value != $action_date) {
|
||||||
|
@ -119,6 +142,8 @@ trait Loggable
|
||||||
{
|
{
|
||||||
$log = new Actionlog;
|
$log = new Actionlog;
|
||||||
|
|
||||||
|
$fields_array = [];
|
||||||
|
|
||||||
if($target != null){
|
if($target != null){
|
||||||
$log->target_type = get_class($target);
|
$log->target_type = get_class($target);
|
||||||
$log->target_id = $target->id;
|
$log->target_id = $target->id;
|
||||||
|
@ -135,6 +160,16 @@ trait Loggable
|
||||||
if (static::class == Asset::class) {
|
if (static::class == Asset::class) {
|
||||||
if ($asset = Asset::find($log->item_id)) {
|
if ($asset = Asset::find($log->item_id)) {
|
||||||
$asset->increment('checkin_counter', 1);
|
$asset->increment('checkin_counter', 1);
|
||||||
|
|
||||||
|
// add the custom fields that were changed
|
||||||
|
if ($asset->model->fieldset) {
|
||||||
|
$fields_array = [];
|
||||||
|
foreach ($asset->model->fieldset->fields as $field) {
|
||||||
|
if ($field->display_checkin == 1) {
|
||||||
|
$fields_array[$field->db_column] = $asset->{$field->db_column};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -152,9 +187,14 @@ trait Loggable
|
||||||
}
|
}
|
||||||
|
|
||||||
$changed = [];
|
$changed = [];
|
||||||
$originalValues = array_intersect_key($originalValues, array_flip(['action_date','name','status_id','location_id','rtd_location_id','expected_checkin']));
|
|
||||||
|
$array_to_flip = array_keys($fields_array);
|
||||||
|
$array_to_flip = array_merge($array_to_flip, ['action_date','name','status_id','location_id','expected_checkin']);
|
||||||
|
|
||||||
|
$originalValues = array_intersect_key($originalValues, array_flip($array_to_flip));
|
||||||
|
|
||||||
foreach ($originalValues as $key => $value) {
|
foreach ($originalValues as $key => $value) {
|
||||||
|
|
||||||
if ($key == 'action_date' && $value != $action_date) {
|
if ($key == 'action_date' && $value != $action_date) {
|
||||||
$changed[$key]['old'] = $value;
|
$changed[$key]['old'] = $value;
|
||||||
$changed[$key]['new'] = is_string($action_date) ? $action_date : $action_date->format('Y-m-d H:i:s');
|
$changed[$key]['new'] = is_string($action_date) ? $action_date : $action_date->format('Y-m-d H:i:s');
|
||||||
|
|
|
@ -53,6 +53,7 @@ class Manufacturer extends SnipeModel
|
||||||
'support_url',
|
'support_url',
|
||||||
'url',
|
'url',
|
||||||
'warranty_lookup_url',
|
'warranty_lookup_url',
|
||||||
|
'notes',
|
||||||
];
|
];
|
||||||
|
|
||||||
use Searchable;
|
use Searchable;
|
||||||
|
@ -62,7 +63,7 @@ class Manufacturer extends SnipeModel
|
||||||
*
|
*
|
||||||
* @var array
|
* @var array
|
||||||
*/
|
*/
|
||||||
protected $searchableAttributes = ['name', 'created_at'];
|
protected $searchableAttributes = ['name', 'created_at', 'notes'];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The relations and their attributes that should be included when searching the model.
|
* The relations and their attributes that should be included when searching the model.
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Reference in a new issue