From c182ae552cd063a76293fc066bd33977e70e27f3 Mon Sep 17 00:00:00 2001 From: Arturo Corro Date: Wed, 5 Mar 2025 20:39:27 -0600 Subject: [PATCH] first commit --- .editorconfig | 18 + .gitattributes | 38 ++ .gitignore | 10 + .prettierignore | 16 + .prettierrc.json | 29 + CHANGELOG.md | 39 ++ CONTRIBUTING.md | 9 + Http/AssetAassignmentController.php | 65 +++ Http/AssetController.php | 65 +++ Http/AssetLifecycleController.php | 65 +++ Http/AssetMaintenanceController.php | 65 +++ Http/FixedAssetController.php | 65 +++ Http/FixedAssetEventController.php | 65 +++ Http/FixedAssetStatusHistoryController.php | 65 +++ LICENSE | 9 + .../AssetAassignmentsIndex.php | 109 ++++ .../AssetLifecycles/AssetLifecyclesIndex.php | 109 ++++ .../AssetMaintenancesIndex.php | 109 ++++ Livewire/Assets/AssetsIndex.php | 109 ++++ .../VuexyAssetManagementServiceProvider.php | 49 ++ README.md | 133 +++++ composer.json | 36 ++ ...2_17_106605_create_fixed_assets_tables.php | 97 ++++ .../views/asset-aassignments/index.blade.php | 24 + .../views/asset-lifecycles/index.blade.php | 24 + .../views/asset-maintenances/index.blade.php | 24 + resources/views/assets/index.blade.php | 24 + .../asset-aassignments-index.blade.php | 516 ++++++++++++++++++ .../asset-lifecycles-index.blade.php | 516 ++++++++++++++++++ .../asset-maintenances-index.blade.php | 516 ++++++++++++++++++ .../livewire/assets/assets-index.blade.php | 516 ++++++++++++++++++ routes/admin.php | 208 +++++++ 32 files changed, 3742 insertions(+) create mode 100644 .editorconfig create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 .prettierignore create mode 100644 .prettierrc.json create mode 100644 CHANGELOG.md create mode 100644 CONTRIBUTING.md create mode 100644 Http/AssetAassignmentController.php create mode 100644 Http/AssetController.php create mode 100644 Http/AssetLifecycleController.php create mode 100644 Http/AssetMaintenanceController.php create mode 100644 Http/FixedAssetController.php create mode 100644 Http/FixedAssetEventController.php create mode 100644 Http/FixedAssetStatusHistoryController.php create mode 100644 LICENSE create mode 100644 Livewire/AssetAassignments/AssetAassignmentsIndex.php create mode 100644 Livewire/AssetLifecycles/AssetLifecyclesIndex.php create mode 100644 Livewire/AssetMaintenances/AssetMaintenancesIndex.php create mode 100644 Livewire/Assets/AssetsIndex.php create mode 100644 Providers/VuexyAssetManagementServiceProvider.php create mode 100644 README.md create mode 100644 composer.json create mode 100644 database/migrations/2024_12_17_106605_create_fixed_assets_tables.php create mode 100644 resources/views/asset-aassignments/index.blade.php create mode 100644 resources/views/asset-lifecycles/index.blade.php create mode 100644 resources/views/asset-maintenances/index.blade.php create mode 100644 resources/views/assets/index.blade.php create mode 100644 resources/views/livewire/asset-aassignments/asset-aassignments-index.blade.php create mode 100644 resources/views/livewire/asset-lifecycles/asset-lifecycles-index.blade.php create mode 100644 resources/views/livewire/asset-maintenances/asset-maintenances-index.blade.php create mode 100644 resources/views/livewire/assets/assets-index.blade.php create mode 100644 routes/admin.php diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..8f0de65 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,18 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +indent_size = 4 +indent_style = space +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +trim_trailing_whitespace = false + +[*.{yml,yaml}] +indent_size = 2 + +[docker-compose.yml] +indent_size = 4 diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..7333620 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,38 @@ +* text=auto eol=lf + +*.blade.php diff=html +*.css diff=css +*.html diff=html +*.md diff=markdown +*.php diff=php + +/.github export-ignore +CHANGELOG.md export-ignore +.styleci.yml export-ignore + +# Ignorar archivos de configuración y herramientas de desarrollo +.editorconfig export-ignore +.prettierrc.json export-ignore +.prettierignore export-ignore +.eslintrc.json export-ignore + +# Ignorar node_modules y dependencias locales +node_modules/ export-ignore +vendor/ export-ignore + +# Ignorar archivos de build +npm-debug.log export-ignore + +# Ignorar carpetas de logs y caché +storage/logs/ export-ignore +storage/framework/ export-ignore + +# Ignorar carpetas de compilación de frontend +public/build/ export-ignore +dist/ export-ignore + +# Ignorar archivos de CI/CD +.github/ export-ignore +.gitlab-ci.yml export-ignore +.vscode/ export-ignore +.idea/ export-ignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d07bec2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,10 @@ +/node_modules +/vendor +/.vscode +/.nova +/.fleet +/.phpactor.json +/.phpunit.cache +/.phpunit.result.cache +/.zed +/.idea diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..5d3dfee --- /dev/null +++ b/.prettierignore @@ -0,0 +1,16 @@ +# Dependencias de Composer y Node.js +/vendor/ +/node_modules/ + +# Caché y logs +/storage/ +*.log +*.cache + +# Archivos del sistema +.DS_Store +Thumbs.db + +# Configuración de editores +.idea/ +.vscode/ diff --git a/.prettierrc.json b/.prettierrc.json new file mode 100644 index 0000000..5f11c9c --- /dev/null +++ b/.prettierrc.json @@ -0,0 +1,29 @@ +{ + "arrowParens": "avoid", + "bracketSpacing": true, + "bracketSameLine": true, + "htmlWhitespaceSensitivity": "css", + "insertPragma": false, + "jsxSingleQuote": true, + "printWidth": 120, + "proseWrap": "preserve", + "quoteProps": "as-needed", + "requirePragma": false, + "semi": true, + "singleQuote": true, + "tabWidth": 4, + "trailingComma": "none", + "useTabs": false, + "endOfLine": "lf", + "embeddedLanguageFormatting": "auto", + "overrides": [ + { + "files": [ + "resources/assets/**/*.js" + ], + "options": { + "semi": false + } + } + ] +} diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..c72be6c --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,39 @@ +# 📜 CHANGELOG - Laravel Vuexy Asset Management + +Este documento sigue el formato [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). + +## [0.1.0] - ALPHA - 2024-03-05 + +### ✨ Added (Agregado) +- 🚀 Primera versión alpha de la librería. +- 🔹 Implementación inicial de [funcionalidad clave 1]. +- 🔹 Integración con [dependencia o servicio principal]. +- 🔹 Soporte para [Laravel/Vuexy Admin, si aplica]. + +### 🛠 Changed (Modificado) +- 🔄 Optimización de [código o estructura interna]. + +### 🐛 Fixed (Correcciones) +- 🐞 Correcciones iniciales en [migraciones, modelos, servicios, etc.]. + +--- + +## 📅 Próximos Cambios Planeados +- 📊 **Mejoras en [feature futuro]**. +- 🏪 **Compatibilidad con [Laravel 11, Vuexy, etc.]**. +- 📍 **Integración con [API o funcionalidad esperada]**. + +--- + +**📌 Nota:** Esta es una versión **ALPHA**, aún en desarrollo. + +--- + +## 🔄 Sincronización de Cambios +Este `CHANGELOG.md` se actualiza primero en nuestro repositorio principal en **[Tea - Koneko Git](https://git.koneko.mx/koneko/laravel-vuexy-asset-management)** y luego se refleja en GitHub. +Los cambios recientes pueden verse antes en **Tea** que en **GitHub** debido a la sincronización automática. + +--- + +📅 Última actualización: **2024-03-05**. + diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..9d43746 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,9 @@ +## 🔐 Acceso al Repositorio Privado + +Nuestro servidor Git en **Tea** tiene un registro cerrado. Para contribuir: + +1. Abre un **Issue** en [GitHub](https://github.com/koneko-mx/laravel-vuexy-asset-management/issues) indicando tu interés en contribuir. +2. Alternativamente, envía un correo a **contacto@koneko.mx** solicitando acceso. +3. Una vez aprobado, recibirás una invitación para registrarte y clonar el repositorio. + +Si solo necesitas acceso de lectura, puedes clonar la versión pública en **GitHub**. diff --git a/Http/AssetAassignmentController.php b/Http/AssetAassignmentController.php new file mode 100644 index 0000000..c505a67 --- /dev/null +++ b/Http/AssetAassignmentController.php @@ -0,0 +1,65 @@ +tipo_persona_options = [ + User::TIPO_RFC_FISICA => User::$tipoRfcList[User::TIPO_RFC_FISICA], + User::TIPO_RFC_MORAL => User::$tipoRfcList[User::TIPO_RFC_MORAL], + User::TIPO_RFC_PUBLICO => User::$tipoRfcList[User::TIPO_RFC_PUBLICO], + ]; + + $this->estado_options = DB::table('sat_estado') + ->select('sat_estado.c_estado', 'sat_estado.nombre_del_estado') + ->join('sat_codigo_postal', 'sat_estado.c_estado', '=', 'sat_codigo_postal.c_estado') + ->join('users', 'users.domicilio_fiscal', '=', 'sat_codigo_postal.c_codigo_postal') + ->distinct() + ->orderBy('sat_estado.c_estado') + ->pluck('sat_estado.nombre_del_estado', 'sat_estado.c_estado'); + + + $this->status_options = $this->status_list = [ + User::STATUS_ENABLED => User::$statusList[User::STATUS_ENABLED], + User::STATUS_DISABLED => User::$statusList[User::STATUS_DISABLED], + ]; + + //$this->status = User::STATUS_ENABLED; + $this->status_list_class = User::$statusListClass; + + $this->statuses = [ + User::STATUS_ENABLED => ['title' => 'Activo', 'class' => 'badge bg-label-' . User::$statusListClass[User::STATUS_ENABLED]], + User::STATUS_DISABLED => ['title' => 'Deshabilitado', 'class' => 'badge bg-label-' . User::$statusListClass[User::STATUS_DISABLED]], + User::STATUS_REMOVED => ['title' => 'Eliminado', 'class' => 'badge bg-label-' . User::$statusListClass[User::STATUS_REMOVED]], + ]; + + $roles = Role::whereNotIn('name', ['Patient', 'Doctor'])->get(); + + $this->roles_html_select = ""; + + $this->status_options = [ + User::STATUS_ENABLED => User::$statusList[User::STATUS_ENABLED], + User::STATUS_DISABLED => User::$statusList[User::STATUS_DISABLED], + ]; + + $this->uso_cfdi_options = UsoCfdi::selectList(); + $this->regimen_fiscal_options = RegimenFiscal::selectList(); + } + + + + + public function render() + { + return view('vuexy-warehouse::livewire.assets-aasigments.assets-aassignments-index'); + } + +} diff --git a/Livewire/AssetLifecycles/AssetLifecyclesIndex.php b/Livewire/AssetLifecycles/AssetLifecyclesIndex.php new file mode 100644 index 0000000..82d7c8e --- /dev/null +++ b/Livewire/AssetLifecycles/AssetLifecyclesIndex.php @@ -0,0 +1,109 @@ +tipo_persona_options = [ + User::TIPO_RFC_FISICA => User::$tipoRfcList[User::TIPO_RFC_FISICA], + User::TIPO_RFC_MORAL => User::$tipoRfcList[User::TIPO_RFC_MORAL], + User::TIPO_RFC_PUBLICO => User::$tipoRfcList[User::TIPO_RFC_PUBLICO], + ]; + + $this->estado_options = DB::table('sat_estado') + ->select('sat_estado.c_estado', 'sat_estado.nombre_del_estado') + ->join('sat_codigo_postal', 'sat_estado.c_estado', '=', 'sat_codigo_postal.c_estado') + ->join('users', 'users.domicilio_fiscal', '=', 'sat_codigo_postal.c_codigo_postal') + ->distinct() + ->orderBy('sat_estado.c_estado') + ->pluck('sat_estado.nombre_del_estado', 'sat_estado.c_estado'); + + + $this->status_options = $this->status_list = [ + User::STATUS_ENABLED => User::$statusList[User::STATUS_ENABLED], + User::STATUS_DISABLED => User::$statusList[User::STATUS_DISABLED], + ]; + + //$this->status = User::STATUS_ENABLED; + $this->status_list_class = User::$statusListClass; + + $this->statuses = [ + User::STATUS_ENABLED => ['title' => 'Activo', 'class' => 'badge bg-label-' . User::$statusListClass[User::STATUS_ENABLED]], + User::STATUS_DISABLED => ['title' => 'Deshabilitado', 'class' => 'badge bg-label-' . User::$statusListClass[User::STATUS_DISABLED]], + User::STATUS_REMOVED => ['title' => 'Eliminado', 'class' => 'badge bg-label-' . User::$statusListClass[User::STATUS_REMOVED]], + ]; + + $roles = Role::whereNotIn('name', ['Patient', 'Doctor'])->get(); + + $this->roles_html_select = ""; + + $this->status_options = [ + User::STATUS_ENABLED => User::$statusList[User::STATUS_ENABLED], + User::STATUS_DISABLED => User::$statusList[User::STATUS_DISABLED], + ]; + + $this->uso_cfdi_options = UsoCfdi::selectList(); + $this->regimen_fiscal_options = RegimenFiscal::selectList(); + } + + + + + public function render() + { + return view('vuexy-warehouse::livewire.asset-lifecycles.asset-lifecycles-index'); + } + +} diff --git a/Livewire/AssetMaintenances/AssetMaintenancesIndex.php b/Livewire/AssetMaintenances/AssetMaintenancesIndex.php new file mode 100644 index 0000000..ddd6048 --- /dev/null +++ b/Livewire/AssetMaintenances/AssetMaintenancesIndex.php @@ -0,0 +1,109 @@ +tipo_persona_options = [ + User::TIPO_RFC_FISICA => User::$tipoRfcList[User::TIPO_RFC_FISICA], + User::TIPO_RFC_MORAL => User::$tipoRfcList[User::TIPO_RFC_MORAL], + User::TIPO_RFC_PUBLICO => User::$tipoRfcList[User::TIPO_RFC_PUBLICO], + ]; + + $this->estado_options = DB::table('sat_estado') + ->select('sat_estado.c_estado', 'sat_estado.nombre_del_estado') + ->join('sat_codigo_postal', 'sat_estado.c_estado', '=', 'sat_codigo_postal.c_estado') + ->join('users', 'users.domicilio_fiscal', '=', 'sat_codigo_postal.c_codigo_postal') + ->distinct() + ->orderBy('sat_estado.c_estado') + ->pluck('sat_estado.nombre_del_estado', 'sat_estado.c_estado'); + + + $this->status_options = $this->status_list = [ + User::STATUS_ENABLED => User::$statusList[User::STATUS_ENABLED], + User::STATUS_DISABLED => User::$statusList[User::STATUS_DISABLED], + ]; + + //$this->status = User::STATUS_ENABLED; + $this->status_list_class = User::$statusListClass; + + $this->statuses = [ + User::STATUS_ENABLED => ['title' => 'Activo', 'class' => 'badge bg-label-' . User::$statusListClass[User::STATUS_ENABLED]], + User::STATUS_DISABLED => ['title' => 'Deshabilitado', 'class' => 'badge bg-label-' . User::$statusListClass[User::STATUS_DISABLED]], + User::STATUS_REMOVED => ['title' => 'Eliminado', 'class' => 'badge bg-label-' . User::$statusListClass[User::STATUS_REMOVED]], + ]; + + $roles = Role::whereNotIn('name', ['Patient', 'Doctor'])->get(); + + $this->roles_html_select = ""; + + $this->status_options = [ + User::STATUS_ENABLED => User::$statusList[User::STATUS_ENABLED], + User::STATUS_DISABLED => User::$statusList[User::STATUS_DISABLED], + ]; + + $this->uso_cfdi_options = UsoCfdi::selectList(); + $this->regimen_fiscal_options = RegimenFiscal::selectList(); + } + + + + + public function render() + { + return view('vuexy-warehouse::livewire.asset-maintenances.asset-maintenances-index'); + } + +} diff --git a/Livewire/Assets/AssetsIndex.php b/Livewire/Assets/AssetsIndex.php new file mode 100644 index 0000000..bca1113 --- /dev/null +++ b/Livewire/Assets/AssetsIndex.php @@ -0,0 +1,109 @@ +tipo_persona_options = [ + User::TIPO_RFC_FISICA => User::$tipoRfcList[User::TIPO_RFC_FISICA], + User::TIPO_RFC_MORAL => User::$tipoRfcList[User::TIPO_RFC_MORAL], + User::TIPO_RFC_PUBLICO => User::$tipoRfcList[User::TIPO_RFC_PUBLICO], + ]; + + $this->estado_options = DB::table('sat_estado') + ->select('sat_estado.c_estado', 'sat_estado.nombre_del_estado') + ->join('sat_codigo_postal', 'sat_estado.c_estado', '=', 'sat_codigo_postal.c_estado') + ->join('users', 'users.domicilio_fiscal', '=', 'sat_codigo_postal.c_codigo_postal') + ->distinct() + ->orderBy('sat_estado.c_estado') + ->pluck('sat_estado.nombre_del_estado', 'sat_estado.c_estado'); + + + $this->status_options = $this->status_list = [ + User::STATUS_ENABLED => User::$statusList[User::STATUS_ENABLED], + User::STATUS_DISABLED => User::$statusList[User::STATUS_DISABLED], + ]; + + //$this->status = User::STATUS_ENABLED; + $this->status_list_class = User::$statusListClass; + + $this->statuses = [ + User::STATUS_ENABLED => ['title' => 'Activo', 'class' => 'badge bg-label-' . User::$statusListClass[User::STATUS_ENABLED]], + User::STATUS_DISABLED => ['title' => 'Deshabilitado', 'class' => 'badge bg-label-' . User::$statusListClass[User::STATUS_DISABLED]], + User::STATUS_REMOVED => ['title' => 'Eliminado', 'class' => 'badge bg-label-' . User::$statusListClass[User::STATUS_REMOVED]], + ]; + + $roles = Role::whereNotIn('name', ['Patient', 'Doctor'])->get(); + + $this->roles_html_select = ""; + + $this->status_options = [ + User::STATUS_ENABLED => User::$statusList[User::STATUS_ENABLED], + User::STATUS_DISABLED => User::$statusList[User::STATUS_DISABLED], + ]; + + $this->uso_cfdi_options = UsoCfdi::selectList(); + $this->regimen_fiscal_options = RegimenFiscal::selectList(); + } + + + + + public function render() + { + return view('vuexy-warehouse::livewire.assets.assets-index'); + } + +} diff --git a/Providers/VuexyAssetManagementServiceProvider.php b/Providers/VuexyAssetManagementServiceProvider.php new file mode 100644 index 0000000..d4f55a3 --- /dev/null +++ b/Providers/VuexyAssetManagementServiceProvider.php @@ -0,0 +1,49 @@ +loadRoutesFrom(__DIR__.'/../routes/admin.php'); + + + // Cargar vistas del paquete + $this->loadViewsFrom(__DIR__.'/../resources/views', 'vuexy-asset-management'); + + + // Register the migrations + $this->loadMigrationsFrom(__DIR__ . '/../database/migrations'); + + + // Registrar Livewire Components + $components = [ + //'cache-functions' => CacheFunctions::class, + ]; + + foreach ($components as $alias => $component) { + Livewire::component($alias, $component); + } + + + // Registrar auditoría en usuarios + //User::observe(AuditableObserver::class); + } +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..ac1f5e9 --- /dev/null +++ b/README.md @@ -0,0 +1,133 @@ +# 🎨 Laravel Vuexy Asset Management - Vuexy Admin + +

