Просмотр исходного кода

feat: :sparkles: crud prestadores formas pagamento

crud prestadores formas pagamento
Gustavo Zanatta 1 месяц назад
Родитель
Сommit
8177f6168f

+ 26 - 0
src/api/providerPaymentMethod.js

@@ -0,0 +1,26 @@
+import api from "./index";
+
+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;
+};

+ 7 - 8
src/api/providerServicesType.js

@@ -1,17 +1,16 @@
 import api from "src/api";
 
 export const getProviderServiceTypes = async (providerId) => {
-  const response = await api.get(`/provider/service-types/${providerId}`)
-  return response.data
+  const { data } = await api.get(`/provider/service-types/${providerId}`)
+  return data.payload;
 }
 
-export const createProviderServiceType = async (providerId, data) => {
-    console.log(data)
-  const response = await api.post(`/provider/service-types/${providerId}`, data)
-  return response.data
+export const createProviderServiceType = async (providerId, info) => {
+  const { data } = await api.post(`/provider/service-types/${providerId}`, info)
+  return data.payload;
 }
 
 export const deleteProviderServiceType = async (providerId, id) => {
-  const response = await api.delete(`/provider/service-types/${providerId}/${id}`)
-  return response.data
+  const { data } = await api.delete(`/provider/service-types/${providerId}/${id}`)
+  return data.payload;
 }

+ 7 - 7
src/api/providerSpeciality.js

@@ -1,16 +1,16 @@
 import api from "src/api";
 
 export const getProviderSpecialities = async (providerId) => {
-  const response = await api.get(`/provider/specialities/${providerId}`)
-  return response.data
+  const { data } = await api.get(`/provider/specialities/${providerId}`)
+  return data.payload;
 }
 
-export const createProviderSpeciality = async (providerId, data) => {
-  const response = await api.post(`/provider/specialities/${providerId}`, data)
-  return response.data
+export const createProviderSpeciality = async (providerId, info) => {
+  const { data } = await api.post(`/provider/specialities/${providerId}`, info)
+  return data.payload;
 }
 
 export const deleteProviderSpeciality = async (providerId, id) => {
-  const response = await api.delete(`/provider/specialities/${providerId}/${id}`)
-  return response.data
+  const { data } = await api.delete(`/provider/specialities/${providerId}/${id}`)
+  return data.payload;
 }

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

@@ -331,6 +331,28 @@
     "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"
+    }
+  },
   "orders": {
     "singular": "Order",
     "plural": "Orders",

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

@@ -331,6 +331,28 @@
     "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"
+    }
+  },
   "orders": {
     "singular": "Pedido",
     "plural": "Pedidos",

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

@@ -331,6 +331,28 @@
     "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"
+    }
+  },
   "orders": {
     "singular": "Pedido",
     "plural": "Pedidos",

+ 6 - 1
src/pages/provider/components/AddEditProviderDialog.vue

@@ -6,6 +6,7 @@
       <q-tabs v-model="tab" dense 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-tabs>
 
       <q-separator v-if="provider" />
@@ -160,6 +161,10 @@
         <q-tab-panel v-if="provider" name="addresses">
           <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>
       </q-tab-panels>
     </q-card>
   </q-dialog>
@@ -173,7 +178,6 @@ import { createProvider, updateProvider } from "src/api/provider";
 import { useFormUpdateTracker } from "src/composables/useFormUpdateTracker";
 import { useSubmitHandler } from "src/composables/useSubmitHandler";
 import { dynamicCpfCnpjMask, validateCpfCnpj, calculateDailyPrices } from "src/helpers/utils";
-
 import DefaultDialogHeader from "src/components/defaults/DefaultDialogHeader.vue";
 import UserSelect from "src/components/user/UserSelect.vue";
 import DefaultInputDatePicker from "src/components/defaults/DefaultInputDatePicker.vue";
@@ -181,6 +185,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";
 
 defineEmits([
   ...useDialogPluginComponent.emits,

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

@@ -0,0 +1,209 @@
+<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>

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

@@ -0,0 +1,137 @@
+<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>

+ 1 - 2
src/pages/provider/components/ProviderServicesTypesPanel.vue

@@ -85,8 +85,7 @@ const loadProviderServiceTypes = async () => {
   try {
     loading.value = true
     const response = await getProviderServiceTypes(props.providerId)
-    console.log(response)
-    providerServiceTypes.value = response.payload || []
+    providerServiceTypes.value = response || []
   } catch (error) {
     console.error('Error loading provider service types:', error)
     $q.notify({

+ 1 - 1
src/pages/provider/components/ProviderSpecialitiesPanel.vue

@@ -85,7 +85,7 @@ const loadProviderSpecialities = async () => {
   try {
     loading.value = true
     const response = await getProviderSpecialities(props.providerId)
-    providerSpecialities.value = response.payload || []
+    providerSpecialities.value = response || []
   } catch (error) {
     console.error('Error loading provider specialities:', error)
     $q.notify({