Skip to content
Merged
Show file tree
Hide file tree
Changes from 24 commits
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
ee5aac8
supplier destroy action creaated and a lot scratched out
spencerrlongg Jun 4, 2025
a0431e1
supplier actions working
spencerrlongg Jun 5, 2025
1745648
category destroy action
spencerrlongg Jun 5, 2025
5e81c63
some notes and things moved
spencerrlongg Jun 11, 2025
1cee7e4
more (reusable) exceptions, a couple notes
spencerrlongg Jun 12, 2025
13c971b
some refinements, bulk categories controller
spencerrlongg Jun 12, 2025
5da79cd
destroy manufacturer action, bulk manufacturer controller
spencerrlongg Jun 12, 2025
db63ad1
add image check to supplier action
spencerrlongg Jun 17, 2025
d5ca543
start introducing parent exception
spencerrlongg Jul 7, 2025
5f835aa
delete unused imports
spencerrlongg Jul 7, 2025
4d8c5a8
routes added, tests scratched but need writing
spencerrlongg Jul 10, 2025
f1584b7
work on bulk tests, switching branches to check something
spencerrlongg Jul 10, 2025
59ccc70
bulk changes that should make this work
spencerrlongg Jul 10, 2025
7cdfaa9
a couple more tests and cleanup
spencerrlongg Jul 10, 2025
f590fcf
some tests, a component i probably won't use, beginning of front end
spencerrlongg Aug 10, 2025
b61419c
oop, revert delete
spencerrlongg Aug 10, 2025
3eefeec
partials made, need to figure out all this jquery, button disabled
spencerrlongg Aug 10, 2025
d0e068f
suppliers completely done, rinse and repeat for the other two
spencerrlongg Aug 12, 2025
0dcdfc5
fix tests after routing change
spencerrlongg Aug 12, 2025
5cd5392
manufacturer completed, just categories left
spencerrlongg Aug 12, 2025
6159ee8
category done!
spencerrlongg Aug 12, 2025
78ca1d1
some cleanup
spencerrlongg Aug 12, 2025
3052029
Merge branch 'develop' into feature/8709-bulk-deletion-of-asset-categ…
spencerrlongg Aug 12, 2025
e33b1b6
fixed maintenances
spencerrlongg Aug 12, 2025
b934f43
rename all exceptions
spencerrlongg Aug 21, 2025
643d44a
change \Throwable to \Exceptionm, add missing `report()`s
spencerrlongg Aug 21, 2025
a091baf
component finally working
spencerrlongg Aug 25, 2025
c429964
rm unused import
spencerrlongg Aug 25, 2025
c39d484
rm unused import, new prop
spencerrlongg Aug 25, 2025
fdb0651
tests passing, needs some manual testing
spencerrlongg Aug 25, 2025
7b6c0c3
Revert "tests passing, needs some manual testing"
spencerrlongg Aug 25, 2025
1d88cf4
revert SuppliersController as well
spencerrlongg Aug 25, 2025
51f6927
add details block for more than 3 errors to notification
spencerrlongg Aug 27, 2025
c450c0d
lots of translation changes
spencerrlongg Aug 27, 2025
526bb2c
more translation changes
spencerrlongg Aug 27, 2025
1d24b79
another translation change
spencerrlongg Aug 27, 2025
36f5099
added new counts and throw new exceptions and catch them
spencerrlongg Sep 29, 2025
32882f8
replace `box-default`
spencerrlongg Sep 29, 2025
b9f4dc1
translation
spencerrlongg Oct 2, 2025
24bb45a
change translation
spencerrlongg Oct 7, 2025
5fdb999
Merge branch 'develop' into feature/8709-bulk-deletion-of-asset-categ…
snipe Oct 13, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
61 changes: 61 additions & 0 deletions app/Actions/Categories/DestroyCategoryAction.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
<?php

namespace App\Actions\Categories;

