ajuste do crud empresa
This commit is contained in:
parent
cb12483790
commit
bb33d0b20b
@ -1,5 +1,5 @@
|
||||
<template>
|
||||
<v-dialog v-model="isOpen" max-width="500px" @close="closeModal">
|
||||
<v-dialog v-model="isOpen" max-width="900px" @close="closeModal">
|
||||
<v-form @submit="handleSave">
|
||||
<v-card class="pa-6 rounded-xl elevation-2 card-modal">
|
||||
<v-card-title class="text-h5 font-weight-bold pb-0">
|
||||
@ -8,52 +8,58 @@
|
||||
<v-card-text>
|
||||
<v-container>
|
||||
<v-row>
|
||||
<v-text class="text-h7">Dados básicos</v-text>
|
||||
<v-col cols="12">
|
||||
<h3 class="text-body-1 text-grey-darken-1 pb-4">Dados Básicos</h3>
|
||||
</v-col>
|
||||
<v-col cols="12">
|
||||
<v-text-field v-model="localCompany.name" label="Nome da Empresa *" clearable required />
|
||||
</v-col>
|
||||
<v-col cols="12">
|
||||
<v-text-field v-model="localCompany.fantasy_name" label="Nome Fantasia" clearable />
|
||||
</v-col>
|
||||
<v-col cols="12">
|
||||
<v-col cols="12" md="6">
|
||||
<v-text-field v-model="localCompany.cnpj" label="CNPJ *" clearable required />
|
||||
</v-col>
|
||||
<v-col cols="12">
|
||||
<v-col cols="12" md="6">
|
||||
<v-text-field v-model="localCompany.type" label="Tipo" clearable />
|
||||
</v-col>
|
||||
<v-text class="text-h7">Contato</v-text>
|
||||
<v-col cols="12">
|
||||
<h3 class="text-body-1 text-grey-darken-1 pb-4">Contato</h3>
|
||||
</v-col>
|
||||
<v-col cols="12" md="6">
|
||||
<v-text-field v-model="localCompany.email" label="Email *" clearable required />
|
||||
</v-col>
|
||||
<v-col cols="12">
|
||||
<v-col cols="12" md="6">
|
||||
<v-text-field v-model="localCompany.email_sec" label="Email Secundário" clearable />
|
||||
</v-col>
|
||||
<v-col cols="12">
|
||||
<v-col cols="12" md="6">
|
||||
<v-text-field v-model="localCompany.phone" label="Telefone *" clearable required />
|
||||
</v-col>
|
||||
<v-col cols="12">
|
||||
<v-col cols="12" md="6">
|
||||
<v-text-field v-model="localCompany.phone_sec" label="Telefone Secundário" clearable />
|
||||
</v-col>
|
||||
<v-text class="text-h7">Endereço</v-text>
|
||||
<v-col cols="12">
|
||||
<h3 class="text-body-1 text-grey-darken-1 pb-4">Endereço</h3>
|
||||
</v-col>
|
||||
<v-col cols="12" md="4">
|
||||
<v-text-field v-model="localCompany.cep" label="CEP *" clearable />
|
||||
</v-col>
|
||||
<v-col cols="12">
|
||||
<v-col cols="12" md="8">
|
||||
<v-text-field v-model="localCompany.rua" label="Rua *" clearable />
|
||||
</v-col>
|
||||
<v-col cols="12">
|
||||
<v-col cols="12" md="4">
|
||||
<v-text-field v-model="localCompany.numero" label="Número *" clearable />
|
||||
</v-col>
|
||||
<v-col cols="12">
|
||||
<v-col cols="12"md="4">
|
||||
<v-text-field v-model="localCompany.bairro" label="Bairro *" clearable />
|
||||
</v-col>
|
||||
<v-col cols="12">
|
||||
<v-col cols="12" md="4">
|
||||
<v-text-field v-model="localCompany.complemento" label="Complemento" clearable />
|
||||
</v-col>
|
||||
<v-col cols="12">
|
||||
<v-col cols="12" md="6">
|
||||
<v-text-field v-model="localCompany.estado" label="Estado" clearable />
|
||||
</v-col>
|
||||
<v-col cols="12">
|
||||
<v-col cols="12" md="6">
|
||||
<v-text-field v-model="localCompany.cidade" label="Cidade" clearable />
|
||||
</v-col>
|
||||
</v-row>
|
||||
@ -162,8 +168,10 @@ const handleSave = async (e) => {
|
||||
e.preventDefault(); // Isso é um seguro extra
|
||||
try {
|
||||
const companyData = { ...localCompany.value };
|
||||
|
||||
if (!props.isEditMode) {
|
||||
delete companyData.id;
|
||||
console.log('Dados da empresa:', companyData);
|
||||
await companyStore.createCompany(companyData);
|
||||
} else {
|
||||
await companyStore.updateCompany(companyData.id, companyData);
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
<template>
|
||||
<v-dialog v-model="isOpen" max-width="500px" @close="closeModal">
|
||||
<v-dialog v-model="isOpen" max-width="900px" @close="closeModal">
|
||||
<v-form ref="form" v-model="formValid">
|
||||
<v-card class="pa-6 rounded-xl elevation-2 card-modal">
|
||||
<v-card-title class="text-h5 font-weight-bold pb-0">
|
||||
@ -8,116 +8,59 @@
|
||||
<v-card-text>
|
||||
<v-container>
|
||||
<v-row>
|
||||
<v-text class="text-h7">Dados básicos</v-text>
|
||||
<v-col cols="12">
|
||||
<v-text-field
|
||||
v-model="localCompany.name"
|
||||
label="Nome da Empresa *"
|
||||
clearable
|
||||
:rules="[rules.required]"
|
||||
required
|
||||
/>
|
||||
<h3 class="text-body-1 text-grey-darken-1 pb-4">Dados Básicos</h3>
|
||||
</v-col>
|
||||
<v-col cols="12">
|
||||
<v-text-field
|
||||
v-model="localCompany.fantasy_name"
|
||||
label="Nome Fantasia *"
|
||||
clearable
|
||||
:rules="[rules.required]"
|
||||
required
|
||||
/>
|
||||
<v-text-field v-model="localCompany.name" label="Nome da Empresa *" clearable :rules="[rules.required]" required />
|
||||
</v-col>
|
||||
<v-col cols="12">
|
||||
<v-text-field
|
||||
v-model="localCompany.cnpj"
|
||||
label="CNPJ *"
|
||||
clearable
|
||||
:rules="[rules.required]"
|
||||
required
|
||||
/>
|
||||
<v-text-field v-model="localCompany.fantasy_name" label="Nome Fantasia" clearable :rules="[rules.required]" required />
|
||||
</v-col>
|
||||
<v-col cols="12" md="6">
|
||||
<v-text-field v-model="localCompany.cnpj" label="CNPJ *" clearable :rules="[rules.required]" required />
|
||||
</v-col>
|
||||
<v-col cols="12" md="6">
|
||||
<v-text-field v-model="localCompany.type" label="Tipo" clearable :rules="[rules.required]" required />
|
||||
</v-col>
|
||||
<v-col cols="12">
|
||||
<v-text-field
|
||||
v-model="localCompany.type"
|
||||
label="Tipo *"
|
||||
clearable
|
||||
:rules="[rules.required]"
|
||||
required
|
||||
/>
|
||||
<h3 class="text-body-1 text-grey-darken-1 pb-4">Contato</h3>
|
||||
</v-col>
|
||||
<v-col cols="12" md="6">
|
||||
<v-text-field v-model="localCompany.email" label="Email *" clearable required :rules="[rules.required, rules.email]"/>
|
||||
</v-col>
|
||||
<v-text class="text-h7">Contato</v-text>
|
||||
<v-col cols="12">
|
||||
<v-text-field
|
||||
v-model="localCompany.email"
|
||||
label="Email *"
|
||||
clearable
|
||||
:rules="[rules.required, rules.email]"
|
||||
required
|
||||
/>
|
||||
<v-col cols="12" md="6">
|
||||
<v-text-field v-model="localCompany.email_sec" label="Email Secundário" clearable :rules="[rules.required, rules.email]" required/>
|
||||
</v-col>
|
||||
<v-col cols="12" md="6">
|
||||
<v-text-field v-model="localCompany.phone" label="Telefone *" clearable required :rules="[rules.required]" />
|
||||
</v-col>
|
||||
<v-col cols="12" md="6">
|
||||
<v-text-field v-model="localCompany.phone_sec" label="Telefone Secundário" clearable :rules="[rules.required]" required />
|
||||
</v-col>
|
||||
<v-col cols="12">
|
||||
<v-text-field
|
||||
v-model="localCompany.phone"
|
||||
label="Telefone *"
|
||||
clearable
|
||||
:rules="[rules.required]"
|
||||
required
|
||||
/>
|
||||
<h3 class="text-body-1 text-grey-darken-1 pb-4">Endereço</h3>
|
||||
</v-col>
|
||||
<v-text class="text-h7">Endereço</v-text>
|
||||
<v-col cols="12">
|
||||
<v-text-field
|
||||
v-model="localCompany.cep"
|
||||
label="CEP *"
|
||||
clearable
|
||||
:rules="[rules.required]"
|
||||
required
|
||||
/>
|
||||
<v-col cols="12" md="4">
|
||||
<v-text-field v-model="localCompany.cep" label="CEP *" clearable :rules="[rules.required]" required />
|
||||
</v-col>
|
||||
<v-col cols="12">
|
||||
<v-text-field
|
||||
v-model="localCompany.rua"
|
||||
label="Rua *"
|
||||
clearable
|
||||
:rules="[rules.required]"
|
||||
required
|
||||
/>
|
||||
<v-col cols="12" md="8">
|
||||
<v-text-field v-model="localCompany.rua" label="Rua *" clearable :rules="[rules.required]" required/>
|
||||
</v-col>
|
||||
<v-col cols="12">
|
||||
<v-text-field
|
||||
v-model="localCompany.numero"
|
||||
label="Número *"
|
||||
clearable
|
||||
:rules="[rules.required]"
|
||||
required
|
||||
/>
|
||||
<v-col cols="12" md="4">
|
||||
<v-text-field v-model="localCompany.numero" label="Número *" clearable :rules="[rules.required]" required />
|
||||
</v-col>
|
||||
<v-col cols="12">
|
||||
<v-text-field
|
||||
v-model="localCompany.bairro"
|
||||
label="Bairro *"
|
||||
clearable
|
||||
:rules="[rules.required]"
|
||||
required
|
||||
/>
|
||||
<v-col cols="12"md="4">
|
||||
<v-text-field v-model="localCompany.bairro" label="Bairro *" clearable :rules="[rules.required]" required/>
|
||||
</v-col>
|
||||
<v-col cols="12">
|
||||
<v-text-field
|
||||
v-model="localCompany.estado"
|
||||
label="Estado *"
|
||||
clearable
|
||||
:rules="[rules.required]"
|
||||
required
|
||||
/>
|
||||
<v-col cols="12" md="4">
|
||||
<v-text-field v-model="localCompany.complemento" label="Complemento" clearable :rules="[rules.required]" required/>
|
||||
</v-col>
|
||||
<v-col cols="12">
|
||||
<v-text-field
|
||||
v-model="localCompany.cidade"
|
||||
label="Cidade *"
|
||||
clearable
|
||||
:rules="[rules.required]"
|
||||
required
|
||||
/>
|
||||
<v-col cols="12" md="6">
|
||||
<v-text-field v-model="localCompany.estado" label="Estado" clearable :rules="[rules.required]" required/>
|
||||
</v-col>
|
||||
<v-col cols="12" md="6">
|
||||
<v-text-field v-model="localCompany.cidade" label="Cidade" clearable :rules="[rules.required]" required />
|
||||
</v-col>
|
||||
</v-row>
|
||||
</v-container>
|
||||
@ -144,6 +87,7 @@
|
||||
import { ref, watch } from 'vue';
|
||||
import { useCompanyStore } from '../../stores/company';
|
||||
import { useAuthStore } from '../../stores/auth';
|
||||
import {useServiceInstanceStore} from '../../stores/service_instance';
|
||||
|
||||
const props = defineProps({
|
||||
isModalOpen: Boolean,
|
||||
@ -153,19 +97,23 @@ const emit = defineEmits(['update:isModalOpen', 'company-created']);
|
||||
const isOpen = ref(false);
|
||||
const companyStore = useCompanyStore();
|
||||
const authStore = useAuthStore();
|
||||
|
||||
const serviceInstanceStore = useServiceInstanceStore();
|
||||
const localCompany = ref({
|
||||
id: null,
|
||||
name: '',
|
||||
fantasy_name: '',
|
||||
type: '',
|
||||
cnpj: '',
|
||||
email: '',
|
||||
email_sec: '',
|
||||
phone: '',
|
||||
phone_sec: '',
|
||||
estado: '',
|
||||
cidade: '',
|
||||
bairro: '',
|
||||
rua: '',
|
||||
numero: '',
|
||||
complemento: '',
|
||||
cep: '',
|
||||
service_instance_id: authStore.service_instance_id || 2,
|
||||
parent_id: authStore.userId,
|
||||
@ -184,17 +132,21 @@ watch(() => props.isModalOpen, (newVal) => {
|
||||
isOpen.value = newVal;
|
||||
if (newVal) {
|
||||
Object.assign(localCompany.value, {
|
||||
id: null,
|
||||
name: '',
|
||||
fantasy_name: '',
|
||||
type: '',
|
||||
cnpj: '',
|
||||
email: '',
|
||||
email_sec: '',
|
||||
phone: '',
|
||||
phone_sec: '',
|
||||
estado: '',
|
||||
cidade: '',
|
||||
bairro: '',
|
||||
rua: '',
|
||||
numero: '',
|
||||
complemento: '',
|
||||
cep: '',
|
||||
service_instance_id: authStore.service_instance_id || 2,
|
||||
parent_id: authStore.userId,
|
||||
@ -212,10 +164,22 @@ const closeModal = () => {
|
||||
isOpen.value = false;
|
||||
};
|
||||
|
||||
const formatCompanyData = () => {
|
||||
const now = new Date().toISOString(); // gera data atual no formato ISO
|
||||
|
||||
return {
|
||||
name: localCompany.value.name,
|
||||
description: localCompany.value.fantasy_name,
|
||||
service_id: 1,
|
||||
};
|
||||
};
|
||||
|
||||
const validateAndSave = async () => {
|
||||
if (form.value.validate()) {
|
||||
try {
|
||||
const formattedCompany = formatCompanyData();
|
||||
await companyStore.createCompany(localCompany.value);
|
||||
await serviceInstanceStore.createServiceInstance(formattedCompany);
|
||||
emit('company-created');
|
||||
closeModal();
|
||||
} catch (error) {
|
||||
|
||||
@ -85,10 +85,10 @@
|
||||
<v-select v-model="localUser.empresa" :items="empresas" label="Empresa" clearable />
|
||||
</v-col>
|
||||
<v-col cols="12" md="6">
|
||||
<v-select v-model="localUser.cargo" :items="cargos" label="Cargo" clearable />
|
||||
<v-select v-model="localUser.cargo" :items="cargos" :disabled="true" label="Cargo" clearable />
|
||||
</v-col>
|
||||
<v-col cols="12" md="6">
|
||||
<v-select v-model="localUser.setor" :items="setores" label="Setor" clearable />
|
||||
<v-select v-model="localUser.setor" :items="setores" :disabled="true" label="Setor" clearable />
|
||||
</v-col>
|
||||
<v-col cols="12" md="6">
|
||||
<v-select v-model="localUser.escala" :items="escalas" label="Escala" clearable />
|
||||
|
||||
@ -61,7 +61,7 @@ export const useCompanyStore = defineStore('company', {
|
||||
const url = '/company/';
|
||||
this.loading = true;
|
||||
this.error = null;
|
||||
|
||||
console.log('Dados da empresa:', companyData);
|
||||
try {
|
||||
const response = await api.post(url, companyData, {
|
||||
headers: {
|
||||
|
||||
135
src/stores/service_instance.js
Normal file
135
src/stores/service_instance.js
Normal file
@ -0,0 +1,135 @@
|
||||
import { defineStore } from 'pinia';
|
||||
import api from '../services/api';
|
||||
import router from '../routes/router';
|
||||
import { useAuthStore } from './auth';
|
||||
import { ca } from 'date-fns/locale';
|
||||
|
||||
export const useServiceInstanceStore = defineStore('servic_instance', {
|
||||
state: () => ({
|
||||
service_instance: [],
|
||||
total: 0,
|
||||
page: 1,
|
||||
perPage: 10,
|
||||
error: null,
|
||||
loading: false,
|
||||
}),
|
||||
|
||||
getters: {
|
||||
currentPage(state) {
|
||||
return state.page;
|
||||
},
|
||||
totalPages(state) {
|
||||
return Math.ceil(state.total / state.perPage);
|
||||
},
|
||||
},
|
||||
|
||||
actions: {
|
||||
/**
|
||||
* Busca os turnos (shifts) registrados na API
|
||||
*/
|
||||
async fetchServiceInstance() {
|
||||
this.loading = true;
|
||||
this.error = null;
|
||||
|
||||
try {
|
||||
const response = await api.get('/service_instance/', {
|
||||
params: {}
|
||||
})
|
||||
|
||||
return response.data;
|
||||
} catch (error) {
|
||||
const status = error?.response?.status;
|
||||
|
||||
if (status === 401) {
|
||||
console.warn('Não autorizado. Redirecionando para login...');
|
||||
router.push('/login');
|
||||
}
|
||||
|
||||
this.error = error?.response?.data?.message || error.message || 'Erro ao buscar turnos';
|
||||
console.error('Erro ao buscar turnos', error);
|
||||
throw error;
|
||||
} finally {
|
||||
this.loading = false;
|
||||
}
|
||||
},
|
||||
/**
|
||||
* Busca o ID da instância de serviço pelo nome
|
||||
*/
|
||||
async fetchServiceInstanceIdByName(nome) {
|
||||
this.loading = true;
|
||||
this.error = null;
|
||||
|
||||
try {
|
||||
const response = await api.get(`/service_instance/get-id-by-name/${nome}`, {
|
||||
headers: {
|
||||
'Content-Type': 'application/json'
|
||||
}
|
||||
});
|
||||
|
||||
return response.data.id;
|
||||
} catch (error) {
|
||||
const status = error?.response?.status;
|
||||
|
||||
if (status === 401) {
|
||||
console.warn('Não autorizado. Redirecionando para login...');
|
||||
router.push('/login');
|
||||
}
|
||||
|
||||
this.error = error?.response?.data?.message || error.message || 'Erro ao buscar ID da instância de serviço';
|
||||
console.error('Erro ao buscar ID da instância de serviço', error);
|
||||
throw error;
|
||||
} finally {
|
||||
this.loading = false;
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
/**
|
||||
* Busca um turno específico pelo ID
|
||||
*/
|
||||
async createServiceInstance(service_instance) {
|
||||
const url = '/service_instance/';
|
||||
this.loading = true;
|
||||
this.error = null;
|
||||
|
||||
try {
|
||||
const response = await api.post(url, service_instance, {
|
||||
headers: {
|
||||
'Content-Type': 'application/json'
|
||||
}
|
||||
});
|
||||
|
||||
this.service_instance.push(response.data);
|
||||
return response.data;
|
||||
} catch (error) {
|
||||
this.error = error?.response?.data?.message || error.message || 'Erro ao criar turno';
|
||||
console.error('Erro ao criar turno', error);
|
||||
throw error;
|
||||
} finally {
|
||||
this.loading = false;
|
||||
}
|
||||
},
|
||||
async deleteServiceInstance(service_instance_id) {
|
||||
this.loading = true;
|
||||
this.error = null;
|
||||
|
||||
try {
|
||||
const response = await api.delete(`/service_instance/${service_instance_id}`);
|
||||
return response.data;
|
||||
} catch (error) {
|
||||
const status = error?.response?.status;
|
||||
|
||||
if (status === 401) {
|
||||
console.warn('Não autorizado. Redirecionando para login...');
|
||||
router.push('/login');
|
||||
}
|
||||
|
||||
this.error = error?.response?.data?.message || error.message || 'Erro ao deletar instância de serviço';
|
||||
console.error('Erro ao deletar instância de serviço', error);
|
||||
throw error;
|
||||
} finally {
|
||||
this.loading = false;
|
||||
}
|
||||
}
|
||||
},
|
||||
});
|
||||
@ -145,6 +145,7 @@
|
||||
import CompanyModal from '../components/modals/CompanyModal.vue';
|
||||
import CompanyModayCreate from '../components/modals/CompanyModalCreate.vue';
|
||||
import { useCompanyStore } from '../stores/company';
|
||||
import { useServiceInstanceStore } from '../stores/service_instance';
|
||||
|
||||
export default {
|
||||
name: 'CompanyManagement',
|
||||
@ -154,7 +155,7 @@
|
||||
},
|
||||
setup() {
|
||||
const router = useRouter();
|
||||
|
||||
const serviceInstanceStore = useServiceInstanceStore();
|
||||
// Estados
|
||||
const isCreateModalOpen = ref(false);
|
||||
const isEditing = ref(false);
|
||||
@ -435,6 +436,9 @@
|
||||
|
||||
// Faz a requisição para deletar
|
||||
await companyStore.deleteCompany(companyId);
|
||||
const service_instance_id = await serviceInstanceStore.fetchServiceInstanceIdByName(itemToDelete.value.name);''
|
||||
console.log(`Serviço de instância excluído com ID: ${service_instance_id}`);
|
||||
await serviceInstanceStore.deleteServiceInstance(service_instance_id);
|
||||
|
||||
// Remover o item diretamente da lista local
|
||||
// Esta é uma abordagem mais direta e imediata
|
||||
|
||||
Loading…
Reference in New Issue
Block a user