Previously, totals were computed client-side from only the current page data, which gave incorrect results when paginating. Now the backend calculates totals across ALL filtered records and returns them in the API response. - Invoice: Add total_sold_all field for sum of all filtered invoice balances - Treasury: Add sold_precedent_all, total_incasari_all, total_plati_all, sold_final_all - Trial Balance: Add 6-column totals (debit/credit for each balance type) - Frontend stores and views updated to use backend totals 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
216 lines
5.4 KiB
JavaScript
216 lines
5.4 KiB
JavaScript
/**
|
|
* Pinia Store for Trial Balance (Balanță de Verificare)
|
|
*/
|
|
import { defineStore } from "pinia";
|
|
import { ref, computed } from "vue";
|
|
import { apiService } from "../services/api";
|
|
|
|
export const useTrialBalanceStore = defineStore("trialBalance", () => {
|
|
// State
|
|
const trialBalanceData = ref([]);
|
|
const isLoading = ref(false);
|
|
const error = ref(null);
|
|
|
|
// Totaluri din TOATE înregistrările filtrate (nu doar pagina curentă)
|
|
const totals = ref({
|
|
total_sold_precedent_debit: 0,
|
|
total_sold_precedent_credit: 0,
|
|
total_rulaj_lunar_debit: 0,
|
|
total_rulaj_lunar_credit: 0,
|
|
total_sold_final_debit: 0,
|
|
total_sold_final_credit: 0,
|
|
});
|
|
|
|
const filters = ref({
|
|
luna: new Date().getMonth() + 1, // Current month (1-12)
|
|
an: new Date().getFullYear(), // Current year
|
|
cont: "",
|
|
denumire: "",
|
|
});
|
|
|
|
const pagination = ref({
|
|
currentPage: 1,
|
|
pageSize: 50,
|
|
totalItems: 0,
|
|
totalPages: 0,
|
|
});
|
|
|
|
const sorting = ref({
|
|
sortBy: "CONT",
|
|
sortOrder: "asc",
|
|
});
|
|
|
|
// Getters
|
|
const hasData = computed(() => trialBalanceData.value.length > 0);
|
|
|
|
const currentPeriod = computed(() => {
|
|
return {
|
|
luna: filters.value.luna,
|
|
an: filters.value.an,
|
|
};
|
|
});
|
|
|
|
// Actions
|
|
const fetchTrialBalance = async (companyCode) => {
|
|
if (!companyCode) {
|
|
error.value = "Company code is required";
|
|
return { success: false, error: error.value };
|
|
}
|
|
|
|
isLoading.value = true;
|
|
error.value = null;
|
|
|
|
try {
|
|
const params = {
|
|
company: companyCode,
|
|
luna: filters.value.luna,
|
|
an: filters.value.an,
|
|
page: pagination.value.currentPage,
|
|
page_size: pagination.value.pageSize,
|
|
sort_by: sorting.value.sortBy,
|
|
sort_order: sorting.value.sortOrder,
|
|
};
|
|
|
|
// Add optional filters
|
|
if (filters.value.cont) {
|
|
params.cont_filter = filters.value.cont;
|
|
}
|
|
if (filters.value.denumire) {
|
|
params.denumire_filter = filters.value.denumire;
|
|
}
|
|
|
|
const response = await apiService.get("/trial-balance/", { params });
|
|
|
|
if (response.data.success) {
|
|
trialBalanceData.value = response.data.data.items || [];
|
|
|
|
// Update pagination
|
|
const paginationData = response.data.data.pagination;
|
|
pagination.value = {
|
|
currentPage: paginationData.current_page,
|
|
pageSize: paginationData.page_size,
|
|
totalItems: paginationData.total_items,
|
|
totalPages: paginationData.total_pages,
|
|
};
|
|
|
|
// Store totals from ALL filtered records (not just current page)
|
|
if (response.data.data.totals) {
|
|
totals.value = response.data.data.totals;
|
|
}
|
|
|
|
return { success: true };
|
|
} else {
|
|
throw new Error("Invalid response format");
|
|
}
|
|
} catch (err) {
|
|
error.value =
|
|
err.response?.data?.detail || "Failed to load trial balance data";
|
|
console.error("Failed to load trial balance:", err);
|
|
return { success: false, error: error.value };
|
|
} finally {
|
|
isLoading.value = false;
|
|
}
|
|
};
|
|
|
|
const applyFilters = async (newFilters, companyCode) => {
|
|
filters.value = { ...filters.value, ...newFilters };
|
|
pagination.value.currentPage = 1; // Reset to first page when filtering
|
|
await fetchTrialBalance(companyCode);
|
|
};
|
|
|
|
const clearFilters = async (companyCode) => {
|
|
filters.value = {
|
|
luna: new Date().getMonth() + 1,
|
|
an: new Date().getFullYear(),
|
|
cont: "",
|
|
denumire: "",
|
|
};
|
|
pagination.value.currentPage = 1;
|
|
await fetchTrialBalance(companyCode);
|
|
};
|
|
|
|
const changePage = async (page, companyCode) => {
|
|
pagination.value.currentPage = page;
|
|
await fetchTrialBalance(companyCode);
|
|
};
|
|
|
|
const changePageSize = async (pageSize, companyCode) => {
|
|
pagination.value.pageSize = pageSize;
|
|
pagination.value.currentPage = 1; // Reset to first page
|
|
await fetchTrialBalance(companyCode);
|
|
};
|
|
|
|
const sort = async (sortBy, sortOrder, companyCode) => {
|
|
sorting.value = { sortBy, sortOrder };
|
|
pagination.value.currentPage = 1; // Reset to first page when sorting
|
|
await fetchTrialBalance(companyCode);
|
|
};
|
|
|
|
const changePeriod = async (luna, an, companyCode) => {
|
|
filters.value.luna = luna;
|
|
filters.value.an = an;
|
|
pagination.value.currentPage = 1;
|
|
await fetchTrialBalance(companyCode);
|
|
};
|
|
|
|
const clearError = () => {
|
|
error.value = null;
|
|
};
|
|
|
|
const reset = () => {
|
|
trialBalanceData.value = [];
|
|
isLoading.value = false;
|
|
error.value = null;
|
|
totals.value = {
|
|
total_sold_precedent_debit: 0,
|
|
total_sold_precedent_credit: 0,
|
|
total_rulaj_lunar_debit: 0,
|
|
total_rulaj_lunar_credit: 0,
|
|
total_sold_final_debit: 0,
|
|
total_sold_final_credit: 0,
|
|
};
|
|
filters.value = {
|
|
luna: new Date().getMonth() + 1,
|
|
an: new Date().getFullYear(),
|
|
cont: "",
|
|
denumire: "",
|
|
};
|
|
pagination.value = {
|
|
currentPage: 1,
|
|
pageSize: 50,
|
|
totalItems: 0,
|
|
totalPages: 0,
|
|
};
|
|
sorting.value = {
|
|
sortBy: "CONT",
|
|
sortOrder: "asc",
|
|
};
|
|
};
|
|
|
|
return {
|
|
// State
|
|
trialBalanceData,
|
|
isLoading,
|
|
error,
|
|
totals,
|
|
filters,
|
|
pagination,
|
|
sorting,
|
|
|
|
// Getters
|
|
hasData,
|
|
currentPeriod,
|
|
|
|
// Actions
|
|
fetchTrialBalance,
|
|
applyFilters,
|
|
clearFilters,
|
|
changePage,
|
|
changePageSize,
|
|
sort,
|
|
changePeriod,
|
|
clearError,
|
|
reset,
|
|
};
|
|
});
|