Przeglądaj źródła

Menu facturation

Vincent GUFFON 4 lat temu
rodzic
commit
3096312a74

+ 2 - 2
components/Layout/MenuComponent.vue

@@ -61,7 +61,7 @@
 </template>
 
 <script lang="ts">
-  import useMenu from '@/use/template/menu'
+  import {$useMenu} from '@/use/template/menu'
   import {defineComponent} from '@nuxtjs/composition-api'
   import {AnyJson} from "~/types/types";
 
@@ -77,7 +77,7 @@
       }
     },
     setup() {
-      const menu: AnyJson = new useMenu().useMenuConstruct()
+      const menu: AnyJson = $useMenu.setUpContext().useMenuConstruct()
 
       return {
         menu

+ 63 - 0
config/abilities/pages/billing.yaml

@@ -0,0 +1,63 @@
+  billing_product_page:
+    action: 'display'
+    services:
+      access:
+        - {function: hasAbility, parameters: [{action: 'read', subject: 'billings-administration'}]}
+      organization:
+        - {function: hasModule, parameters: ['BillingAdministration']}
+
+  billing_products_by_student_page:
+    action: 'display'
+    services:
+      access:
+        - {function: hasAbility, parameters: [{action: 'read', subject: 'pedagogics-administration'}]}
+      organization:
+        - {function: hasModule, parameters: ['BillingAdministration']}
+
+  billing_edition_page:
+    action: 'display'
+    services:
+      access:
+        - {function: hasAbility, parameters: [{action: 'manage', subject: 'billings-administration'}]}
+      organization:
+        - {function: hasModule, parameters: ['BillingAdministration']}
+
+  billing_accounting_page:
+    action: 'display'
+    services:
+      access:
+        - {function: hasAbility, parameters: [{action: 'read', subject: 'billings-administration'}]}
+      organization:
+        - {function: hasModule, parameters: ['BillingAdministration']}
+
+  billing_payment_list_page:
+    action: 'display'
+    services:
+      access:
+        - {function: hasAbility, parameters: [{action: 'read', subject: 'billings-administration'}]}
+      organization:
+        - {function: hasModule, parameters: ['BillingAdministration']}
+
+  pes_page:
+    action: 'display'
+    services:
+      access:
+        - {function: hasAbility, parameters: [{action: 'manage', subject: 'billings-administration'}]}
+      organization:
+        - {function: hasModule, parameters: ['Pes']}
+
+  berger_levrault_page:
+    action: 'display'
+    services:
+      access:
+        - {function: hasAbility, parameters: [{action: 'manage', subject: 'billings-administration'}]}
+      organization:
+        - {function: hasModule, parameters: ['BergerLevrault']}
+
+  jvs_page:
+    action: 'display'
+    services:
+      access:
+        - {function: hasAbility, parameters: [{action: 'manage', subject: 'billings-administration'}]}
+      organization:
+        - {function: hasModule, parameters: ['Jvs']}

+ 9 - 0
lang/layout/fr-FR.js

@@ -18,5 +18,14 @@ export default (context, locale) => {
     test_validation: 'Validation par évaluation',
     examen_results: 'Résultats des examens',
     education_by_student_validation: 'Validation par enseignement',
+    billing: 'Facturation',
+    billing_product: 'Produit',
+    billing_products_by_student: 'Produits par élève',
+    billing_edition: 'Édition des factures',
+    billing_accounting: 'Factures et avoirs',
+    billing_payment_list: 'Journal des règlements',
+    pes_export: 'Export JVS',
+    berger_levrault_export: 'Export Berger Levrault',
+    jvs_export: 'Export JVS',
   })
 }

+ 1 - 1
package.json

@@ -17,7 +17,7 @@
     "@casl/vue": "^1.2.1",
     "@nuxt/http": "^0.6.1",
     "@nuxt/typescript-runtime": "^2.0.0",
-    "@nuxtjs/composition-api": "^0.17.0",
+    "@nuxtjs/composition-api": "0.19",
     "@syncfusion/ej2-vue-grids": "^18.4.30",
     "@types/lodash": "^4.14.168",
     "@vuex-orm/core": "1.0.0-draft.8",

+ 25 - 0
test/use/template/menu.spec.js

@@ -0,0 +1,25 @@
+import {$useMenu} from "~/use/template/menu";
+
+test('test constructMenu', () => {
+  const menuWithoutChildren = $useMenu.constructMenu('icon', 'children', '/url', false)
+  expect(menuWithoutChildren).toStrictEqual({
+    "icon": "icon",
+    "title": "children",
+    "to": "/url",
+    "old": false
+  });
+
+  const menuWithChildren = $useMenu.constructMenu('icon', 'parent', undefined, undefined, [menuWithoutChildren])
+  expect(menuWithChildren).toStrictEqual({
+    "children": [
+      {
+        "icon": "icon",
+        "old": false,
+        "title": "children",
+        "to": "/url"
+      }
+    ],
+    "icon": "icon",
+    "title": "parent"
+  });
+})

+ 54 - 1
use/template/menu.ts

