Sfoglia il codice sorgente

feat(treasury): add financial plan account selection and display in treasury launch

ebagabee 16 ore fa
parent
commit
6c216c55eb

+ 47 - 1
src/components/financial/AddTreasuryLaunchDialog.vue

@@ -25,6 +25,22 @@
             class="col-12"
           />
 
+          <DefaultSelect
+            v-model="form.financial_plan_account_id"
+            v-model:error="validationErrors.financial_plan_account_id"
+            :options="planAccountOptions"
+            :loading="loadingPlanAccounts"
+            emit-value
+            map-options
+            use-input
+            input-debounce="0"
+            :rules="[inputRules.required]"
+            label="Plano de Contas"
+            placeholder="Selecione a conta"
+            class="col-12"
+            @filter="filterPlanAccounts"
+          />
+
           <DefaultCurrencyInput
             v-model="form.amount"
             v-model:error="validationErrors.amount"
@@ -43,11 +59,12 @@
 </template>
 
 <script setup>
-import { ref } from "vue";
+import { ref, onMounted } from "vue";
 import { useDialogPluginComponent } from "quasar";
 import { useInputRules } from "src/composables/useInputRules";
 import { useSubmitHandler } from "src/composables/useSubmitHandler";
 import { createTreasuryLaunch } from "src/api/treasury_launch";
+import { getFinancialPlanAccounts } from "src/api/financial_plan_account";
 
 import DefaultDialogHeader from "src/components/defaults/DefaultDialogHeader.vue";
 import DefaultInput from "src/components/defaults/DefaultInput.vue";
@@ -78,9 +95,37 @@ const typeOptions = [
 const form = ref({
   transaction_type: null,
   description: "",
+  financial_plan_account_id: null,
   amount: 0,
 });
 
+const allPlanAccounts = ref([]);
+const planAccountOptions = ref([]);
+const loadingPlanAccounts = ref(false);
+
+const filterPlanAccounts = (needle, update) => {
+  update(() => {
+    const term = needle.toLowerCase();
+    planAccountOptions.value = term
+      ? allPlanAccounts.value.filter((o) => o.label.toLowerCase().includes(term))
+      : allPlanAccounts.value;
+  });
+};
+
+onMounted(async () => {
+  loadingPlanAccounts.value = true;
+  try {
+    const accounts = await getFinancialPlanAccounts();
+    allPlanAccounts.value = accounts.map((a) => ({
+      label: `${a.code} - ${a.description}`,
+      value: a.id,
+    }));
+    planAccountOptions.value = allPlanAccounts.value;
+  } finally {
+    loadingPlanAccounts.value = false;
+  }
+});
+
 const {
   loading,
   validationErrors,
@@ -96,6 +141,7 @@ const onOKClick = async () => {
       account_id: account.id,
       transaction_type: form.value.transaction_type,
       description: form.value.description,
+      financial_plan_account_id: form.value.financial_plan_account_id,
       amount: form.value.amount,
     }),
   );

+ 0 - 14
src/components/shared/DevBanner.vue

@@ -1,14 +0,0 @@
-<template>
-  <div class="dev-banner row items-center q-px-md q-py-xs q-gutter-x-sm">
-    <q-icon name="mdi-hammer-wrench" size="16px" />
-    <span class="text-caption text-weight-medium">Em Desenvolvimento — funcionalidades podem estar incompletas</span>
-  </div>
-</template>
-
-<style scoped>
-.dev-banner {
-  background-color: #fff8e1;
-  border-left: 4px solid #f9a825;
-  color: #7a5900;
-}
-</style>

+ 0 - 2
src/pages/financial/AccountsPayablePage.vue

@@ -2,7 +2,6 @@
   <div>
     <DefaultHeaderPage title="Contas a Pagar" :show-filter-icon="false" />
 
-    <div class="q-px-md"><DevBanner /></div>
     <div class="row q-pa-md q-gutter-md">
       <FinancialCard
         title="Saldo Tesouraria"
@@ -68,7 +67,6 @@
 <script setup>
 import { ref } from "vue";
 import DefaultHeaderPage from "src/components/layout/DefaultHeaderPage.vue";
-import DevBanner from "src/components/shared/DevBanner.vue";
 import DefaultTable from "src/components/defaults/DefaultTable.vue";
 import FinancialCard from "src/components/financial/FinancialCard.vue";
 

+ 0 - 2
src/pages/financial/InvoiceIssuancePage.vue

@@ -2,7 +2,6 @@
   <div>
     <DefaultHeaderPage title="Emissão de Notas" :show-filter-icon="false" />
 
-    <div class="q-px-md"><DevBanner /></div>
     <div class="q-px-md">
       <DefaultTable
         v-model:rows="rows"
@@ -32,7 +31,6 @@
 <script setup>
 import { ref } from "vue";
 import DefaultHeaderPage from "src/components/layout/DefaultHeaderPage.vue";
-import DevBanner from "src/components/shared/DevBanner.vue";
 import DefaultTable from "src/components/defaults/DefaultTable.vue";
 
 const rows = ref([]);

+ 2 - 0
src/pages/financial/TreasuryPage.vue

@@ -80,6 +80,7 @@ const rows = computed(() =>
     return {
       id: launch.id,
       description: launch.description,
+      plan_account: launch.financial_plan_account?.label ?? "—",
       value: `${isIncome ? "+ " : "- "}${formatToBRLCurrency(launch.amount)}`,
       updated_at: formatDateYMDtoDMY(launch.updated_at),
     };
@@ -88,6 +89,7 @@ const rows = computed(() =>
 
 const columns = [
   { name: "description", label: "Descrição", field: "description", align: "left" },
+  { name: "plan_account", label: "Plano de Contas", field: "plan_account", align: "left" },
   { name: "value", label: "Valor", field: "value", align: "left" },
   { name: "updated_at", label: "Atualização", field: "updated_at", align: "left" },
 ];