AccountsPayablePage.vue 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. <template>
  2. <div>
  3. <DefaultHeaderPage title="Contas a Pagar" :show-filter-icon="false" />
  4. <div class="row q-pa-md q-gutter-md">
  5. <FinancialCard
  6. title="Pago"
  7. icon="mdi-check-circle-outline"
  8. :financial-value="totals.paid"
  9. :integer="totals.paidCount"
  10. integer-label="pagamentos"
  11. />
  12. <FinancialCard
  13. title="A Pagar"
  14. icon="mdi-cash-minus"
  15. :financial-value="totals.pending"
  16. :integer="totals.pendingCount"
  17. integer-label="pendentes"
  18. />
  19. <FinancialCard
  20. title="Vencidas"
  21. icon="mdi-alert-circle-outline"
  22. :financial-value="totals.overdue"
  23. :integer="totals.overdueCount"
  24. integer-label="em atraso"
  25. />
  26. </div>
  27. <div class="q-px-md">
  28. <DefaultTable
  29. v-model:rows="rows"
  30. no-api-call
  31. :add-item="canAdd"
  32. title="Contas a Pagar"
  33. description="contas"
  34. :female="true"
  35. :columns="columns"
  36. @on-add-item="openCreate"
  37. >
  38. <template #body-cell-plan_account="{ row }">
  39. <q-td class="text-left">
  40. {{ row.plan_account ? `${row.plan_account.code} — ${row.plan_account.description}` : "—" }}
  41. </q-td>
  42. </template>
  43. <template #body-cell-value="{ row }">
  44. <q-td class="text-left">{{ formatCurrency(row.value) }}</q-td>
  45. </template>
  46. <template #body-cell-status="{ row }">
  47. <q-td class="text-left">
  48. <q-btn
  49. :color="row.status === 'paid' ? 'positive' : 'orange-7'"
  50. :label="row.status === 'paid' ? 'Pago' : 'Não pago'"
  51. dense
  52. no-caps
  53. unelevated
  54. :disable="!canEdit || row.status === 'paid'"
  55. @click.prevent.stop="changeStatus(row)"
  56. >
  57. <q-tooltip v-if="canEdit && row.status !== 'paid'">Dar baixa</q-tooltip>
  58. </q-btn>
  59. </q-td>
  60. </template>
  61. </DefaultTable>
  62. </div>
  63. </div>
  64. </template>
  65. <script setup>
  66. import { computed, onMounted, ref } from "vue";
  67. import { useQuasar } from "quasar";
  68. import { getCompanyPayables } from "src/api/company_payable";
  69. import DefaultHeaderPage from "src/components/layout/DefaultHeaderPage.vue";
  70. import DefaultTable from "src/components/defaults/DefaultTable.vue";
  71. import FinancialCard from "src/components/financial/FinancialCard.vue";
  72. import AddCompanyPayableDialog from "src/components/financial/AddCompanyPayableDialog.vue";
  73. import SettleCompanyPayableDialog from "src/components/financial/SettleCompanyPayableDialog.vue";
  74. import { permissionStore } from "src/stores/permission";
  75. const $q = useQuasar();
  76. const rows = ref([]);
  77. const permissions = permissionStore();
  78. const canAdd = permissions.getAccess("franchisor_financial", "add");
  79. const canEdit = permissions.getAccess("franchisor_financial", "edit");
  80. const columns = [
  81. { name: "history", label: "Descrição", field: "history", align: "left" },
  82. { name: "plan_account", label: "Plano de Contas", field: "plan_account", align: "left" },
  83. { name: "value", label: "Valor", field: "value", align: "left" },
  84. { name: "due_date", label: "Vencimento", field: "due_date", align: "left" },
  85. { name: "status", label: "Status", field: "status", align: "left" },
  86. ];
  87. function formatCurrency(value) {
  88. return new Intl.NumberFormat("pt-BR", {
  89. style: "currency",
  90. currency: "BRL",
  91. }).format(Number(value ?? 0));
  92. }
  93. const totals = computed(() => {
  94. const acc = {
  95. paid: 0,
  96. paidCount: 0,
  97. pending: 0,
  98. pendingCount: 0,
  99. overdue: 0,
  100. overdueCount: 0,
  101. };
  102. for (const r of rows.value) {
  103. if (r.status === "paid") {
  104. acc.paid += Number(r.paid_value ?? 0);
  105. acc.paidCount++;
  106. } else if (r.status === "overdue") {
  107. acc.overdue += Number(r.value ?? 0);
  108. acc.overdueCount++;
  109. } else if (r.status === "pending") {
  110. acc.pending += Number(r.value ?? 0);
  111. acc.pendingCount++;
  112. }
  113. }
  114. return acc;
  115. });
  116. async function loadData() {
  117. try {
  118. rows.value = await getCompanyPayables();
  119. } catch (e) {
  120. console.error("Erro ao buscar contas a pagar:", e);
  121. }
  122. }
  123. function openSettle(row) {
  124. $q.dialog({
  125. component: SettleCompanyPayableDialog,
  126. componentProps: { payable: row },
  127. }).onOk(loadData);
  128. }
  129. function changeStatus(row) {
  130. if (row.status !== "paid") openSettle(row);
  131. }
  132. function openCreate() {
  133. $q.dialog({ component: AddCompanyPayableDialog }).onOk(loadData);
  134. }
  135. onMounted(loadData);
  136. </script>