UnitDataTab.vue 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284
  1. <template>
  2. <div class="q-pa-md">
  3. <q-form ref="formRef">
  4. <div class="column justify-center items-center q-mb-lg">
  5. <AvatarImageComponent ref="avatarRef" @update:file="onAvatarChange" />
  6. <div class="row full-width q-mt-md q-col-gutter-sm">
  7. <DefaultInput
  8. v-model="form.social_reason"
  9. label="Razão Social"
  10. class="col-12"
  11. outlined
  12. :rules="[inputRules.required]"
  13. />
  14. <DefaultInput
  15. v-model="form.fantasy_name"
  16. label="Nome Fantasia"
  17. class="col-12"
  18. outlined
  19. :rules="[inputRules.required]"
  20. />
  21. <DefaultInput
  22. v-model="form.cnpj"
  23. label="CNPJ"
  24. class="col-4"
  25. outlined
  26. :mask="masks.Brasil.cnpj"
  27. :rules="[inputRules.required, inputRules.cnpj]"
  28. />
  29. <DefaultInput
  30. v-model="form.state_registration"
  31. label="Inscrição Estadual"
  32. class="col-4"
  33. outlined
  34. />
  35. <DefaultInput
  36. v-model="form.name_responsible"
  37. label="Responsável"
  38. class="col-4"
  39. outlined
  40. :rules="[inputRules.required]"
  41. />
  42. <DefaultCepInput
  43. v-model="form.postal_code"
  44. class="col-3"
  45. outlined
  46. :rules="[inputRules.required]"
  47. @rua="form.street = $event"
  48. @bairro="form.neighborhood = $event"
  49. @uf="stateSelectRef?.selectStateByCode($event)"
  50. @cidade="citySelectRef?.selectCityByName($event)"
  51. />
  52. <DefaultInput
  53. v-model="form.street"
  54. label="Endereço"
  55. class="col-6"
  56. outlined
  57. :rules="[inputRules.required]"
  58. />
  59. <DefaultInput
  60. v-model="form.address_number"
  61. label="Número"
  62. class="col-3"
  63. outlined
  64. />
  65. <DefaultInput
  66. v-model="form.neighborhood"
  67. label="Bairro"
  68. class="col-4"
  69. outlined
  70. :rules="[inputRules.required]"
  71. />
  72. <StateSelect
  73. ref="stateSelectRef"
  74. v-model="selectedState"
  75. label="Estado"
  76. class="col-4"
  77. outlined
  78. :rules="[inputRules.required]"
  79. />
  80. <CitySelect
  81. ref="citySelectRef"
  82. v-model="selectedCity"
  83. label="Cidade"
  84. class="col-4"
  85. outlined
  86. :state="selectedState"
  87. :rules="[inputRules.required]"
  88. />
  89. <DefaultInput
  90. v-model="form.complement"
  91. label="Complemento"
  92. class="col-12"
  93. outlined
  94. />
  95. <DefaultInput
  96. v-model="form.email"
  97. label="E-mail Principal"
  98. class="col-6"
  99. outlined
  100. :rules="[inputRules.required, inputRules.email]"
  101. />
  102. <DefaultInput
  103. v-model="form.secondary_email"
  104. label="E-mail Secundário"
  105. class="col-6"
  106. outlined
  107. :rules="[inputRules.email]"
  108. />
  109. <DefaultInput
  110. v-model="form.phone_number"
  111. label="Telefone"
  112. class="col-6"
  113. outlined
  114. :mask="masks.Brasil.telefone"
  115. :rules="[inputRules.required]"
  116. />
  117. <DefaultInput
  118. v-model="form.cell_number"
  119. label="Celular"
  120. class="col-6"
  121. outlined
  122. :mask="masks.Brasil.celular"
  123. />
  124. </div>
  125. <div class="row justify-end q-mt-md items-end full-width q-px-xs">
  126. <div class="row q-gutter-sm">
  127. <q-btn label="Cancelar" color="primary" outline @click="onCancel" />
  128. <q-btn
  129. label="Salvar"
  130. color="primary-2"
  131. :loading="loading"
  132. @click="onSave"
  133. />
  134. </div>
  135. </div>
  136. </div>
  137. </q-form>
  138. </div>
  139. </template>
  140. <script setup>
  141. import { ref, watch, onMounted } from "vue";
  142. import { useRouter } from "vue-router";
  143. import DefaultInput from "src/components/defaults/DefaultInput.vue";
  144. import DefaultCepInput from "src/components/defaults/DefaultCepInput.vue";
  145. import AvatarImageComponent from "src/components/shared/AvatarImageComponent.vue";
  146. import StateSelect from "src/components/selects/StateSelect.vue";
  147. import CitySelect from "src/components/selects/CitySelect.vue";
  148. import { useSubmitHandler } from "src/composables/useSubmitHandler";
  149. import { useInputRules } from "src/composables/useInputRules";
  150. import { createUnit, getUnit, updateUnit } from "src/api/unit";
  151. import masks from "src/helpers/masks";
  152. const props = defineProps({
  153. unitId: {
  154. type: Number,
  155. default: null,
  156. },
  157. getFormAsFormData: {
  158. type: Function,
  159. required: true,
  160. },
  161. setUpdateFormAsOriginal: {
  162. type: Function,
  163. required: true,
  164. },
  165. });
  166. const form = defineModel("form", { type: Object, required: true });
  167. const router = useRouter();
  168. const formRef = ref(null);
  169. const avatarRef = ref(null);
  170. const stateSelectRef = ref(null);
  171. const citySelectRef = ref(null);
  172. const selectedState = ref(null);
  173. const selectedCity = ref(null);
  174. const { inputRules } = useInputRules();
  175. watch(selectedState, (state) => {
  176. form.value.state_id = state?.value ?? null;
  177. });
  178. watch(selectedCity, (city) => {
  179. form.value.city_id = city?.value ?? null;
  180. });
  181. function onAvatarChange(file) {
  182. form.value.avatar = file;
  183. }
  184. onMounted(async () => {
  185. if (!props.unitId) return;
  186. try {
  187. const unit = await getUnit(props.unitId);
  188. form.value.fantasy_name = unit.fantasy_name;
  189. form.value.social_reason = unit.social_reason;
  190. form.value.cnpj = unit.cnpj;
  191. form.value.state_registration = unit.state_registration;
  192. form.value.name_responsible = unit.name_responsible;
  193. form.value.street = unit.street;
  194. form.value.address_number = unit.address_number;
  195. form.value.postal_code = unit.postal_code;
  196. form.value.neighborhood = unit.neighborhood;
  197. form.value.complement = unit.complement;
  198. form.value.email = unit.email;
  199. form.value.secondary_email = unit.secondary_email;
  200. form.value.phone_number = unit.phone_number;
  201. form.value.cell_number = unit.cell_number;
  202. form.value.state_id = unit.state_id;
  203. form.value.city_id = unit.city_id;
  204. if (unit.state_id) {
  205. stateSelectRef.value?.selectStateById(unit.state_id);
  206. }
  207. if (unit.city_id) {
  208. citySelectRef.value?.selectCityById(unit.city_id);
  209. }
  210. if (unit.avatar_url) {
  211. avatarRef.value?.setImageUrl(unit.avatar_url);
  212. }
  213. props.setUpdateFormAsOriginal();
  214. } catch (e) {
  215. console.error(e);
  216. }
  217. });
  218. const { loading, execute } = useSubmitHandler({
  219. formRef,
  220. onSuccess: () => {
  221. router.push({ name: "FranchiseePage" });
  222. },
  223. });
  224. async function onSave() {
  225. await execute(() => {
  226. const formData = props.getFormAsFormData();
  227. if (props.unitId) {
  228. return updateUnit(props.unitId, formData);
  229. }
  230. form.value.partners.forEach((partner, index) => {
  231. Object.entries(partner).forEach(([key, value]) => {
  232. if (value != null) {
  233. formData.append(`partners[${index}][${key}]`, value);
  234. }
  235. });
  236. });
  237. form.value.contracts.forEach((contract) => {
  238. formData.append("contracts[]", contract.file, contract.name);
  239. });
  240. return createUnit(formData);
  241. });
  242. }
  243. function onCancel() {
  244. router.push({ name: "FranchiseePage" });
  245. }
  246. </script>