瀏覽代碼

feat: :sparkles: feat (contas bancarias prestador) adicionada possibilidade de ter mais de uma conta bancaria

adicionada possibilidade de ter multiplas contas bancarias no prestador, com funcao de atribuir principal,  e foi removido campos de pix

fase:dev | origin:escopo
Gustavo Zanatta 2 天之前
父節點
當前提交
454cc24f1a

+ 6 - 0
src/api/providerBankAccount.js

@@ -0,0 +1,6 @@
+import api from "src/api";
+
+export const getProviderBankAccounts = async (providerId) => {
+  const { data } = await api.get(`/provider/${providerId}/bank-accounts`);
+  return data.payload;
+};

+ 0 - 26
src/api/providerPaymentMethod.js

@@ -1,26 +0,0 @@
-import api from "src/api";
-
-export const getProviderPaymentMethods = async (providerId) => {
-  const { data } = await api.get(`/provider/payment-methods/${providerId}`);
-  return data.payload;
-};
-
-export const getProviderPaymentMethod = async (id) => {
-  const { data } = await api.get(`/provider/payment-method/${id}`);
-  return data.payload;
-};
-
-export const createProviderPaymentMethod = async (info) => {
-  const { data } = await api.post("/provider/payment-method", info);
-  return data.payload;
-};
-
-export const updateProviderPaymentMethod = async (id, info) => {
-  const { data } = await api.put(`/provider/payment-method/${id}`, info);
-  return data.payload;
-};
-
-export const deleteProviderPaymentMethod = async (id) => {
-  const { data } = await api.delete(`/provider/payment-method/${id}`);
-  return data.payload;
-};

+ 18 - 22
src/i18n/locales/en.json

@@ -385,28 +385,6 @@
     "empty_state": "No service types added",
     "remove_confirm": "Are you sure you want to remove this service type?"
   },
-  "provider_payment_methods": {
-    "singular": "Payment Method",
-    "plural": "Payment Methods",
-    "header": "Payment Methods",
-    "add_button": "Add Payment Method",
-    "edit_button": "Edit Payment Method",
-    "empty_state": "No payment methods registered",
-    "account_type": "Account Type",
-    "pix_key": "PIX Key",
-    "bank_account_type": "Bank Account Type",
-    "agency": "Agency",
-    "account": "Account",
-    "digit": "Digit",
-    "account_types": {
-      "pix": "PIX",
-      "bank_account": "Bank Account"
-    },
-    "bank_account_types": {
-      "checking": "Checking",
-      "savings": "Savings"
-    }
-  },
   "provider_working_days": {
     "header": "Working Days",
     "morning": "Morning",
@@ -866,5 +844,23 @@
       "admin": "Administrator",
       "user": "Operator"
     }
+  },
+  "provider_bank_accounts": {
+    "singular": "Bank Account",
+    "plural": "Bank Accounts",
+    "header": "Bank Accounts",
+    "empty_state": "No bank account registered",
+    "read_only_hint": "Read only: bank accounts are managed by the provider in the app.",
+    "primary": "Primary",
+    "bank": "Bank",
+    "account_type": "Account Type",
+    "agency": "Agency",
+    "account": "Account",
+    "holder_name": "Holder",
+    "synced": "Synced",
+    "account_types": {
+      "checking": "Checking",
+      "savings": "Savings"
+    }
   }
 }

+ 18 - 22
src/i18n/locales/es.json

@@ -385,28 +385,6 @@
     "empty_state": "No se han agregado tipos de servicios",
     "remove_confirm": "¿Está seguro de que desea eliminar este tipo de servicio?"
   },
-  "provider_payment_methods": {
-    "singular": "Método de Pago",
-    "plural": "Métodos de Pago",
-    "header": "Métodos de Pago",
-    "add_button": "Agregar Método de Pago",
-    "edit_button": "Editar Método de Pago",
-    "empty_state": "No hay métodos de pago registrados",
-    "account_type": "Tipo de Cuenta",
-    "pix_key": "Clave PIX",
-    "bank_account_type": "Tipo de Cuenta Bancaria",
-    "agency": "Agencia",
-    "account": "Cuenta",
-    "digit": "Dígito",
-    "account_types": {
-      "pix": "PIX",
-      "bank_account": "Cuenta Bancaria"
-    },
-    "bank_account_types": {
-      "checking": "Corriente",
-      "savings": "Ahorro"
-    }
-  },
   "provider_working_days": {
     "header": "Días de Trabajo",
     "morning": "Mañana",
@@ -866,5 +844,23 @@
       "admin": "Administrador",
       "user": "Operador"
     }