@@ -17,10 +17,14 @@ class Menu{
    * Initialisation des services issues du context
    */
   constructor() {
+  }
+
+  setUpContext(){
     const {$ability, $config, store} = useContext();
     this.$ability = $ability;
     this.$config = $config;
     this.$store = store;
+    return this;
   }
 
   /**
@@ -41,6 +45,9 @@ class Menu{
     const educationalMenu = this.educationalMenu()
     if(educationalMenu) menu.push(educationalMenu)
 
+    const billingMenu = this.billingMenu()
+    if(billingMenu) menu.push(billingMenu)
+
     return ref(menu)
   }
 
@@ -146,6 +153,52 @@ class Menu{
     return children.length > 0 ? this.constructMenu('fa-graduation-cap', 'education_state', undefined, undefined, children) : null;
   }
 
+  /**
+   * Construit le menu Facturation ou null si aucune page accessible
+   * @return {ItemMenu | null}
+   */
+  billingMenu():ItemMenu | null {
+    const children:ItemsMenu = [];
+
+    if (this.$ability().can('display', 'billing_product_page')) {
+      children.push(this.constructMenu('fa-cube', 'billing_product', '/intangibles/list/', true))
+    }
+
+    if (this.$ability().can('display', 'billing_products_by_student_page')) {
+      children.push(this.constructMenu('fa-cubes', 'billing_products_by_student', '/access_intangibles/list/', true))
+    }
+
+    if (this.$ability().can('display', 'billing_edition_page')) {
+      children.push(this.constructMenu('fa-copy', 'billing_edition', '/billing_edition', true))
+    }
+
+    if (this.$ability().can('display', 'billing_accounting_page')) {
+      children.push(this.constructMenu('fa-file-alt', 'billing_accounting', '/bill_accountings/list/', true))
+    }
+
+    if (this.$ability().can('display', 'billing_payment_list_page')) {
+      children.push(this.constructMenu('fa-credit-card', 'billing_payment_list', '/bill_payments_list/list/', true))
+    }
+
+    if (this.$ability().can('display', 'pes_page')) {
+      children.push(this.constructMenu('fa-align-justify', 'pes_export', '/pes/list/', true))
+    }
+
+    if (this.$ability().can('display', 'berger_levrault_page')) {
+      children.push(this.constructMenu('fa-align-justify', 'berger_levrault_export', '/berger_levraults/list/', true))
+    }
+
+    if (this.$ability().can('display', 'jvs_page')) {
+      children.push(this.constructMenu('fa-align-justify', 'jvs_export', '/jvs/list/', true))
+    }
+
+    if(children.length === 1){
+      return children[0];
+    }
+    return children.length > 0 ? this.constructMenu('fa-euro-sign', 'billing', undefined, undefined, children) : null;
+  }
+
+
   /**
    * Construit un ItemMenu
    * @param {string} icon
@@ -169,4 +222,4 @@ class Menu{
   }
 }
 
-export default Menu
+export const $useMenu = new Menu()

+ 11 - 11
yarn.lock

@@ -1607,14 +1607,14 @@
     webpack-node-externals "^2.5.2"
     webpackbar "^4.0.0"
 
-"@nuxtjs/composition-api@^0.17.0":
-  version "0.17.0"
-  resolved "https://registry.yarnpkg.com/@nuxtjs/composition-api/-/composition-api-0.17.0.tgz#533402f82dc860cbed17d9612ac8b41333789b26"
-  integrity sha512-hc/1amRpu1sr4/0jkb4T0N37YgvM00jcBTQeur5ymdUd52eJExKiOu+EwbWvTPRFz8IU29x6PhdLZ5LcJT6FgA==
+"@nuxtjs/composition-api@0.19":
+  version "0.19.0"
+  resolved "https://registry.yarnpkg.com/@nuxtjs/composition-api/-/composition-api-0.19.0.tgz#06ed97e70e4c5522bad151aa1890d85afb252b49"
+  integrity sha512-eej0MNm2KE4BSzAq+iZ2NrL8abDBfZoFrbBHV/GxuOVOQce2aKOEVZ3HB7UgEvdJywKmhM1/RajkGNG+YvT4CA==
   dependencies:
-    "@vue/composition-api" "1.0.0-beta.21"
+    "@vue/composition-api" "1.0.0-rc.1"
     defu "^3.2.2"
-    normalize-path "^3.0.0"
+    upath "^2.0.1"
 
 "@nuxtjs/eslint-config-typescript@^3.0.0":
   version "3.0.0"
@@ -2447,12 +2447,12 @@
   optionalDependencies:
     prettier "^1.18.2"
 
-"@vue/composition-api@1.0.0-beta.21":
-  version "1.0.0-beta.21"
-  resolved "https://registry.yarnpkg.com/@vue/composition-api/-/composition-api-1.0.0-beta.21.tgz#d5a3c68afc8b569dfc3eccd69998388bb7f6a16c"
-  integrity sha512-tgbvDpLvKQ1GrII424wsoyzPCsG0oTFf38emMq495SfLY7RmUqhVIl81pvnC5489PPrCxDkbauJHJrhlcXfbTQ==
+"@vue/composition-api@1.0.0-rc.1":
+  version "1.0.0-rc.1"
+  resolved "https://registry.yarnpkg.com/@vue/composition-api/-/composition-api-1.0.0-rc.1.tgz#d5286bbaffcd1987e56d5e3a9f26bfb6023e7c41"
+  integrity sha512-6I5LkfA+VvVOLZufRugzQ5sWKQH81/Cr9gRLidDSeUmjRPolEEWgG4MAnWtBR5zgP5qbRMwZJ4IEYtKhnadMQQ==
   dependencies:
-    tslib "^2.0.1"
+    tslib "^2.0.3"
 
 "@vue/test-utils@^1.1.0":
   version "1.1.1"