diff --git a/packages/desktop-client/src/components/budget/rollover/BudgetSummary.tsx b/packages/desktop-client/src/components/budget/rollover/BudgetSummary.tsx index cb33597e0ffa58b365d69f2ff3c9030c64682913..b4b1e6b5d0cb0def828bd806b033dd9a63bd0797 100644 --- a/packages/desktop-client/src/components/budget/rollover/BudgetSummary.tsx +++ b/packages/desktop-client/src/components/budget/rollover/BudgetSummary.tsx @@ -394,6 +394,10 @@ export function BudgetSummary({ name: 'set-3-avg', text: 'Set budgets to 3 month avg', }, + isGoalTemplatesEnabled && { + name: 'check-templates', + text: 'Check templates', + }, isGoalTemplatesEnabled && { name: 'apply-goal-template', text: 'Apply budget template', diff --git a/packages/loot-core/src/client/actions/queries.ts b/packages/loot-core/src/client/actions/queries.ts index 3308684a27e6aa7b590da5f1269757dc19fb935f..3dc59dc5ea385a101fc20163484904d04a382b3f 100644 --- a/packages/loot-core/src/client/actions/queries.ts +++ b/packages/loot-core/src/client/actions/queries.ts @@ -25,6 +25,9 @@ export function applyBudgetAction(month, type, args) { case 'set-3-avg': await send('budget/set-3month-avg', { month }); break; + case 'check-templates': + dispatch(addNotification(await send('budget/check-templates'))); + break; case 'apply-goal-template': dispatch( addNotification(await send('budget/apply-goal-template', { month })), diff --git a/packages/loot-core/src/server/budget/app.ts b/packages/loot-core/src/server/budget/app.ts index a501281eed0b2f8bd196fa360a85184a17300f2e..6360e2a6d0bfc6c4f8e9373765aa39c27bd36f5e 100644 --- a/packages/loot-core/src/server/budget/app.ts +++ b/packages/loot-core/src/server/budget/app.ts @@ -15,6 +15,10 @@ app.method( ); app.method('budget/set-zero', mutator(undoable(actions.setZero))); app.method('budget/set-3month-avg', mutator(undoable(actions.set3MonthAvg))); +app.method( + 'budget/check-templates', + mutator(undoable(goalActions.runCheckTemplates)), +); app.method( 'budget/apply-goal-template', mutator(undoable(goalActions.applyTemplate)), diff --git a/packages/loot-core/src/server/budget/goaltemplates.ts b/packages/loot-core/src/server/budget/goaltemplates.ts index 94a1e4b1a4739eec5bc6dc04f25ab47bdcdc4aaa..e1eb10cd518320ae77338effc7dc160505c0761d 100644 --- a/packages/loot-core/src/server/budget/goaltemplates.ts +++ b/packages/loot-core/src/server/budget/goaltemplates.ts @@ -26,6 +26,10 @@ export function overwriteTemplate({ month }) { return processTemplate(month, true); } +export function runCheckTemplates() { + return checkTemplates(); +} + function checkScheduleTemplates(template) { let lowPriority = template[0].priority; let errorNotice = false; @@ -211,9 +215,7 @@ async function processTemplate(month, force) { return { type: 'message', message: 'All categories were up to date.' }; } } else { - let applied = `Successfully applied templates to ${num_applied} ${ - num_applied === 1 ? 'category' : 'categories' - }.`; + let applied = `Successfully applied ${num_applied} templates.`; if (errors.length) { return { sticky: true, @@ -617,3 +619,38 @@ async function applyCategoryTemplate( return { amount: to_budget, errors }; } } + +async function checkTemplates() { + let category_templates = await getCategoryTemplates(); + let errors = []; + + let categories = await db.all( + 'SELECT * FROM v_categories WHERE tombstone = 0', + ); + + // run through each line and see if its an error + for (let c = 0; c < categories.length; c++) { + let category = categories[c]; + let template = category_templates[category.id]; + if (template) { + for (let l = 0; l < template.length; l++) { + if (template[l].type === 'error') { + //return { type: 'message', message: "found a bad one",}; + errors.push(category.name + ': ' + template[l].line); + } + } + } + } + if (errors.length) { + return { + sticky: true, + message: `There were errors interpreting some templates:`, + pre: errors.join('\n\n'), + }; + } else { + return { + type: 'message', + message: 'All templates passed! 🎉', + }; + } +} diff --git a/packages/loot-core/src/server/budget/types/handlers.d.ts b/packages/loot-core/src/server/budget/types/handlers.d.ts index eb251efbd897e65c10916535eb5535c8d2247dd6..bca907c64b07f9f47e361870b0b6522b83ce1923 100644 --- a/packages/loot-core/src/server/budget/types/handlers.d.ts +++ b/packages/loot-core/src/server/budget/types/handlers.d.ts @@ -7,6 +7,8 @@ export interface BudgetHandlers { 'budget/set-3month-avg': (...args: unknown[]) => Promise<unknown>; + 'budget/check-templates': (...args: unknown[]) => Promise<unknown>; + 'budget/apply-goal-template': (...args: unknown[]) => Promise<unknown>; 'budget/overwrite-goal-template': (...args: unknown[]) => Promise<unknown>; diff --git a/upcoming-release-notes/1108.md b/upcoming-release-notes/1108.md new file mode 100644 index 0000000000000000000000000000000000000000..6c27745698bef06dd9e40ffc63782b64381e0e50 --- /dev/null +++ b/upcoming-release-notes/1108.md @@ -0,0 +1,6 @@ +--- +category: Enhancements +authors: [youncw] +--- + +Add action in month drop down to check template lines for proper formatting