+  },
+  "provider_bank_accounts": {
+    "singular": "Cuenta Bancaria",
+    "plural": "Cuentas Bancarias",
+    "header": "Cuentas Bancarias",
+    "empty_state": "Ninguna cuenta bancaria registrada",
+    "read_only_hint": "Solo lectura: las cuentas bancarias las gestiona el prestador en la aplicación.",
+    "primary": "Principal",
+    "bank": "Banco",
+    "account_type": "Tipo de Cuenta",
+    "agency": "Agencia",
+    "account": "Cuenta",
+    "holder_name": "Titular",
+    "synced": "Sincronizada",
+    "account_types": {
+      "checking": "Corriente",
+      "savings": "Ahorro"
+    }
   }
 }

+ 18 - 22
src/i18n/locales/pt.json

@@ -387,28 +387,6 @@
     "empty_state": "Nenhum tipo de serviço adicionado",
     "remove_confirm": "Tem certeza que deseja remover este tipo de serviço?"
   },
-  "provider_payment_methods": {
-    "singular": "Método de Pagamento",
-    "plural": "Métodos de Pagamento",
-    "header": "Métodos de Pagamento",
-    "add_button": "Adicionar Método de Pagamento",
-    "edit_button": "Editar Método de Pagamento",
-    "empty_state": "Nenhum método de pagamento cadastrado",
-    "account_type": "Tipo de Conta",
-    "pix_key": "Chave PIX",
-    "bank_account_type": "Tipo de Conta Bancária",
-    "agency": "Agência",
-    "account": "Conta",
-    "digit": "Dígito",
-    "account_types": {
-      "pix": "PIX",
-      "bank_account": "Conta Bancária"
-    },
-    "bank_account_types": {
-      "checking": "Corrente",
-      "savings": "Poupança"
-    }
-  },
   "provider_working_days": {
     "header": "Dias de Trabalho",
     "morning": "Manhã",
@@ -868,5 +846,23 @@
       "admin": "Administrador",
       "user": "Operador"
     }
+  },
+  "provider_bank_accounts": {
+    "singular": "Conta Bancária",
+    "plural": "Contas Bancárias",
+    "header": "Contas Bancárias",
+    "empty_state": "Nenhuma conta bancária cadastrada",
+    "read_only_hint": "Somente leitura: as contas bancárias são gerenciadas pelo próprio prestador no aplicativo.",
+    "primary": "Principal",
+    "bank": "Banco",
+    "account_type": "Tipo de Conta",
+    "agency": "Agência",
+    "account": "Conta",
+    "holder_name": "Titular",
+    "synced": "Sincronizada",
+    "account_types": {
+      "checking": "Corrente",
+      "savings": "Poupança"
+    }
   }
 }

+ 4 - 4
src/pages/provider/components/AddEditProviderDialog.vue

@@ -6,7 +6,7 @@
       <q-tabs v-model="tab" class="text-grey" active-color="primary" indicator-color="primary" align="justify">
         <q-tab name="data" label="Dados" />
         <q-tab v-if="provider" name="addresses" :label="$t('address.tab')" />
-        <q-tab v-if="provider" name="payment_methods" :label="$t('provider_payment_methods.header')" />
+        <q-tab v-if="provider" name="bank_accounts" :label="$t('provider_bank_accounts.header')" />
         <q-tab v-if="provider" name="working_days" :label="$t('provider_working_days.header')" />
         <q-tab v-if="provider" name="blocked_days" :label="$t('provider_blocked_days.header')" />
         <q-tab v-if="provider" name="blocked_clients" :label="$t('provider_client_blocks.tab')" />
@@ -246,8 +246,8 @@
             <AddressesPanel :source="'provider'" :source-id="provider.id" />
           </q-tab-panel>
 
-          <q-tab-panel v-if="provider" name="payment_methods">
-            <ProviderPaymentMethodsPanel :provider-id="provider.id" />
+          <q-tab-panel v-if="provider" name="bank_accounts">
+            <ProviderBankAccountsPanel :provider-id="provider.id" />
           </q-tab-panel>
 
           <q-tab-panel v-if="provider" name="working_days">
@@ -316,7 +316,7 @@ import DefaultCurrencyInput from "src/components/defaults/DefaultCurrencyInput.v
 import AddressesPanel from "src/pages/address/components/AddressesPanel.vue";
 import ProviderSpecialitiesPanel from "./ProviderSpecialitiesPanel.vue";
 import ProviderServicesTypesPanel from "./ProviderServicesTypesPanel.vue";