+ Koneko Soluciones Tecnológicas Logo +

+

+ Sitio Web + Latest Stable Version + License + Servidor Git + Build Status + Issues +

+ +--- + +## 📌 Descripción + +**Laravel Vuexy Asset Management** es un módulo diseñado para **Laravel Vuexy Admin**, proporcionando [breve descripción de la funcionalidad]. + +### ✨ Características: +- 🔹 Integración completa con Vuexy Admin. +- 🔹 Funcionalidad clave 1. +- 🔹 Funcionalidad clave 2. + +--- + +## 📦 Instalación + +Instalar vía **Composer**: + +```bash +composer require koneko/laravel-vuexy-asset-management +``` + +Publicar archivos de configuración y migraciones (si aplica): + +```bash +php artisan vendor:publish --tag=laravel-vuexy-asset-management-config +php artisan migrate +``` + +--- + +## 🚀 Uso básico + +```php +use Koneko\NombreLibreria\Models\Model; + +$model = Model::create([ + 'campo1' => 'Valor', + 'campo2' => 'Otro valor', +]); +``` + +--- + +## 📚 Configuración adicional + +Si necesitas personalizar la configuración del módulo, publica el archivo de configuración: + +```bash +php artisan vendor:publish --tag=laravel-vuexy-asset-management-config +``` + +Esto generará `config/laravel-vuexy-asset-management.php`, donde puedes modificar valores predeterminados. + +--- + +## 🛠 Dependencias + +Este paquete requiere las siguientes dependencias: +- Laravel 11 +- `koneko/laravel-vuexy-asset-management` +- Dependencias específicas de la librería + +--- + +## 📦 Publicación de Assets y Configuraciones + +Para publicar configuraciones y seeders: + +```bash +php artisan vendor:publish --tag=laravel-vuexy-asset-management-config +php artisan vendor:publish --tag=laravel-vuexy-asset-management-seeders +php artisan migrate --seed +``` + +Para publicar imágenes del tema: + +```bash +php artisan vendor:publish --tag=laravel-vuexy-asset-management-images +``` + +--- + +## 🛠 Pruebas + +Ejecuta los tests con: + +```bash +php artisan test +``` + +--- + +## 🌍 Repositorio Principal y Sincronización + +Este repositorio es una **copia sincronizada** del repositorio principal alojado en **[Tea - Koneko Git](https://git.koneko.mx/koneko/laravel-vuexy-asset-management)**. + +### 🔄 Sincronización con GitHub +- **Repositorio Principal:** [git.koneko.mx](https://git.koneko.mx/koneko/laravel-vuexy-asset-management) +- **Repositorio en GitHub:** [github.com/koneko/laravel-vuexy-asset-management](https://github.com/koneko/laravel-vuexy-asset-management) +- **Los cambios pueden reflejarse primero en Tea antes de GitHub.** + +### 🤝 Contribuciones +Si deseas contribuir: +1. Puedes abrir un **Issue** en [GitHub Issues](https://github.com/koneko/laravel-vuexy-asset-management/issues). +2. Para Pull Requests, **preferimos contribuciones en Tea**. Contacta a `admin@koneko.mx` para solicitar acceso. + +⚠️ **Nota:** Algunos cambios pueden tardar en reflejarse en GitHub, ya que este repositorio se actualiza automáticamente desde Tea. + +--- + +## 🏅 Licencia + +Este paquete es de código abierto bajo la licencia [MIT](LICENSE). + +--- + +

