create user with role warehouse

This commit is contained in:
Alexandro Uc Santos
2025-03-01 16:53:04 -06:00
parent a0b0dee7d2
commit 1a857f989d
8 changed files with 124 additions and 51 deletions

View File

@@ -20,14 +20,16 @@
}); });
const { t } = useI18n(); const { t } = useI18n();
onMounted(() => { const authStore = useAuthStore();
const companyStore = useCompanyStore();
onMounted(async() => {
if(props.user) { if(props.user) {
console.log(props.user) userForm.job_role = props.user.job_role;
userForm.name = props.user.first_name; userForm.name = props.user.first_name;
userForm.last_name = props.user.last_name; userForm.last_name = props.user.last_name;
userForm.email = props.user.email; userForm.email = props.user.email;
userForm.phone = props.user.phone; userForm.phone = props.user.phone;
userForm.job_role = props.user.job_role;
userForm.categories = props.user.categories; userForm.categories = props.user.categories;
userForm.user_city = props.user.user_city?.map(m =>{ userForm.user_city = props.user.user_city?.map(m =>{
return { city_name: m }; return { city_name: m };
@@ -39,14 +41,15 @@
return { meta_value:m }; return { meta_value:m };
}); });
userForm.user_description = props.user.user_description; userForm.user_description = props.user.user_description;
if(props.user.job_role === 'warehouse') {
await loadWarehouses();
userForm.warehouse = warehouses.value.find(w => w._id === props.user.branch?._id);
}
} else { } else {
Object.assign(userForm, initState); Object.assign(userForm, initState);
} }
}) })
const authStore = useAuthStore();
const companyStore = useCompanyStore();
const initState = { const initState = {
name: '', name: '',
last_name: '', last_name: '',
@@ -59,6 +62,7 @@
user_state: [], user_state: [],
truck_type: [], truck_type: [],
user_description: '', user_description: '',
warehouse: null
}; };
const userForm = reactive({ const userForm = reactive({
@@ -70,10 +74,14 @@
last_name: null, last_name: null,
email: null, email: null,
phone: null, phone: null,
job_role: null,
warehouse: null
}) })
const formRef = ref(null); const formRef = ref(null);
const loading = ref(false); const loading = ref(false);
const loadingWarehouses = ref(false);
const warehouses = ref([]);
const title = computed(() => { const title = computed(() => {
return (props.user) ? t('labels.editUser') : t('labels.createUser'); return (props.user) ? t('labels.editUser') : t('labels.createUser');
@@ -83,7 +91,7 @@
const saveUser = async() => { const saveUser = async() => {
validations() validations()
if(errors.value.name || errors.value.last_name || errors.value.email || errors.value.phone){ if(errors.value.name || errors.value.last_name || errors.value.email || errors.value.phone || errors.value.job_role || errors.value.warehouse) {
return; return;
} else { } else {
let userData ={ let userData ={
@@ -98,13 +106,14 @@
user_city: userForm.user_city?.length <= 0 ? null : userForm.user_city?.map((e) => e.city_name), user_city: userForm.user_city?.length <= 0 ? null : userForm.user_city?.map((e) => e.city_name),
user_state: userForm.user_state?.length <= 0 ? null : userForm.user_state?.map((e) => e.state_name), user_state: userForm.user_state?.length <= 0 ? null : userForm.user_state?.map((e) => e.state_name),
truck_type: userForm.truck_type?.length <= 0 ? null : userForm.truck_type?.map((e) => e.meta_value), truck_type: userForm.truck_type?.length <= 0 ? null : userForm.truck_type?.map((e) => e.meta_value),
user_description: userForm.user_description user_description: userForm.user_description,
branch: userForm.warehouse?._id
} }
const dataUpdate = { const dataUpdate = {
categories: userForm.categories, categories: userForm.categories,
name: userForm.name + ' ' + userForm.last_name name: userForm.name + ' ' + userForm.last_name,
branch: userForm.warehouse
} }
let result = 'error'; let result = 'error';
@@ -141,8 +150,26 @@
last_name: userForm.last_name.length <= 1 ? t('errors.lastname') : null, last_name: userForm.last_name.length <= 1 ? t('errors.lastname') : null,
email: !validateEmail(userForm.email) ? t('errors.email') : null, email: !validateEmail(userForm.email) ? t('errors.email') : null,
phone: userForm.phone.length < 10 ? t('errors.phone') : null, phone: userForm.phone.length < 10 ? t('errors.phone') : null,
job_role: userForm.job_role === '' ? t('errors.required') : null,
warehouse: (userForm.job_role == 'warehouse' && userForm.warehouse === null)
? t('errors.required')
: null
}; };
} }
const handleRoleChange = async () => {
if (userForm.job_role === "warehouse") {
await loadWarehouses();
}
}
const loadWarehouses = async () => {
loadingWarehouses.value = true;
warehouses.value = await companyStore.getLocationsLoads('loading');
loadingWarehouses.value = false;
}
</script> </script>
<template> <template>
@@ -194,21 +221,53 @@
:filled="false" :filled="false"
:error="errors.email" :error="errors.email"
/> />
<div class="d-flex flex-column"> <div
<label class="custom-label" for="role">{{ t('labels.userRole') }}</label> v-if="userForm.job_role !== 'owner'"
class="d-flex flex-column"
>
<label class="custom-label" for="role">{{ t('labels.userRole') }}*</label>
<select <select
class="custom-input-light" class="custom-input-light"
name="role" name="role"
id="role" id="role"
v-model="userForm.job_role" v-model="userForm.job_role"
@change="handleRoleChange"
> >
<option disabled value="">-- {{ t('labels.selectedRol') }} --</option> <option disabled value="">-- {{ t('labels.selectedRol') }} --</option>
<!-- <option value="owner">Dueño</option> -->
<option value="manager">{{ t('labels.manager') }}</option> <option value="manager">{{ t('labels.manager') }}</option>
<option value="staff">{{ t('labels.staff') }}</option> <option value="staff">{{ t('labels.staff') }}</option>
<option v-if="authStore.user?.permissions === 'role_carrier'" value="driver">{{ t('labels.driver') }}</option> <option
v-if="authStore.user?.permissions === 'role_shipper'"
value="warehouse"
>
{{ t('labels.warehouse') }}
</option>
<option
v-if="authStore.user?.permissions === 'role_carrier'"
value="driver"
>
{{ t('labels.driver') }}
</option>
</select> </select>
<span class="error-msg" v-if="errors.job_role">{{ errors.job_role }}</span>
</div> </div>
<div v-if="userForm.job_role === 'warehouse'">
<Spiner v-if="loadingWarehouses"/>
<div class="d-flex flex-column my-4" v-if="!loadingWarehouses">
<label class="custom-label" for="locationLoad">{{ t('labels.warehouses') }}*</label>
<select
class="custom-input-light"
name="locationLoad"
id="locationLoad"
v-model="userForm.warehouse"
>
<option disabled value="null">-- {{ t('labels.warehouseSelect') }} --</option>
<option v-for="loc in warehouses" :value="loc">{{ loc.branch_name }}</option>
</select>
<span class="error-msg" v-if="errors.warehouse">{{ errors.warehouse }}</span>
</div>
</div>
<div v-else>
<div class="mb-4 mt-3"> <div class="mb-4 mt-3">
<label class="custom-label">{{ t('global.segments') }}</label> <label class="custom-label">{{ t('global.segments') }}</label>
<Segments <Segments
@@ -237,6 +296,7 @@
:multiple="true" :multiple="true"
/> />
</div> </div>
</div>
<div class="d-flex flex-column"> <div class="d-flex flex-column">
<label class="custom-label" for="description">{{ t('labels.userInfo') }}</label> <label class="custom-label" for="description">{{ t('labels.userInfo') }}</label>
<textarea <textarea

View File

@@ -34,7 +34,7 @@
noty.notifications = resp.data; noty.notifications = resp.data;
} }
const roleCheck = 'store'; const roleCheck = 'warehouse';
</script> </script>
<template> <template>

View File

@@ -40,7 +40,7 @@
}); });
} }
const roleCheck = 'store'; const roleCheck = 'warehouse';
</script> </script>
@@ -128,7 +128,9 @@
class="nav-link" :to="{name: 'published-trucks'}">{{ t('global.acceptedOffers') }}</RouterLink> class="nav-link" :to="{name: 'published-trucks'}">{{ t('global.acceptedOffers') }}</RouterLink>
</div> </div>
</li> </li>
<li :class="[route.name === 'calendar' ? 'bg-nav-active' : '']"> <li
v-if="jobRole !== roleCheck"
:class="[route.name === 'calendar' ? 'bg-nav-active' : '']">
<div> <div>
<i class="fa-regular fa-calendar" :class="[route.name === 'calendar' ? 'router-link-active' : '']"></i> <i class="fa-regular fa-calendar" :class="[route.name === 'calendar' ? 'router-link-active' : '']"></i>
<RouterLink <RouterLink
@@ -136,7 +138,10 @@
class="nav-link" :to="{name: 'calendar'}">{{ t('global.calendar') }}</RouterLink> class="nav-link" :to="{name: 'calendar'}">{{ t('global.calendar') }}</RouterLink>
</div> </div>
</li> </li>
<li :class="[route.name === 'store' ? 'bg-nav-active' : '']"> <li
v-if="jobRole === roleCheck"
:class="[route.name === 'store' ? 'bg-nav-active' : '']"
>
<div> <div>
<i class="fa-solid fa-shop-lock" :class="[route.name === 'store' ? 'router-link-active' : '']"></i> <i class="fa-solid fa-shop-lock" :class="[route.name === 'store' ? 'router-link-active' : '']"></i>
<RouterLink <RouterLink