-import ProviderPaymentMethodsPanel from "./ProviderPaymentMethodsPanel.vue";
+import ProviderBankAccountsPanel from "./ProviderBankAccountsPanel.vue";
 import ProviderWorkingDaysPanel from "./ProviderWorkingDaysPanel.vue";
 import ProviderBlockedDaysPanel from "./ProviderBlockedDaysPanel.vue";
 import ProviderClientsBlocksPanel from "./ProviderClientsBlocksPanel.vue";

+ 0 - 209
src/pages/provider/components/AddEditProviderPaymentMethodDialog.vue

@@ -1,209 +0,0 @@
-<template>
-  <q-dialog ref="dialogRef" @hide="onDialogHide">
-    <q-card class="q-dialog-plugin" style="width: 700px; max-width: 90vw">
-      <DefaultDialogHeader :title="title" @close="onDialogCancel" />
-      <q-form ref="formRef" @submit="onOKClick">
-        <q-card-section class="row q-col-gutter-sm">
-          <q-select
-            v-model="form.account_type"
-            :options="accountTypeOptions"
-            :label="$t('provider_payment_methods.account_type')"
-            :rules="[inputRules.required]"
-            :error="!!serverErrors?.account_type"
-            :error-message="serverErrors?.account_type"
-            emit-value
-            map-options
-            class="col-12"
-            @update:model-value="onAccountTypeChange"
-          />
-
-          <template v-if="form.account_type === 'pix'">
-            <q-input
-              v-model="form.pix_key"
-              :label="$t('provider_payment_methods.pix_key')"
-              :rules="[inputRules.required]"
-              :error="!!serverErrors?.pix_key"
-              :error-message="serverErrors?.pix_key"
-              class="col-12"
-            />
-          </template>
-
-          <template v-if="form.account_type === 'bank_account'">
-            <q-select
-              v-model="form.bank_account_type"
-              :options="bankAccountTypeOptions"
-              :label="$t('provider_payment_methods.bank_account_type')"
-              :rules="[inputRules.required]"
-              :error="!!serverErrors?.bank_account_type"
-              :error-message="serverErrors?.bank_account_type"
-              emit-value
-              map-options
-              class="col-12"
-            />
-
-            <q-input
-              v-model="form.agency"
-              :label="$t('provider_payment_methods.agency')"
-              :rules="[inputRules.required]"
-              :error="!!serverErrors?.agency"
-              :error-message="serverErrors?.agency"
-              class="col-md-6 col-12"
-            />
-
-            <q-input
-              v-model="form.account"
-              :label="$t('provider_payment_methods.account')"
-              :rules="[inputRules.required]"
-              :error="!!serverErrors?.account"
-              :error-message="serverErrors?.account"
-              class="col-md-4 col-12"
-            />
-
-            <q-input
-              v-model="form.digit"
-              :label="$t('provider_payment_methods.digit')"
-              :rules="[inputRules.required]"
-              :error="!!serverErrors?.digit"
-              :error-message="serverErrors?.digit"
-              class="col-md-2 col-12"
-            />
-          </template>
-        </q-card-section>
-
-        <q-card-actions align="right">
-          <q-btn
-            flat
-            :label="$t('common.actions.cancel')"
-            color="negative"
-            @click="onDialogCancel"
-          />
-          <q-btn
-            type="submit"
-            :label="$t('common.actions.save')"
-            :loading="loading"
-            color="primary"
-            :disable="!hasUpdatedFields"
-          />
-        </q-card-actions>
-      </q-form>
-    </q-card>
-  </q-dialog>
-</template>
-
-<script setup>
-import { ref, computed, onMounted } from 'vue'
-import { useDialogPluginComponent } from 'quasar'
-import { useI18n } from 'vue-i18n'
-import {
-  createProviderPaymentMethod,
-  updateProviderPaymentMethod
-} from 'src/api/providerPaymentMethod'
-import DefaultDialogHeader from 'src/components/defaults/DefaultDialogHeader.vue'
-import { useInputRules } from "src/composables/useInputRules";
-import { useFormUpdateTracker } from "src/composables/useFormUpdateTracker";
-import { useSubmitHandler } from "src/composables/useSubmitHandler";
-
-
-const { inputRules } = useInputRules();
-
-const props = defineProps({
-  paymentMethod: {
-    type: Object,
-    default: null
-  },
-  providerId: {
-    type: Number,
-    required: true
-  },
-  title: {
-    type: Function,
-    default: () => ''
-  }
-})
-
-const { t } = useI18n()
-const { dialogRef, onDialogHide, onDialogOK, onDialogCancel } = useDialogPluginComponent()
-
-
-defineEmits([...useDialogPluginComponent.emits])
-
-const formRef = ref(null);
-
-const accountTypeOptions = computed(() => [
-  {
-    label: t('provider_payment_methods.account_types.pix'),
-    value: 'pix'
-  },
-  {
-    label: t('provider_payment_methods.account_types.bank_account'),
-    value: 'bank_account'
-  }
-])
-
-const bankAccountTypeOptions = computed(() => [
-  {
-    label: t('provider_payment_methods.bank_account_types.checking'),
-    value: 'checking'
-  },
-  {
-    label: t('provider_payment_methods.bank_account_types.savings'),
-    value: 'savings'
-  }
-]);
-
-const { form, getUpdatedFields, hasUpdatedFields } = useFormUpdateTracker({
-  provider_id: props.providerId,
-  account_type: props.paymentMethod ? props.paymentMethod.account_type : null,
-  pix_key: props.paymentMethod ? props.paymentMethod.pix_key : null,
-  bank_account_type: props.paymentMethod ? props.paymentMethod.bank_account_type : null,
-  agency: props.paymentMethod ? props.paymentMethod.agency : null,
-  account: props.paymentMethod ? props.paymentMethod.account : null,
-  digit: props.paymentMethod ? props.paymentMethod.digit : null
-});
-
-const {
-  loading,
-  serverErrors,
-  execute: submitForm,
-} = useSubmitHandler({
-  onSuccess: () => onDialogOK(true),
-  formRef: formRef,
-});
-
-const onAccountTypeChange = () => {
-  if (form.account_type === 'pix') {
-    form.bank_account_type = null
-    form.agency = null
-    form.account = null
-    form.digit = null
-  } else if (form.account_type === 'bank_account') {
-    form.pix_key = null
-  }
-};
-
-const onOKClick = async () => {
-    const data = {
-        ...form,
-    };
-
-    if(props.paymentMethod) {
-        await submitForm(() => updateProviderPaymentMethod(getUpdatedFields.value, props.paymentMethod.id));
-    } else {
-        await submitForm(() => createProviderPaymentMethod(data));
-    }
-};
-
-onMounted(() => {
-  if (props.paymentMethod) {
-    form.value = {
-      provider_id: props.providerId,
-      account_type: props.paymentMethod.account_type,
-      pix_key: props.paymentMethod.pix_key,
-      bank_account_type: props.paymentMethod.bank_account_type,
-      agency: props.paymentMethod.agency,
-      account: props.paymentMethod.account,
-      digit: props.paymentMethod.digit
-    }
-  }
-})
-</script>