+ Hecho con ❤️ por Koneko Soluciones Tecnológicas +

diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..dabb5b5 --- /dev/null +++ b/composer.json @@ -0,0 +1,36 @@ +{ + "name": "koneko/laravel-vuexy-asset-management", + "description": "Laravel Vuexy Asset Management, un modulo de administracion de activos optimizado para México.", + "keywords": ["laravel", "koneko", "framework", "vuexy", "asset", "management", "admin", "mexico"], + "type": "library", + "license": "MIT", + "require": { + "php": "^8.2", + "koneko/laravel-vuexy-warehouse": "@dev", + "laravel/framework": "^11.31" + }, + "autoload": { + "psr-4": { + "Koneko\\VuexyAssetManagement\\": "" + } + }, + "extra": { + "laravel": { + "providers": [ + "Koneko\\VuexyAssetManagement\\Providers\\VuexyAssetManagementServiceProvider" + ] + } + }, + "authors": [ + { + "name": "Arturo Corro Pacheco", + "email": "arturo@koneko.mx" + } + ], + "support": { + "source": "https://github.com/koneko-mx/laravel-vuexy-asset-management", + "issues": "https://github.com/koneko-mx/laravel-vuexy-asset-management/issues" + }, + "minimum-stability": "dev", + "prefer-stable": true +} diff --git a/database/migrations/2024_12_17_106605_create_fixed_assets_tables.php b/database/migrations/2024_12_17_106605_create_fixed_assets_tables.php new file mode 100644 index 0000000..63286b9 --- /dev/null +++ b/database/migrations/2024_12_17_106605_create_fixed_assets_tables.php @@ -0,0 +1,97 @@ +smallIncrements('id'); // ID del activo fijo + + // Información básica del activo + $table->string('name', 100)->index(); // Nombre del activo + $table->string('asset_code', 50)->unique(); // Código único para identificar el activo + $table->string('description')->nullable(); // Descripción del activo + $table->string('model')->nullable(); // Modelo del activo + $table->string('manufacturer')->nullable(); // Fabricante del activo + $table->unsignedSmallInteger('year_of_manufacture')->nullable(); // Año de fabricación + $table->date('purchase_date')->nullable(); // Fecha de compra + $table->decimal('purchase_price', 10, 2)->unsigned(); // Precio de compra + $table->decimal('salvage_value', 10, 2)->unsigned()->nullable(); // Valor residual + $table->unsignedSmallInteger('useful_life_years')->nullable(); // Vida útil en años + + // Cálculo de depreciación + $table->decimal('depreciation_rate', 5, 2)->unsigned(); // Tasa de depreciación + $table->decimal('depreciation_expense', 10, 2)->unsigned()->default(0); // Gastos de depreciación acumulados + + // Especificaciones adicionales + $table->decimal('hourly_cost', 8, 2)->unsigned()->default(0); // Costo por hora de uso + $table->string('location')->nullable(); // Ubicación del activo + + // Estado del activo + $table->unsignedTinyInteger('status')->index(); // 'available', 'in_maintenance', 'out_of_service' + + // Auditoría + $table->unsignedMediumInteger('created_by')->index(); // Usuario que creó el registro + $table->unsignedMediumInteger('updated_by')->index(); // Último usuario que actualizó el registro + + $table->timestamps(); + + // Relaciones + $table->foreign('created_by')->references('id')->on('users')->onDelete('restrict'); + $table->foreign('updated_by')->references('id')->on('users')->onDelete('restrict'); + }); + + + Schema::create('fixed_asset_status_history', function (Blueprint $table) { + $table->smallIncrements('id'); // ID del historial + + $table->unsignedSmallInteger('fixed_asset_id')->index(); // Relación con el activo fijo + $table->unsignedTinyInteger('status'); // Estado del activo (por ejemplo, disponible, en mantenimiento, fuera de servicio) + $table->date('status_change_date'); // Fecha del cambio de estado + $table->mediumText('notes')->nullable(); // Notas sobre el cambio de estado + + // Auditoría + $table->unsignedMediumInteger('created_by')->index(); // Usuario que creó el registro + $table->timestamps(); + + // Relaciones + $table->foreign('fixed_asset_id')->references('id')->on('fixed_assets')->onDelete('cascade'); + $table->foreign('created_by')->references('id')->on('users')->onDelete('restrict'); + }); + + + Schema::create('fixed_asset_events', function (Blueprint $table) { + $table->smallIncrements('id'); // ID del evento + + $table->unsignedSmallInteger('fixed_asset_id')->index(); // Relación con el activo fijo + $table->date('event_date'); // Fecha del evento (mantenimiento, inspección fiscal, etc.) + $table->string('event_type'); // Tipo de evento (mantenimiento, auditoría, etc.) + $table->string('frequency')->nullable(); // Frecuencia del evento (por ejemplo, mensual, trimestral) + $table->mediumText('notes')->nullable(); // Notas sobre el evento + + // Auditoría + $table->unsignedMediumInteger('created_by')->index(); // Usuario que creó el evento + $table->timestamps(); + + // Relaciones + $table->foreign('fixed_asset_id')->references('id')->on('fixed_assets')->onDelete('cascade'); + $table->foreign('created_by')->references('id')->on('users')->onDelete('restrict'); + }); + + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('fixed_assets_tables'); + } +}; diff --git a/resources/views/asset-aassignments/index.blade.php b/resources/views/asset-aassignments/index.blade.php new file mode 100644 index 0000000..e132abc --- /dev/null +++ b/resources/views/asset-aassignments/index.blade.php @@ -0,0 +1,24 @@ +@extends('vuexy-admin::layouts.vuexy.layoutMaster') + +@section('title', 'Asignaciones de Activos') + + +@section('vendor-style') + @vite([ + 'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/select2/select2.scss', + ]) +@endsection + + +@section('vendor-script') + @vite([ + 'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/bootstrap-table/bootstrap-table.js', + 'vendor/koneko/laravel-vuexy-admin/resources/js/components/datatables/btFormatter.js', + 'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/select2/select2.js', + 'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/jquery-validation/jquery.validate.js', + ]) +@endsection + +@section('content') + @livewire('asset-aassignments-index') +@endsection diff --git a/resources/views/asset-lifecycles/index.blade.php b/resources/views/asset-lifecycles/index.blade.php new file mode 100644 index 0000000..d47bc2b --- /dev/null +++ b/resources/views/asset-lifecycles/index.blade.php @@ -0,0 +1,24 @@ +@extends('vuexy-admin::layouts.vuexy.layoutMaster') + +@section('title', 'Control de vida util') + + +@section('vendor-style') + @vite([ + 'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/select2/select2.scss', + ]) +@endsection + + +@section('vendor-script') + @vite([ + 'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/bootstrap-table/bootstrap-table.js', + 'vendor/koneko/laravel-vuexy-admin/resources/js/components/datatables/btFormatter.js', + 'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/select2/select2.js', + 'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/jquery-validation/jquery.validate.js', + ]) +@endsection + +@section('content') + @livewire('asset-lifecycles-index') +@endsection diff --git a/resources/views/asset-maintenances/index.blade.php b/resources/views/asset-maintenances/index.blade.php new file mode 100644 index 0000000..fd84fd1 --- /dev/null +++ b/resources/views/asset-maintenances/index.blade.php @@ -0,0 +1,24 @@ +@extends('vuexy-admin::layouts.vuexy.layoutMaster') + +@section('title', 'Mantenimientos de Activos') + + +@section('vendor-style') + @vite([ + 'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/select2/select2.scss', + ]) +@endsection + + +@section('vendor-script') + @vite([ + 'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/bootstrap-table/bootstrap-table.js', + 'vendor/koneko/laravel-vuexy-admin/resources/js/components/datatables/btFormatter.js', + 'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/select2/select2.js', + 'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/jquery-validation/jquery.validate.js', + ]) +@endsection + +@section('content') + @livewire('asset-maintenances-index') +@endsection diff --git a/resources/views/assets/index.blade.php b/resources/views/assets/index.blade.php new file mode 100644 index 0000000..61877a5 --- /dev/null +++ b/resources/views/assets/index.blade.php @@ -0,0 +1,24 @@ +@extends('vuexy-admin::layouts.vuexy.layoutMaster') + +@section('title', 'Activos registrados') + + +@section('vendor-style') + @vite([ + 'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/select2/select2.scss', + ]) +@endsection + + +@section('vendor-script') + @vite([ + 'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/bootstrap-table/bootstrap-table.js', + 'vendor/koneko/laravel-vuexy-admin/resources/js/components/datatables/btFormatter.js', + 'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/select2/select2.js', + 'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/jquery-validation/jquery.validate.js', + ]) +@endsection + +@section('content') + @livewire('assets-index') +@endsection diff --git a/resources/views/livewire/asset-aassignments/asset-aassignments-index.blade.php b/resources/views/livewire/asset-aassignments/asset-aassignments-index.blade.php new file mode 100644 index 0000000..63c7e0d --- /dev/null +++ b/resources/views/livewire/asset-aassignments/asset-aassignments-index.blade.php @@ -0,0 +1,516 @@ +
+
+
+
+
+
+ +
+ +
+ +
+ +
+
+
+
+
+ +@section('page-script') + +@endsection diff --git a/resources/views/livewire/asset-lifecycles/asset-lifecycles-index.blade.php b/resources/views/livewire/asset-lifecycles/asset-lifecycles-index.blade.php new file mode 100644 index 0000000..63c7e0d --- /dev/null +++ b/resources/views/livewire/asset-lifecycles/asset-lifecycles-index.blade.php @@ -0,0 +1,516 @@ +
+
+
+
+
+
+ +
+ +
+ +
+ +
+
+
+
+
+ +@section('page-script') + +@endsection diff --git a/resources/views/livewire/asset-maintenances/asset-maintenances-index.blade.php b/resources/views/livewire/asset-maintenances/asset-maintenances-index.blade.php new file mode 100644 index 0000000..63c7e0d --- /dev/null +++ b/resources/views/livewire/asset-maintenances/asset-maintenances-index.blade.php @@ -0,0 +1,516 @@ +
+
+
+
+
+
+ +
+ +
+ +
+ +
+
+
+
+
+ +@section('page-script') + +@endsection diff --git a/resources/views/livewire/assets/assets-index.blade.php b/resources/views/livewire/assets/assets-index.blade.php new file mode 100644 index 0000000..63c7e0d --- /dev/null +++ b/resources/views/livewire/assets/assets-index.blade.php @@ -0,0 +1,516 @@ +
+
+
+
+
+
+ +
+ +
+ +
+ +
+
+
+
+
+ +@section('page-script') + +@endsection diff --git a/routes/admin.php b/routes/admin.php new file mode 100644 index 0000000..8a7f6aa --- /dev/null +++ b/routes/admin.php @@ -0,0 +1,208 @@ +name('admin.inventory.')->middleware(['web', 'auth', 'admin'])->group(function () { + Route::controller(ProductCategorieController::class)->prefix('categorias')->name('product-categories.')->group(function () { + Route::get('/', 'index')->name('index'); // Listar + Route::get('create', 'create')->name('create'); // Formulario de creación + Route::post('/', 'categorie')->name('store'); // Guardar + Route::get('{categorie}', 'show')->name('show'); // Ver + Route::get('{categorie}/edit', 'edit')->name('edit'); // Formulario de edición + Route::put('{categorie}', 'update')->name('update'); // Actualizar + Route::delete('{categorie}', 'destroy')->name('destroy'); // Eliminar + }); + + Route::controller(ProductCatalogController::class)->prefix('catalogos')->name('product-catalogs.')->group(function () { + Route::get('/', 'index')->name('index'); // Listar + Route::get('create', 'create')->name('create'); // Formulario de creación + Route::post('/', 'catalog')->name('store'); // Guardar + Route::get('{catalog}', 'show')->name('show'); // Ver + Route::get('{catalog}/edit', 'edit')->name('edit'); // Formulario de edición + Route::put('{catalog}', 'update')->name('update'); // Actualizar + Route::delete('{catalog}', 'destroy')->name('destroy'); // Eliminar + }); + + Route::controller(ProductController::class)->prefix('productos')->name('products.')->group(function () { + Route::get('/', 'index')->name('index'); // Listar + Route::get('create', 'create')->name('create'); // Formulario de creación + Route::post('/', 'product')->name('store'); // Guardar + Route::get('{product}', 'show')->name('show'); // Ver + Route::get('{product}/edit', 'edit')->name('edit'); // Formulario de edición + Route::put('{product}', 'update')->name('update'); // Actualizar + Route::delete('{product}', 'destroy')->name('destroy'); // Eliminar + }); +}); + +Route::prefix('admin/inventario-y-logistica')->name('admin.inventory.')->middleware(['web', 'auth', 'admin'])->group(function () { + Route::controller(PurchaseOrderController::class)->prefix('ordenes-de-compra')->name('orders.')->group(function () {; + Route::get('/', 'index')->name('index'); // Listar + Route::get('create', 'create')->name('create'); // Formulario de creación + Route::post('/', 'orders')->name('store'); // Guardar + Route::get('{orders}', 'show')->name('show'); // Ver + Route::get('{orders}/edit', 'edit')->name('edit'); // Formulario de edición + Route::put('{orders}', 'update')->name('update'); // Actualizar + Route::delete('{orders}', 'destroy')->name('destroy'); // Eliminar + }); + + Route::controller(ProductReceiptController::class)->prefix('recepcion-de-productos')->name('reception.')->group(function () {; + Route::get('/', 'index')->name('index'); // Listar + Route::get('create', 'create')->name('create'); // Formulario de creación + Route::post('/', 'reception')->name('store'); // Guardar + Route::get('{reception}', 'show')->name('show'); // Ver + Route::get('{reception}/edit', 'edit')->name('edit'); // Formulario de edición + Route::put('{reception}', 'update')->name('update'); // Actualizar + Route::delete('{reception}', 'destroy')->name('destroy'); // Eliminar + }); + + Route::controller(MaterialController::class)->prefix('gestion-de-insumos')->name('materials.')->group(function () {; + Route::get('/', 'index')->name('index'); // Listar + Route::get('create', 'create')->name('create'); // Formulario de creación + Route::post('/', 'materials')->name('store'); // Guardar + Route::get('{materials}', 'show')->name('show'); // Ver + Route::get('{materials}/edit', 'edit')->name('edit'); // Formulario de edición + Route::put('{materials}', 'update')->name('update'); // Actualizar + Route::delete('{materials}', 'destroy')->name('destroy'); // Eliminar + }); + + Route::controller(WarehouseController::class)->prefix('almacenes')->name('warehouse.')->group(function () {; + Route::get('/', 'index')->name('index'); // Listar + Route::get('create', 'create')->name('create'); // Formulario de creación + Route::post('/', 'warehouse')->name('store'); // Guardar + Route::get('{warehouse}', 'show')->name('show'); // Ver + Route::get('{warehouse}/edit', 'edit')->name('edit'); // Formulario de edición + Route::put('{warehouse}', 'update')->name('update'); // Actualizar + Route::delete('{warehouse}', 'destroy')->name('destroy'); // Eliminar + }); + + Route::controller(InventoryStockController::class)->prefix('stock-de-inventario')->name('stock.')->group(function () {; + Route::get('/', 'index')->name('index'); // Listar + Route::get('create', 'create')->name('create'); // Formulario de creación + Route::post('/', 'stock')->name('store'); // Guardar + Route::get('{stock}', 'show')->name('show'); // Ver + Route::get('{stock}/edit', 'edit')->name('edit'); // Formulario de edición + Route::put('{stock}', 'update')->name('update'); // Actualizar + Route::delete('{stock}', 'destroy')->name('destroy'); // Eliminar + }); + + Route::controller(InventoryMovementController::class)->prefix('movimientos-de-inventario')->name('movements.')->group(function () {; + Route::get('/', 'index')->name('index'); // Listar + Route::get('create', 'create')->name('create'); // Formulario de creación + Route::post('/', 'movements')->name('store'); // Guardar + Route::get('{movements}', 'show')->name('show'); // Ver + Route::get('{movements}/edit', 'edit')->name('edit'); // Formulario de edición + Route::put('{movements}', 'update')->name('update'); // Actualizar + Route::delete('{movements}', 'destroy')->name('destroy'); // Eliminar + }); + + Route::controller(WarehouseTransfersController::class)->prefix('transferencias-entre-almacenes')->name('transfers.')->group(function () {; + Route::get('/', 'index')->name('index'); // Listar + Route::get('create', 'create')->name('create'); // Formulario de creación + Route::post('/', 'transfers')->name('store'); // Guardar + Route::get('{transfers}', 'show')->name('show'); // Ver + Route::get('{transfers}/edit', 'edit')->name('edit'); // Formulario de edición + Route::put('{transfers}', 'update')->name('update'); // Actualizar + Route::delete('{transfers}', 'destroy')->name('destroy'); // Eliminar + }); + + Route::controller(ShippingOrderController::class)->prefix('ordenes-de-envio')->name('shipping-orders.')->group(function () {; + Route::get('/', 'index')->name('index'); // Listar + Route::get('create', 'create')->name('create'); // Formulario de creación + Route::post('/', 'shipping-order')->name('store'); // Guardar + Route::get('{shipping-order}', 'show')->name('show'); // Ver + Route::get('{shipping-order}/edit', 'edit')->name('edit'); // Formulario de edición + Route::put('{shipping-order}', 'update')->name('update'); // Actualizar + Route::delete('{shipping-order}', 'destroy')->name('destroy'); // Eliminar + }); + + Route::controller(ShipmentTrackingController::class)->prefix('seguimiento-de-envios')->name('shipping-tracking.')->group(function () {; + Route::get('/', 'index')->name('index'); // Listar + Route::get('create', 'create')->name('create'); // Formulario de creación + Route::post('/', 'shippingTracking')->name('store'); // Guardar + Route::get('{shippingTracking}', 'show')->name('show'); // Ver + Route::get('{shippingTracking}/edit', 'edit')->name('edit'); // Formulario de edición + Route::put('{shippingTracking}', 'update')->name('update'); // Actualizar + Route::delete('{shippingTracking}', 'destroy')->name('destroy'); // Eliminar + }); + + Route::controller(ShippingCarrierController::class)->prefix('transportistas')->name('shipping-carriers.')->group(function () {; + Route::get('/', 'index')->name('index'); // Listar + Route::get('create', 'create')->name('create'); // Formulario de creación + Route::post('/', 'shippingCarrier')->name('store'); // Guardar + Route::get('{shippingCarrier}', 'show')->name('show'); // Ver + Route::get('{shippingCarrier}/edit', 'edit')->name('edit'); // Formulario de edición + Route::put('{shippingCarrier}', 'update')->name('update'); // Actualizar + Route::delete('{shippingCarrier}', 'destroy')->name('destroy'); // Eliminar + }); + + Route::controller(ShippingRateController::class)->prefix('tarifas-y-metodos-de-envio')->name('shipping-rates.')->group(function () {; + Route::get('/', 'index')->name('index'); // Listar + Route::get('create', 'create')->name('create'); // Formulario de creación + Route::post('/', 'shippingRate')->name('store'); // Guardar + Route::get('{shippingRate}', 'show')->name('show'); // Ver + Route::get('{shippingRate}/edit', 'edit')->name('edit'); // Formulario de edición + Route::put('{shippingRate}', 'update')->name('update'); // Actualizar + Route::delete('{shippingRate}', 'destroy')->name('destroy'); // Eliminar + }); + + Route::controller(AssetController::class)->prefix('activos-registrados')->name('assets.')->group(function () {; + Route::get('/', 'index')->name('index'); // Listar + Route::get('create', 'create')->name('create'); // Formulario de creación + Route::post('/', 'asset')->name('store'); // Guardar + Route::get('{asset}', 'show')->name('show'); // Ver + Route::get('{asset}/edit', 'edit')->name('edit'); // Formulario de edición + Route::put('{asset}', 'update')->name('update'); // Actualizar + Route::delete('{asset}', 'destroy')->name('destroy'); // Eliminar + }); + + Route::controller(AssetMaintenanceController::class)->prefix('mantenimiento-preventivo')->name('asset-maintenance.')->group(function () {; + Route::get('/', 'index')->name('index'); // Listar + Route::get('create', 'create')->name('create'); // Formulario de creación + Route::post('/', 'assetMaintenance')->name('store'); // Guardar + Route::get('{assetMaintenance}', 'show')->name('show'); // Ver + Route::get('{assetMaintenance}/edit', 'edit')->name('edit'); // Formulario de edición + Route::put('{assetMaintenance}', 'update')->name('update'); // Actualizar + Route::delete('{assetMaintenance}', 'destroy')->name('destroy'); // Eliminar + }); + + Route::controller(AssetLifecycleController::class)->prefix('control-de-vida-util')->name('asset-lifecycle.')->group(function () {; + Route::get('/', 'index')->name('index'); // Listar + Route::get('create', 'create')->name('create'); // Formulario de creación + Route::post('/', 'assetLifecycle')->name('store'); // Guardar + Route::get('{assetLifecycle}', 'show')->name('show'); // Ver + Route::get('{assetLifecycle}/edit', 'edit')->name('edit'); // Formulario de edición + Route::put('{assetLifecycle}', 'update')->name('update'); // Actualizar + Route::delete('{assetLifecycle}', 'destroy')->name('destroy'); // Eliminar + }); + + Route::controller(AssetAassignmentController::class)->prefix('asignacion-de-activos')->name('asset-assignments.')->group(function () {; + Route::get('/', 'index')->name('index'); // Listar + Route::get('create', 'create')->name('create'); // Formulario de creación + Route::post('/', 'assetAssignmen')->name('store'); // Guardar + Route::get('{assetAssignmen}', 'show')->name('show'); // Ver + Route::get('{assetAssignmen}/edit', 'edit')->name('edit'); // Formulario de edición + Route::put('{assetAssignmen}', 'update')->name('update'); // Actualizar + Route::delete('{assetAssignmen}', 'destroy')->name('destroy'); // Eliminar + }); + +});