use App\Exceptions\ModelIsNotDeletable;
use App\Exceptions\ModelStillHasAccessories;
use App\Exceptions\ModelStillHasAssetModels;
use App\Exceptions\ModelStillHasAssets;
use App\Exceptions\ModelStillHasComponents;
use App\Exceptions\ModelStillHasConsumables;
use App\Exceptions\ModelStillHasLicenses;
use App\Helpers\Helper;
use App\Models\Category;
use Illuminate\Support\Facades\Storage;

class DestroyCategoryAction
{
/**
* @throws ModelStillHasAssets
* @throws ModelStillHasAssetModels
* @throws ModelStillHasComponents
* @throws ModelStillHasAccessories
* @throws ModelStillHasLicenses
* @throws ModelStillHasConsumables
*/
static function run(Category $category): bool
{
$category->loadCount([
'assets as assets_count',
'accessories as accessories_count',
'consumables as consumables_count',
'components as components_count',
'licenses as licenses_count',
'models as models_count'
]);

if ($category->assets_count > 0) {
throw new ModelStillHasAssets($category);
}
if ($category->accessories_count > 0) {
throw new ModelStillHasAccessories($category);
}
if ($category->consumables_count > 0) {
throw new ModelStillHasConsumables($category);
}
if ($category->components_count > 0) {
throw new ModelStillHasComponents($category);
}
if ($category->licenses_count > 0) {
throw new ModelStillHasLicenses($category);
}
if ($category->models_count > 0) {
throw new ModelStillHasAssetModels($category);
}

Storage::disk('public')->delete('categories'.'/'.$category->image);
$category->delete();

return true;
}
}
63 changes: 63 additions & 0 deletions app/Actions/Manufacturers/DeleteManufacturerAction.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
<?php

namespace App\Actions\Manufacturers;

use App\Exceptions\ModelStillHasAccessories;
use App\Exceptions\ModelStillHasAssets;
use App\Exceptions\ModelStillHasComponents;
use App\Exceptions\ModelStillHasConsumables;
use App\Exceptions\ModelStillHasLicenses;
use App\Models\Manufacturer;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Storage;

class DeleteManufacturerAction
{
/**
* @throws ModelStillHasAssets
* @throws ModelStillHasComponents
* @throws ModelStillHasAccessories
* @throws ModelStillHasLicenses
* @throws ModelStillHasConsumables
*/
static function run(Manufacturer $manufacturer): bool
{
$manufacturer->loadCount([
'assets as assets_count',
'accessories as accessories_count',
'consumables as consumables_count',
'components as components_count',
'licenses as licenses_count',
]);

if ($manufacturer->assets_count > 0) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I kinda feel like all these checks could get put in something like:

public function throwIfNotDeletable()
{
   //grab counts, throw the new exceptions as appropriate
}

And then you can make is_deletable() just be like this:

public function is_deletable()
{
   try {
      $this->throwIfNotDeletable();
      } catch (BaseExceptionWhateverItsCalled $e) {
        return false;
   } catch (Exception $e) {
     //do something else?
  }
  }

throw new ModelStillHasAssets($manufacturer);
}
if ($manufacturer->accessories_count > 0) {
throw new ModelStillHasAccessories($manufacturer);
}
if ($manufacturer->consumables_count > 0) {
throw new ModelStillHasConsumables($manufacturer);
}
if ($manufacturer->components_count > 0) {
throw new ModelStillHasComponents($manufacturer);
}
if ($manufacturer->licenses_count > 0) {
throw new ModelStillHasLicenses($manufacturer);
}

if ($manufacturer->image) {
try {
Storage::disk('public')->delete('manufacturers/'.$manufacturer->image);
} catch (\Exception $e) {
Log::info($e);
}
}

$manufacturer->delete();
//dd($manufacturer);

return true;
}

}
50 changes: 50 additions & 0 deletions app/Actions/Suppliers/DestroySupplierAction.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
<?php

namespace App\Actions\Suppliers;

use App\Models\Supplier;
use App\Exceptions\ModelStillHasAssets;
use App\Exceptions\ModelStillHasMaintenances;
use App\Exceptions\ModelStillHasLicenses;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Storage;