+ 84 - 0
src/pages/provider/components/ProviderBankAccountsPanel.vue

@@ -0,0 +1,84 @@
+<template>
+  <div class="q-pa-md">
+    <div class="text-grey-7 q-mb-sm">
+      {{ t('provider_bank_accounts.read_only_hint') }}
+    </div>
+
+    <DefaultTable
+      :columns="columns"
+      :api-call="() => getProviderBankAccounts(props.providerId)"
+      :add-item="false"
+      :mostrar-selecao-de-colunas="false"
+      :mostrar-botao-fullscreen="false"
+      :mostrar-toggle-inativos="false"
+    />
+  </div>
+</template>
+
+<script setup>
+import { computed } from 'vue'
+import { useI18n } from 'vue-i18n'
+import { getProviderBankAccounts } from 'src/api/providerBankAccount'
+import DefaultTable from 'src/components/defaults/DefaultTable.vue'
+
+const props = defineProps({
+  providerId: {
+    type: Number,
+    required: true
+  }
+})
+
+const { t } = useI18n()
+
+const columns = computed(() => [
+  {
+    name: 'is_primary',
+    label: t('provider_bank_accounts.primary'),
+    field: 'is_primary',
+    align: 'left',
+    sortable: true,
+    format: (val) => (val ? t('common.status.yes') : t('common.status.no'))
+  },
+  {
+    name: 'bank',
+    label: t('provider_bank_accounts.bank'),
+    field: (row) => [row.bank_code, row.bank_name].filter(Boolean).join(' - '),
+    align: 'left',
+    sortable: true
+  },
+  {
+    name: 'type',
+    label: t('provider_bank_accounts.account_type'),
+    field: 'type',
+    align: 'left',
+    sortable: true,
+    format: (val) => (val ? t(`provider_bank_accounts.account_types.${val}`) : '')
+  },
+  {
+    name: 'branch',
+    label: t('provider_bank_accounts.agency'),
+    field: (row) => [row.branch_number, row.branch_check_digit].filter(Boolean).join('-'),
+    align: 'left'
+  },
+  {
+    name: 'account',
+    label: t('provider_bank_accounts.account'),
+    field: (row) => [row.account_number, row.account_check_digit].filter(Boolean).join('-'),
+    align: 'left'
+  },
+  {
+    name: 'holder_name',
+    label: t('provider_bank_accounts.holder_name'),
+    field: 'holder_name',
+    align: 'left',
+    sortable: true
+  },
+  {
+    name: 'synced',
+    label: t('provider_bank_accounts.synced'),
+    field: 'synced',
+    align: 'left',
+    format: (val) => (val ? t('common.status.yes') : t('common.status.no'))
+  }
+])
+</script>

