fix(roles): restringe usuarios Taller y Mecanico a solo la seccion de Taller y oculta precios
- sidebar.js: itemAllowed incluye mechanic junto a workshop -> solo muestra Taller - app-init.js: redirige a /pos/workshop si el rol es workshop/mechanic - config_bp.py: remueve customers.view y fleet.view de los permisos por defecto de workshop/mechanic - workshop.js: hidePrices ahora tambien aplica para mechanic; oculta columnas/inputs de precio - app-init.js/config.js: agrega etiquetas de rol para workshop y mechanic - workshop.html: marca columnas de precio con price-col y oculta input catRate Tests: 35 passed
This commit is contained in:
@@ -237,10 +237,8 @@ def create_employee():
|
|||||||
'reports.view', 'reports.financial',
|
'reports.view', 'reports.financial',
|
||||||
'customers.view',
|
'customers.view',
|
||||||
'fleet.view'],
|
'fleet.view'],
|
||||||
'workshop': ['workshop.view', 'workshop.edit', 'workshop.add_items', 'customers.view',
|
'workshop': ['workshop.view', 'workshop.edit', 'workshop.add_items'],
|
||||||
'fleet.view'],
|
'mechanic': ['workshop.view', 'workshop.edit', 'workshop.add_items'],
|
||||||
'mechanic': ['workshop.view', 'workshop.edit', 'workshop.add_items', 'customers.view',
|
|
||||||
'fleet.view'],
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for perm in role_permissions.get(data['role'], []):
|
for perm in role_permissions.get(data['role'], []):
|
||||||
|
|||||||
@@ -43,7 +43,8 @@
|
|||||||
var _t = typeof window.t === 'function' ? window.t : function(k) { return k; };
|
var _t = typeof window.t === 'function' ? window.t : function(k) { return k; };
|
||||||
var roleLabels = {
|
var roleLabels = {
|
||||||
'owner': _t('role_owner'), 'admin': _t('role_admin'), 'cashier': _t('role_cashier'),
|
'owner': _t('role_owner'), 'admin': _t('role_admin'), 'cashier': _t('role_cashier'),
|
||||||
'warehouse': _t('role_warehouse'), 'accountant': _t('role_accountant')
|
'warehouse': _t('role_warehouse'), 'accountant': _t('role_accountant'),
|
||||||
|
'workshop': 'Taller', 'mechanic': 'Mecanico'
|
||||||
};
|
};
|
||||||
var roleLabel = roleLabels[role] || role;
|
var roleLabel = roleLabels[role] || role;
|
||||||
var initials = name.split(' ').map(function(p) { return p[0]; }).join('').toUpperCase().substring(0, 2);
|
var initials = name.split(' ').map(function(p) { return p[0]; }).join('').toUpperCase().substring(0, 2);
|
||||||
@@ -180,6 +181,12 @@
|
|||||||
permissions: payload.permissions || []
|
permissions: payload.permissions || []
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// ─── Restrict workshop/mechanic users to the workshop view only ───
|
||||||
|
if ((role === 'workshop' || role === 'mechanic') && window.location.pathname !== '/pos/workshop') {
|
||||||
|
window.location.replace('/pos/workshop');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// ─── Preload enabled modules for sidebar filtering ───
|
// ─── Preload enabled modules for sidebar filtering ───
|
||||||
try {
|
try {
|
||||||
fetch('/pos/api/config/modules', {
|
fetch('/pos/api/config/modules', {
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ window.renderSidebar = function(modulesOverride) {
|
|||||||
// only the sections relevant to their job.
|
// only the sections relevant to their job.
|
||||||
function itemAllowed(id) {
|
function itemAllowed(id) {
|
||||||
if (role === 'owner' || role === 'admin') return true;
|
if (role === 'owner' || role === 'admin') return true;
|
||||||
if (role === 'workshop') {
|
if (role === 'workshop' || role === 'mechanic') {
|
||||||
return id === 'workshop';
|
return id === 'workshop';
|
||||||
}
|
}
|
||||||
if (role === 'cashier') {
|
if (role === 'cashier') {
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ var Workshop = (function() {
|
|||||||
|
|
||||||
var user = window.POS_USER || {};
|
var user = window.POS_USER || {};
|
||||||
var role = (user.role || '').toLowerCase();
|
var role = (user.role || '').toLowerCase();
|
||||||
var hidePrices = role === 'workshop';
|
var hidePrices = role === 'workshop' || role === 'mechanic';
|
||||||
var perms = user.permissions || [];
|
var perms = user.permissions || [];
|
||||||
var canEdit = role === 'owner' || role === 'admin' || perms.indexOf('workshop.edit') !== -1;
|
var canEdit = role === 'owner' || role === 'admin' || perms.indexOf('workshop.edit') !== -1;
|
||||||
var canSell = role === 'owner' || role === 'admin' || perms.indexOf('pos.sell') !== -1;
|
var canSell = role === 'owner' || role === 'admin' || perms.indexOf('pos.sell') !== -1;
|
||||||
@@ -652,15 +652,15 @@ var Workshop = (function() {
|
|||||||
function renderCatalog() {
|
function renderCatalog() {
|
||||||
var body = document.getElementById('catalogBody');
|
var body = document.getElementById('catalogBody');
|
||||||
if (!catalog.length) {
|
if (!catalog.length) {
|
||||||
body.innerHTML = '<tr><td colspan="5" style="text-align:center;">Sin conceptos</td></tr>';
|
body.innerHTML = '<tr><td colspan="' + (hidePrices ? 3 : 5) + '" style="text-align:center;">Sin conceptos</td></tr>';
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
body.innerHTML = catalog.map(function(c) {
|
body.innerHTML = catalog.map(function(c) {
|
||||||
return '<tr>' +
|
return '<tr>' +
|
||||||
'<td>' + esc(c.name) + (c.description ? '<br><small>' + esc(c.description) + '</small>' : '') + '</td>' +
|
'<td>' + esc(c.name) + (c.description ? '<br><small>' + esc(c.description) + '</small>' : '') + '</td>' +
|
||||||
'<td>' + fmt(c.suggested_hours) + '</td>' +
|
'<td>' + fmt(c.suggested_hours) + '</td>' +
|
||||||
'<td>' + fmtMoney(c.suggested_rate) + '</td>' +
|
(hidePrices ? '' : '<td class="price-col">' + fmtMoney(c.suggested_rate) + '</td>' +
|
||||||
'<td>' + fmtMoney(c.suggested_hours * c.suggested_rate) + '</td>' +
|
'<td class="price-col">' + fmtMoney(c.suggested_hours * c.suggested_rate) + '</td>') +
|
||||||
'<td><button class="btn btn--sm btn--ghost" onclick="Workshop.deleteCatalogItem(' + c.id + ')">Desactivar</button></td>' +
|
'<td><button class="btn btn--sm btn--ghost" onclick="Workshop.deleteCatalogItem(' + c.id + ')">Desactivar</button></td>' +
|
||||||
'</tr>';
|
'</tr>';
|
||||||
}).join('');
|
}).join('');
|
||||||
|
|||||||
@@ -254,7 +254,7 @@
|
|||||||
<div class="form-field">
|
<div class="form-field">
|
||||||
<input class="form-input" id="catHours" type="number" step="0.1" placeholder="Horas" />
|
<input class="form-input" id="catHours" type="number" step="0.1" placeholder="Horas" />
|
||||||
</div>
|
</div>
|
||||||
<div class="form-field">
|
<div class="form-field price-col">
|
||||||
<input class="form-input" id="catRate" type="number" step="0.01" placeholder="Precio/hora" />
|
<input class="form-input" id="catRate" type="number" step="0.01" placeholder="Precio/hora" />
|
||||||
</div>
|
</div>
|
||||||
<div class="form-field form-field--span3">
|
<div class="form-field form-field--span3">
|
||||||
@@ -271,8 +271,8 @@
|
|||||||
<tr>
|
<tr>
|
||||||
<th>Servicio</th>
|
<th>Servicio</th>
|
||||||
<th>Horas</th>
|
<th>Horas</th>
|
||||||
<th>Precio/hora</th>
|
<th class="price-col">Precio/hora</th>
|
||||||
<th>Total sugerido</th>
|
<th class="price-col">Total sugerido</th>
|
||||||
<th></th>
|
<th></th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
|
|||||||
Reference in New Issue
Block a user