View File

@@ -8,6 +8,8 @@ export const getTypeUser = (value, locale = 'es') => {
return (locale == 'es') ? 'Gerente' : 'Manager'; return (locale == 'es') ? 'Gerente' : 'Manager';
case 'owner': case 'owner':
return (locale == 'es') ? 'Propietario' : 'Owner'; return (locale == 'es') ? 'Propietario' : 'Owner';
case 'warehouse':
return (locale == 'es') ? 'Bodega' : 'Warehouse';
default: default:
return (locale == 'es') ? 'Personal' : 'Staff'; return (locale == 'es') ? 'Personal' : 'Staff';

View File

@@ -51,6 +51,9 @@ const en = {
completed: 'Offers completed', completed: 'Offers completed',
all: 'All offers', all: 'All offers',
load: 'Load', load: 'Load',
warehouse: 'Warehouse',
warehouses: 'Warehouses',
warehouseSelect: 'Select warehouse',
download: 'Download', download: 'Download',
select: 'Select', select: 'Select',
additionalInformation: 'Additional information', additionalInformation: 'Additional information',

View File

@@ -68,6 +68,9 @@ const es = {
vehicle: 'Vehiculo', vehicle: 'Vehiculo',
comment: 'Comentario', comment: 'Comentario',
tons: "Toneladas", tons: "Toneladas",
warehouse: 'Bodega',
warehouses: 'Bodegas',
warehouseSelect: 'Seleccionar bodega',
priceTons: "Precio por toneladas", priceTons: "Precio por toneladas",
tonLoad: "Tonelaje aproximado de carga", tonLoad: "Tonelaje aproximado de carga",
originTruckKm1: "Origen del camión al origin de carga(KM)", originTruckKm1: "Origen del camión al origin de carga(KM)",

View File

@@ -138,7 +138,7 @@ const router = createRouter({
name: 'calendar', name: 'calendar',
meta: { meta: {
permissions: ['role_shipper', 'role_carrier'], permissions: ['role_shipper', 'role_carrier'],
roles: ['staff', 'manager', 'owner', 'store'] roles: ['staff', 'manager', 'owner']
}, },
component: () => import('../views/CalendarView.vue'), component: () => import('../views/CalendarView.vue'),
}, },
@@ -147,7 +147,7 @@ const router = createRouter({
name: 'store', name: 'store',
meta: { meta: {
permissions: ['role_shipper'], permissions: ['role_shipper'],
roles: ['owner', 'manager', 'store'] roles: ['warehouse']
}, },
component: () => import('../views/store/StoreView.vue'), component: () => import('../views/store/StoreView.vue'),
}, },
@@ -220,16 +220,16 @@ router.beforeEach( async(to, from, next) => {
} }
if (permissions && !permissions.includes(permissionUser)) { if (permissions && !permissions.includes(permissionUser)) {
if(role === 'store') { /// Check if user is store if(role === 'warehouse') { /// Check if user is store
return next({name: 'calendar'}); return next({name: 'store'});
} else { } else {
return next({name: 'home'}); return next({name: 'home'});
} }
} }
if(roles && !roles.includes(role)) { if(roles && !roles.includes(role)) {
console.log('tiene perminsos'); // return next({name: 'calendar'});
return next({name: 'calendar'}); return next({name: 'store'});
} }
next(); next();

View File

@@ -59,7 +59,7 @@
const handleConfirmRegister = async() => { const handleConfirmRegister = async() => {
msgError.value = ''; msgError.value = '';
msgSuccess.value = ''; msgSuccess.value = '';
if(form.code.length < 6) { if(form.code.length < 5) {
msgError.value = t('errors.code'); msgError.value = t('errors.code');
clearMessages(); clearMessages();
return; return;