diff --git a/app/Abstracts/View/Components/Documents/Form.php b/app/Abstracts/View/Components/Documents/Form.php index 6158e12d1..606488315 100644 --- a/app/Abstracts/View/Components/Documents/Form.php +++ b/app/Abstracts/View/Components/Documents/Form.php @@ -425,15 +425,15 @@ abstract class Form extends Component protected function getCurrency($document, $currency, $currency_code) { - if (!empty($currency)) { + if (! empty($currency)) { return $currency; } - if (!empty($currency_code)) { + if (! empty($currency_code)) { $currency = Currency::where('code', $currency_code)->first(); } - if (empty($currency) && !empty($document)) { + if (empty($currency) && ! empty($document)) { $currency = Currency::where('code', $document->currency_code)->first(); } diff --git a/app/Http/Controllers/Settings/Categories.php b/app/Http/Controllers/Settings/Categories.php index 542be10b9..915ea8f77 100644 --- a/app/Http/Controllers/Settings/Categories.php +++ b/app/Http/Controllers/Settings/Categories.php @@ -146,14 +146,31 @@ class Categories extends Controller $categories[$type] = []; } - Category::enabled()->orderBy('name')->get()->each(function ($category) use (&$categories, $edited_category_id) { - if ($edited_category_id != $category->id) { - $categories[$category->type][] = [ - 'id' => $category->id, - 'title' => $category->name, - 'level' => $category->level, - ]; + $skip_categories = []; + $skip_categories[] = $edited_category_id; + + foreach ($category->sub_categories as $sub_category) { + $skip_categories[] = $sub_category->id; + + if ($sub_category->sub_categories) { + $skips = $this->getChildrenCategoryIds($sub_category); + + foreach ($skips as $skip) { + $skip_categories[] = $skip; + } } + } + + Category::enabled()->orderBy('name')->get()->each(function ($category) use (&$categories, &$skip_categories) { + if (in_array($category->id, $skip_categories)) { + return; + } + + $categories[$category->type][] = [ + 'id' => $category->id, + 'title' => $category->name, + 'level' => $category->level, + ]; }); return view('settings.categories.edit', compact('category', 'types', 'type_disabled', 'categories')); @@ -167,10 +184,8 @@ class Categories extends Controller * * @return Response */ - public function update($category_id, Request $request) + public function update(Category $category, Request $request) { - $category = $this->getCategoryWithoutChildren($category_id); - $response = $this->ajaxDispatch(new UpdateCategory($category, $request)); if ($response['success']) { @@ -197,10 +212,8 @@ class Categories extends Controller * * @return Response */ - public function enable($category_id) + public function enable(Category $category) { - $category = $this->getCategoryWithoutChildren($category_id); - $response = $this->ajaxDispatch(new UpdateCategory($category, request()->merge(['enabled' => 1]))); if ($response['success']) { @@ -217,10 +230,8 @@ class Categories extends Controller * * @return Response */ - public function disable($category_id) + public function disable(Category $category) { - $category = $this->getCategoryWithoutChildren($category_id); - $response = $this->ajaxDispatch(new UpdateCategory($category, request()->merge(['enabled' => 0]))); if ($response['success']) { diff --git a/app/Jobs/Auth/UpdateUser.php b/app/Jobs/Auth/UpdateUser.php index 56cc7c3d5..1e2a044c6 100644 --- a/app/Jobs/Auth/UpdateUser.php +++ b/app/Jobs/Auth/UpdateUser.php @@ -87,5 +87,29 @@ class UpdateUser extends Job implements ShouldUpdate throw new \Exception($message); } + + // Can't unassigned company, The company must be assigned at least one user. + $companies = $this->request->get('companies'); + $user_companies = $this->model->companies()->pluck('id')->toArray(); + + $company_diff = array_diff($user_companies, $companies); + + if ($company_diff) { + $errors = []; + + foreach ($company_diff as $company_id) { + $company = Company::withCount('users')->find($company_id); + + if ($company->users_count < 2) { + $errors[] = trans('auth.error.unassigned', ['company' => $company->name]); + } + } + + if ($errors) { + $message = implode('\n', $errors); + + throw new \Exception($message); + } + } } } diff --git a/app/Listeners/Update/V30/Version307.php b/app/Listeners/Update/V30/Version307.php new file mode 100644 index 000000000..99edd8b60 --- /dev/null +++ b/app/Listeners/Update/V30/Version307.php @@ -0,0 +1,43 @@ +skipThisUpdate($event)) { + return; + } + + Log::channel('stdout')->info('Updating to 3.0.7 version...'); + + $this->updateDatabase(); + + Log::channel('stdout')->info('Done!'); + } + + public function updateDatabase(): void + { + Log::channel('stdout')->info('Updating database...'); + + Artisan::call('migrate', ['--force' => true]); + + Log::channel('stdout')->info('Database updated.'); + } +} diff --git a/app/Models/Setting/Category.php b/app/Models/Setting/Category.php index e2c31549f..68b0a70fa 100644 --- a/app/Models/Setting/Category.php +++ b/app/Models/Setting/Category.php @@ -94,6 +94,7 @@ class Category extends Model { return $this->resolveRouteBindingQuery($this, $value, $field) ->withoutGlobalScope(Scope::class) + ->getWithoutChildren() ->first(); } diff --git a/app/Providers/Event.php b/app/Providers/Event.php index 56bec2104..b3ccb7d31 100644 --- a/app/Providers/Event.php +++ b/app/Providers/Event.php @@ -19,6 +19,7 @@ class Event extends Provider 'App\Listeners\Update\V30\Version303', 'App\Listeners\Update\V30\Version304', 'App\Listeners\Update\V30\Version305', + 'App\Listeners\Update\V30\Version307', ], 'Illuminate\Auth\Events\Login' => [ 'App\Listeners\Auth\Login', diff --git a/app/Traits/Categories.php b/app/Traits/Categories.php index dc2696259..14789fdd8 100644 --- a/app/Traits/Categories.php +++ b/app/Traits/Categories.php @@ -43,4 +43,19 @@ trait Categories return $id == $this->getTransferCategoryId(); } + + public function getChildrenCategoryIds($category) + { + $ids = []; + + foreach ($category->sub_categories as $sub_category) { + $ids[] = $sub_category->id; + + if ($sub_category->sub_categories) { + $ids = array_merge($ids, $this->getChildrenCategoryIds($sub_category)); + } + } + + return $ids; + } } diff --git a/public/css/app.css b/public/css/app.css index 5d0c73ba9..458fa314b 100644 --- a/public/css/app.css +++ b/public/css/app.css @@ -51707,6 +51707,10 @@ body{ right: 6rem; } + .lg\:top-2{ + top: 0.5rem; + } + .lg\:col-span-5{ grid-column: span 5 / span 5; } @@ -51800,8 +51804,21 @@ body{ height: 1rem; } +<<<<<<< HEAD .lg\:w-18{ width: 4.5rem; +======= + .lg\:h-12{ + height: 3rem; + } + + .lg\:h-auto{ + height: auto; + } + + .lg\:w-9{ + width: 2.25rem; +>>>>>>> e8693a3c924c3442b8be7a2ad7bdf8525ed982d4 } .lg\:w-1\/2{ @@ -51884,6 +51901,10 @@ body{ width: 24rem; } + .lg\:w-auto{ + width: auto; + } + .lg\:w-2\/4{ width: 50%; } diff --git a/resources/assets/js/components/AkauntingModal.vue b/resources/assets/js/components/AkauntingModal.vue index 5dc8d4c7c..2a20e0f1e 100644 --- a/resources/assets/js/components/AkauntingModal.vue +++ b/resources/assets/js/components/AkauntingModal.vue @@ -7,7 +7,7 @@ tabindex="-1" role="dialog" :aria-hidden="!show"> -