class DestroySupplierAction
{
/**
* @throws ModelStillHasLicenses
* @throws ModelStillHasAssets
* @throws ModelStillHasMaintenances
*/
static function run(Supplier $supplier): bool
{
$supplier->loadCount([
'maintenances as maintenances_count',
'assets as assets_count',
'licenses as licenses_count'
]);
if ($supplier->assets_count > 0) {
throw new ModelStillHasAssets($supplier);
}

if ($supplier->maintenances_count > 0) {
throw new ModelStillHasMaintenances($supplier);
}

if ($supplier->licenses_count > 0) {
throw new ModelStillHasLicenses($supplier);
}

if ($supplier->image) {
try {
Storage::disk('public')->delete('suppliers/'.$supplier->image);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If we restore these categories, etc, the image will be broken

} catch (\Exception $e) {
Log::info($e->getMessage());
}
}

$supplier->delete();

return true;
}
}
10 changes: 10 additions & 0 deletions app/Exceptions/ModelStillHasAccessories.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<?php

namespace App\Exceptions;

use Exception;

class ModelStillHasAccessories extends ModelStillHasChildren
{
//
}
10 changes: 10 additions & 0 deletions app/Exceptions/ModelStillHasAssetModels.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<?php

namespace App\Exceptions;

use Exception;

class ModelStillHasAssetModels extends ModelStillHasChildren
{
//
}
9 changes: 9 additions & 0 deletions app/Exceptions/ModelStillHasAssets.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<?php

namespace App\Exceptions;

use Exception;

class ModelStillHasAssets extends ModelStillHasChildren
{
}
14 changes: 14 additions & 0 deletions app/Exceptions/ModelStillHasChildren.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<?php

namespace App\Exceptions;

use Exception;

class ModelStillHasChildren extends Exception
{
//public function __construct($message, $code = 0, Exception $previous = null, $parent, $children)
//{
// trans()
//
//}
}
10 changes: 10 additions & 0 deletions app/Exceptions/ModelStillHasComponents.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<?php

namespace App\Exceptions;

use Exception;

class ModelStillHasComponents extends ModelStillHasChildren
{
//
}
10 changes: 10 additions & 0 deletions app/Exceptions/ModelStillHasConsumables.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<?php

namespace App\Exceptions;

use Exception;

class ModelStillHasConsumables extends ModelStillHasChildren
{
//
}
10 changes: 10 additions & 0 deletions app/Exceptions/ModelStillHasLicenses.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<?php

namespace App\Exceptions;

use Exception;

class ModelStillHasLicenses extends ModelStillHasChildren
{
//
}
10 changes: 10 additions & 0 deletions app/Exceptions/ModelStillHasMaintenances.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<?php

namespace App\Exceptions;

use Exception;

class ModelStillHasMaintenances extends ModelStillHasChildren
{
//
}
18 changes: 12 additions & 6 deletions app/Http/Controllers/Api/CategoriesController.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

namespace App\Http\Controllers\Api;

