diff --git a/app/Http/Controllers/Admin/DepartmentController.php b/app/Http/Controllers/Admin/DepartmentController.php new file mode 100644 index 0000000..933df53 --- /dev/null +++ b/app/Http/Controllers/Admin/DepartmentController.php @@ -0,0 +1,73 @@ + + * + * @version 1.0.0 + */ +class DepartmentController extends VueController +{ + + public function __construct() + { + $this->vueRoot('admin.departments'); + } + + + public function index() + { + $q = request()->get('q'); + + return $this->vuew('index', [ + 'departments' => department::where('name', 'LIKE', "%{$q}%") + ->orWhere('description', 'LIKE', "%{$q}%") + ->select([ + 'id', + 'name', + 'description', + ]) + ->paginate(config('app.pagination')) + ]); + } + + public function create() + { + return $this->vuew('create'); + } + + public function store(StoreDepartment $request) + { + $data = $request->all(); + + department::create($data); + + return $this->index(); + } + + public function update(UpdateDepartment $request, $department) + { + $data = $request->all(); + + department::find($department)->update($data); + } + + public function destroy($department) + { + department::find($department)->delete(); + + return $this->index(); + } +} diff --git a/app/Http/Controllers/Admin/MainRoleController.php b/app/Http/Controllers/Admin/MainRoleController.php new file mode 100644 index 0000000..6c31f1c --- /dev/null +++ b/app/Http/Controllers/Admin/MainRoleController.php @@ -0,0 +1,42 @@ + + * + * @version 1.0.0 + */ +class MainRoleController extends VueController +{ + public function __construct() + { + $this->vueRoot('admin.main-role'); + } + + public function index() + { + $q = request()->get('q'); + + return $this->vuew('index', [ + 'roles' => MainRole::where('name', 'LIKE', "%{$q}%") + ->orWhere('description', 'LIKE', "%{$q}%") + ->select([ + 'id', + 'name', + 'description', + ]) + ->paginate(config('app.pagination')) + ]); + } +} diff --git a/app/Http/Controllers/Admin/ScoreController.php b/app/Http/Controllers/Admin/ScoreController.php new file mode 100644 index 0000000..281d06d --- /dev/null +++ b/app/Http/Controllers/Admin/ScoreController.php @@ -0,0 +1,71 @@ + + * + * @version 1.0.0 + */ +class ScoreController extends VueController +{ + + public function __construct() + { + $this->vueRoot('admin.app'); + } + + public function index() + { + $q = request()->get('q'); + + return $this->vuew('index', [ + 'scores' => Score::where('alias', 'LIKE', "%{$q}%") + ->orWhere('value', 'LIKE', "%{$q}%") + ->select([ + 'id', + 'alias', + 'value', + 'description', + ]) + ->paginate(config('app.pagination')) + ]); + } + + public function create() + { + return $this->vuew('create'); + } + + public function store(StoreScore $request) + { + $data = $request->all(); + + Score::create($data); + + return $this->index(); + } + + public function update(UpdateScore $request, $score) + { + $data = $request->all(); + + Score::find($score)->update($data); + } + + public function destroy($score) + { + Score::find($score)->delete(); + + return $this->index(); + } + +} diff --git a/app/Http/Requests/StoreDepartment.php b/app/Http/Requests/StoreDepartment.php new file mode 100644 index 0000000..7c196d3 --- /dev/null +++ b/app/Http/Requests/StoreDepartment.php @@ -0,0 +1,39 @@ + + * + * @version 1.0.0 + */ +class StoreDepartment extends FormRequest +{ + /** + * Determinar si el usuario esta autorizado + * + * @return bool + */ + public function authorize() + { + return true; + } + + /** + * Reglas de validación + * + * @return array + */ + public function rules() + { + return [ + 'name' => ['required', 'string'], + 'description' => ['nullable', 'string'], + ]; + } +} diff --git a/app/Http/Requests/StoreMainRole.php b/app/Http/Requests/StoreMainRole.php new file mode 100644 index 0000000..b798988 --- /dev/null +++ b/app/Http/Requests/StoreMainRole.php @@ -0,0 +1,39 @@ + + * + * @version 1.0.0 + */ +class StoreMainRole extends FormRequest +{ + /** + * Determinar si el usuario esta autorizado + * + * @return bool + */ + public function authorize() + { + return true; + } + + /** + * Reglas de validación + * + * @return array + */ + public function rules() + { + return [ + 'name' => ['required', 'string'], + 'description' => ['nullable', 'string'], + ]; + } +} diff --git a/app/Http/Requests/StoreScore.php b/app/Http/Requests/StoreScore.php new file mode 100644 index 0000000..1151350 --- /dev/null +++ b/app/Http/Requests/StoreScore.php @@ -0,0 +1,40 @@ + + * + * @version 1.0.0 + */ +class StoreScore extends FormRequest +{ + /** + * Determinar si el usuario esta autorizado + * + * @return bool + */ + public function authorize() + { + return true; + } + + /** + * Reglas de validación + * + * @return array + */ + public function rules() + { + return [ + 'alias' => ['required', 'string'], + 'value' => ['required', 'string'], + 'description' => ['nullable', 'string'], + ]; + } +} diff --git a/app/Http/Requests/UpdateDepartment.php b/app/Http/Requests/UpdateDepartment.php new file mode 100644 index 0000000..ffe9878 --- /dev/null +++ b/app/Http/Requests/UpdateDepartment.php @@ -0,0 +1,40 @@ + + * + * @version 1.0.0 + */ +class UpdateDepartment extends FormRequest +{ + /** + * Determinar si el usuario esta autorizado + * + * @return bool + */ + public function authorize() + { + return true; + } + + /** + * Reglas de validación + * + * @return array + */ + public function rules() + { + return [ + 'name' => ['required', 'string'], + 'description' => ['nullable', 'string'], + ]; + } +} diff --git a/app/Http/Requests/UpdateMainRole.php b/app/Http/Requests/UpdateMainRole.php new file mode 100644 index 0000000..0968dcc --- /dev/null +++ b/app/Http/Requests/UpdateMainRole.php @@ -0,0 +1,39 @@ + + * + * @version 1.0.0 + */ +class UpdateMainRole extends FormRequest +{ + /** + * Determinar si el usuario esta autorizado + * + * @return bool + */ + public function authorize() + { + return true; + } + + /** + * Reglas de validación + * + * @return array + */ + public function rules() + { + return [ + 'name' => ['required', 'string'], + 'description' => ['nullable', 'string'], + ]; + } +} diff --git a/app/Http/Requests/UpdateScore.php b/app/Http/Requests/UpdateScore.php new file mode 100644 index 0000000..1e9fe54 --- /dev/null +++ b/app/Http/Requests/UpdateScore.php @@ -0,0 +1,41 @@ + + * + * @version 1.0.0 + */ +class UpdateScore extends FormRequest +{ + /** + * Determinar si el usuario esta autorizado + * + * @return bool + */ + public function authorize() + { + return true; + } + + /** + * Reglas de validación + * + * @return array + */ + public function rules() + { + return [ + 'alias' => ['required', 'string'], + 'value' => ['required', 'string'], + 'description' => ['nullable', 'string'], + ]; + } +} diff --git a/app/Models/Score.php b/app/Models/Score.php new file mode 100644 index 0000000..cad93f4 --- /dev/null +++ b/app/Models/Score.php @@ -0,0 +1,30 @@ + + * + * @version 1.0.0 + */ +class Score extends Model +{ + use HasFactory, + ModelExtend; + + /** + * Atributos llenables masivamente + */ + protected $fillable = [ + 'alias', + 'value', + 'description', + ]; +} diff --git a/app/Models/department.php b/app/Models/department.php new file mode 100644 index 0000000..5de561b --- /dev/null +++ b/app/Models/department.php @@ -0,0 +1,37 @@ + + * + * @version 1.0.0 + */ +class department extends Model +{ + use HasFactory, + ModelExtend; + + /** + * Atributos llenables masivamente + */ + protected $fillable = [ + 'name', + 'description' + ]; + + /** + * Un departamento tiene muchos main roles + */ + public function mainRoles() + { + return $this->hasMany(MainRole::class); + } +} diff --git a/app/Models/main_role.php b/app/Models/main_role.php new file mode 100644 index 0000000..b72cc32 --- /dev/null +++ b/app/Models/main_role.php @@ -0,0 +1,43 @@ + + * + * @version 1.0.0 + */ +class MainRole extends Model +{ + use HasFactory, + ModelExtend; + + /** + * Nombre de la tabla + */ + protected $table = 'main_role'; + + /** + * Atributos llenables masivamente + */ + protected $fillable = [ + 'name', + 'description', + 'department_id' + ]; + + /** + * Un main role pertenece a un departamento + */ + public function department() + { + return $this->belongsTo(Department::class); + } +} diff --git a/database/migrations/2025_07_01_104541_scores.php b/database/migrations/2025_07_01_104541_scores.php new file mode 100644 index 0000000..b864651 --- /dev/null +++ b/database/migrations/2025_07_01_104541_scores.php @@ -0,0 +1,34 @@ +id(); + $table->string('alias'); + $table->integer('value'); + $table->string('description')->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('scores'); + } +}; diff --git a/database/migrations/2025_07_01_151711_create_departments_table.php b/database/migrations/2025_07_01_151711_create_departments_table.php new file mode 100644 index 0000000..2b5e993 --- /dev/null +++ b/database/migrations/2025_07_01_151711_create_departments_table.php @@ -0,0 +1,29 @@ +id(); + $table->string('name'); + $table->string('description')->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('departments'); + } +}; diff --git a/database/migrations/2025_07_01_151840_create_main_role_table.php b/database/migrations/2025_07_01_151840_create_main_role_table.php new file mode 100644 index 0000000..4992c6c --- /dev/null +++ b/database/migrations/2025_07_01_151840_create_main_role_table.php @@ -0,0 +1,30 @@ +id(); + $table->string('name'); + $table->string('description')->nullable(); + $table->foreignId('department_id')->constrained('departments')->onDelete('cascade'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('main_role'); + } +}; diff --git a/package-lock.json b/package-lock.json index 9fbf9e7..6f0249d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,5 +1,5 @@ { - "name": "template-laravel-vuejs", + "name": "Scores", "lockfileVersion": 3, "requires": true, "packages": { diff --git a/resources/js/Lang/es.js b/resources/js/Lang/es.js index ac1cb5b..78b1c51 100644 --- a/resources/js/Lang/es.js +++ b/resources/js/Lang/es.js @@ -224,5 +224,24 @@ export default { system:'Usuarios del sistema', title:'Usuarios', }, + + scores:{ + system: 'Sistema de puntuación', + create:{ + title:'Crear puntuación', + description:'Permite crear nuevas puntuaciones para los usuarios.', + onSuccess:'Puntuación creada exitosamente', + onError:'Error al crear la puntuación', + } + }, + department:{ + system: 'Sistema de departamentos', + create:{ + title:'Crear departamento', + description:'Permite crear nuevos departamentos para los usuarios.', + onSuccess:'Departamento creado exitosamente', + onError:'Error al crear el departamento', + } + }, version:'Versión', -} \ No newline at end of file +} diff --git a/resources/js/Layouts/DashboardLayout.vue b/resources/js/Layouts/DashboardLayout.vue index 0b72714..682b8c0 100644 --- a/resources/js/Layouts/DashboardLayout.vue +++ b/resources/js/Layouts/DashboardLayout.vue @@ -35,7 +35,7 @@ onMounted(()=> { :title="title" />
- -
diff --git a/resources/js/Pages/Admin/App/Component.js b/resources/js/Pages/Admin/App/Component.js new file mode 100644 index 0000000..e647589 --- /dev/null +++ b/resources/js/Pages/Admin/App/Component.js @@ -0,0 +1,15 @@ +import { t } from '@/Lang/i18n'; +import { hasPermission } from '@/rolePermission.js'; + +// Obtener ruta +const goTo = (route) => `admin.scores.${route}` +// Obtener traducción del componente +const transl = (lang) => t(`scores.${lang}`) +// Determina si un usuario puede hacer algo no en base a los permisos +const can = (permission) => hasPermission(`users.${permission}`) + +export { + can, + goTo, + transl +} diff --git a/resources/js/Pages/Admin/App/Create.vue b/resources/js/Pages/Admin/App/Create.vue new file mode 100644 index 0000000..0bed155 --- /dev/null +++ b/resources/js/Pages/Admin/App/Create.vue @@ -0,0 +1,84 @@ + + + diff --git a/resources/js/Pages/Admin/App/Destroy.vue b/resources/js/Pages/Admin/App/Destroy.vue new file mode 100644 index 0000000..a7846db --- /dev/null +++ b/resources/js/Pages/Admin/App/Destroy.vue @@ -0,0 +1,43 @@ + + + diff --git a/resources/js/Pages/Admin/App/Edit.vue b/resources/js/Pages/Admin/App/Edit.vue new file mode 100644 index 0000000..0789fcf --- /dev/null +++ b/resources/js/Pages/Admin/App/Edit.vue @@ -0,0 +1,73 @@ + + diff --git a/resources/js/Pages/Admin/App/Index.vue b/resources/js/Pages/Admin/App/Index.vue new file mode 100644 index 0000000..0b69590 --- /dev/null +++ b/resources/js/Pages/Admin/App/Index.vue @@ -0,0 +1,158 @@ + + + diff --git a/resources/js/Pages/Admin/App/Show.vue b/resources/js/Pages/Admin/App/Show.vue new file mode 100644 index 0000000..8211c9e --- /dev/null +++ b/resources/js/Pages/Admin/App/Show.vue @@ -0,0 +1,41 @@ + + diff --git a/resources/js/Pages/Admin/Departments/Component.js b/resources/js/Pages/Admin/Departments/Component.js new file mode 100644 index 0000000..311acf5 --- /dev/null +++ b/resources/js/Pages/Admin/Departments/Component.js @@ -0,0 +1,15 @@ +import { t } from '@/Lang/i18n'; +import { hasPermission } from '@/rolePermission.js'; + +// Obtener ruta +const goTo = (route) => `admin.departments.${route}` +// Obtener traducción del componente +const transl = (lang) => t(`department.${lang}`) +// Determina si un usuario puede hacer algo no en base a los permisos +const can = (permission) => hasPermission(`users.${permission}`) + +export { + can, + goTo, + transl +} diff --git a/resources/js/Pages/Admin/Departments/Create.vue b/resources/js/Pages/Admin/Departments/Create.vue new file mode 100644 index 0000000..4803c4f --- /dev/null +++ b/resources/js/Pages/Admin/Departments/Create.vue @@ -0,0 +1,74 @@ + + + diff --git a/resources/js/Pages/Admin/Departments/Destroy.vue b/resources/js/Pages/Admin/Departments/Destroy.vue new file mode 100644 index 0000000..698d010 --- /dev/null +++ b/resources/js/Pages/Admin/Departments/Destroy.vue @@ -0,0 +1,43 @@ + + + diff --git a/resources/js/Pages/Admin/Departments/Edit.vue b/resources/js/Pages/Admin/Departments/Edit.vue new file mode 100644 index 0000000..76a4df2 --- /dev/null +++ b/resources/js/Pages/Admin/Departments/Edit.vue @@ -0,0 +1,67 @@ + + diff --git a/resources/js/Pages/Admin/Departments/Index.vue b/resources/js/Pages/Admin/Departments/Index.vue new file mode 100644 index 0000000..2bf392e --- /dev/null +++ b/resources/js/Pages/Admin/Departments/Index.vue @@ -0,0 +1,145 @@ + + + diff --git a/resources/js/Pages/Admin/Departments/Show.vue b/resources/js/Pages/Admin/Departments/Show.vue new file mode 100644 index 0000000..8211c9e --- /dev/null +++ b/resources/js/Pages/Admin/Departments/Show.vue @@ -0,0 +1,41 @@ + + diff --git a/routes/web.php b/routes/web.php index 2ad00e1..ff80d72 100644 --- a/routes/web.php +++ b/routes/web.php @@ -1,23 +1,25 @@ name('dashboard.')->middleware([ @@ -44,7 +46,7 @@ /** * Rutas de administrador - * + * * Estas ubicaciones son del administrador, sin embargo el desarrollador * puede acceder a ellas. */ @@ -52,7 +54,9 @@ 'auth:sanctum', config('jetstream.auth_session') ])->group(function () { - Route::resource('users', UserController::class); + Route::resource('users', UserController::class); + Route::resource('scores', ScoreController::class); + Route::resource('departments', DepartmentController::class); Route::prefix('/users')->name('users.')->group(function() { @@ -64,7 +68,7 @@ /** * Rutas solo del desarrollador - * + * * Son ubicaciones o funciones que pueden llegar a ser muy sensibles en el sistema, por lo que * solo el desarrollador debe de ser capaz de modificarlas o actualizarlas. */ @@ -77,9 +81,9 @@ /** * Elementos de la plantilla - * + * * Estos son elementos que existen y pueden ser usados en la plantilla, vienen ejemplos de uso. - * + * * Estas rutas pueden ser comentadas o eliminadas cuando se finalice un proyecto. Por default estan ocultas * en el dashboard. */ @@ -89,4 +93,4 @@ config('jetstream.auth_session') ])->group(function () { Route::get('/', [ExampleIndexController::class, 'index'])->name('index'); -}); \ No newline at end of file +});