Skip to content

Commit 936b0f3

Browse files
feat: support split expense grouping for Xero (#1075)
* feat: add split expense grouping config to xero export settings * feat: add split expense grouping config to xero clone settings (#1072)
1 parent c7a822f commit 936b0f3

File tree

5 files changed

+64
-8
lines changed

5 files changed

+64
-8
lines changed

src/app/core/models/xero/xero-configuration/xero-export-settings.model.ts

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { FormControl, FormGroup } from "@angular/forms";
22
import { SelectFormOption } from "../../common/select-form-option.model";
33
import { DefaultDestinationAttribute, DestinationAttribute } from "../../db/destination-attribute.model";
44
import { ExpenseGroupSettingGet, ExpenseGroupSettingPost } from "../../db/expense-group-setting.model";
5-
import { AutoMapEmployeeOptions, ExpenseGroupingFieldOption, ExpenseState, ExportDateType, XeroCCCExpenseState, XeroCorporateCreditCardExpensesObject, XeroReimbursableExpensesObject } from "../../enum/enum.model";
5+
import { AutoMapEmployeeOptions, ExpenseGroupingFieldOption, ExpenseState, ExportDateType, SplitExpenseGrouping, XeroCCCExpenseState, XeroCorporateCreditCardExpensesObject, XeroReimbursableExpensesObject } from "../../enum/enum.model";
66
import { ExportModuleRule, ExportSettingModel, ExportSettingValidatorRule } from "../../common/export-settings.model";
77
import { brandingContent } from "src/app/branding/branding-config";
88

@@ -12,7 +12,8 @@ export type XeroExpenseGroupSettingPost = {
1212
reimbursable_export_date_type: ExportDateType | null;
1313
corporate_credit_card_expense_group_fields?: string[] | null;
1414
ccc_export_date_type: ExportDateType | null;
15-
reimbursable_expense_state: ExpenseState
15+
reimbursable_expense_state: ExpenseState;
16+
split_expense_grouping: SplitExpenseGrouping
1617
};
1718

1819
export interface XeroExpenseGroupSettingGet extends XeroExpenseGroupSettingPost {}
@@ -167,10 +168,23 @@ export class XeroExportSettingModel {
167168
];
168169
}
169170

171+
static getSplitExpenseGroupingOptions() {
172+
return [
173+
{
174+
label: 'Single Line Item',
175+
value: SplitExpenseGrouping.SINGLE_LINE_ITEM
176+
},
177+
{
178+
label: 'Multiple Line Item',
179+
value: SplitExpenseGrouping.MULTIPLE_LINE_ITEM
180+
}
181+
];
182+
}
183+
170184
static getValidators(): [ExportSettingValidatorRule, ExportModuleRule[]] {
171185
const exportSettingValidatorRule: ExportSettingValidatorRule = {
172186
reimbursableExpense: ['reimbursableExportType', 'reimbursableExportGroup', 'reimbursableExportDate', 'expenseState'],
173-
creditCardExpense: ['creditCardExportType', 'creditCardExportGroup', 'creditCardExportDate', 'cccExpenseState', 'bankAccount']
187+
creditCardExpense: ['creditCardExportType', 'creditCardExportGroup', 'creditCardExportDate', 'cccExpenseState', 'bankAccount', 'splitExpenseGrouping']
174188
};
175189

176190
const exportModuleRule: ExportModuleRule[] = [
@@ -204,7 +218,8 @@ export class XeroExportSettingModel {
204218
creditCardExportDate: new FormControl(exportSettings?.expense_group_settings?.ccc_export_date_type),
205219
bankAccount: new FormControl(exportSettings?.general_mappings?.bank_account?.id ? findObjectByDestinationId(destinationAttribute, exportSettings.general_mappings.bank_account.id) : null),
206220
autoMapEmployees: new FormControl(exportSettings?.workspace_general_settings?.auto_map_employees),
207-
searchOption: new FormControl('')
221+
searchOption: new FormControl(''),
222+
splitExpenseGrouping: new FormControl(exportSettings?.expense_group_settings?.split_expense_grouping)
208223
});
209224
}
210225

@@ -215,7 +230,8 @@ export class XeroExportSettingModel {
215230
reimbursable_expense_state: exportSettingsForm.get('expenseState')?.value,
216231
reimbursable_export_date_type: exportSettingsForm.get('reimbursableExportDate')?.value ? exportSettingsForm.get('reimbursableExportDate')?.value : ExportDateType.CURRENT_DATE,
217232
ccc_expense_state: exportSettingsForm.get('cccExpenseState')?.value,
218-
ccc_export_date_type: exportSettingsForm.get('creditCardExportDate')?.value ? exportSettingsForm.get('creditCardExportDate')?.value : ExportDateType.SPENT_AT
233+
ccc_export_date_type: exportSettingsForm.get('creditCardExportDate')?.value ? exportSettingsForm.get('creditCardExportDate')?.value : ExportDateType.SPENT_AT,
234+
split_expense_grouping: exportSettingsForm.get('splitExpenseGrouping')?.value ? exportSettingsForm.get('splitExpenseGrouping')?.value : SplitExpenseGrouping.MULTIPLE_LINE_ITEM
219235
},
220236
workspace_general_settings: {
221237
reimbursable_expenses_object: exportSettingsForm.get('reimbursableExpense')?.value ? XeroReimbursableExpensesObject.PURCHASE_BILL : null,

src/app/integrations/xero/xero-onboarding/xero-clone-settings/xero-clone-settings.component.html

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,21 @@
178178
[tooltipText]="'The selected date will reflect in the corporate card expenses exported to Xero.'">
179179
</app-clone-setting-field>
180180
</div>
181+
182+
<div class="clone-setting--field" *ngIf="brandingFeatureConfig.featureFlags.exportSettings.splitExpenseGrouping &&
183+
exportSettingForm.controls.creditCardExportType.value === XeroCorporateCreditCardExpensesObject.BANK_TRANSACTION">
184+
<app-clone-setting-field
185+
[iconSource]="'question-square-outline'"
186+
[label]="'How should the split expenses be grouped?'"
187+
[options]="splitExpenseGroupingOptions"
188+
[placeholder]="'Select split expense grouping'"
189+
[form]="exportSettingForm"
190+
[isFieldMandatory]="true"
191+
[formControllerName]="'splitExpenseGrouping'"
192+
[dropdownDisplayKey]="'label'"
193+
[tooltipText]="'The selected option will dictate how split expenses will be exported to Xero.'">
194+
</app-clone-setting-field>
195+
</div>
181196
</div>
182197
</div>
183198

src/app/integrations/xero/xero-onboarding/xero-clone-settings/xero-clone-settings.component.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@ import { Component, Inject, OnInit } from '@angular/core';
22
import { FormArray, FormBuilder, FormGroup, Validators } from '@angular/forms';
33
import { Router } from '@angular/router';
44
import { forkJoin } from 'rxjs';
5-
import { brandingConfig, brandingContent } from 'src/app/branding/branding-config';
5+
import { brandingConfig, brandingContent, brandingFeatureConfig } from 'src/app/branding/branding-config';
66
import { ExportSettingModel } from 'src/app/core/models/common/export-settings.model';
77
import { ExpenseField, ImportSettingsModel } from 'src/app/core/models/common/import-settings.model';
88
import { SelectFormOption } from 'src/app/core/models/common/select-form-option.model';
99
import { DefaultDestinationAttribute, DestinationAttribute } from 'src/app/core/models/db/destination-attribute.model';
1010
import { FyleField, IntegrationField } from 'src/app/core/models/db/mapping.model';
11-
import { AppName, ConfigurationCta, ConfigurationWarningEvent, InputType, ToastSeverity, XeroFyleField } from 'src/app/core/models/enum/enum.model';
11+
import { AppName, ConfigurationCta, ConfigurationWarningEvent, InputType, ToastSeverity, XeroCorporateCreditCardExpensesObject, XeroFyleField } from 'src/app/core/models/enum/enum.model';
1212
import { ConfigurationWarningOut } from 'src/app/core/models/misc/configuration-warning.model';
1313
import { OnboardingStepper } from 'src/app/core/models/misc/onboarding-stepper.model';
1414
import { QBDEmailOptions } from 'src/app/core/models/qbd/qbd-configuration/qbd-advanced-setting.model';
@@ -40,6 +40,8 @@ export class XeroCloneSettingsComponent implements OnInit {
4040

4141
brandingConfig = brandingConfig;
4242

43+
brandingFeatureConfig = brandingFeatureConfig;
44+
4345
bankAccounts: DefaultDestinationAttribute[];
4446

4547
reimbursableExportTypes = XeroExportSettingModel.getReimbursableExportTypes();
@@ -60,6 +62,8 @@ export class XeroCloneSettingsComponent implements OnInit {
6062

6163
cccExpenseStateOptions = XeroExportSettingModel.getCCCExpenseStateOptions();
6264

65+
splitExpenseGroupingOptions = XeroExportSettingModel.getSplitExpenseGroupingOptions();
66+
6367
exportSettingForm: FormGroup;
6468

6569
xeroFields: IntegrationField[];
@@ -133,6 +137,8 @@ export class XeroCloneSettingsComponent implements OnInit {
133137

134138
brandingContent = brandingContent;
135139

140+
XeroCorporateCreditCardExpensesObject = XeroCorporateCreditCardExpensesObject;
141+
136142
constructor(
137143
private cloneSettingService: CloneSettingService,
138144
private configurationService: ConfigurationService,

src/app/integrations/xero/xero-shared/xero-export-settings/xero-export-settings.component.html

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,21 @@ <h5>
190190
[formControllerName]="'creditCardExportDate'">
191191
</app-configuration-select-field>
192192
</div>
193+
194+
<div *ngIf="brandingFeatureConfig.featureFlags.exportSettings.splitExpenseGrouping && exportSettingForm.get('creditCardExportType')?.value === XeroCorporateCreditCardExpensesObject.BANK_TRANSACTION" class="tw-mt-16-px tw-bg-white tw-border tw-border-solid tw-border-border-tertiary tw-rounded-12-px">
195+
<app-configuration-select-field
196+
[form]="exportSettingForm"
197+
[isFieldMandatory]="true"
198+
[showClearIcon]="true"
199+
[mandatoryErrorListName]="'split expense grouping'"
200+
[label]="'How should the split expenses be grouped?'"
201+
[subLabel]="'Choose how expenses should be grouped for split expenses'"
202+
[options]="splitExpenseGroupingOptions"
203+
[iconPath]="'question-square-outline'"
204+
[placeholder]="'Select the split expense grouping type'"
205+
[formControllerName]="'splitExpenseGrouping'">
206+
</app-configuration-select-field>
207+
</div>
193208
</div>
194209
</div>
195210
<app-configuration-step-footer

src/app/integrations/xero/xero-shared/xero-export-settings/xero-export-settings.component.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { brandingConfig, brandingContent, brandingFeatureConfig, brandingKbArtic
66
import { ExportSettingModel, ExportSettingOptionSearch } from 'src/app/core/models/common/export-settings.model';
77
import { SelectFormOption } from 'src/app/core/models/common/select-form-option.model';
88
import { DestinationAttribute } from 'src/app/core/models/db/destination-attribute.model';
9-
import { AppName, ConfigurationCta, ConfigurationWarningEvent, EmployeeFieldMapping, ExpenseGroupingFieldOption, XeroExportSettingDestinationOptionKey, ToastSeverity, XeroOnboardingState } from 'src/app/core/models/enum/enum.model';
9+
import { AppName, ConfigurationCta, ConfigurationWarningEvent, EmployeeFieldMapping, ExpenseGroupingFieldOption, XeroExportSettingDestinationOptionKey, ToastSeverity, XeroOnboardingState, XeroCorporateCreditCardExpensesObject } from 'src/app/core/models/enum/enum.model';
1010
import { ConfigurationWarningOut } from 'src/app/core/models/misc/configuration-warning.model';
1111
import { XeroExportSettingGet, XeroExportSettingModel } from 'src/app/core/models/xero/xero-configuration/xero-export-settings.model';
1212
import { HelperService } from 'src/app/core/services/common/helper.service';
@@ -49,6 +49,8 @@ export class XeroExportSettingsComponent implements OnInit {
4949

5050
cccExpenseGroupingDateOptions = XeroExportSettingModel.getCCCExpenseGroupingDateOptions();
5151

52+
splitExpenseGroupingOptions = XeroExportSettingModel.getSplitExpenseGroupingOptions();
53+
5254
autoMapEmployeeTypes = XeroExportSettingModel.getAutoMapEmployeeOptions();
5355

5456
expenseStateOptions = XeroExportSettingModel.getReimbursableExpenseStateOptions();
@@ -86,6 +88,8 @@ export class XeroExportSettingsComponent implements OnInit {
8688

8789
readonly brandingContent = brandingContent.xero.configuration.exportSetting;
8890

91+
readonly XeroCorporateCreditCardExpensesObject = XeroCorporateCreditCardExpensesObject;
92+
8993
constructor(
9094
public helperService: HelperService,
9195
private exportSettingService: XeroExportSettingsService,

0 commit comments

Comments
 (0)