@nutrien-br/liborgs 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.nvmrc +1 -0
- package/lib/index.d.mts +290 -0
- package/lib/index.d.ts +290 -0
- package/lib/index.js +949 -0
- package/lib/index.mjs +912 -0
- package/package.json +41 -0
- package/src/core/entity/CreditSourceSchema.ts +15 -0
- package/src/core/entity/schFinancial/CreditAnalysisResultSchema.ts +17 -0
- package/src/core/entity/schFinancial/CreditSourceLimitHistorySchema.ts +32 -0
- package/src/core/entity/schFinancial/RateRulesSchema.ts +21 -0
- package/src/core/entity/schFinancial/SolicitationNfSchema.ts +12 -0
- package/src/core/entity/schFinancial/SolicitationRateSchema.ts +23 -0
- package/src/core/entity/schFinancial/SolicitationRevenueSchema.ts +12 -0
- package/src/core/entity/schFinancial/SolicitationSchema.ts +23 -0
- package/src/core/entity/schOrgs/CompanySchema.ts +16 -0
- package/src/core/entity/schOrgs/PersonSchema.ts +24 -0
- package/src/index.ts +2 -0
- package/src/infra/config/params.ts +17 -0
- package/src/infra/database/Database.ts +33 -0
- package/src/infra/database/migrate.ts +52 -0
- package/src/infra/database/migrations/01_create_table_credit_source.migration.ts +49 -0
- package/src/infra/database/seed.ts +35 -0
- package/src/infra/database/seeds/01_create_seed_credit_source.seed.ts +55 -0
- package/src/infra/database/strategies/IDatabaseStrategy.ts +5 -0
- package/src/infra/database/strategies/PostgresStrategy.ts +17 -0
- package/src/infra/database/strategies/SqliteStrategy.ts +14 -0
- package/src/infra/database/umzug-migration.type.ts +9 -0
- package/src/infra/database/umzug.ts +30 -0
- package/src/infra/models/initModels.ts +58 -0
- package/src/infra/models/schFinancial/CreditAnalysisResult.ts +82 -0
- package/src/infra/models/schFinancial/CreditSource.ts +46 -0
- package/src/infra/models/schFinancial/CreditSourceLimitHistory.ts +91 -0
- package/src/infra/models/schFinancial/RateRules.ts +45 -0
- package/src/infra/models/schFinancial/Solicitation.ts +91 -0
- package/src/infra/models/schFinancial/SolicitationNf.ts +74 -0
- package/src/infra/models/schFinancial/SolicitationRate.ts +72 -0
- package/src/infra/models/schFinancial/SolicitationRevenue.ts +72 -0
- package/src/infra/models/schFinancial/__tests__/creditSource.spec.ts +20 -0
- package/src/infra/models/schFinancial/__tests__/creditSourceLimitHistory.spec.ts +37 -0
- package/src/infra/models/schFinancial/__tests__/rateRules.spec.ts +37 -0
- package/src/infra/models/schFinancial/__tests__/solicitation.spec.ts +44 -0
- package/src/infra/models/schOrgs/Company.ts +75 -0
- package/src/infra/models/schOrgs/Person.ts +107 -0
- package/src/infra/models/schOrgs/__tests__/company.spec.ts +20 -0
- package/src/infra/models/schOrgs/__tests__/person.spec.ts +41 -0
- package/src/utils/initMock.ts +57 -0
- package/src/utils/mocks/mockCompanies.ts +27 -0
- package/src/utils/mocks/mockCreditAnalysisResult.ts +28 -0
- package/src/utils/mocks/mockCreditSourceLimitHistory.ts +26 -0
- package/src/utils/mocks/mockCreditSources.ts +24 -0
- package/src/utils/mocks/mockPerson.ts +23 -0
- package/src/utils/mocks/mockRateRules.ts +18 -0
- package/src/utils/mocks/mockSolicitation.ts +9 -0
- package/src/utils/mocks/mockSolicitationNf.ts +11 -0
- package/src/utils/mocks/mockSolicitationRate.ts +11 -0
- package/src/utils/mocks/mockSolicitationRevenue.ts +12 -0
- package/tsconfig.json +29 -0
- package/tsup.config.js +14 -0
- package/vitest.config.ts +43 -0
package/package.json
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@nutrien-br/liborgs",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "lib to database orgs",
|
|
5
|
+
"main": "lib/index.js",
|
|
6
|
+
"module": "lib/index.mjs",
|
|
7
|
+
"types": "lib/index.d.js",
|
|
8
|
+
"typings": "lib/my-lib.d.ts",
|
|
9
|
+
"scripts": {
|
|
10
|
+
"build": "tsup",
|
|
11
|
+
"test": "NODE_ENV=test vitest --coverage --silent",
|
|
12
|
+
"test:dev": "NODE_ENV=test vitest --coverage"
|
|
13
|
+
},
|
|
14
|
+
"keywords": [
|
|
15
|
+
"orgs",
|
|
16
|
+
"sequelize",
|
|
17
|
+
"models"
|
|
18
|
+
],
|
|
19
|
+
"author": "Johnny Moreira",
|
|
20
|
+
"license": "ISC",
|
|
21
|
+
"devDependencies": {
|
|
22
|
+
"@types/node": "^20.19.37",
|
|
23
|
+
"@types/pg": "^8.18.0",
|
|
24
|
+
"@types/sequelize": "^4.28.20",
|
|
25
|
+
"@vitest/coverage-v8": "^4.0.18",
|
|
26
|
+
"sqlite3": "^5.1.7",
|
|
27
|
+
"tsup": "^8.5.1",
|
|
28
|
+
"tsx": "^4.21.0",
|
|
29
|
+
"typescript": "^5.9.3",
|
|
30
|
+
"umzug": "^3.8.2",
|
|
31
|
+
"vite-tsconfig-paths": "^6.1.1",
|
|
32
|
+
"vitest": "^4.0.18"
|
|
33
|
+
},
|
|
34
|
+
"dependencies": {
|
|
35
|
+
"dotenv": "^17.3.1",
|
|
36
|
+
"pg": "^8.20.0",
|
|
37
|
+
"pg-hstore": "^2.3.4",
|
|
38
|
+
"sequelize": "^6.37.8",
|
|
39
|
+
"zod": "^4.3.6"
|
|
40
|
+
}
|
|
41
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
|
|
3
|
+
export const CreditSourceSchema = z.object({
|
|
4
|
+
csrcId: z.number().positive(),
|
|
5
|
+
csrcName: z.string().min(1, "O nome é obrigatório"),
|
|
6
|
+
csrcType: z.enum(['PARTNER', 'IN_HOUSE'], {
|
|
7
|
+
error: "O tipo deve ser PARTNER ou IN_HOUSE",
|
|
8
|
+
}),
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
export const CreateCreditSourceSchema = CreditSourceSchema.omit({ csrcId: true });
|
|
13
|
+
|
|
14
|
+
export type CreditSourceEntity = z.infer<typeof CreditSourceSchema>;
|
|
15
|
+
export type CreateCreditSourceEntity = z.infer<typeof CreateCreditSourceSchema>;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
3
|
+
export const CreditAnalysisResultSchema = z.object({
|
|
4
|
+
careId: z.number().int().optional(),
|
|
5
|
+
careExternalId: z.string().max(255),
|
|
6
|
+
careRequestedLimit: z.number().nonnegative().optional(),
|
|
7
|
+
careApprovedLimit: z.number().nonnegative().optional(),
|
|
8
|
+
careDateSolicitation: z.date().optional(),
|
|
9
|
+
careResponseDate: z.date().optional().nullable(),
|
|
10
|
+
careResponse: z.boolean().default(false),
|
|
11
|
+
careRequestId: z.string().uuid(),
|
|
12
|
+
soliId: z.number().int(),
|
|
13
|
+
csrcId: z.number().int(),
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
export type CreditAnalysisResultEntity = z.infer<typeof CreditAnalysisResultSchema>;
|
|
17
|
+
export type CreateCreditAnalysisResultEntity = z.input<typeof CreditAnalysisResultSchema>;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
3
|
+
export const CreditSourceLimitHistorySchema = z.object({
|
|
4
|
+
cslhId: z.number().int().optional(),
|
|
5
|
+
csrcId: z.number().int(),
|
|
6
|
+
persId: z.number().int().nullable().optional(),
|
|
7
|
+
compId: z.number().int().nullable().optional(),
|
|
8
|
+
cslhTotalLimit: z.number().nonnegative(),
|
|
9
|
+
cslhUsedLimit: z.number().nonnegative(),
|
|
10
|
+
cslhAvailableLimit: z.number().optional(),
|
|
11
|
+
cslhReferenceDate: z.coerce.date(),
|
|
12
|
+
cslhCreatedAt: z.date().optional(),
|
|
13
|
+
}).refine(
|
|
14
|
+
(data) => {
|
|
15
|
+
const hasPerson = !!data.persId;
|
|
16
|
+
const hasCompany = !!data.compId;
|
|
17
|
+
return (hasPerson && !hasCompany) || (!hasPerson && hasCompany);
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
message: "O histórico deve pertencer exclusivamente a uma Pessoa ou a uma Empresa.",
|
|
21
|
+
path: ["persId"],
|
|
22
|
+
}
|
|
23
|
+
).refine(
|
|
24
|
+
(data) => data.cslhUsedLimit <= data.cslhTotalLimit,
|
|
25
|
+
{
|
|
26
|
+
message: "O limite usado não pode ser maior que o limite total.",
|
|
27
|
+
path: ["cslhUsedLimit"],
|
|
28
|
+
}
|
|
29
|
+
);
|
|
30
|
+
|
|
31
|
+
export type CreditSourceLimitHistoryEntity = z.infer<typeof CreditSourceLimitHistorySchema>;
|
|
32
|
+
export type CreateCreditSourceLimitHistoryEntity = z.input<typeof CreditSourceLimitHistorySchema>;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
3
|
+
export const RateRulesSchema = z.object({
|
|
4
|
+
raruId: z.number().int().optional(),
|
|
5
|
+
raruVersion: z.number().int().optional(),
|
|
6
|
+
raruRating: z.string().max(2),
|
|
7
|
+
raruInHousePercentage: z.number().min(0).max(100),
|
|
8
|
+
raruPartnerPercentage: z.number().min(0).max(100),
|
|
9
|
+
}).refine(
|
|
10
|
+
(data) => {
|
|
11
|
+
const sum = Number(data.raruInHousePercentage) + Number(data.raruPartnerPercentage);
|
|
12
|
+
return Math.abs(sum - 100) < 0.01;
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
message: "A soma das porcentagens (In House + Partner) deve ser exatamente 100%.",
|
|
16
|
+
path: ["raruInHousePercentage"],
|
|
17
|
+
}
|
|
18
|
+
);
|
|
19
|
+
|
|
20
|
+
export type RateRulesEntity = z.infer<typeof RateRulesSchema>;
|
|
21
|
+
export type CreateRateRulesEntity = z.input<typeof RateRulesSchema>;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
3
|
+
export const SolicitationNfSchema = z.object({
|
|
4
|
+
sonfId: z.number().int().optional(),
|
|
5
|
+
sonfSumNf: z.number().nonnegative().optional(),
|
|
6
|
+
sonfCompleted: z.boolean().default(false),
|
|
7
|
+
sonfRequestId: z.string().uuid(),
|
|
8
|
+
soliId: z.number().int(),
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
export type SolicitationNfEntity = z.infer<typeof SolicitationNfSchema>;
|
|
12
|
+
export type CreateSolicitationNfEntity = z.input<typeof SolicitationNfSchema>;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
3
|
+
export const SolicitationRateSchema = z.object({
|
|
4
|
+
soraId: z.number().int().optional(),
|
|
5
|
+
soraRating: z.string().max(2).optional(),
|
|
6
|
+
soraInHousePercentage: z.number().min(0).max(100),
|
|
7
|
+
soraPartnerPercentage: z.number().min(0).max(100),
|
|
8
|
+
soraInHouseAllocation: z.number().nonnegative(),
|
|
9
|
+
soraPartnerAllocation: z.number().nonnegative(),
|
|
10
|
+
soliId: z.number().int(),
|
|
11
|
+
}).refine(
|
|
12
|
+
(data) => {
|
|
13
|
+
const sum = Number(data.soraInHousePercentage) + Number(data.soraPartnerPercentage);
|
|
14
|
+
return Math.abs(sum - 100) < 0.01;
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
message: "A soma das porcentagens (In House + Partner) deve ser exatamente 100%.",
|
|
18
|
+
path: ["soraInHousePercentage"],
|
|
19
|
+
}
|
|
20
|
+
);
|
|
21
|
+
|
|
22
|
+
export type SolicitationRateEntity = z.infer<typeof SolicitationRateSchema>;
|
|
23
|
+
export type CreateSolicitationRateEntity = z.input<typeof SolicitationRateSchema>;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
3
|
+
export const SolicitationRevenueSchema = z.object({
|
|
4
|
+
soreId: z.number().int().optional(),
|
|
5
|
+
soreRevenue: z.number().nonnegative().optional(),
|
|
6
|
+
soreCompleted: z.boolean().default(false),
|
|
7
|
+
soreRequestId: z.string().uuid(),
|
|
8
|
+
soliId: z.number().int(),
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
export type SolicitationRevenueEntity = z.infer<typeof SolicitationRevenueSchema>;
|
|
12
|
+
export type CreateSolicitationRevenueEntity = z.input<typeof SolicitationRevenueSchema>;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
3
|
+
export const SolicitationSchema = z.object({
|
|
4
|
+
soliId: z.number().optional(),
|
|
5
|
+
soliRequestedLimit: z.number().positive(),
|
|
6
|
+
soliCompleted: z.boolean().default(false),
|
|
7
|
+
|
|
8
|
+
persId: z.number().int().nullable().optional(),
|
|
9
|
+
compId: z.number().int().nullable().optional(),
|
|
10
|
+
}).refine(
|
|
11
|
+
(data) => {
|
|
12
|
+
const hasPerson = data.persId !== null && data.persId !== undefined;
|
|
13
|
+
const hasCompany = data.compId !== null && data.compId !== undefined;
|
|
14
|
+
return (hasPerson && !hasCompany) || (!hasPerson && hasCompany);
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
message: "A solicitação deve pertencer obrigatoriamente a uma Pessoa ou a uma Empresa (exclusivamente).",
|
|
18
|
+
path: ["persId"],
|
|
19
|
+
}
|
|
20
|
+
);
|
|
21
|
+
|
|
22
|
+
export type SolicitationEntity = z.infer<typeof SolicitationSchema>;
|
|
23
|
+
export type CreateSolicitationEntity = z.input<typeof SolicitationSchema>;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
3
|
+
export const CompanySchema = z.object({
|
|
4
|
+
compId: z.number().optional(),
|
|
5
|
+
compDes: z.string().max(60).nullable().optional(),
|
|
6
|
+
compCorporateName: z.string().max(300),
|
|
7
|
+
compRegistration: z.string().max(20).nullable().optional(),
|
|
8
|
+
compUuid: z.string().uuid().optional(),
|
|
9
|
+
compObs: z.string().max(4000).nullable().optional(),
|
|
10
|
+
compRegisDate: z.date(),
|
|
11
|
+
compRegisUser: z.string().max(100),
|
|
12
|
+
compErpRegisDate: z.date().optional(),
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
export type CompanyEntity = z.infer<typeof CompanySchema>;
|
|
16
|
+
export type CreateCompanyEntity = z.input<typeof CompanySchema>;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
3
|
+
export const PersonSchema = z.object({
|
|
4
|
+
persId: z.number().optional(),
|
|
5
|
+
persName: z.string().max(100),
|
|
6
|
+
persSocialName: z.string().max(100).nullable().optional(),
|
|
7
|
+
persFirstName: z.string().max(50).nullable().optional(),
|
|
8
|
+
persLastName: z.string().max(50).nullable().optional(),
|
|
9
|
+
persBirthDate: z.date().nullable().optional(),
|
|
10
|
+
persMothersName: z.string().max(100).nullable().optional(),
|
|
11
|
+
persFathersName: z.string().max(100).nullable().optional(),
|
|
12
|
+
persIndSex: z.string().length(1),
|
|
13
|
+
persRegistration: z.string().max(20).nullable().optional(),
|
|
14
|
+
persUuid: z.string().uuid().optional(),
|
|
15
|
+
mastCod: z.string().max(10).nullable().optional(),
|
|
16
|
+
gendCod: z.string().max(10).nullable().optional(),
|
|
17
|
+
persObs: z.string().max(4000).nullable().optional(),
|
|
18
|
+
persRegisDate: z.date(),
|
|
19
|
+
persRegisUser: z.string().max(50),
|
|
20
|
+
persErpRegisDate: z.date().optional(),
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
export type PersonEntity = z.infer<typeof PersonSchema>;
|
|
24
|
+
export type CreatePersonEntity = z.input<typeof PersonSchema>;
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import dotenv from "dotenv";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
dotenv.config();
|
|
4
|
+
|
|
5
|
+
const envSchema = z.object({
|
|
6
|
+
PORT: z.string().default("80"),
|
|
7
|
+
NODE_ENV: z.enum(["dev", "test", "sit", "preProd", "production"]).default("dev"),
|
|
8
|
+
DATABASE_USERNAME: z.string().optional(),
|
|
9
|
+
DATABASE_PASSWORD: z.string().optional(),
|
|
10
|
+
DATABASE_NAME: z.string().optional(),
|
|
11
|
+
DATABASE_HOST: z.string().optional(),
|
|
12
|
+
DATABASE_PORT: z.string().optional(),
|
|
13
|
+
DATABASE_PORT_WRITE: z.string().optional(),
|
|
14
|
+
DATABASE_PORT_READ: z.string().optional()
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
export const ENV = envSchema.parse(process.env);
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { Sequelize } from 'sequelize';
|
|
2
|
+
import { IDatabaseStrategy } from './strategies/IDatabaseStrategy';
|
|
3
|
+
import { PostgresStrategy } from './strategies/PostgresStrategy';
|
|
4
|
+
import { SqliteStrategy } from './strategies/SqliteStrategy';
|
|
5
|
+
|
|
6
|
+
export default class Database {
|
|
7
|
+
private static instance: Sequelize;
|
|
8
|
+
|
|
9
|
+
static getConnection(): Sequelize {
|
|
10
|
+
if (!Database.instance) {
|
|
11
|
+
const strategy = Database.resolveStrategy();
|
|
12
|
+
Database.instance = strategy.connect();
|
|
13
|
+
}
|
|
14
|
+
return Database.instance;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
private static resolveStrategy(): IDatabaseStrategy {
|
|
18
|
+
const env = process.env.NODE_ENV || 'development';
|
|
19
|
+
const isProductionLike = ['dev', 'sit', 'pre-prod', 'prod'].includes(env);
|
|
20
|
+
|
|
21
|
+
if (isProductionLike) {
|
|
22
|
+
return new PostgresStrategy({
|
|
23
|
+
username: process.env.DB_USER,
|
|
24
|
+
password: process.env.DB_PASSWORD,
|
|
25
|
+
database: process.env.DB_NAME,
|
|
26
|
+
host: process.env.DB_HOST,
|
|
27
|
+
port: Number(process.env.DB_PORT),
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
return new SqliteStrategy(process.env.DB_STORAGE);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { Umzug, SequelizeStorage } from "umzug";
|
|
2
|
+
import Database from "./Database";
|
|
3
|
+
import { config } from 'dotenv'
|
|
4
|
+
|
|
5
|
+
// const getEnv = (stage?: string) => {
|
|
6
|
+
// switch (stage) {
|
|
7
|
+
// case 'stg':
|
|
8
|
+
// return '.env.stg'
|
|
9
|
+
// case 'prod':
|
|
10
|
+
// return '.env.prod'
|
|
11
|
+
// default:
|
|
12
|
+
// return '.env'
|
|
13
|
+
// }
|
|
14
|
+
// }
|
|
15
|
+
|
|
16
|
+
const path = process.env.NODE_ENV //getEnv(process.env.NODE_ENV)
|
|
17
|
+
console.log('> READING DOT ENV', path)
|
|
18
|
+
config({ path })
|
|
19
|
+
console.log('> NODE_ENV', process.env.NODE_ENV)
|
|
20
|
+
console.log('> Connecting to', process.env.DATABASE_NAME, process.env.DATABASE_HOST);
|
|
21
|
+
const sequelize = Database.getConnection()
|
|
22
|
+
|
|
23
|
+
const umzug = new Umzug({
|
|
24
|
+
migrations: {
|
|
25
|
+
glob: "src/database/migrations/*.migration.ts"
|
|
26
|
+
},
|
|
27
|
+
context: sequelize,
|
|
28
|
+
storage: new SequelizeStorage({
|
|
29
|
+
sequelize,
|
|
30
|
+
modelName: "sequelize_meta"
|
|
31
|
+
}),
|
|
32
|
+
logger: console
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
const task = process.env.MIGRATION;
|
|
36
|
+
console.log('> Running migration', task?.toUpperCase());
|
|
37
|
+
switch (task) {
|
|
38
|
+
case "up":
|
|
39
|
+
umzug.up().then((result) => {
|
|
40
|
+
console.log("Migrations up went successful!", result);
|
|
41
|
+
process.exit(0);
|
|
42
|
+
});
|
|
43
|
+
break;
|
|
44
|
+
case "down":
|
|
45
|
+
umzug.down().then((result) => {
|
|
46
|
+
console.log("Migrations down went successful!", result);
|
|
47
|
+
process.exit(0);
|
|
48
|
+
});
|
|
49
|
+
break;
|
|
50
|
+
default:
|
|
51
|
+
break;
|
|
52
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { DataTypes } from 'sequelize';
|
|
2
|
+
import { UmzugMigration } from '../umzug-migration.type';
|
|
3
|
+
|
|
4
|
+
const table = {
|
|
5
|
+
name: 'credit_start',
|
|
6
|
+
schema: 'sch_financial'
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
export const up = async (migration: UmzugMigration) => {
|
|
10
|
+
const query = migration.context.getQueryInterface();
|
|
11
|
+
|
|
12
|
+
// await query.createSchema(table.schema).catch(() => {
|
|
13
|
+
// });
|
|
14
|
+
|
|
15
|
+
await query.createTable(
|
|
16
|
+
{
|
|
17
|
+
tableName: table.name,
|
|
18
|
+
schema: table.schema
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
csrc_id: {
|
|
22
|
+
type: DataTypes.INTEGER,
|
|
23
|
+
autoIncrement: true,
|
|
24
|
+
primaryKey: true,
|
|
25
|
+
allowNull: false,
|
|
26
|
+
},
|
|
27
|
+
csrc_name: {
|
|
28
|
+
type: DataTypes.STRING,
|
|
29
|
+
allowNull: false,
|
|
30
|
+
},
|
|
31
|
+
csrc_type: {
|
|
32
|
+
type: DataTypes.ENUM('PARTNER', 'IN_HOUSE'),
|
|
33
|
+
allowNull: false,
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
);
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
export const down = async (migration: UmzugMigration) => {
|
|
40
|
+
const query = migration.context.getQueryInterface();
|
|
41
|
+
|
|
42
|
+
await query.dropTable({
|
|
43
|
+
tableName: table.name,
|
|
44
|
+
schema: table.schema
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
// TODO: se precisar remover o enum descomentar essa linha, ele é global no postgres
|
|
48
|
+
// await query.sequelize.query(`DROP TYPE IF EXISTS "${table.schema}"."enum_credit_start_csrc_type";`);
|
|
49
|
+
};
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { Umzug, SequelizeStorage } from "umzug";
|
|
2
|
+
import Database from "./Database";
|
|
3
|
+
|
|
4
|
+
const sequelize = Database.getConnection()
|
|
5
|
+
|
|
6
|
+
const umzug = new Umzug({
|
|
7
|
+
migrations: {
|
|
8
|
+
glob: "src/database/seeds/*.seed.ts"
|
|
9
|
+
},
|
|
10
|
+
context: sequelize,
|
|
11
|
+
storage: new SequelizeStorage({
|
|
12
|
+
sequelize,
|
|
13
|
+
modelName: "seeder_meta"
|
|
14
|
+
}),
|
|
15
|
+
logger: console
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
const task = process.env.MIGRATION;
|
|
19
|
+
|
|
20
|
+
switch (task) {
|
|
21
|
+
case "up":
|
|
22
|
+
umzug.up().then((result) => {
|
|
23
|
+
console.log("Seeds up went successful!", result);
|
|
24
|
+
process.exit(0);
|
|
25
|
+
});
|
|
26
|
+
break;
|
|
27
|
+
case "down":
|
|
28
|
+
umzug.down().then((result) => {
|
|
29
|
+
console.log("Seeds down went successful!", result);
|
|
30
|
+
process.exit(0);
|
|
31
|
+
});
|
|
32
|
+
break;
|
|
33
|
+
default:
|
|
34
|
+
break;
|
|
35
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import type { UmzugSeed } from "../umzug-migration.type";
|
|
2
|
+
|
|
3
|
+
const table = {
|
|
4
|
+
name: 'credit_start',
|
|
5
|
+
schema: 'sch_financial',
|
|
6
|
+
};
|
|
7
|
+
|
|
8
|
+
const seed = [
|
|
9
|
+
{
|
|
10
|
+
csrc_id: 1,
|
|
11
|
+
csrc_name: 'FARM',
|
|
12
|
+
csrc_type: 'PARTNER'
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
csrc_id: 2,
|
|
16
|
+
csrc_name: 'SUPPLIER',
|
|
17
|
+
csrc_type: 'PARTNER'
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
csrc_id: 3,
|
|
21
|
+
csrc_name: 'SELLOR',
|
|
22
|
+
csrc_type: 'PARTNER'
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
csrc_id: 4,
|
|
26
|
+
csrc_name: 'NUTRIEN',
|
|
27
|
+
csrc_type: 'IN_HOUSE'
|
|
28
|
+
},
|
|
29
|
+
];
|
|
30
|
+
|
|
31
|
+
export const up = async (migration: UmzugSeed) => {
|
|
32
|
+
const query = migration.context.getQueryInterface();
|
|
33
|
+
|
|
34
|
+
await query.bulkInsert(
|
|
35
|
+
{
|
|
36
|
+
tableName: table.name,
|
|
37
|
+
schema: table.schema
|
|
38
|
+
},
|
|
39
|
+
seed,
|
|
40
|
+
);
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
export const down = async (migration: UmzugSeed) => {
|
|
44
|
+
const query = migration.context.getQueryInterface();
|
|
45
|
+
|
|
46
|
+
await query.bulkDelete(
|
|
47
|
+
{
|
|
48
|
+
tableName: table.name,
|
|
49
|
+
schema: table.schema
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
csrc_id: seed.map((s) => s.csrc_id)
|
|
53
|
+
},
|
|
54
|
+
);
|
|
55
|
+
};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Sequelize } from 'sequelize';
|
|
2
|
+
import pg from 'pg';
|
|
3
|
+
import { IDatabaseStrategy } from './IDatabaseStrategy';
|
|
4
|
+
|
|
5
|
+
export class PostgresStrategy implements IDatabaseStrategy {
|
|
6
|
+
constructor(private config: any) { }
|
|
7
|
+
|
|
8
|
+
connect(): Sequelize {
|
|
9
|
+
return new Sequelize({
|
|
10
|
+
...this.config,
|
|
11
|
+
dialect: 'postgres',
|
|
12
|
+
dialectModule: pg,
|
|
13
|
+
logging: false,
|
|
14
|
+
pool: { max: 20, min: 5, acquire: 30000, idle: 10000 },
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Sequelize } from 'sequelize';
|
|
2
|
+
import { IDatabaseStrategy } from './IDatabaseStrategy';
|
|
3
|
+
|
|
4
|
+
export class SqliteStrategy implements IDatabaseStrategy {
|
|
5
|
+
constructor(private storage?: string) { }
|
|
6
|
+
|
|
7
|
+
connect(): Sequelize {
|
|
8
|
+
return new Sequelize({
|
|
9
|
+
dialect: 'sqlite',
|
|
10
|
+
storage: this.storage || ':memory:',
|
|
11
|
+
logging: false,
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { Umzug, SequelizeStorage } from "umzug";
|
|
2
|
+
import database from "./Database";
|
|
3
|
+
|
|
4
|
+
export const migrator = new Umzug({
|
|
5
|
+
migrations: {
|
|
6
|
+
glob: ["migrations/*.ts", { cwd: __dirname }]
|
|
7
|
+
},
|
|
8
|
+
context: database.getSequelize(),
|
|
9
|
+
storage: new SequelizeStorage({
|
|
10
|
+
sequelize: database.getSequelize(),
|
|
11
|
+
modelName: "migration_meta"
|
|
12
|
+
}),
|
|
13
|
+
logger: console
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
export const seeder = new Umzug({
|
|
17
|
+
migrations: {
|
|
18
|
+
glob: ["seeds/*.ts", { cwd: __dirname }]
|
|
19
|
+
},
|
|
20
|
+
context: database.getSequelize(),
|
|
21
|
+
storage: new SequelizeStorage({
|
|
22
|
+
sequelize: database.getSequelize(),
|
|
23
|
+
modelName: "seeder_meta"
|
|
24
|
+
}),
|
|
25
|
+
logger: console
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
export type Migration = typeof migrator._types.migration;
|
|
29
|
+
export type Seeder = typeof seeder._types.migration;
|
|
30
|
+
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import Database from "../database/Database";
|
|
2
|
+
import { CreditAnalysisResult } from "./schFinancial/CreditAnalysisResult";
|
|
3
|
+
import { CreditSource } from "./schFinancial/CreditSource";
|
|
4
|
+
import { CreditSourceLimitHistory } from "./schFinancial/CreditSourceLimitHistory";
|
|
5
|
+
import { RateRules } from "./schFinancial/RateRules";
|
|
6
|
+
import { Solicitation } from "./schFinancial/Solicitation";
|
|
7
|
+
import { SolicitationNf } from "./schFinancial/SolicitationNf";
|
|
8
|
+
import { SolicitationRate } from "./schFinancial/SolicitationRate";
|
|
9
|
+
import { SolicitationRevenue } from "./schFinancial/SolicitationRevenue";
|
|
10
|
+
import { Company } from "./schOrgs/Company";
|
|
11
|
+
import { Person } from "./schOrgs/Person";
|
|
12
|
+
|
|
13
|
+
async function initModels() {
|
|
14
|
+
const sequelize = Database.getConnection();
|
|
15
|
+
|
|
16
|
+
const models = [
|
|
17
|
+
Person,
|
|
18
|
+
Company,
|
|
19
|
+
CreditSource,
|
|
20
|
+
Solicitation,
|
|
21
|
+
SolicitationRate,
|
|
22
|
+
RateRules,
|
|
23
|
+
SolicitationRevenue,
|
|
24
|
+
SolicitationNf,
|
|
25
|
+
CreditSourceLimitHistory,
|
|
26
|
+
CreditAnalysisResult
|
|
27
|
+
];
|
|
28
|
+
|
|
29
|
+
models.forEach((model) => {
|
|
30
|
+
model.prototype.init(sequelize);
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
models.forEach((model) => {
|
|
34
|
+
if (model.prototype.associate) {
|
|
35
|
+
model.prototype.associate();
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
return sequelize;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// initModels()
|
|
43
|
+
// .then(() => logger.info(`Models initialized successfully [ENV: ${process.env.NODE_ENV}]`))
|
|
44
|
+
// .catch(err => logger.error(`Error initializing models: ${err.message}`, err));
|
|
45
|
+
|
|
46
|
+
export {
|
|
47
|
+
initModels,
|
|
48
|
+
CreditSource,
|
|
49
|
+
Person,
|
|
50
|
+
Company,
|
|
51
|
+
Solicitation,
|
|
52
|
+
SolicitationRate,
|
|
53
|
+
RateRules,
|
|
54
|
+
SolicitationRevenue,
|
|
55
|
+
SolicitationNf,
|
|
56
|
+
CreditSourceLimitHistory,
|
|
57
|
+
CreditAnalysisResult
|
|
58
|
+
};
|