Ver Fonte

feat(permissions): update permission scopes to franchisor_financial and enhance access controls across financial pages

ebagabee há 2 semanas atrás
pai
commit
40d8fbb196

+ 7 - 2
src/pages/financial/AccountsPayablePage.vue

@@ -39,6 +39,7 @@
         @update:model-value="loadData"
         @update:model-value="loadData"
       />
       />
       <q-btn
       <q-btn
+        v-if="canAdd"
         color="primary"
         color="primary"
         label="Nova conta a pagar"
         label="Nova conta a pagar"
         icon="mdi-plus"
         icon="mdi-plus"
@@ -83,7 +84,7 @@
         <template #body-cell-actions="{ row }">
         <template #body-cell-actions="{ row }">
           <q-td auto-width>
           <q-td auto-width>
             <q-btn
             <q-btn
-              v-if="row.status !== 'paid' && row.status !== 'cancelled'"
+              v-if="canEdit && row.status !== 'paid' && row.status !== 'cancelled'"
               color="primary"
               color="primary"
               label="Dar baixa"
               label="Dar baixa"
               dense
               dense
@@ -93,7 +94,7 @@
               @click="openSettle(row)"
               @click="openSettle(row)"
             />
             />
             <q-btn
             <q-btn
-              v-else-if="row.status === 'paid'"
+              v-else-if="canEdit && row.status === 'paid'"
               color="grey-7"
               color="grey-7"
               label="Reabrir"
               label="Reabrir"
               dense
               dense
@@ -236,8 +237,12 @@ import DefaultCurrencyInput from "src/components/defaults/DefaultCurrencyInput.v
 import DefaultInputDatePicker from "src/components/defaults/DefaultInputDatePicker.vue";
 import DefaultInputDatePicker from "src/components/defaults/DefaultInputDatePicker.vue";
 import DefaultDialogHeader from "src/components/defaults/DefaultDialogHeader.vue";
 import DefaultDialogHeader from "src/components/defaults/DefaultDialogHeader.vue";
 import FinancialCard from "src/components/financial/FinancialCard.vue";
 import FinancialCard from "src/components/financial/FinancialCard.vue";
+import { permissionStore } from "src/stores/permission";
 
 
 const rows = ref([]);
 const rows = ref([]);
+const permissions = permissionStore();
+const canAdd = permissions.getAccess("franchisor_financial", "add");
+const canEdit = permissions.getAccess("franchisor_financial", "edit");
 const statusFilter = ref(null);
 const statusFilter = ref(null);
 
 
 const settleDialog = ref(false);
 const settleDialog = ref(false);

+ 4 - 1
src/pages/financial/AsaasIntegrationPage.vue

@@ -38,7 +38,7 @@
 
 
           <div class="row justify-end items-center q-mt-md" style="gap: 12px">
           <div class="row justify-end items-center q-mt-md" style="gap: 12px">
             <q-btn
             <q-btn
-              v-if="account.asaas_configured"
+              v-if="canEdit && account.asaas_configured"
               flat
               flat
               color="negative"
               color="negative"
               label="Remover chave"
               label="Remover chave"
@@ -46,6 +46,7 @@
               @click="onRemove"
               @click="onRemove"
             />
             />
             <q-btn
             <q-btn
+              v-if="canEdit"
               color="primary"
               color="primary"
               label="Salvar"
               label="Salvar"
               :disable="!apiKey"
               :disable="!apiKey"
