diff --git a/apps/picsa-tools/budget-tool/src/app/components/budget-summary/budget-summary.component.html b/apps/picsa-tools/budget-tool/src/app/components/budget-summary/budget-summary.component.html
new file mode 100644
index 000000000..dde8d9168
--- /dev/null
+++ b/apps/picsa-tools/budget-tool/src/app/components/budget-summary/budget-summary.component.html
@@ -0,0 +1,25 @@
+
+
+
+ {{ totalFamilyLabourHours }} {{ 'hours' | translate }}
+
+
+
+ @for (produce of totalProduceSummary; track produce.id) {
+
+
+ {{ produce.total }} {{ 'consumed' | translate }}
+
+ }
+
+
+
+ {{ finalCashBalance }} {{ 'balance' | translate }}
+
+
diff --git a/apps/picsa-tools/budget-tool/src/app/components/budget-summary/budget-summary.component.scss b/apps/picsa-tools/budget-tool/src/app/components/budget-summary/budget-summary.component.scss
new file mode 100644
index 000000000..f664f0c08
--- /dev/null
+++ b/apps/picsa-tools/budget-tool/src/app/components/budget-summary/budget-summary.component.scss
@@ -0,0 +1,20 @@
+:host {
+ display: block;
+}
+.summary-container {
+ display: flex;
+ flex-direction: column;
+ gap: 8px;
+}
+section {
+ display: flex;
+ align-items: center;
+}
+.summary-icon {
+ width: 24px;
+ height: 24px;
+ font-size: 24px;
+}
+.summary-value {
+ margin-left: 8px;
+}
diff --git a/apps/picsa-tools/budget-tool/src/app/components/budget-summary/budget-summary.component.spec.ts b/apps/picsa-tools/budget-tool/src/app/components/budget-summary/budget-summary.component.spec.ts
new file mode 100644
index 000000000..3ac1ac8e0
--- /dev/null
+++ b/apps/picsa-tools/budget-tool/src/app/components/budget-summary/budget-summary.component.spec.ts
@@ -0,0 +1,21 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+import { BudgetSummaryComponent } from './budget-summary.component';
+
+describe('BudgetSummaryComponent', () => {
+ let component: BudgetSummaryComponent;
+ let fixture: ComponentFixture;
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [BudgetSummaryComponent],
+ }).compileComponents();
+
+ fixture = TestBed.createComponent(BudgetSummaryComponent);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ });
+
+ it('should create', () => {
+ expect(component).toBeTruthy();
+ });
+});
diff --git a/apps/picsa-tools/budget-tool/src/app/components/budget-summary/budget-summary.component.ts b/apps/picsa-tools/budget-tool/src/app/components/budget-summary/budget-summary.component.ts
new file mode 100644
index 000000000..fa92df272
--- /dev/null
+++ b/apps/picsa-tools/budget-tool/src/app/components/budget-summary/budget-summary.component.ts
@@ -0,0 +1,71 @@
+import { Component, Input, OnInit } from '@angular/core';
+
+import { IBudget } from '../../models/budget-tool.models';
+import { IBudgetCardWithValues } from '../../schema';
+
+interface ISummaryEntry {
+ label: string;
+ total: number;
+ id: string;
+ imgPath: string;
+}
+
+@Component({
+ selector: 'budget-summary',
+ templateUrl: './budget-summary.component.html',
+ styleUrls: ['./budget-summary.component.scss'],
+})
+export class BudgetSummaryComponent implements OnInit {
+ @Input() budgetData: IBudget['data'];
+
+ totalFamilyLabourHours: number = 0;
+ totalInputsValue: number = 0;
+ totalOutputsValue: number = 0;
+ totalProduceSummary: ISummaryEntry[] = [];
+ finalCashBalance: number = 0;
+
+ ngOnInit(): void {
+ this.calculateSummary();
+ }
+
+ calculateSummary() {
+ this.budgetData.forEach((item) => {
+ item.familyLabour.forEach((member) => {
+ this.totalFamilyLabourHours += member.values.quantity;
+ });
+
+ item.inputs.forEach((input) => {
+ this.totalInputsValue += input.values.total;
+ });
+
+ item.outputs.forEach((output) => {
+ this.totalOutputsValue += output.values.total;
+ });
+
+ item.produceConsumed.forEach((consumed) => {
+ this.updateProduceSummary(consumed);
+ });
+ });
+
+ this.finalCashBalance = this.totalOutputsValue - this.totalInputsValue;
+ }
+
+ updateProduceSummary(consumed: IBudgetCardWithValues) {
+ const existingProduce = this.totalProduceSummary.find((p) => p.label === consumed.label);
+
+ if (existingProduce) {
+ existingProduce.total += consumed.values.quantity;
+ } else {
+ this.totalProduceSummary.push({
+ label: consumed.label,
+ total: consumed.values.quantity,
+ id: consumed.id,
+ imgPath: this.getImagePath(consumed.id, consumed.imgType),
+ });
+ }
+ }
+
+ getImagePath(imageId: string, extension: 'png' | 'svg'): string {
+ return `assets/budget-cards/${imageId}.${extension}`;
+ }
+}
diff --git a/apps/picsa-tools/budget-tool/src/app/components/budget-tool.components.ts b/apps/picsa-tools/budget-tool/src/app/components/budget-tool.components.ts
index 313905518..97df18330 100644
--- a/apps/picsa-tools/budget-tool/src/app/components/budget-tool.components.ts
+++ b/apps/picsa-tools/budget-tool/src/app/components/budget-tool.components.ts
@@ -7,6 +7,7 @@ import { PicsaCommonComponentsModule } from '@picsa/components';
import { PicsaDialogsModule } from '@picsa/shared/features';
import { PicsaDbModule } from '@picsa/shared/modules';
import { MobxAngularModule } from 'mobx-angular';
+import { MatTooltipModule } from '@angular/material/tooltip';
import { BudgetMaterialModule } from '../material.module';
// Components
@@ -29,6 +30,8 @@ import { BudgetListItemComponent, BudgetListItemRenameDialog } from './list-item
import { BudgetShareDialogComponent } from './share-dialog/share-dialog.component';
import { BudgetPeriodSummaryComponent } from './summary/period-summary';
import { BudgetTableComponent } from './table/budget-table';
+import { BudgetSummaryComponent } from './budget-summary/budget-summary.component';
+import { MatIconModule } from '@angular/material/icon';
const components = [
BudgetBalanceLegendComponent,
@@ -51,6 +54,7 @@ const components = [
BudgetPeriodSummaryComponent,
BudgetShareDialogComponent,
BudgetTableComponent,
+ BudgetSummaryComponent,
];
@NgModule({
@@ -65,6 +69,8 @@ const components = [
MobxAngularModule,
PicsaDbModule,
RouterModule,
+ MatTooltipModule,
+ MatIconModule,
],
exports: components,
})
diff --git a/apps/picsa-tools/budget-tool/src/app/components/card/card-new/card-new.ts b/apps/picsa-tools/budget-tool/src/app/components/card/card-new/card-new.ts
index a86ee5379..b53bc8521 100644
--- a/apps/picsa-tools/budget-tool/src/app/components/card/card-new/card-new.ts
+++ b/apps/picsa-tools/budget-tool/src/app/components/card/card-new/card-new.ts
@@ -30,6 +30,7 @@ export class BudgetCardNew {
label: '',
type: this.type,
groupings: groupings as IBudgetCardGrouping[],
+ imgType: 'svg',
};
const dialogRef = this.dialog.open(BudgetCardNewDialog, {
width: '250px',
diff --git a/apps/picsa-tools/budget-tool/src/app/components/list-item/budget-list-item.html b/apps/picsa-tools/budget-tool/src/app/components/list-item/budget-list-item.html
index 5411078c2..f8d0cdcea 100644
--- a/apps/picsa-tools/budget-tool/src/app/components/list-item/budget-list-item.html
+++ b/apps/picsa-tools/budget-tool/src/app/components/list-item/budget-list-item.html
@@ -6,6 +6,7 @@
{{ budget.meta.description }}
{{ budget._created | date }}
+