ajuste do crud empresa

This commit is contained in:
ka-lucas 2025-04-27 16:45:37 -03:00
parent cb12483790
commit bb33d0b20b
6 changed files with 226 additions and 115 deletions

View File

@ -1,5 +1,5 @@
<template> <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-form @submit="handleSave">
<v-card class="pa-6 rounded-xl elevation-2 card-modal"> <v-card class="pa-6 rounded-xl elevation-2 card-modal">
<v-card-title class="text-h5 font-weight-bold pb-0"> <v-card-title class="text-h5 font-weight-bold pb-0">
@ -8,52 +8,58 @@
<v-card-text> <v-card-text>
<v-container> <v-container>
<v-row> <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-col cols="12">
<v-text-field v-model="localCompany.name" label="Nome da Empresa *" clearable required /> <v-text-field v-model="localCompany.name" label="Nome da Empresa *" clearable required />
</v-col> </v-col>
<v-col cols="12"> <v-col cols="12">
<v-text-field v-model="localCompany.fantasy_name" label="Nome Fantasia" clearable /> <v-text-field v-model="localCompany.fantasy_name" label="Nome Fantasia" clearable />
</v-col> </v-col>
<v-col cols="12"> <v-col cols="12" md="6">
<v-text-field v-model="localCompany.cnpj" label="CNPJ *" clearable required /> <v-text-field v-model="localCompany.cnpj" label="CNPJ *" clearable required />
</v-col> </v-col>
<v-col cols="12"> <v-col cols="12" md="6">
<v-text-field v-model="localCompany.type" label="Tipo" clearable /> <v-text-field v-model="localCompany.type" label="Tipo" clearable />
</v-col> </v-col>
<v-text class="text-h7">Contato</v-text>
<v-col cols="12"> <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-text-field v-model="localCompany.email" label="Email *" clearable required />
</v-col> </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-text-field v-model="localCompany.email_sec" label="Email Secundário" clearable />
</v-col> </v-col>
<v-col cols="12"> <v-col cols="12" md="6">
<v-text-field v-model="localCompany.phone" label="Telefone *" clearable required /> <v-text-field v-model="localCompany.phone" label="Telefone *" clearable required />
</v-col> </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-text-field v-model="localCompany.phone_sec" label="Telefone Secundário" clearable />
</v-col> </v-col>
<v-text class="text-h7">Endereço</v-text>
<v-col cols="12"> <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-text-field v-model="localCompany.cep" label="CEP *" clearable />
</v-col> </v-col>
<v-col cols="12"> <v-col cols="12" md="8">
<v-text-field v-model="localCompany.rua" label="Rua *" clearable /> <v-text-field v-model="localCompany.rua" label="Rua *" clearable />
</v-col> </v-col>
<v-col cols="12"> <v-col cols="12" md="4">
<v-text-field v-model="localCompany.numero" label="Número *" clearable /> <v-text-field v-model="localCompany.numero" label="Número *" clearable />
</v-col> </v-col>
<v-col cols="12"> <v-col cols="12"md="4">
<v-text-field v-model="localCompany.bairro" label="Bairro *" clearable /> <v-text-field v-model="localCompany.bairro" label="Bairro *" clearable />
</v-col> </v-col>
<v-col cols="12"> <v-col cols="12" md="4">
<v-text-field v-model="localCompany.complemento" label="Complemento" clearable /> <v-text-field v-model="localCompany.complemento" label="Complemento" clearable />
</v-col> </v-col>
<v-col cols="12"> <v-col cols="12" md="6">
<v-text-field v-model="localCompany.estado" label="Estado" clearable /> <v-text-field v-model="localCompany.estado" label="Estado" clearable />
</v-col> </v-col>
<v-col cols="12"> <v-col cols="12" md="6">
<v-text-field v-model="localCompany.cidade" label="Cidade" clearable /> <v-text-field v-model="localCompany.cidade" label="Cidade" clearable />
</v-col> </v-col>
</v-row> </v-row>
@ -162,8 +168,10 @@ const handleSave = async (e) => {
e.preventDefault(); // Isso é um seguro extra e.preventDefault(); // Isso é um seguro extra
try { try {
const companyData = { ...localCompany.value }; const companyData = { ...localCompany.value };
if (!props.isEditMode) { if (!props.isEditMode) {
delete companyData.id; delete companyData.id;
console.log('Dados da empresa:', companyData);
await companyStore.createCompany(companyData); await companyStore.createCompany(companyData);
} else { } else {
await companyStore.updateCompany(companyData.id, companyData); await companyStore.updateCompany(companyData.id, companyData);

View File

@ -1,5 +1,5 @@
<template> <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-form ref="form" v-model="formValid">
<v-card class="pa-6 rounded-xl elevation-2 card-modal"> <v-card class="pa-6 rounded-xl elevation-2 card-modal">
<v-card-title class="text-h5 font-weight-bold pb-0"> <v-card-title class="text-h5 font-weight-bold pb-0">
@ -8,116 +8,59 @@
<v-card-text> <v-card-text>
<v-container> <v-container>
<v-row> <v-row>
<v-text class="text-h7">Dados básicos</v-text>
<v-col cols="12"> <v-col cols="12">
<v-text-field <h3 class="text-body-1 text-grey-darken-1 pb-4">Dados Básicos</h3>
v-model="localCompany.name"
label="Nome da Empresa *"
clearable
:rules="[rules.required]"
required
/>
</v-col> </v-col>
<v-col cols="12"> <v-col cols="12">
<v-text-field <v-text-field v-model="localCompany.name" label="Nome da Empresa *" clearable :rules="[rules.required]" required />
v-model="localCompany.fantasy_name"
label="Nome Fantasia *"
clearable
:rules="[rules.required]"
required
/>
</v-col> </v-col>
<v-col cols="12"> <v-col cols="12">
<v-text-field <v-text-field v-model="localCompany.fantasy_name" label="Nome Fantasia" clearable :rules="[rules.required]" required />
v-model="localCompany.cnpj" </v-col>
label="CNPJ *" <v-col cols="12" md="6">
clearable <v-text-field v-model="localCompany.cnpj" label="CNPJ *" clearable :rules="[rules.required]" required />
:rules="[rules.required]" </v-col>
required <v-col cols="12" md="6">
/> <v-text-field v-model="localCompany.type" label="Tipo" clearable :rules="[rules.required]" required />
</v-col> </v-col>
<v-col cols="12"> <v-col cols="12">
<v-text-field <h3 class="text-body-1 text-grey-darken-1 pb-4">Contato</h3>
v-model="localCompany.type"
label="Tipo *"
clearable
:rules="[rules.required]"
required
/>
</v-col> </v-col>
<v-text class="text-h7">Contato</v-text> <v-col cols="12" md="6">
<v-col cols="12"> <v-text-field v-model="localCompany.email" label="Email *" clearable required :rules="[rules.required, rules.email]"/>
<v-text-field </v-col>
v-model="localCompany.email" <v-col cols="12" md="6">
label="Email *" <v-text-field v-model="localCompany.email_sec" label="Email Secundário" clearable :rules="[rules.required, rules.email]" required/>
clearable </v-col>
:rules="[rules.required, rules.email]" <v-col cols="12" md="6">
required <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>
<v-col cols="12"> <v-col cols="12">
<v-text-field <h3 class="text-body-1 text-grey-darken-1 pb-4">Endereço</h3>
v-model="localCompany.phone"
label="Telefone *"
clearable
:rules="[rules.required]"
required
/>
</v-col> </v-col>
<v-text class="text-h7">Endereço</v-text> <v-col cols="12" md="4">
<v-col cols="12"> <v-text-field v-model="localCompany.cep" label="CEP *" clearable :rules="[rules.required]" required />
<v-text-field
v-model="localCompany.cep"
label="CEP *"
clearable
:rules="[rules.required]"
required
/>
</v-col> </v-col>
<v-col cols="12"> <v-col cols="12" md="8">
<v-text-field <v-text-field v-model="localCompany.rua" label="Rua *" clearable :rules="[rules.required]" required/>
v-model="localCompany.rua"
label="Rua *"
clearable
:rules="[rules.required]"
required
/>
</v-col> </v-col>
<v-col cols="12"> <v-col cols="12" md="4">
<v-text-field <v-text-field v-model="localCompany.numero" label="Número *" clearable :rules="[rules.required]" required />
v-model="localCompany.numero"
label="Número *"
clearable
:rules="[rules.required]"
required
/>
</v-col> </v-col>
<v-col cols="12"> <v-col cols="12"md="4">
<v-text-field <v-text-field v-model="localCompany.bairro" label="Bairro *" clearable :rules="[rules.required]" required/>
v-model="localCompany.bairro"
label="Bairro *"
clearable
:rules="[rules.required]"
required
/>
</v-col> </v-col>
<v-col cols="12"> <v-col cols="12" md="4">
<v-text-field <v-text-field v-model="localCompany.complemento" label="Complemento" clearable :rules="[rules.required]" required/>
v-model="localCompany.estado"
label="Estado *"
clearable
:rules="[rules.required]"
required
/>
</v-col> </v-col>
<v-col cols="12"> <v-col cols="12" md="6">
<v-text-field <v-text-field v-model="localCompany.estado" label="Estado" clearable :rules="[rules.required]" required/>
v-model="localCompany.cidade" </v-col>
label="Cidade *" <v-col cols="12" md="6">
clearable <v-text-field v-model="localCompany.cidade" label="Cidade" clearable :rules="[rules.required]" required />
:rules="[rules.required]"
required
/>
</v-col> </v-col>
</v-row> </v-row>
</v-container> </v-container>
@ -144,6 +87,7 @@
import { ref, watch } from 'vue'; import { ref, watch } from 'vue';
import { useCompanyStore } from '../../stores/company'; import { useCompanyStore } from '../../stores/company';
import { useAuthStore } from '../../stores/auth'; import { useAuthStore } from '../../stores/auth';
import {useServiceInstanceStore} from '../../stores/service_instance';
const props = defineProps({ const props = defineProps({
isModalOpen: Boolean, isModalOpen: Boolean,
@ -153,19 +97,23 @@ const emit = defineEmits(['update:isModalOpen', 'company-created']);
const isOpen = ref(false); const isOpen = ref(false);
const companyStore = useCompanyStore(); const companyStore = useCompanyStore();
const authStore = useAuthStore(); const authStore = useAuthStore();
const serviceInstanceStore = useServiceInstanceStore();
const localCompany = ref({ const localCompany = ref({
id: null,
name: '', name: '',
fantasy_name: '', fantasy_name: '',
type: '', type: '',
cnpj: '', cnpj: '',
email: '', email: '',
email_sec: '',
phone: '', phone: '',
phone_sec: '',
estado: '', estado: '',
cidade: '', cidade: '',
bairro: '', bairro: '',
rua: '', rua: '',
numero: '', numero: '',
complemento: '',
cep: '', cep: '',
service_instance_id: authStore.service_instance_id || 2, service_instance_id: authStore.service_instance_id || 2,
parent_id: authStore.userId, parent_id: authStore.userId,
@ -184,17 +132,21 @@ watch(() => props.isModalOpen, (newVal) => {
isOpen.value = newVal; isOpen.value = newVal;
if (newVal) { if (newVal) {
Object.assign(localCompany.value, { Object.assign(localCompany.value, {
id: null,
name: '', name: '',
fantasy_name: '', fantasy_name: '',
type: '', type: '',
cnpj: '', cnpj: '',
email: '', email: '',
email_sec: '',
phone: '', phone: '',
phone_sec: '',
estado: '', estado: '',
cidade: '', cidade: '',
bairro: '', bairro: '',
rua: '', rua: '',
numero: '', numero: '',
complemento: '',
cep: '', cep: '',
service_instance_id: authStore.service_instance_id || 2, service_instance_id: authStore.service_instance_id || 2,
parent_id: authStore.userId, parent_id: authStore.userId,
@ -212,10 +164,22 @@ const closeModal = () => {
isOpen.value = false; 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 () => { const validateAndSave = async () => {
if (form.value.validate()) { if (form.value.validate()) {
try { try {
const formattedCompany = formatCompanyData();
await companyStore.createCompany(localCompany.value); await companyStore.createCompany(localCompany.value);
await serviceInstanceStore.createServiceInstance(formattedCompany);
emit('company-created'); emit('company-created');
closeModal(); closeModal();
} catch (error) { } catch (error) {

View File

@ -85,10 +85,10 @@
<v-select v-model="localUser.empresa" :items="empresas" label="Empresa" clearable /> <v-select v-model="localUser.empresa" :items="empresas" label="Empresa" clearable />
</v-col> </v-col>
<v-col cols="12" md="6"> <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>
<v-col cols="12" md="6"> <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>
<v-col cols="12" md="6"> <v-col cols="12" md="6">
<v-select v-model="localUser.escala" :items="escalas" label="Escala" clearable /> <v-select v-model="localUser.escala" :items="escalas" label="Escala" clearable />

View File

@ -61,7 +61,7 @@ export const useCompanyStore = defineStore('company', {
const url = '/company/'; const url = '/company/';
this.loading = true; this.loading = true;
this.error = null; this.error = null;
console.log('Dados da empresa:', companyData);
try { try {
const response = await api.post(url, companyData, { const response = await api.post(url, companyData, {
headers: { headers: {

View 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;
}
}
},
});

View File

@ -145,6 +145,7 @@
import CompanyModal from '../components/modals/CompanyModal.vue'; import CompanyModal from '../components/modals/CompanyModal.vue';
import CompanyModayCreate from '../components/modals/CompanyModalCreate.vue'; import CompanyModayCreate from '../components/modals/CompanyModalCreate.vue';
import { useCompanyStore } from '../stores/company'; import { useCompanyStore } from '../stores/company';
import { useServiceInstanceStore } from '../stores/service_instance';
export default { export default {
name: 'CompanyManagement', name: 'CompanyManagement',
@ -154,7 +155,7 @@
}, },
setup() { setup() {
const router = useRouter(); const router = useRouter();
const serviceInstanceStore = useServiceInstanceStore();
// Estados // Estados
const isCreateModalOpen = ref(false); const isCreateModalOpen = ref(false);
const isEditing = ref(false); const isEditing = ref(false);
@ -435,6 +436,9 @@
// Faz a requisição para deletar // Faz a requisição para deletar
await companyStore.deleteCompany(companyId); 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 // Remover o item diretamente da lista local
// Esta é uma abordagem mais direta e imediata // Esta é uma abordagem mais direta e imediata