Pārlūkot izejas kodu

feat(treasury): add create/edit bank account dialog

Dialog captures name, bank, account type (corrente/poupanca), agency
and account number; treasury_type fixed as bank for now.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
ebagabee 1 dienu atpakaļ
vecāks
revīzija
fcdebb18ce
1 mainītis faili ar 134 papildinājumiem un 0 dzēšanām
  1. 134 0
      src/components/financial/AddEditTreasuryAccountDialog.vue

+ 134 - 0
src/components/financial/AddEditTreasuryAccountDialog.vue

@@ -0,0 +1,134 @@
+<template>
+  <q-dialog ref="dialogRef" @hide="onDialogHide">
+    <q-card class="q-dialog-plugin overflow-hidden" style="width: 600px; max-width: 90vw">
+      <DefaultDialogHeader :title="title" @close="onDialogCancel" />
+      <q-form ref="formRef" @submit="onOKClick">
+        <q-card-section class="row q-col-gutter-sm q-pt-none">
+          <DefaultInput
+            v-model="form.name"
+            v-model:error="validationErrors.name"
+            :rules="[inputRules.required]"
+            label="Nome da conta"
+            placeholder="Ex. Conta Principal"
+            class="col-12"
+          />
+
+          <DefaultInput
+            v-model="form.bank_name"
+            v-model:error="validationErrors.bank_name"
+            :rules="[inputRules.required]"
+            label="Banco"
+            placeholder="Ex. Banco do Brasil"
+            class="col-12 col-md-6"
+          />
+
+          <DefaultSelect
+            v-model="form.bank_type_account"
+            v-model:error="validationErrors.bank_type_account"
+            :options="accountTypeOptions"
+            emit-value
+            map-options
+            label="Tipo de conta"
+            placeholder="Selecione"
+            class="col-12 col-md-6"
+          />
+
+          <DefaultInput
+            v-model="form.bank_agency"
+            v-model:error="validationErrors.bank_agency"
+            label="Agência"
+            placeholder="Ex. 1234"
+            class="col-12 col-md-6"
+          />
+
+          <DefaultInput
+            v-model="form.bank_account"
+            v-model:error="validationErrors.bank_account"
+            label="Conta"
+            placeholder="Ex. 56789-0"
+            class="col-12 col-md-6"
+          />
+        </q-card-section>
+
+        <q-card-actions>
+          <q-space />
+          <q-btn outline color="negative" label="Cancelar" @click="onDialogCancel" />
+          <q-btn
+            color="primary"
+            :label="isEdit ? 'Salvar' : 'Cadastrar'"
+            type="submit"
+            :loading="loading"
+          />
+        </q-card-actions>
+      </q-form>
+    </q-card>
+  </q-dialog>
+</template>
+
+<script setup>
+import { ref, computed } from "vue";
+import { useDialogPluginComponent } from "quasar";
+import { useInputRules } from "src/composables/useInputRules";
+import { useSubmitHandler } from "src/composables/useSubmitHandler";
+import { createTreasuryAccount, updateTreasuryAccount } from "src/api/treasury_account";
+
+import DefaultDialogHeader from "src/components/defaults/DefaultDialogHeader.vue";
+import DefaultInput from "src/components/defaults/DefaultInput.vue";
+import DefaultSelect from "src/components/defaults/DefaultSelect.vue";
+
+defineEmits([...useDialogPluginComponent.emits]);
+
+const { account } = defineProps({
+  account: {
+    type: Object,
+    default: null,
+  },
+});
+
+const { inputRules } = useInputRules();
+
+const { dialogRef, onDialogHide, onDialogOK, onDialogCancel } = useDialogPluginComponent();
+
+const formRef = ref(null);
+const isEdit = computed(() => !!account);
+const title = computed(() => (isEdit.value ? "Editar Banco" : "Novo Banco"));
+
+const accountTypeOptions = [
+  { label: "Conta Corrente", value: "corrente" },
+  { label: "Conta Poupança", value: "poupanca" },
+];
+
+const form = ref({
+  name: account?.name ?? "",
+  bank_name: account?.bank_name ?? "",
+  bank_agency: account?.bank_agency ?? "",
+  bank_account: account?.bank_account ?? "",
+  bank_type_account: account?.bank_type_account ?? null,
+});
+
+const {
+  loading,
+  validationErrors,
+  execute: submitForm,
+} = useSubmitHandler({
+  onSuccess: (response) => onDialogOK(response),
+  formRef,
+});
+
+const onOKClick = async () => {
+  const payload = {
+    name: form.value.name,
+    treasury_type: "bank",
+    bank_name: form.value.bank_name,
+    bank_agency: form.value.bank_agency || null,
+    bank_account: form.value.bank_account || null,
+    bank_type_account: form.value.bank_type_account || null,
+  };
+
+  if (isEdit.value) {
+    await submitForm(() => updateTreasuryAccount(account.id, payload));
+  } else {
+    await submitForm(() => createTreasuryAccount(payload));
+  }
+};
+</script>