Explorar o código

VIEW Permission and Service Categories

Alan Colon %!s(int64=7) %!d(string=hai) anos
pai
achega
62c2e78070

+ 16 - 5
app/components/user-area-nav.js

@@ -31,13 +31,13 @@ app.component('appUserAreaNav', {
           {{::terminal.key}} Services
         </md-button>
       </md-menu-item>
-      <md-menu-item ng-if="$ctrl.api.claims.STAFF_MEMBER_READ">
+      <md-menu-item ng-if="$ctrl.api.claims.STAFF_MEMBER_VIEW">
         <md-button ng-href="/staff-members/{{::terminal.key}}">
           <md-icon md-svg-icon="${staffMemberIcon}"></md-icon>
           {{::terminal.key}} Staff Members
         </md-button>
       </md-menu-item>
-      <md-menu-item ng-if="$ctrl.api.claims.CLIENT_READ">
+      <md-menu-item ng-if="$ctrl.api.claims.CLIENT_VIEW">
         <md-button ng-href="/clients/{{::terminal.key}}">
           <md-icon md-svg-icon="${clientIcon}"></md-icon>
           {{::terminal.key}} Clients
@@ -47,24 +47,35 @@ app.component('appUserAreaNav', {
 
     <div ng-if="$ctrl.api.claims.TERMINAL_ALL_ACCESS">
       <h3>All</h3>
-      <md-menu-item ng-if="$ctrl.api.claims.STAFF_MEMBER_READ">
+      <md-menu-item ng-if="$ctrl.api.claims.STAFF_MEMBER_VIEW">
         <md-button ng-href="/staff-members/all">
           <md-icon md-svg-icon="${staffMemberIcon}"></md-icon>
           Staff Members
         </md-button>
       </md-menu-item>
-      <md-menu-item ng-if="$ctrl.api.claims.STAFFING_AGENCY_READ">
+      <md-menu-item ng-if="$ctrl.api.claims.STAFFING_AGENCY_VIEW">
         <md-button ng-href="/staffing-agencies">
           <md-icon md-svg-icon="${staffingAgencyIcon}"></md-icon>
           Staffing Agencies
         </md-button>
       </md-menu-item>
-      <md-menu-item ng-if="$ctrl.api.claims.CLIENT_READ">
+      <md-menu-item ng-if="$ctrl.api.claims.CLIENT_VIEW">
         <md-button ng-href="/clients/all">
           <md-icon md-svg-icon="${clientIcon}"></md-icon>
           Clients
         </md-button>
       </md-menu-item>
+
+      <md-menu-item ng-if="$ctrl.api.claims.LABOR_CATEGORY_VIEW">
+        <md-button ng-href="/labor-categories">
+          Labor Categories
+        </md-button>
+      </md-menu-item>
+      <md-menu-item ng-if="$ctrl.api.claims.LABOR_CATEGORY_VIEW">
+        <md-button ng-href="/service-categories">
+          Service Categories
+        </md-button>
+      </md-menu-item>
     </div>
     
   `,

+ 1 - 0
auto-crud/index.js

@@ -1,5 +1,6 @@
 require('./terminal')
 require('./labor-category')
+require('./service-category')
 require('./client')
 /* Example */
 /*

+ 7 - 0
auto-crud/labor-category.js

@@ -27,12 +27,19 @@ register({
   columns: [
     { camelName: 'key' },
     { camelName: 'name' },
+    {
+      camelName: 'serviceCategories',
+      type: 'multi-select',
+      apiPrefix: '/api/service-categories',
+      inList: false
+    }
   ],
   layout: [
     {
       section: 'Details',
       rows: [
         [ 'name', 'key' ],
+        [ 'serviceCategories' ]
       ]
     }
   ]

+ 46 - 0
auto-crud/service-category.js

@@ -0,0 +1,46 @@
+const { register, Sequelize } = require('@alancnet/material-framework/auto-crud')
+
+register({
+  camelName: 'serviceCategory',
+  showNav: false,
+  schema: {
+    id: {
+      type: Sequelize.UUID,
+      defaultValue: Sequelize.UUIDV1,
+      primaryKey: true
+    },
+    name: Sequelize.STRING,
+    key: {
+      type: Sequelize.STRING,
+      unique: true
+    },
+  },
+  options: {
+    paranoid: true,
+    indexes: [
+      {
+        unique: true,
+        fields: ['key']
+      }
+    ]
+  },
+  columns: [
+    { camelName: 'key' },
+    { camelName: 'name' },
+    {
+      camelName: 'laborCategories',
+      type: 'multi-select',
+      apiPrefix: '/api/labor-categories',
+      inList: false
+    }
+  ],
+  layout: [
+    {
+      section: 'Details',
+      rows: [
+        [ 'name', 'key' ],
+        [ 'laborCategories' ]
+      ]
+    }
+  ]
+})

+ 7 - 2
lib/database/index.js

@@ -1,9 +1,12 @@
 require('./migrations')
 // TODO: App Specific Models
 const {database} = require('@alancnet/material-framework/server')
-const { Terminal, Client } = database
+const { Terminal, Client, ServiceCategory, LaborCategory } = database
 const initialize = require('./initialize')
 
+const LaborServiceCategory = LaborCategory.belongsToMany(ServiceCategory, { through: 'laborServiceCategories' })
+const ServiceLaborCategory = ServiceCategory.belongsToMany(LaborCategory, { through: 'laborServiceCategories' })
+
 // const Terminal = require('./terminal')
 const Workday = require('./workday')
 const Service = require('./service')
@@ -55,5 +58,7 @@ module.exports = Object.assign(database, {
   StaffMemberTerminal,
   Labor,
   TerminalClient,
-  ClientTerminal
+  ClientTerminal,
+  LaborServiceCategory,
+  ServiceLaborCategory
 })

+ 44 - 5
lib/database/initialize.js

@@ -1,3 +1,4 @@
+const { Op } = require('sequelize')
 const { controllers: C } = require('@alancnet/material-framework/server')
 const { register } = C.auth.permissions
 const terminals = [
@@ -19,7 +20,7 @@ const terminals = [
   }
 ]
 
-const categories = [
+const laborCategories = [
   {
     name: 'Warehouse',
     key: 'WAREHOUSE'
@@ -38,6 +39,25 @@ const categories = [
   }
 ]
 
+const serviceCategories = [
+  {
+    name: 'Inbound',
+    key: 'INBOUND',
+    laborCategories: [
+      'WAREHOUSE',
+      'ADMIN',
+      'OPS'
+    ]
+  },
+  {
+    name: 'Delivery',
+    key: 'DELIVERY',
+    laborCategories: [
+      'DELIVERY'
+    ]
+  }
+]
+
 const roles = [
   {
     name: 'Management',
@@ -106,14 +126,16 @@ const roles = [
       'CLIENT_READ',
       'CLIENT_UNDELETE',
       'CLIENT_UPDATE',
+      'CLIENT_VIEW',
       'STAFFING_AGENCY_READ',
       'STAFF_MEMBER_CREATE',
       'STAFF_MEMBER_DELETE',
       'STAFF_MEMBER_READ',
       'STAFF_MEMBER_UNDELETE',
-      'STAFF_MEMBER_UPDATE'
+      'STAFF_MEMBER_UPDATE',
+      'STAFF_MEMBER_VIEW'
     ]
-      .concat(categories.map(x => x.key).filter(key => key !== 'ADMIN').map(key => `INCOME_${key}_VIEW`))
+      .concat(laborCategories.map(x => x.key).filter(key => key !== 'ADMIN').map(key => `INCOME_${key}_VIEW`))
       .join(',')
   },
   {
@@ -134,7 +156,7 @@ const roles = [
       'STAFF_MEMBER_UNDELETE',
       'STAFF_MEMBER_UPDATE'
     ]
-      .concat(categories.map(x => x.key).filter(key => key !== 'ADMIN').map(key => `INCOME_${key}_VIEW`))
+      .concat(laborCategories.map(x => x.key).filter(key => key !== 'ADMIN').map(key => `INCOME_${key}_VIEW`))
       .join(',')
   },
   {
@@ -166,17 +188,34 @@ const initializeRoles = async db => {
 }
 
 const initializeLaborCategories = async db => {
-  for (let category of categories) {
+  for (let category of laborCategories) {
     const record = await db.upsert(db.LaborCategory, category)
     register(`INCOME_${category.key}_VIEW`, `View ${category.name} Staff income.`)
     console.log(`Upserted Labor Category ${category.name}: ${JSON.stringify(record)}`) 
   }
 }
 
+const initializeServiceCategories = async db => {
+  for (let category of serviceCategories) {
+    const record = await db.upsert(db.ServiceCategory, category)
+    const laborCategories = await db.LaborCategory.findAll({
+      where: {
+        key: {
+          [Op.in]: category.laborCategories
+        }
+      }
+    })
+    await record.setLaborCategories(laborCategories)
+
+    console.log(`Upserted Service Category ${category.name}: ${JSON.stringify(record)}`) 
+  }
+}
+
 const init = async (db) => {
   await initializeTerminals(db)
   await initializeRoles(db)
   await initializeLaborCategories(db)
+  await initializeServiceCategories(db)
 }
 
 module.exports = {

+ 11 - 0
lib/database/migrations/1.03-service-categories.js

@@ -0,0 +1,11 @@
+module.exports = {
+  version: 1.03,
+  name: 'Service Categories',
+  description: 'Adds serviceCategories and the laborServiceCategories association.',
+  up: async (queryInterface, Sequelize) => {
+    const { LaborServiceCategory, ServiceCategory } = require('../')
+    await LaborServiceCategory.throughModel.sync()
+    await ServiceCategory.sync()
+    return 1.03
+  }
+}

+ 2 - 1
lib/database/migrations/index.js

@@ -2,7 +2,8 @@ const migrations = require('@alancnet/material-framework/lib/database/migrations
 module.exports = Object.assign(migrations, {
   'special-dispatch-app': [
     require('./1.01-location-to-terminal.js'),
-    require('./1.02-retailer-to-client.js')
+    require('./1.02-retailer-to-client.js'),
+    require('./1.03-service-categories.js')
   ]
 })