@@ -69,8 +70,10 @@ import {
 
 
 import DefaultHeaderPage from "src/components/layout/DefaultHeaderPage.vue";
 import DefaultHeaderPage from "src/components/layout/DefaultHeaderPage.vue";
 import DefaultPasswordInput from "src/components/defaults/DefaultPasswordInput.vue";
 import DefaultPasswordInput from "src/components/defaults/DefaultPasswordInput.vue";
+import { permissionStore } from "src/stores/permission";
 
 
 const formRef = ref(null);
 const formRef = ref(null);
+const canEdit = permissionStore().getAccess("franchisor_financial", "edit");
 const apiKey = ref("");
 const apiKey = ref("");
 
 
 const defaultAccount = () => ({
 const defaultAccount = () => ({

+ 3 - 1
src/pages/financial/ChartOfAccountsPage.vue

@@ -6,7 +6,7 @@
       <DefaultTable
       <DefaultTable
         v-model:rows="rows"
         v-model:rows="rows"
         no-api-call
         no-api-call
-        add-item
+        :add-item="canAdd"
         add-item-label="Nova Conta"
         add-item-label="Nova Conta"
         dense-add
         dense-add
         :loading="loading"
         :loading="loading"
@@ -27,8 +27,10 @@ import DefaultHeaderPage from "src/components/layout/DefaultHeaderPage.vue";
 import DefaultTable from "src/components/defaults/DefaultTable.vue";
 import DefaultTable from "src/components/defaults/DefaultTable.vue";
 import AddFinancialPlanAccountDialog from "src/components/financial/AddFinancialPlanAccountDialog.vue";
 import AddFinancialPlanAccountDialog from "src/components/financial/AddFinancialPlanAccountDialog.vue";
 import { getFinancialPlanAccounts } from "src/api/financial_plan_account";
 import { getFinancialPlanAccounts } from "src/api/financial_plan_account";
+import { permissionStore } from "src/stores/permission";
 
 
 const $q = useQuasar();
 const $q = useQuasar();
+const canAdd = permissionStore().getAccess("franchisor_financial", "add");
 
 
 const accounts = ref([]);
 const accounts = ref([]);
 const loading = ref(false);
 const loading = ref(false);

+ 3 - 1
src/pages/financial/InvoiceIssuancePage.vue

@@ -6,7 +6,7 @@
       <DefaultTable
       <DefaultTable
         v-model:rows="rows"
         v-model:rows="rows"
         no-api-call
         no-api-call
-        add-item
+        :add-item="canAdd"
         title="Emissão de Notas"
         title="Emissão de Notas"
         description="notas"
         description="notas"
         :female="true"
         :female="true"
@@ -32,8 +32,10 @@
 import { ref } from "vue";
 import { ref } from "vue";
 import DefaultHeaderPage from "src/components/layout/DefaultHeaderPage.vue";
 import DefaultHeaderPage from "src/components/layout/DefaultHeaderPage.vue";
 import DefaultTable from "src/components/defaults/DefaultTable.vue";
 import DefaultTable from "src/components/defaults/DefaultTable.vue";
+import { permissionStore } from "src/stores/permission";
 
 
 const rows = ref([]);
 const rows = ref([]);
+const canAdd = permissionStore().getAccess("franchisor_financial", "add");
 
 
 const columns = [
 const columns = [
   { name: "nf", label: "NF", field: "nf", align: "left" },
   { name: "nf", label: "NF", field: "nf", align: "left" },

+ 7 - 3
src/pages/financial/TreasuryPage.vue

@@ -3,7 +3,7 @@
     <DefaultHeaderPage title="Tesouraria" :show-filter-icon="false" />
     <DefaultHeaderPage title="Tesouraria" :show-filter-icon="false" />
 
 
     <div class="flex justify-end">
     <div class="flex justify-end">
-      <q-btn v-if="!loading" color="primary" style="height: 40px; width: 40px;" icon="mdi-plus" @click="openCreateDialog"/>
+      <q-btn v-if="!loading && canAdd" color="primary" style="height: 40px; width: 40px;" icon="mdi-plus" @click="openCreateDialog"/>
     </div>
     </div>
     <div class="row q-pa-md q-col-gutter-md items-stretch">
     <div class="row q-pa-md q-col-gutter-md items-stretch">
       <div v-for="bank in cards" :key="bank.key" class="col-3">
       <div v-for="bank in cards" :key="bank.key" class="col-3">
@@ -13,7 +13,7 @@
           :financial-value="bank.value"
           :financial-value="bank.value"
           :percentage="bank.percentage"
           :percentage="bank.percentage"
           clickable
           clickable
-          :editable="!!bank.account"
+          :editable="canEdit && !!bank.account"
           :selected="selectedBank.key === bank.key"
           :selected="selectedBank.key === bank.key"
           @click="selectedBank = bank"
           @click="selectedBank = bank"
           @edit="openEditDialog(bank.account)"
           @edit="openEditDialog(bank.account)"
@@ -25,7 +25,7 @@
       <DefaultTable
       <DefaultTable
         v-model:rows="rows"
         v-model:rows="rows"
         no-api-call
         no-api-call
-        add-item
+        :add-item="canAdd"
         :title="`Extrato ${selectedBank.label}`"
         :title="`Extrato ${selectedBank.label}`"
         description="registros"
         description="registros"
         :female="false"
         :female="false"
@@ -47,8 +47,12 @@ import AddTreasuryLaunchDialog from "src/components/financial/AddTreasuryLaunchD
 import { getTreasuryAccounts } from "src/api/treasury_account";
 import { getTreasuryAccounts } from "src/api/treasury_account";
 import { getTreasuryLaunches } from "src/api/treasury_launch";
 import { getTreasuryLaunches } from "src/api/treasury_launch";
 import { formatToBRLCurrency, formatDateYMDtoDMY } from "src/helpers/utils";
 import { formatToBRLCurrency, formatDateYMDtoDMY } from "src/helpers/utils";
+import { permissionStore } from "src/stores/permission";
 
 
 const $q = useQuasar();
 const $q = useQuasar();
+const permissions = permissionStore();
+const canAdd = permissions.getAccess("franchisor_financial", "add");
+const canEdit = permissions.getAccess("franchisor_financial", "edit");
 
 
 const accounts = ref([]);
 const accounts = ref([]);
 const launches = ref([]);
 const launches = ref([]);

+ 1 - 29
src/pages/permissions/permission_menus.js

@@ -55,37 +55,9 @@ export const FRANCHISOR_PERMISSION_MENUS = Object.freeze([
   { scope: "franchisor_products", label: "Produtos", icon: "mdi-cart-outline" },
   { scope: "franchisor_products", label: "Produtos", icon: "mdi-cart-outline" },
   { scope: "franchisor_tbr", label: "TBR", icon: "mdi-database-outline" },
   { scope: "franchisor_tbr", label: "TBR", icon: "mdi-database-outline" },
   {
   {
-    scope: "financial",
+    scope: "franchisor_financial",
     label: "Financeiro",
     label: "Financeiro",
     icon: "mdi-cash-multiple",
     icon: "mdi-cash-multiple",
-    children: [
-      { scope: "treasury", label: "Tesouraria", icon: "mdi-bank-outline" },
-      {
-        scope: "financial-account-payable",
-        label: "Contas a Pagar",
-        icon: "mdi-cash-minus",
-      },
-      {
-        scope: "financial-account-receive",
-        label: "Contas a Receber",
-        icon: "mdi-cash-plus",
-      },
-      {
-        scope: "financial-plan-account",
-        label: "Plano de Contas",
-        icon: "mdi-format-list-bulleted",
-      },
-      {
-        scope: "financial-invoice",
-        label: "Emissão de Notas",
-        icon: "mdi-file-document-outline",
-      },
-      {
-        scope: "integrations",
-        label: "Integração Asaas",
-        icon: "mdi-api",
-      },
-    ],
   },
   },
   { scope: "support-ticket", label: "Suporte", icon: "mdi-headset" },
   { scope: "support-ticket", label: "Suporte", icon: "mdi-headset" },
   { scope: "kanban", label: "Atividades", icon: "mdi-clipboard-list-outline" },
   { scope: "kanban", label: "Atividades", icon: "mdi-clipboard-list-outline" },

+ 7 - 0
src/router/routes/financial.route.js

@@ -7,6 +7,7 @@ export default [
       title: { value: "Financeiro", translate: false },
       title: { value: "Financeiro", translate: false },
       requireAuth: true,
       requireAuth: true,
       requireFinancialAuth: true,
       requireFinancialAuth: true,
+      requiredPermission: "franchisor_financial",
       breadcrumbs: [
       breadcrumbs: [
         { name: "DashboardPage", title: "Dashboard" },
         { name: "DashboardPage", title: "Dashboard" },
         { name: "FinancialPage", title: "Financeiro" },
         { name: "FinancialPage", title: "Financeiro" },
@@ -21,6 +22,7 @@ export default [
       title: { value: "Tesouraria", translate: false },
       title: { value: "Tesouraria", translate: false },
       requireAuth: true,
       requireAuth: true,
       requireFinancialAuth: true,
       requireFinancialAuth: true,
+      requiredPermission: "franchisor_financial",
       breadcrumbs: [
       breadcrumbs: [
         { name: "DashboardPage", title: "Dashboard" },
         { name: "DashboardPage", title: "Dashboard" },
         { name: "TreasuryPage", title: "Tesouraria" },
         { name: "TreasuryPage", title: "Tesouraria" },
@@ -35,6 +37,7 @@ export default [
       title: { value: "Contas a Pagar", translate: false },
       title: { value: "Contas a Pagar", translate: false },
       requireAuth: true,
       requireAuth: true,
       requireFinancialAuth: true,
       requireFinancialAuth: true,
+      requiredPermission: "franchisor_financial",
       breadcrumbs: [
       breadcrumbs: [
         { name: "DashboardPage", title: "Dashboard" },
         { name: "DashboardPage", title: "Dashboard" },
         { name: "AccountsPayablePage", title: "Contas a Pagar" },
         { name: "AccountsPayablePage", title: "Contas a Pagar" },
@@ -49,6 +52,7 @@ export default [
       title: { value: "Contas a Receber", translate: false },
       title: { value: "Contas a Receber", translate: false },
       requireAuth: true,
       requireAuth: true,
       requireFinancialAuth: true,
       requireFinancialAuth: true,
+      requiredPermission: "franchisor_financial",
       breadcrumbs: [
       breadcrumbs: [
         { name: "DashboardPage", title: "Dashboard" },
         { name: "DashboardPage", title: "Dashboard" },
         { name: "AccountsReceivablePage", title: "Contas a Receber" },
         { name: "AccountsReceivablePage", title: "Contas a Receber" },
@@ -63,6 +67,7 @@ export default [
       title: { value: "Plano de Contas", translate: false },
       title: { value: "Plano de Contas", translate: false },
       requireAuth: true,
       requireAuth: true,
       requireFinancialAuth: true,
       requireFinancialAuth: true,
+      requiredPermission: "franchisor_financial",
       breadcrumbs: [
       breadcrumbs: [
         { name: "DashboardPage", title: "Dashboard" },
         { name: "DashboardPage", title: "Dashboard" },
         { name: "ChartOfAccountsPage", title: "Plano de Contas" },
         { name: "ChartOfAccountsPage", title: "Plano de Contas" },
@@ -77,6 +82,7 @@ export default [
       title: { value: "Emissão de Notas", translate: false },
       title: { value: "Emissão de Notas", translate: false },
       requireAuth: true,
       requireAuth: true,
       requireFinancialAuth: true,
       requireFinancialAuth: true,
+      requiredPermission: "franchisor_financial",
       breadcrumbs: [
       breadcrumbs: [
         { name: "DashboardPage", title: "Dashboard" },
         { name: "DashboardPage", title: "Dashboard" },
         { name: "InvoiceIssuancePage", title: "Emissão de Notas" },
         { name: "InvoiceIssuancePage", title: "Emissão de Notas" },
@@ -91,6 +97,7 @@ export default [
       title: { value: "Integração Asaas", translate: false },
       title: { value: "Integração Asaas", translate: false },
       requireAuth: true,
       requireAuth: true,
       requireFinancialAuth: true,
       requireFinancialAuth: true,
+      requiredPermission: "franchisor_financial",
       breadcrumbs: [
       breadcrumbs: [
         { name: "DashboardPage", title: "Dashboard" },
         { name: "DashboardPage", title: "Dashboard" },
         { name: "AsaasIntegrationPage", title: "Integração Asaas" },
         { name: "AsaasIntegrationPage", title: "Integração Asaas" },

+ 1 - 1
src/stores/navigation.js

@@ -57,7 +57,7 @@ export const navigationStore = defineStore("navigation", () => {
       icon: "mdi-cash-multiple",
       icon: "mdi-cash-multiple",
       disable: false,
       disable: false,
       permission: false,
       permission: false,
-      permissionScope: "dashboard",
+      permissionScope: "franchisor_financial",
       childrens: [
       childrens: [
         {
         {
           title: "Tesouraria",
           title: "Tesouraria",