Skip to content

Commit 3a2b763

Browse files
authored
import name with code from sage 300 cre mapping (#890)
import name with code from sage 300 cre
1 parent 0550917 commit 3a2b763

28 files changed

+424
-90
lines changed

src/app/core/models/common/import-settings.model.ts

+18-5
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@ import { Sage300ImportSettingGet } from "../sage300/sage300-configuration/sage30
77
export type ImportDefaultField = {
88
destination_field: string,
99
source_field: string,
10-
formController: string
10+
formController: string,
11+
import_code?: string
1112
}
1213

1314
export type ExpenseField = {
@@ -30,7 +31,8 @@ export type ImportSettingMappingRow = {
3031
import_to_fyle: boolean,
3132
is_custom: boolean,
3233
source_field: string,
33-
source_placeholder: string | null
34+
source_placeholder: string | null,
35+
import_code?: boolean
3436
}
3537

3638
export type ImportSettingsCustomFieldRow = {
@@ -40,6 +42,10 @@ export type ImportSettingsCustomFieldRow = {
4042
is_dependent: boolean
4143
}
4244

45+
export type ImportCodeFieldConfigType = {
46+
[key: string]: boolean;
47+
};
48+
4349
export class ImportSettingsModel {
4450

4551
static getCustomFieldOption(): ExpenseField[] {
@@ -52,11 +58,16 @@ export class ImportSettingsModel {
5258
destination_field: new FormControl(data.destination_field || '', RxwebValidators.unique()),
5359
import_to_fyle: new FormControl(data.import_to_fyle || false),
5460
is_custom: new FormControl(data.is_custom || false),
55-
source_placeholder: new FormControl(data.source_placeholder || null)
61+
source_placeholder: new FormControl(data.source_placeholder || null),
62+
import_code: new FormControl(data.import_code)
5663
});
5764
}
5865

59-
static constructFormArray(importSettingsMappingSettings: ImportSettingMappingRow[] | [], accountingAppFields: IntegrationField[], isDestinationFixedImport: boolean = true): FormGroup[] {
66+
static getImportCodeField(importCodeFields: string[], destinationField: string): boolean {
67+
return importCodeFields.includes(destinationField);
68+
}
69+
70+
static constructFormArray(importSettingsMappingSettings: ImportSettingMappingRow[], accountingAppFields: IntegrationField[], isDestinationFixedImport: boolean = true, importCodeFields: string[] | [] = []): FormGroup[] {
6071
const expenseFieldFormArray: FormGroup[] = [];
6172
const mappedFieldMap = new Map<string, any>();
6273
const unmappedFieldMap = new Map<string, any>();
@@ -72,9 +83,11 @@ export class ImportSettingsModel {
7283
import_to_fyle: false,
7384
is_custom: false,
7485
source_field: '',
75-
source_placeholder: null
86+
source_placeholder: null,
87+
import_code: null
7688
};
7789
if (mappingSetting) {
90+
fieldData.import_code = fieldData.import_to_fyle ? this.getImportCodeField(importCodeFields, accountingAppField.attribute_type) : null;
7891
mappedFieldMap.set(accountingAppField.attribute_type, fieldData);
7992
} else {
8093
unmappedFieldMap.set(accountingAppField.attribute_type, fieldData);

src/app/core/models/common/select-form-option.model.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
export type SelectFormOption = {
22
label: string;
3-
value: string | null | number;
3+
value: string | null | number | boolean;
4+
subLabel?: string;
45
}
56

67
export type SelectFormLabel = {

src/app/core/models/db/destination-attribute.model.ts

+1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ export type DestinationAttribute = {
1919
value: string;
2020
destination_id: string;
2121
active: boolean;
22+
code?: string;
2223
created_at: Date;
2324
updated_at: Date;
2425
workspace: number;

src/app/core/models/sage300/sage300-configuration/sage300-import-settings.model.ts

+12-5
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ import { IntegrationField } from "../../db/mapping.model";
55
export type Sage300DefaultFields = {
66
destination_field: string,
77
source_field: string,
8-
formController: string
8+
formController: string,
9+
import_code: string
910
}
1011

1112
export type Sage300DependentImportFields = {
@@ -27,7 +28,8 @@ export type Sage300ImportSetting = {
2728
import_settings: {
2829
import_categories: boolean,
2930
import_vendors_as_merchants: boolean,
30-
add_commitment_details: boolean
31+
add_commitment_details: boolean,
32+
import_code_fields: string[] | [],
3133
},
3234
mapping_settings: ImportSettingMappingRow[] | [],
3335
dependent_field_settings: Sage300ImportSettingsDependentFieldSetting | null,
@@ -51,10 +53,14 @@ export class Sage300ImportSettingModel extends ImportSettingsModel {
5153
}
5254

5355
static mapAPIResponseToFormGroup(importSettings: Sage300ImportSettingGet | null, sage300Fields: IntegrationField[]): FormGroup {
54-
const expenseFieldsArray = importSettings?.mapping_settings ? this.constructFormArray(importSettings.mapping_settings, sage300Fields, false) : [] ;
56+
const importCode = importSettings?.import_settings?.import_code_fields ? importSettings?.import_settings?.import_code_fields : [];
57+
const expenseFieldsArray = importSettings?.mapping_settings ? this.constructFormArray(importSettings.mapping_settings, sage300Fields, false, importCode) : [] ;
5558
return new FormGroup({
59+
importCodeFields: new FormControl(importSettings?.import_settings?.import_code_fields ? importSettings?.import_settings.import_code_fields : []),
5660
importCategories: new FormControl(importSettings?.import_settings?.import_categories ?? false),
61+
importCategoryCode: new FormControl(importSettings?.import_settings?.import_categories ? this.getImportCodeField(importCode, 'ACCOUNT') : null),
5762
importVendorAsMerchant: new FormControl(importSettings?.import_settings?.import_vendors_as_merchants ?? false),
63+
importVendorCode: new FormControl(importSettings?.import_settings?.import_vendors_as_merchants ? this.getImportCodeField(importCode, 'VENDOR') : null),
5864
expenseFields: new FormArray(expenseFieldsArray),
5965
isDependentImportEnabled: new FormControl(importSettings?.dependent_field_settings?.is_import_enabled ? importSettings.dependent_field_settings.is_import_enabled : false),
6066
costCodes: new FormControl(importSettings?.dependent_field_settings?.cost_code_field_name ? this.generateDependentFieldValue(importSettings.dependent_field_settings.cost_code_field_name, importSettings.dependent_field_settings.cost_code_placeholder) : null),
@@ -72,10 +78,11 @@ export class Sage300ImportSettingModel extends ImportSettingsModel {
7278
import_settings: {
7379
import_categories: importSettingsForm.get('importCategories')?.value,
7480
import_vendors_as_merchants: importSettingsForm.get('importVendorAsMerchant')?.value,
75-
add_commitment_details: importSettingsForm.get('addCommitmentDetails')?.value
81+
add_commitment_details: importSettingsForm.get('addCommitmentDetails')?.value,
82+
import_code_fields: importSettingsForm.get('importCodeFields')?.value
7683
},
7784
mapping_settings: mappingSettings,
78-
dependent_field_settings: importSettingsForm.get('isDependentImportEnabled')?.value ? {
85+
dependent_field_settings: importSettingsForm.get('isDependentImportEnabled')?.value && (importSettingsForm.get('costCodes')?.value && importSettingsForm.get('costCategory')?.value) ? {
7986
cost_code_field_name: importSettingsForm.get('costCodes')?.value ? importSettingsForm.get('costCodes')?.value.attribute_type : (importSettings?.dependent_field_settings?.cost_code_field_name ? importSettings.dependent_field_settings?.cost_code_field_name : null),
8087
cost_code_placeholder: importSettingsForm.get('costCodes')?.value ? importSettingsForm.get('costCodes')?.value.source_placeholder : (importSettings?.dependent_field_settings?.cost_code_placeholder ? importSettings.dependent_field_settings?.cost_code_placeholder : null),
8188
cost_category_field_name: importSettingsForm.get('costCategory')?.value ? importSettingsForm.get('costCategory')?.value.attribute_type : (importSettings?.dependent_field_settings?.cost_category_field_name ? importSettings.dependent_field_settings?.cost_category_field_name : null),

src/app/core/services/common/helper.service.ts

+1
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,7 @@ export class HelperService {
251251
}
252252

253253
sentenseCaseConversion(content: string) {
254+
content = new SnakeCaseToSpaceCasePipe().transform(content);
254255
return brandingConfig.brandId === 'co' ? new SentenceCasePipe().transform(content) : content;
255256
}
256257

src/app/core/services/common/mapping.service.ts

+11-3
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,10 @@ export class MappingService {
3131
return this.apiService.get(`/workspaces/${this.workspaceId}/export_settings/`, {});
3232
}
3333

34+
getImportSettings(): Observable<any> {
35+
return this.apiService.get(`/workspaces/${this.workspaceId}/import_settings/`, {});
36+
}
37+
3438
getDestinationAttributes(attributeTypes: string | string[], version: 'v1' | 'v2', apiPath?: string, accountType?: string, active?: boolean, displayName?: string): Observable<any> {
3539
const params: {attribute_type__in: string | string[], account_type?: string, active?: boolean, display_name__in?: string} = {
3640
attribute_type__in: attributeTypes
@@ -166,17 +170,21 @@ export class MappingService {
166170
return this.apiService.post(`/workspaces/${this.workspaceService.getWorkspaceId()}/mappings/`, mapping);
167171
}
168172

169-
getPaginatedDestinationAttributes(attributeType: string, value?: string, display_name?: string): Observable<PaginatedDestinationAttribute> {
173+
getPaginatedDestinationAttributes(attributeType: string, value?: string, display_name?: string, appName?: string): Observable<PaginatedDestinationAttribute> {
170174
const workspaceId = this.workspaceService.getWorkspaceId();
171-
const params: {limit: number, offset: number, attribute_type: string, active?: boolean, value__icontains?: string, display_name__in?: string} = {
175+
const params: {limit: number, offset: number, attribute_type: string, active?: boolean, value__icontains?: string, value?: string, display_name__in?: string} = {
172176
limit: 100,
173177
offset: 0,
174178
attribute_type: attributeType,
175179
active: true
176180
};
177181

178182
if (value) {
179-
params.value__icontains = value;
183+
if (appName === AppName.SAGE300) {
184+
params.value = value;
185+
} else {
186+
params.value__icontains = value;
187+
}
180188
}
181189

182190
if (display_name) {

src/app/core/services/sage300/sage300-configuration/sage300-import-settings.service.ts

+5
Original file line numberDiff line numberDiff line change
@@ -36,4 +36,9 @@ export class Sage300ImportSettingsService {
3636
postImportSettings(importSettingsPayload: Sage300ImportSettingPost): Observable<Sage300ImportSettingGet> {
3737
return this.apiService.put(`/workspaces/${this.workspaceService.getWorkspaceId()}/import_settings/`, importSettingsPayload);
3838
}
39+
40+
getImportCodeFieldConfig() {
41+
const workspaceId = this.workspaceService.getWorkspaceId();
42+
return this.apiService.get(`/workspaces/${workspaceId}/import_settings/import_code_fields_config/`, {});
43+
}
3944
}

src/app/integrations/sage300/sage300-main/sage300-dashboard/sage300-dashboard.component.html

+1-1
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,6 @@
4040
[groupedErrorStat]="groupedErrorStat"
4141
[destinationFieldMap]="destinationFieldMap"
4242
[exportKey]="'accounting_export'"
43-
>
43+
[importCodeFields]="importCodeFields">
4444
</app-dashboard-error-section>
4545
</div>

src/app/integrations/sage300/sage300-main/sage300-dashboard/sage300-dashboard.component.ts

+9-2
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import { Sage300AccountingExportResponse, Sage300AccountingExport } from 'src/ap
1111
import { AccountingExportService } from 'src/app/core/services/common/accounting-export.service';
1212
import { brandingFeatureConfig } from 'src/app/branding/branding-config';
1313
import { Sage300ExportSettingService } from 'src/app/core/services/sage300/sage300-configuration/sage300-export-setting.service';
14+
import { Sage300ImportSettingsService } from 'src/app/core/services/sage300/sage300-configuration/sage300-import-settings.service';
1415

1516
@Component({
1617
selector: 'app-sage300-dashboard',
@@ -67,11 +68,14 @@ export class Sage300DashboardComponent implements OnInit {
6768

6869
readonly isGradientAllowed: boolean = brandingFeatureConfig.isGradientAllowed;
6970

71+
importCodeFields: any;
72+
7073
constructor(
7174
private accountingExportService: AccountingExportService,
7275
private dashboardService: DashboardService,
7376
private refinerService: RefinerService,
74-
private sage300ExportSettingService: Sage300ExportSettingService
77+
private sage300ExportSettingService: Sage300ExportSettingService,
78+
private sage300ImportSettingService: Sage300ImportSettingsService
7579
) { }
7680

7781
private pollExportStatus(exportableAccountingExportIds: number[] = []): void {
@@ -128,7 +132,8 @@ export class Sage300DashboardComponent implements OnInit {
128132
this.getAccountingExportSummary$.pipe(catchError(() => of(null))),
129133
this.accountingExportService.getAccountingExports(this.accountingExportType, [AccountingExportStatus.ENQUEUED, AccountingExportStatus.IN_PROGRESS, AccountingExportStatus.EXPORT_QUEUED, AccountingExportStatus.FAILED, AccountingExportStatus.FATAL], [], 500, 0),
130134
this.dashboardService.getExportableAccountingExportIds(),
131-
this.sage300ExportSettingService.getSage300ExportSettings()
135+
this.sage300ExportSettingService.getSage300ExportSettings(),
136+
this.sage300ImportSettingService.getSage300ImportSettings()
132137
]).subscribe((responses) => {
133138
this.errors = DashboardModel.parseAPIResponseToGroupedError(responses[0].results);
134139
this.accountingExportSummary = responses[1];
@@ -140,6 +145,8 @@ export class Sage300DashboardComponent implements OnInit {
140145
this.reimbursableImportState = responses[4].reimbursable_expenses_export_type ? this.reimbursableExpenseImportStateMap[responses[4].reimbursable_expense_state] : null;
141146
this.cccImportState = responses[4].credit_card_expense_export_type ? this.cccExpenseImportStateMap[responses[4].credit_card_expense_state] : null;
142147

148+
this.importCodeFields = responses[5].import_settings.import_code_fields ? responses[5].import_settings.import_code_fields : [];
149+
143150
this.isLoading = false;
144151

145152
if (queuedTasks.length) {

src/app/integrations/sage300/sage300-main/sage300-mapping/sage300-base-mapping/sage300-base-mapping.component.html

+1
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,6 @@
66
[destinationField]="destinationField"
77
[showAutoMapEmployee]="showAutoMapEmployee"
88
[appName]="AppName.SAGE300"
9+
[isMultiLineOption]="isMultiLineOption"
910
(triggerAutoMapEmployee)="triggerAutoMapEmployees()"
1011
></app-generic-mapping-v2>

src/app/integrations/sage300/sage300-main/sage300-mapping/sage300-base-mapping/sage300-base-mapping.component.ts

+5-1
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ export class Sage300BaseMappingComponent implements OnInit {
3232

3333
AppName = AppName;
3434

35+
isMultiLineOption: boolean = false;
36+
3537
constructor(
3638
private route: ActivatedRoute,
3739
private mappingService: MappingService,
@@ -63,12 +65,14 @@ export class Sage300BaseMappingComponent implements OnInit {
6365
this.sourceField = decodeURIComponent(this.route.snapshot.params.source_field.toUpperCase());
6466
forkJoin(
6567
this.mappingService.getExportSettings(),
68+
this.mappingService.getImportSettings(),
6669
this.mappingService.getMappingSettings()
67-
).subscribe(([exportSettingsResponse, mappingSettingsResponse]) => {
70+
).subscribe(([exportSettingsResponse, importSettingsResponse, mappingSettingsResponse]) => {
6871
this.reimbursableExpenseObject = exportSettingsResponse.reimbursable_expenses_object;
6972
this.cccExpenseObject = exportSettingsResponse.corporate_credit_card_expenses_object;
7073
this.showAutoMapEmployee = exportSettingsResponse.auto_map_employees ? true : false;
7174
this.destinationField = this.getSourceType(mappingSettingsResponse.results);
75+
this.isMultiLineOption = this.destinationField !== FyleField.VENDOR ? importSettingsResponse.import_settings.import_code_fields?.includes(this.destinationField) : false;
7276
this.mappingService.getPaginatedDestinationAttributes(this.destinationField).subscribe((response: any) => {
7377
this.destinationOptions = response.results;
7478
this.isLoading = false;

src/app/integrations/sage300/sage300-shared/fixture.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ export const importSettingsResponse: Sage300ImportSettingGet = {
99
"import_settings": {
1010
"import_categories": false,
1111
"import_vendors_as_merchants": false,
12-
"add_commitment_details": false
12+
"add_commitment_details": false,
13+
"import_code_fields": []
1314
},
1415
"mapping_settings": [
1516
{

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

+5
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@
9090
[iconPath]="'list'"
9191
[placeholder]="'Select default Job'"
9292
[appName]="appName"
93+
[isMultiLineOption]="sage300ImportCodeFields.includes(sage300Field.JOB)"
9394
[formControllerName]="'defaultJobName'">
9495
</app-configuration-select-field>
9596
</div>
@@ -109,6 +110,7 @@
109110
[iconPath]="'list'"
110111
[placeholder]="'Select A/P account'"
111112
[appName]="appName"
113+
[isMultiLineOption]="sage300ImportCodeFields.includes(sage300Field.ACCOUNT)"
112114
[formControllerName]="'defaultReimbursableAP'"></app-configuration-select-field>
113115
</div>
114116
<div *ngIf="exportSettingForm.get('reimbursableExportType')?.value" class="tw-mt-16-px tw-bg-white tw-border tw-border-solid tw-border-separator tw-rounded-12-px">
@@ -229,6 +231,7 @@
229231
[showClearIcon]="true"
230232
[iconPath]="'list'"
231233
[placeholder]="'Select Default Job'"
234+
[isMultiLineOption]="sage300ImportCodeFields.includes(sage300Field.JOB)"
232235
[appName]="appName"
233236
[formControllerName]="'defaultJobName'">
234237
</app-configuration-select-field>
@@ -250,6 +253,7 @@
250253
[iconPath]="'list'"
251254
[placeholder]="'Select A/P account'"
252255
[appName]="appName"
256+
[isMultiLineOption]="sage300ImportCodeFields.includes(sage300Field.ACCOUNT)"
253257
[formControllerName]="'defaultCCCAP'"></app-configuration-select-field>
254258
</div>
255259
<div *ngIf="exportSettingForm.get('cccExportType')?.value" class="tw-mt-16-px tw-bg-white tw-border tw-border-solid tw-border-separator tw-rounded-12-px">
@@ -268,6 +272,7 @@
268272
[iconPath]="'list'"
269273
[placeholder]="'Select default vendor'"
270274
[appName]="appName"
275+
[isMultiLineOption]="sage300ImportCodeFields.includes(Sage300ExportSettingDestinationOptionKey.VENDOR)"
271276
[formControllerName]="'defaultVendorName'">
272277
</app-configuration-select-field>
273278
</div>

0 commit comments

Comments
 (0)