+ 0 - 137
src/pages/provider/components/ProviderPaymentMethodsPanel.vue

@@ -1,137 +0,0 @@
-<template>
-  <div class="q-pa-md">
-    <div>
-      <DefaultTable
-        ref="tableRef"
-        :columns="columns"
-        :api-call="() => getProviderPaymentMethods(props.providerId)"
-        :delete-function="deleteProviderPaymentMethod"
-        :mostrar-selecao-de-colunas="false"
-        :mostrar-botao-fullscreen="false"
-        :mostrar-toggle-inativos="false"
-        open-item
-        add-item
-        @on-row-click="onRowClick"
-        @on-add-item="onAddItem"
-      />
-    </div>
-  </div>
-</template>
-
-<script setup>
-import { ref, computed, defineAsyncComponent } from 'vue'
-import { useQuasar } from 'quasar'
-import { useI18n } from 'vue-i18n'
-import { getProviderPaymentMethods, deleteProviderPaymentMethod } from 'src/api/providerPaymentMethod'
-import { permissionStore } from 'src/stores/permission'
-import DefaultTable from 'src/components/defaults/DefaultTable.vue'
-
-const AddEditProviderPaymentMethodDialog = defineAsyncComponent(
-  () => import('./AddEditProviderPaymentMethodDialog.vue')
-)
-
-const props = defineProps({
-  providerId: {
-    type: Number,
-    required: true
-  }
-})
-
-const { t } = useI18n()
-const $q = useQuasar()
-const permission_store = permissionStore()
-
-const tableRef = ref(null)
-
-const columns = computed(() => [
-  {
-    name: 'account_type',
-    label: t('provider_payment_methods.account_type'),
-    field: 'account_type',
-    align: 'left',
-    sortable: true,
-    format: (val) => t(`provider_payment_methods.account_types.${val}`)
-  },
-  {
-    name: 'pix_key',
-    label: t('provider_payment_methods.pix_key'),
-    field: 'pix_key',
-    align: 'left',
-    sortable: true
-  },
-  {
-    name: 'bank_account_type',
-    label: t('provider_payment_methods.bank_account_type'),
-    field: 'bank_account_type',
-    align: 'left',
-    sortable: true,
-    format: (val) => val ? t(`provider_payment_methods.bank_account_types.${val}`) : ''
-  },
-  {
-    name: 'agency',
-    label: t('provider_payment_methods.agency'),
-    field: 'agency',
-    align: 'left',
-    sortable: true
-  },
-  {
-    name: 'account',
-    label: t('provider_payment_methods.account'),
-    field: 'account',
-    align: 'left',
-    sortable: true
-  },
-  {
-    name: 'actions',
-    label: t('common.terms.actions'),
-    align: 'center',
-    required: true
-  }
-])
-
-const onRowClick = ({ row }) => {
-  if (permission_store.getAccess('config.provider_payment_method', 'edit') === false) {
-    $q.loading.hide()
-    $q.notify({
-      type: 'negative',
-      message: t('validation.permissions.edit')
-    })
-    return
-  }
-  $q.dialog({
-    component: AddEditProviderPaymentMethodDialog,
-    componentProps: {
-      paymentMethod: row,
-      providerId: props.providerId,
-      title: () =>
-        useI18n().t('provider_payment_methods.edit_button')
-    }
-  }).onOk(async (success) => {
-    if (success) {
-      tableRef.value.refresh()
-    }
-  })
-}
-
-const onAddItem = () => {
-  if (permission_store.getAccess('config.provider_payment_method', 'add') === false) {
-    $q.loading.hide()
-    $q.notify({
-      type: 'negative',
-      message: t('validation.permissions.add')
-    })
-    return
-  }
-  $q.dialog({
-    component: AddEditProviderPaymentMethodDialog,
-    componentProps: {
-      title: () => useI18n().t('provider_payment_methods.add_button'),
-      providerId: props.providerId
-    }
-  }).onOk(async (success) => {
-    if (success) {
-      tableRef.value.refresh()
-    }
-  })
-}
-</script>