mirror of
https://github.com/mayswind/ezbookkeeping.git
synced 2026-05-14 23:17:33 +08:00
415 lines
12 KiB
JavaScript
415 lines
12 KiB
JavaScript
import categoryConstants from '@/consts/category.js';
|
|
import transactionConstants from '@/consts/transaction.js';
|
|
|
|
export function setCategoryModelByAnotherCategory(category, category2) {
|
|
category.id = category2.id;
|
|
category.type = category2.type;
|
|
category.parentId = category2.parentId;
|
|
category.name = category2.name;
|
|
category.icon = category2.icon;
|
|
category.color = category2.color;
|
|
category.comment = category2.comment;
|
|
category.visible = !category2.hidden;
|
|
}
|
|
|
|
export function transactionTypeToCategoryType(transactionType) {
|
|
if (transactionType === transactionConstants.allTransactionTypes.Income) {
|
|
return categoryConstants.allCategoryTypes.Income;
|
|
} else if (transactionType === transactionConstants.allTransactionTypes.Expense) {
|
|
return categoryConstants.allCategoryTypes.Expense;
|
|
} else if (transactionType === transactionConstants.allTransactionTypes.Transfer) {
|
|
return categoryConstants.allCategoryTypes.Transfer;
|
|
} else {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
export function categoryTypeToTransactionType(categoryType) {
|
|
if (categoryType === categoryConstants.allCategoryTypes.Income) {
|
|
return transactionConstants.allTransactionTypes.Income;
|
|
} else if (categoryType === categoryConstants.allCategoryTypes.Expense) {
|
|
return transactionConstants.allTransactionTypes.Expense;
|
|
} else if (categoryType === categoryConstants.allCategoryTypes.Transfer) {
|
|
return transactionConstants.allTransactionTypes.Transfer;
|
|
} else {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
export function getTransactionPrimaryCategoryName(categoryId, allCategories) {
|
|
if (!allCategories) {
|
|
return '';
|
|
}
|
|
|
|
for (let i = 0; i < allCategories.length; i++) {
|
|
for (let j = 0; j < allCategories[i].subCategories.length; j++) {
|
|
const subCategory = allCategories[i].subCategories[j];
|
|
if (subCategory.id === categoryId) {
|
|
return allCategories[i].name;
|
|
}
|
|
}
|
|
}
|
|
|
|
return '';
|
|
}
|
|
|
|
export function getTransactionSecondaryCategoryName(categoryId, allCategories) {
|
|
if (!allCategories) {
|
|
return '';
|
|
}
|
|
|
|
for (let i = 0; i < allCategories.length; i++) {
|
|
for (let j = 0; j < allCategories[i].subCategories.length; j++) {
|
|
const subCategory = allCategories[i].subCategories[j];
|
|
if (subCategory.id === categoryId) {
|
|
return subCategory.name;
|
|
}
|
|
}
|
|
}
|
|
|
|
return '';
|
|
}
|
|
|
|
export function allTransactionCategoriesWithVisibleCount(allTransactionCategories, allowCategoryTypes) {
|
|
const ret = {};
|
|
const hasAllowCategoryTypes = allowCategoryTypes
|
|
&& (allowCategoryTypes[categoryConstants.allCategoryTypes.Income.toString()]
|
|
|| allowCategoryTypes[categoryConstants.allCategoryTypes.Expense.toString()]
|
|
|| allowCategoryTypes[categoryConstants.allCategoryTypes.Transfer.toString()]);
|
|
|
|
for (let key in categoryConstants.allCategoryTypes) {
|
|
if (!Object.prototype.hasOwnProperty.call(categoryConstants.allCategoryTypes, key)) {
|
|
continue;
|
|
}
|
|
|
|
const categoryType = categoryConstants.allCategoryTypes[key];
|
|
|
|
if (!allTransactionCategories[categoryType]) {
|
|
continue;
|
|
}
|
|
|
|
if (hasAllowCategoryTypes && !allowCategoryTypes[categoryType]) {
|
|
continue;
|
|
}
|
|
|
|
const allCategories = allTransactionCategories[categoryType];
|
|
const allSubCategories = {};
|
|
const allVisibleSubCategoryCounts = {};
|
|
const allFirstVisibleSubCategoryIndexes = {};
|
|
let allVisibleCategoryCount = 0;
|
|
let firstVisibleCategoryIndex = -1;
|
|
|
|
for (let j = 0; j < allCategories.length; j++) {
|
|
const category = allCategories[j];
|
|
|
|
if (!category.hidden) {
|
|
allVisibleCategoryCount++;
|
|
|
|
if (firstVisibleCategoryIndex === -1) {
|
|
firstVisibleCategoryIndex = j;
|
|
}
|
|
}
|
|
|
|
if (category.subCategories) {
|
|
let visibleSubCategoryCount = 0;
|
|
let firstVisibleSubCategoryIndex = -1;
|
|
|
|
for (let k = 0; k < category.subCategories.length; k++) {
|
|
const subCategory = category.subCategories[k];
|
|
|
|
if (!subCategory.hidden) {
|
|
visibleSubCategoryCount++;
|
|
|
|
if (firstVisibleSubCategoryIndex === -1) {
|
|
firstVisibleSubCategoryIndex = k;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (category.subCategories.length > 0) {
|
|
allSubCategories[category.id] = category.subCategories;
|
|
allVisibleSubCategoryCounts[category.id] = visibleSubCategoryCount;
|
|
allFirstVisibleSubCategoryIndexes[category.id] = firstVisibleSubCategoryIndex;
|
|
}
|
|
}
|
|
}
|
|
|
|
ret[categoryType.toString()] = {
|
|
type: categoryType.toString(),
|
|
allCategories: allCategories,
|
|
allVisibleCategoryCount: allVisibleCategoryCount,
|
|
firstVisibleCategoryIndex: firstVisibleCategoryIndex,
|
|
allSubCategories: allSubCategories,
|
|
allVisibleSubCategoryCounts: allVisibleSubCategoryCounts,
|
|
allFirstVisibleSubCategoryIndexes: allFirstVisibleSubCategoryIndexes
|
|
};
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
export function allVisiblePrimaryTransactionCategoriesByType(allTransactionCategories, categoryType) {
|
|
const allCategories = allTransactionCategories[categoryType];
|
|
const visibleCategories = [];
|
|
|
|
if (!allCategories) {
|
|
return visibleCategories;
|
|
}
|
|
|
|
for (let i = 0; i < allCategories.length; i++) {
|
|
const category = allCategories[i];
|
|
|
|
if (category.hidden) {
|
|
continue;
|
|
}
|
|
|
|
visibleCategories.push(category);
|
|
}
|
|
|
|
return visibleCategories;
|
|
}
|
|
|
|
export function getFinalCategoryIdsByFilteredCategoryIds(allTransactionCategoriesMap, filteredCategoryIds) {
|
|
let finalCategoryIds = '';
|
|
|
|
if (!allTransactionCategoriesMap) {
|
|
return finalCategoryIds;
|
|
}
|
|
|
|
for (let categoryId in allTransactionCategoriesMap) {
|
|
if (!Object.prototype.hasOwnProperty.call(allTransactionCategoriesMap, categoryId)) {
|
|
continue;
|
|
}
|
|
|
|
const category = allTransactionCategoriesMap[categoryId];
|
|
|
|
if (filteredCategoryIds && !isCategoryOrSubCategoriesAllChecked(category, filteredCategoryIds)) {
|
|
continue;
|
|
}
|
|
|
|
if (finalCategoryIds.length > 0) {
|
|
finalCategoryIds += ',';
|
|
}
|
|
|
|
finalCategoryIds += category.id;
|
|
}
|
|
|
|
return finalCategoryIds;
|
|
}
|
|
|
|
export function isSubCategoryIdAvailable(categories, categoryId) {
|
|
if (!categories || !categories.length) {
|
|
return false;
|
|
}
|
|
|
|
for (let i = 0; i < categories.length; i++) {
|
|
const primaryCategory = categories[i];
|
|
|
|
if (primaryCategory.hidden) {
|
|
continue;
|
|
}
|
|
|
|
for (let j = 0; j < primaryCategory.subCategories.length; j++) {
|
|
const secondaryCategory = primaryCategory.subCategories[j];
|
|
|
|
if (secondaryCategory.hidden) {
|
|
continue;
|
|
}
|
|
|
|
if (secondaryCategory.id === categoryId) {
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
export function getFirstAvailableCategoryId(categories) {
|
|
if (!categories || !categories.length) {
|
|
return '';
|
|
}
|
|
|
|
for (let i = 0; i < categories.length; i++) {
|
|
const primaryCategory = categories[i];
|
|
|
|
if (primaryCategory.hidden) {
|
|
continue;
|
|
}
|
|
|
|
for (let j = 0; j < primaryCategory.subCategories.length; j++) {
|
|
const secondaryCategory = primaryCategory.subCategories[j];
|
|
|
|
if (secondaryCategory.hidden) {
|
|
continue;
|
|
}
|
|
|
|
return secondaryCategory.id;
|
|
}
|
|
}
|
|
|
|
return '';
|
|
}
|
|
|
|
export function getFirstAvailableSubCategoryId(categories, categoryId) {
|
|
if (!categories || !categories.length) {
|
|
return '';
|
|
}
|
|
|
|
for (let i = 0; i < categories.length; i++) {
|
|
const primaryCategory = categories[i];
|
|
|
|
if (primaryCategory.hidden || primaryCategory.id !== categoryId) {
|
|
continue;
|
|
}
|
|
|
|
for (let j = 0; j < primaryCategory.subCategories.length; j++) {
|
|
const secondaryCategory = primaryCategory.subCategories[j];
|
|
|
|
if (secondaryCategory.hidden) {
|
|
continue;
|
|
}
|
|
|
|
return secondaryCategory.id;
|
|
}
|
|
|
|
return '';
|
|
}
|
|
|
|
return '';
|
|
}
|
|
|
|
export function hasAnyAvailableCategory(allTransactionCategories, showHidden) {
|
|
for (let type in allTransactionCategories) {
|
|
if (!Object.prototype.hasOwnProperty.call(allTransactionCategories, type)) {
|
|
continue;
|
|
}
|
|
|
|
const categoryType = allTransactionCategories[type];
|
|
|
|
if (showHidden) {
|
|
if (categoryType.allCategories && categoryType.allCategories.length > 0) {
|
|
return true;
|
|
}
|
|
} else {
|
|
if (categoryType.allVisibleCategoryCount > 0) {
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
export function hasAvailableCategory(allTransactionCategories, showHidden) {
|
|
const result = {};
|
|
|
|
for (let type in allTransactionCategories) {
|
|
if (!Object.prototype.hasOwnProperty.call(allTransactionCategories, type)) {
|
|
continue;
|
|
}
|
|
|
|
const categoryType = allTransactionCategories[type];
|
|
|
|
if (showHidden) {
|
|
result[type] = categoryType.allCategories && categoryType.allCategories.length > 0;
|
|
} else {
|
|
result[type] = categoryType.allVisibleCategoryCount > 0;
|
|
}
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
export function selectSubCategories(filterCategoryIds, category, value) {
|
|
if (!category || !category.subCategories || !category.subCategories.length) {
|
|
return;
|
|
}
|
|
|
|
for (let i = 0; i < category.subCategories.length; i++) {
|
|
const subCategory = category.subCategories[i];
|
|
filterCategoryIds[subCategory.id] = value;
|
|
}
|
|
}
|
|
|
|
export function selectAll(filterCategoryIds, allTransactionCategoriesMap) {
|
|
for (let categoryId in filterCategoryIds) {
|
|
if (!Object.prototype.hasOwnProperty.call(filterCategoryIds, categoryId)) {
|
|
continue;
|
|
}
|
|
|
|
const category = allTransactionCategoriesMap[categoryId];
|
|
|
|
if (category) {
|
|
filterCategoryIds[category.id] = false;
|
|
}
|
|
}
|
|
}
|
|
|
|
export function selectNone(filterCategoryIds, allTransactionCategoriesMap) {
|
|
for (let categoryId in filterCategoryIds) {
|
|
if (!Object.prototype.hasOwnProperty.call(filterCategoryIds, categoryId)) {
|
|
continue;
|
|
}
|
|
|
|
const category = allTransactionCategoriesMap[categoryId];
|
|
|
|
if (category) {
|
|
filterCategoryIds[category.id] = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
export function selectInvert(filterCategoryIds, allTransactionCategoriesMap) {
|
|
for (let categoryId in filterCategoryIds) {
|
|
if (!Object.prototype.hasOwnProperty.call(filterCategoryIds, categoryId)) {
|
|
continue;
|
|
}
|
|
|
|
const category = allTransactionCategoriesMap[categoryId];
|
|
|
|
if (category) {
|
|
filterCategoryIds[category.id] = !filterCategoryIds[category.id];
|
|
}
|
|
}
|
|
}
|
|
|
|
export function isCategoryOrSubCategoriesAllChecked(category, filterCategoryIds) {
|
|
if (!category.subCategories) {
|
|
return !filterCategoryIds[category.id];
|
|
}
|
|
|
|
for (let i = 0; i < category.subCategories.length; i++) {
|
|
const subCategory = category.subCategories[i];
|
|
if (filterCategoryIds[subCategory.id]) {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
export function isSubCategoriesAllChecked(category, filterCategoryIds) {
|
|
for (let i = 0; i < category.subCategories.length; i++) {
|
|
const subCategory = category.subCategories[i];
|
|
if (filterCategoryIds[subCategory.id]) {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
export function isSubCategoriesHasButNotAllChecked(category, filterCategoryIds) {
|
|
let checkedCount = 0;
|
|
|
|
for (let i = 0; i < category.subCategories.length; i++) {
|
|
const subCategory = category.subCategories[i];
|
|
if (!filterCategoryIds[subCategory.id]) {
|
|
checkedCount++;
|
|
}
|
|
}
|
|
|
|
return checkedCount > 0 && checkedCount < category.subCategories.length;
|
|
}
|