feat(accounts): controller, service, module and dtos implemented. 2 basics functions are implemented for testing routes

This commit is contained in:
Matthieu Haineault 2026-02-03 09:17:55 -05:00
parent c357f4bdaa
commit 0b81325575
41 changed files with 164 additions and 68 deletions

View File

@ -1,68 +0,0 @@
export class AccountDto {
id: number;
customer_id?: string;
language_id: string;
username?: string;
password?: string;
group_id: GroupName;
status?: number; //link to be made with AccountSuspension, somehow
first_name?: string;
last_name?: string;
mandataire?: string; //sometimes the first_name and last_name are found here, sometimes its the name of someone who manage the account
title?: Title;
email?: string[];
company?: string;
contact: string;
address?: string[]; //string of country, city, state, zip, road, number, apt concat.
tel_home?: string;
tel_office?: string;
tel_office_ext?: string;
cell?: string;
fax?: string;
land_owner: boolean;
commercial: boolean;
vip: boolean;
notes_client?: string[];
terminate_reason?: string;
terminate_cie?: string;
terminate_note?: string;
terminate_date?: string;
mauvais_payeur: boolean;
};
export class AccountMemo {
last_updated: number;
staff_id: number;
memo?: string[];
};
//represents the account_group table
class GroupName {
Admin: number = 1;
Comptabilite: number = 2;
Facturation: number = 3;
Staff: number = 4;
Client: number = 5;
Prospect: number = 6;
Fournisseur: number = 7;
Relais: number = 8;
Cabinet: number = 9;
ÉquipementMotorisé: number = 10;
};
//represents the country table
class Country {
canada: number = 120;
madagascar: number = 450;
virginIsland: number = 840;
};
// enum placeholder to avoid direct entries to the DB
class Title {
m: string = 'M';
mDot: string = 'M.';
mr: string = 'Mr';
mrs: string = 'Mrs';
mme: string = 'Mme';
};

View File

@ -0,0 +1,4 @@
export type Result<T, E> =
| { success: true; data: T }
| { success: false; error: E };

View File

@ -0,0 +1,19 @@
import { Controller } from "@nestjs/common";
import { AccountService } from "src/technical and support services/accounts/account.service";
@Controller()
export class AccountController {
constructor(private readonly accountService: AccountService) { }
findAllAccounts = async() => {
return await this.accountService.findAllAccounts();
}
findMemosByAccountId = async(
accountId:number,
) => {
return await this.accountService.findMemosByAccountId(accountId);
}
}

View File

@ -0,0 +1,37 @@
export class Account {
id: number;
customerId?: string;
language: string;
username?: string;
password?: string;
groupId: number;
status?: number;
firstName?: string;
lastName?: string;
mandataire?: string; //sometimes the first_name and last_name are found here, sometimes its the name of someone who manage the account
title?: string;
email?: string[];
company?: string;
contact: string;
address?: string[]; //string of country, city, state, zip, road, number, apt concat.
telHome?: string;
telOffice?: string;
telOffice_ext?: string;
cell?: string;
fax?: string;
landOwner: boolean;
commercial: boolean;
vip: boolean;
notes_client?: string;
terminateReason?: string;
terminateCie?: string;
terminateNote?: string;
terminateDate?: string;
mauvaisPayeur: boolean;
};
export class AccountMemo {
last_updated: number;
staff_id: number;
memo?: string;
};

View File

@ -0,0 +1,13 @@
import { Module } from "@nestjs/common";
import { AccountController } from "src/technical and support services/accounts/account.controller";
import { AccountService } from "src/technical and support services/accounts/account.service";
@Module({
providers: [
AccountService
],
controllers: [
AccountController
],
}) export class AccountModule { };

View File

@ -0,0 +1,91 @@
import { Injectable } from "@nestjs/common";
import { PrismaClient } from "generated/prisma/client";
import { Result } from "src/common/errors/result-error.factory";
import { Account, AccountMemo } from "src/technical and support services/accounts/account.dto";
@Injectable()
export class AccountService {
constructor(private readonly prisma: PrismaClient) { }
findAllAccounts = async (): Promise<Result<Account[], string>> => {
const listOfAccounts: Account[] = [];
const rawListOfAccounts = await this.prisma.account.findMany({});
if (!rawListOfAccounts) return { success: false, error: 'ACCOUNTS_NOT_FOUND' }
try {
for (const account of rawListOfAccounts) {
const emailList: string[] = [
account.email ? account.email : '',
account.email_autre ? account.email_autre : '',
];
const addressList: string[] = [
account.address1 ? account.address1 : '',
account.address2 ? account.address2 : '',
account.city ? account.city : '',
account.state ? account.state : '',
account.zip ? account.zip : '',
account.country_id.toString(),
];
listOfAccounts.push({
id: Number(account.id),
customerId: account.customer_id ? account.customer_id : '',
language: account.language_id,
username: account.username ? account.username : '',
password: account.password ? account.password : '',
groupId: account.group_id ? account.group_id : 0,
status: account.status ? account.status : 0,
firstName: account.first_name ? account.first_name : '',
lastName: account.last_name ? account.last_name : '',
mandataire: account.mandataire ? account.mandataire : '',
title: account.title ? account.title : '',
email: emailList,
company: account.company ? account.company : '',
contact: account.contact,
address: addressList,
telHome: account.tel_home ? account.tel_home : '',
telOffice: account.tel_office ? account.tel_office : '',
telOffice_ext: account.tel_office_ext ? account.tel_office_ext : '',
cell: account.cell ? account.cell : '',
fax: account.fax ? account.fax : '',
landOwner: account.land_owner,
commercial: account.commercial,
vip: account.vip,
notes_client: account.notes_client ? account.notes_client : '',
terminateReason: account.terminate_reason ? account.terminate_reason : '',
terminateCie: account.terminate_cie ? account.terminate_cie : '',
terminateNote: account.terminate_note ? account.terminate_note : '',
terminateDate: account.terminate_date ? account.terminate_date : '',
mauvaisPayeur: account.mauvais_payeur,
});
}
console.log(listOfAccounts);
return { success: true, data: listOfAccounts };
} catch (error) {
return { success: false, error: error + " \n An error occured during retrieving the list of accounts" }
}
}
findMemosByAccountId = async (accountId: number): Promise<Result<AccountMemo[], string>> => {
const listOfMemos: AccountMemo[] = [];
const rawListOfMemos = await this.prisma.account_memo.findMany({
where: { account_id: accountId },
select: { last_updated: true, staff_id: true, memo: true },
});
if (!rawListOfMemos) return { success: false, error: 'MEMOS_NOT_FOUND' };
for (const memo of rawListOfMemos) {
listOfMemos.push({
last_updated: Number(memo.last_updated),
staff_id: Number(memo.staff_id),
memo: memo.memo ? memo.memo : '',
});
}
return { success: true, data: listOfMemos }
}
}