use App\Actions\Categories\DestroyCategoryAction;
use App\Exceptions\ModelStillHasChildren;
use App\Helpers\Helper;
use App\Http\Controllers\Controller;
use App\Http\Transformers\CategoriesTransformer;
Expand Down Expand Up @@ -209,17 +211,21 @@ public function update(ImageUploadRequest $request, $id) : JsonResponse
* @param int $id
* @return \Illuminate\Http\Response
*/
public function destroy($id) : JsonResponse
public function destroy(Category $category): JsonResponse
{
$this->authorize('delete', Category::class);
$category = Category::withCount('assets as assets_count', 'accessories as accessories_count', 'consumables as consumables_count', 'components as components_count', 'licenses as licenses_count', 'models as models_count')->findOrFail($id);

if (! $category->isDeletable()) {
try {
DestroyCategoryAction::run(category: $category);
} catch (ModelStillHasChildren $e) {
return response()->json(
Helper::formatStandardApiResponse('error', null, trans('admin/categories/message.assoc_items', ['asset_type' => $category->category_type]))
);
} catch (\Throwable $e) {
report($e);
return response()->json(
Helper::formatStandardApiResponse('error', null, trans('admin/categories/message.assoc_items', ['asset_type'=>$category->category_type]))
Helper::formatStandardApiResponse('error', null, trans('general.something_went_wrong'))
);
}
$category->delete();

return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/categories/message.delete.success')));
}
Expand Down
24 changes: 15 additions & 9 deletions app/Http/Controllers/Api/ManufacturersController.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,13 @@

namespace App\Http\Controllers\Api;

use App\Actions\Manufacturers\DeleteManufacturerAction;
use App\Exceptions\ModelStillHasAccessories;
use App\Exceptions\ModelStillHasAssets;
use App\Exceptions\ModelStillHasChildren;
use App\Exceptions\ModelStillHasComponents;
use App\Exceptions\ModelStillHasConsumables;
use App\Exceptions\ModelStillHasLicenses;
use App\Helpers\Helper;
use App\Http\Controllers\Controller;
use App\Http\Transformers\ManufacturersTransformer;
Expand Down Expand Up @@ -184,19 +191,18 @@ public function update(ImageUploadRequest $request, $id) : JsonResponse
* @since [v4.0]
* @param int $id
*/
public function destroy($id) : JsonResponse
public function destroy(Manufacturer $manufacturer): JsonResponse
{
$this->authorize('delete', Manufacturer::class);
$manufacturer = Manufacturer::findOrFail($id);
$this->authorize('delete', $manufacturer);

if ($manufacturer->isDeletable()) {
$manufacturer->delete();
return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/manufacturers/message.delete.success')));
try {
DeleteManufacturerAction::run($manufacturer);
} catch (ModelStillHasChildren $e) {
return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/manufacturers/message.assoc_users')));
} catch (\Exception $e) {
return response()->json(Helper::formatStandardApiResponse('error', null, trans('general.something_went_wrong')));
}

return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/manufacturers/message.assoc_users')));

return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/manufacturers/message.delete.success')));
}

/**
Expand Down
28 changes: 13 additions & 15 deletions app/Http/Controllers/Api/SuppliersController.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@

namespace App\Http\Controllers\Api;

use App\Actions\Suppliers\DestroySupplierAction;
use App\Exceptions\ModelStillHasMaintenances;
use App\Exceptions\ModelStillHasAssets;
use App\Exceptions\ModelStillHasLicenses;
use App\Helpers\Helper;
use App\Http\Controllers\Controller;
use App\Http\Transformers\SelectlistTransformer;
Expand Down Expand Up @@ -191,27 +195,21 @@ public function update(ImageUploadRequest $request, $id) : JsonResponse
* @since [v4.0]
* @param int $id
*/
public function destroy($id) : JsonResponse
public function destroy(Supplier $supplier): JsonResponse
{
$this->authorize('delete', Supplier::class);
$supplier = Supplier::with('maintenances', 'assets', 'licenses')->withCount('maintenances as maintenances_count', 'assets as assets_count', 'licenses as licenses_count')->findOrFail($id);
$this->authorize('delete', $supplier);


if ($supplier->assets_count > 0) {
try {
DestroySupplierAction::run(supplier: $supplier);
} catch (ModelStillHasAssets $e) {
return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/suppliers/message.delete.assoc_assets', ['asset_count' => (int) $supplier->assets_count])));
}

if ($supplier->maintenances_count > 0) {
return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/suppliers/message.delete.assoc_maintenances', ['maintenances_count' => $supplier->maintenances_count])));
}

if ($supplier->licenses_count > 0) {
} catch (ModelStillHasMaintenances $e) {
return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/suppliers/message.delete.assoc_maintenances', ['asset_maintenances_count' => $supplier->asset_maintenances_count])));
} catch (ModelStillHasLicenses $e) {
return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/suppliers/message.delete.assoc_licenses', ['licenses_count' => (int) $supplier->licenses_count])));
} catch (\Exception $e) {
return response()->json(Helper::formatStandardApiResponse('error', null, trans('general.something_went_wrong')));
}

$supplier->delete();

return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/suppliers/message.delete.success')));
}

Expand Down
Loading
Loading