Skip to content

Commit 17b75a3

Browse files
vignesh05904vignesh05904
andauthored
feat: sage50 export settings, show field to select account for per diem and mileage (#1639)
* intial * design alignments for ts * emp mapping tooltip to be displayed at last * comment fix minor --------- Co-authored-by: vignesh05904 <[email protected]>
1 parent cd1c263 commit 17b75a3

File tree

6 files changed

+94
-3
lines changed

6 files changed

+94
-3
lines changed

src/app/core/models/sage50/db/sage50-workspace.model.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import { Workspace } from "../../db/workspaces.model";
44
export interface Sage50Workspace extends Workspace {
55
onboarding_state: Sage50OnboardingState
66
org_settings: {
7-
enabled_payment_modes: ("CREDIT_CARD" | "REIMBURSABLE")[]
7+
enabled_payment_modes: ("CREDIT_CARD" | "REIMBURSABLE")[],
8+
is_mileage_enabled: boolean,
9+
is_per_diem_enabled: boolean
810
}
911
}

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ type Sage50ExportSettingsBase = {
4545
export interface Sage50ExportSettingsPost extends Sage50ExportSettingsBase {
4646
reimbursable_default_credit_line_account: number | null,
4747
reimbursable_default_account_payable_account: number | null,
48+
default_per_diem_account: number | null,
49+
default_mileage_account: number | null,
4850
ccc_default_credit_line_account: number | null,
4951
ccc_default_account_payable_account: number | null,
5052
default_cash_account: number | null,
@@ -54,6 +56,8 @@ export interface Sage50ExportSettingsPost extends Sage50ExportSettingsBase {
5456
export interface Sage50ExportSettingsGet extends Sage50ExportSettingsBase {
5557
reimbursable_default_credit_line_account: DestinationAttribute | null,
5658
reimbursable_default_account_payable_account: DestinationAttribute | null,
59+
default_per_diem_account: DestinationAttribute | null,
60+
default_mileage_account: DestinationAttribute | null,
5761
ccc_default_credit_line_account: DestinationAttribute | null,
5862
ccc_default_account_payable_account: DestinationAttribute | null,
5963
default_cash_account: DestinationAttribute | null,
@@ -73,6 +77,8 @@ export type Sage50ExportSettingsForm = {
7377
cccExportGroup: FormControl<Sage50ExpensesGroupedBy | null>,
7478
reimbursableDefaultCreditLineAccount: FormControl<DestinationAttribute | null>,
7579
reimbursableDefaultAccountPayableAccount: FormControl<DestinationAttribute | null>,
80+
defaultPerDiemAccount: FormControl<DestinationAttribute | null>,
81+
defaultMileageAccount: FormControl<DestinationAttribute | null>,
7682
cccDefaultCreditLineAccount: FormControl<DestinationAttribute | null>,
7783
cccDefaultAccountPayableAccount: FormControl<DestinationAttribute | null>,
7884
defaultCashAccount: FormControl<DestinationAttribute | null>,

src/app/core/services/sage50/sage50-configuration/sage50-export-settings.service.ts

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,12 @@ export const FIELD_DEPENDENCIES = new Map<keyof Sage50ExportSettingsForm, Depend
2222
['reimbursableDefaultAccountPayableAccount', (form) =>
2323
form.get('reimbursableExportType')?.value === Sage50ReimbursableExportType.PURCHASES_RECEIVE_INVENTORY
2424
],
25+
['defaultPerDiemAccount', (form) =>
26+
!!form.get('reimbursableExportType')?.value
27+
],
28+
['defaultMileageAccount', (form) =>
29+
!!form.get('reimbursableExportType')?.value
30+
],
2531
['reimbursableExpenseState', (form) =>
2632
!!form.get('reimbursableExportType')?.value
2733
],
@@ -143,6 +149,8 @@ export class Sage50ExportSettingsService extends ExportSettingsService {
143149
reimbursable_expense_grouped_by: form.get('reimbursableExportGroup')?.value,
144150
reimbursable_default_credit_line_account: form.get('reimbursableDefaultCreditLineAccount')?.value?.id,
145151
reimbursable_default_account_payable_account: form.get('reimbursableDefaultAccountPayableAccount')?.value?.id,
152+
default_per_diem_account: form.get('defaultPerDiemAccount')?.value?.id,
153+
default_mileage_account: form.get('defaultMileageAccount')?.value?.id,
146154
credit_card_expense_export_type: cccExportType,
147155
credit_card_expense_state: form.get('cccExpenseState')?.value,
148156
credit_card_expense_date: form.get('cccExportDate')?.value,
@@ -181,7 +189,13 @@ export class Sage50ExportSettingsService extends ExportSettingsService {
181189
};
182190
}
183191

184-
mapApiResponseToFormGroup(apiResponse: Sage50ExportSettingsGet | null, isReimbursableEnabled: boolean, isCCCEnabled: boolean): FormGroup<Sage50ExportSettingsForm> {
192+
mapApiResponseToFormGroup(
193+
apiResponse: Sage50ExportSettingsGet | null,
194+
isReimbursableEnabled: boolean,
195+
isCCCEnabled: boolean,
196+
isPerDiemEnabled: boolean,
197+
isMileageEnabled: boolean
198+
): FormGroup<Sage50ExportSettingsForm> {
185199
const { reimbursableExpenses, cccExpenses } = this.getEnabledExportTypes(apiResponse, isReimbursableEnabled, isCCCEnabled);
186200

187201
return new FormGroup<Sage50ExportSettingsForm>({
@@ -197,6 +211,8 @@ export class Sage50ExportSettingsService extends ExportSettingsService {
197211
cccExportGroup: new FormControl(apiResponse?.credit_card_expense_grouped_by ?? null),
198212
reimbursableDefaultAccountPayableAccount: new FormControl(apiResponse?.reimbursable_default_account_payable_account ?? null),
199213
reimbursableDefaultCreditLineAccount: new FormControl(apiResponse?.reimbursable_default_credit_line_account ?? null),
214+
defaultPerDiemAccount: new FormControl(apiResponse?.default_per_diem_account ?? null),
215+
defaultMileageAccount: new FormControl(apiResponse?.default_mileage_account ?? null),
200216
cccDefaultCreditLineAccount: new FormControl(apiResponse?.ccc_default_credit_line_account ?? null),
201217
cccDefaultAccountPayableAccount: new FormControl(apiResponse?.ccc_default_account_payable_account ?? null),
202218
defaultPaymentMethod: new FormControl(apiResponse?.default_payment_method ?? null),
@@ -222,6 +238,13 @@ export class Sage50ExportSettingsService extends ExportSettingsService {
222238
// If a field is required and empty, add an error
223239
const condition = FIELD_DEPENDENCIES.get(key as keyof Sage50ExportSettingsForm);
224240
if (condition && condition(form) && !form.get(key)?.value) {
241+
// Additional check for feature-flag-dependent fields
242+
if (key === 'defaultPerDiemAccount' && !isPerDiemEnabled) {
243+
continue; // Skip validation if per diem is not enabled
244+
}
245+
if (key === 'defaultMileageAccount' && !isMileageEnabled) {
246+
continue; // Skip validation if mileage is not enabled
247+
}
225248
errors[key] = {
226249
required: true
227250
};

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

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,51 @@
8484

8585
<ng-container *ngTemplateOutlet="noValidAccountsAlert"></ng-container>
8686

87+
}
88+
89+
@if (isPerDiemEnabled && showField('defaultPerDiemAccount')) {
90+
<app-configuration-select-field
91+
[form]="exportSettingsForm"
92+
[label]="'sage50ExportSettings.defaultPerDiemAccountLabel' | transloco"
93+
[subLabel]="'sage50ExportSettings.defaultPerDiemAccountSubLabel' | transloco"
94+
[formControllerName]="'defaultPerDiemAccount'"
95+
[destinationAttributes]="accounts"
96+
[destinationOptionKey]="Sage50ExportSettingDestinationOptionKey.ACCOUNT"
97+
[isOptionSearchInProgress]="isOptionSearchInProgress"
98+
[isAdvanceSearchEnabled]="true"
99+
(searchOptionsDropdown)="onAdvancedSearch($event)"
100+
[placeholder]="'sage50ExportSettings.defaultPerDiemAccountPlaceholder' | transloco"
101+
[isFieldMandatory]="true"
102+
[appName]="appName"
103+
[iconPath]="'list'"
104+
[isMultiLineOption]="true"
105+
></app-configuration-select-field>
106+
107+
<ng-container *ngTemplateOutlet="noValidAccountsAlert"></ng-container>
108+
}
109+
110+
@if (isMileageEnabled && showField('defaultMileageAccount')) {
111+
<app-configuration-select-field
112+
[form]="exportSettingsForm"
113+
[label]="'sage50ExportSettings.defaultMileageAccountLabel' | transloco"
114+
[subLabel]="'sage50ExportSettings.defaultMileageAccountSubLabel' | transloco"
115+
[formControllerName]="'defaultMileageAccount'"
116+
[destinationAttributes]="accounts"
117+
[destinationOptionKey]="Sage50ExportSettingDestinationOptionKey.ACCOUNT"
118+
[isOptionSearchInProgress]="isOptionSearchInProgress"
119+
[isAdvanceSearchEnabled]="true"
120+
(searchOptionsDropdown)="onAdvancedSearch($event)"
121+
[placeholder]="'sage50ExportSettings.defaultMileageAccountPlaceholder' | transloco"
122+
[isFieldMandatory]="true"
123+
[appName]="appName"
124+
[iconPath]="'list'"
125+
[isMultiLineOption]="true"
126+
></app-configuration-select-field>
127+
128+
<ng-container *ngTemplateOutlet="noValidAccountsAlert"></ng-container>
129+
}
130+
131+
@if (showField('reimbursableDefaultAccountPayableAccount')) {
87132
<div class="tw-p-24-px tw-pt-0">
88133
<app-alert [type]="'info'" [variant]="'subtle-bordered'">
89134
<p>{{ 'sage50ExportSettings.reimbursableDefaultAccountPayableAccountInfo' | transloco }}</p>

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

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,10 @@ export class Sage50ExportSettingsComponent implements OnInit {
112112

113113
isCCCExportGroupEditable = true;
114114

115+
isPerDiemEnabled = false;
116+
117+
isMileageEnabled = false;
118+
115119
showPurchasesExportWarning: boolean = false;
116120

117121
// State
@@ -331,6 +335,8 @@ export class Sage50ExportSettingsComponent implements OnInit {
331335
const extraAccountOptions = [
332336
exportSettings?.reimbursable_default_credit_line_account,
333337
exportSettings?.reimbursable_default_account_payable_account,
338+
exportSettings?.default_per_diem_account,
339+
exportSettings?.default_mileage_account,
334340
exportSettings?.ccc_default_credit_line_account,
335341
exportSettings?.ccc_default_account_payable_account,
336342
exportSettings?.default_cash_account
@@ -489,6 +495,9 @@ export class Sage50ExportSettingsComponent implements OnInit {
489495
this.isCCCEnabled = paymentModes.includes("CREDIT_CARD");
490496
}
491497

498+
this.isPerDiemEnabled = workspaces?.[0]?.org_settings.is_per_diem_enabled ?? false;
499+
this.isMileageEnabled = workspaces?.[0]?.org_settings.is_mileage_enabled ?? false;
500+
492501
this.accounts = [
493502
...accountsPayable.results,
494503
...longTermLiabilities.results,
@@ -498,7 +507,7 @@ export class Sage50ExportSettingsComponent implements OnInit {
498507
this.vendors = vendors.results;
499508

500509
this.exportSettingsForm = this.exportSettingService.mapApiResponseToFormGroup(
501-
exportSettings, this.isReimbursableEnabled, this.isCCCEnabled
510+
exportSettings, this.isReimbursableEnabled, this.isCCCEnabled, this.isPerDiemEnabled, this.isMileageEnabled
502511
);
503512

504513
// Initialize tracking variable for warning dialog with current form value

src/assets/i18n/en.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2486,6 +2486,12 @@
24862486
"reimbursableDefaultAccountPayableAccountLabel": "Default accounts payable account",
24872487
"reimbursableDefaultAccountPayableAccountSubLabel": "Select the accounts payable account where invoices should be posted.",
24882488
"reimbursableDefaultAccountPayableAccountPlaceholder": "Select accounts payable account",
2489+
"defaultPerDiemAccountLabel": "Default per diem account",
2490+
"defaultPerDiemAccountSubLabel": "Select the Sage 50 account to use when exporting per diem expenses.",
2491+
"defaultPerDiemAccountPlaceholder": "Select per diem account",
2492+
"defaultMileageAccountLabel": "Default mileage account",
2493+
"defaultMileageAccountSubLabel": "Select the Sage 50 account to use when exporting mileage expenses.",
2494+
"defaultMileageAccountPlaceholder": "Select mileage account",
24892495
"reimbursableExpenseStateLabel": "State of export",
24902496
"reimbursableExpenseStateSubLabel": "Choose whether to export expenses after the reimbursement is initiated (Processing) or after the reimbursement is settled (Closed).",
24912497
"reimbursableExpenseStatePlaceholder": "Select export state",

0 commit comments

Comments
 (0)