Skip to content

Commit

Permalink
merge dev in re7 : appealNumber and ExtractRoute (#91)
Browse files Browse the repository at this point in the history
* Feature/appeal number 399 (#82)

* adding regex to get registreNUmber || pourvoie

* adding logique to extract RG or Appeal or NumeroRoleGeneral for title in label

* renaming and resolving bug

* renaming and resolving bug

* rename and lint

* optimisation of code

* little clean

* updating sder commit

---------

Co-authored-by: Antoine Jeanneney <[email protected]>

* Fix/updateRoute (#90)

* updating status to done for automatic route decisions

* updating readme

* updating antoine's request

---------

Co-authored-by: Antoine Jeanneney <[email protected]>
  • Loading branch information
Bouba-cassation and Antoine Jeanneney authored Mar 25, 2024
1 parent 9426735 commit 9905273
Show file tree
Hide file tree
Showing 12 changed files with 207 additions and 84 deletions.
2 changes: 1 addition & 1 deletion docs/scripts.md
Original file line number Diff line number Diff line change
Expand Up @@ -165,6 +165,6 @@ Revert a migration.

Run migrations.

## updateRoute
## updateRouteForFreeDocuments

Reapply route rules for documents with a specific status.
2 changes: 1 addition & 1 deletion packages/courDeCassation/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,7 @@ prod label script exportSpecificDocument --documentNumber=10000 --source=jurinet

In Wallix, with a Cygwin terminal:
```
prod label script updateRoute --status=free
prod label script updateRouteForFreeDocuments
```


Expand Down

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
import { extractAppealRegisterRoleGeneralNumber } from './extractAppealRegisterRoleGeneralNumber';

describe('extractAppealRegisterRoleGeneralNumber', () => {
const text = 'Pourvoi n° K 08-16.486 de telle décision';
it('should extract appeal number from text', () => {
const appealNumber = extractAppealRegisterRoleGeneralNumber(text, '');
expect(appealNumber).toBe('08-16.486');
});

it('should extract registerNumber if source jurica', () => {
const regsiterNumber = extractAppealRegisterRoleGeneralNumber(
text,
'jurica',
"Cour d'appel de...",
'appeal',
'22/3455',
'numeroRoleGenaral',
);

expect(regsiterNumber).toBe('22/3455');
});

it('should extract numeroRoleGeneral if source juritj', () => {
const regsiterNumber = extractAppealRegisterRoleGeneralNumber(
text,
'juritj',
'Tribunal de justice de...',
'',
'',
'23/456',
);

expect(regsiterNumber).toBe('23/456');
});

it('should extract appeal and cour de cassation (return formatedAppeal) if source jurinet', () => {
const regsiterNumber = extractAppealRegisterRoleGeneralNumber(
text,
'jurinet',
'Cour de cassation de...',
's1122333',
'',
'numeroRoleGeneral',
);

expect(regsiterNumber).toBe('11-22.333');
});

it('should extract appeal but with other cour (it is register number format : 19/000101 in this case) if source jurinet', () => {
const regsiterNumber = extractAppealRegisterRoleGeneralNumber(
text,
'jurinet',
"Cour d'appel de Rennes",
'19/000101',
'registerNumber',
'numeroRoleGeneral',
);

expect(regsiterNumber).toBe('19/000101');
});

it('should extract no appeal number', () => {
const text = 'Pas de pourvoi';

const appealNumber = extractAppealRegisterRoleGeneralNumber(text, '');

expect(appealNumber).toBe(undefined);
});
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
export { extractAppealRegisterRoleGeneralNumber };

function extractAppealRegisterRoleGeneralNumber(
text: string,
source: string,
jurisdictionName?: string,
appeal?: string,
registerNumber?: string,
numeroRoleGeneral?: string,
) {
if (source === 'jurica' && registerNumber != undefined) {
return registerNumber?.split(' ')[0];
} else if (source === 'jurinet') {
const verifappeal = /^[A-Za-z]\d+$/;
if (
jurisdictionName?.includes('cassation') &&
appeal != undefined &&
verifappeal.test(appeal)
) {
appeal = appeal?.replace(/[A-Za-z]/g, '');
const formattedappeal =
appeal.substring(0, 2) +
'-' +
appeal.substring(2, 4) +
'.' +
appeal.substring(4);
return formattedappeal;
} else {
return appeal;
}
} else if (source === 'juritj' && numeroRoleGeneral != undefined) {
return numeroRoleGeneral;
} else {
return regexExtractAppealNumber(text);
}
}

// regex de base
const REGEX_1 = /\D\s(\d{2}-\d{2}\.\d{3})/;
const REGEX_2 = /\d{2}-\d{5}/;
export function regexExtractAppealNumber(text: string) {
const match1 = text.match(REGEX_1);
if (!!match1 && match1[1]) {
return match1[1];
}

const match2 = text.match(REGEX_2);
if (!!match2 && match2[0]) {
return match2[0];
}
return undefined;
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ function extractRoute(
criminalCaseCode: documentType['decisionMetadata']['criminalCaseCode'];
NACCode: documentType['decisionMetadata']['NACCode'];
endCaseCode: documentType['decisionMetadata']['endCaseCode'];
status?: documentType['status'];
},
source: documentType['source'],
): documentType['route'] {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
import { extractReadableChamberName } from './extractReadableChamberName';
import { extractReadableJurisdictionName } from './extractReadableJurisdictionName';
import { extractAppealNumber } from './extractAppealNumber';
import {
extractAppealRegisterRoleGeneralNumber,
regexExtractAppealNumber,
} from './extractAppealRegisterRoleGeneralNumber';
import { extractRoute } from './extractRoute';

export {
extractReadableChamberName,
extractReadableJurisdictionName,
extractAppealNumber,
extractAppealRegisterRoleGeneralNumber,
regexExtractAppealNumber,
extractRoute,
};
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import {
import {
extractReadableChamberName,
extractReadableJurisdictionName,
extractAppealNumber,
extractAppealRegisterRoleGeneralNumber,
} from './extractors';
import { extractRoute } from './extractors/extractRoute';
import { categoriesMapper } from './categoriesMapper';
Expand All @@ -27,15 +27,24 @@ async function mapCourtDecisionToDocument(
const readableJurisdictionName = extractReadableJurisdictionName(
sderCourtDecision.jurisdictionName,
);
const appealNumber = extractAppealNumber(sderCourtDecision.originalText);

const creationDate = convertToValidDate(sderCourtDecision.dateCreation);

const decisionDate = convertToValidDate(sderCourtDecision.dateDecision);

const source = sderCourtDecision.sourceName;

const registerNumber = sderCourtDecision.registerNumber;
const appeal = sderCourtDecision.appeals[0];
const numeroRoleGeneral = sderCourtDecision.numeroRoleGeneral || '';
const appealNumber = extractAppealRegisterRoleGeneralNumber(
sderCourtDecision.originalText,
source,
readableJurisdictionName,
appeal,
registerNumber,
numeroRoleGeneral,
);

const title = computeTitleFromParsedCourtDecision({
source: source,
number: sderCourtDecision.sourceId,
appealNumber,
readableChamberName,
Expand Down Expand Up @@ -122,24 +131,47 @@ async function mapCourtDecisionToDocument(
text: sderCourtDecision.originalText,
});
}

function getNumberPrefix(
numberToPrefix: string | undefined,
source: string,
readableJurisdictionName: string,
) {
if (numberToPrefix === undefined) {
return undefined;
}
if (source === 'jurinet' && readableJurisdictionName.includes('cassation')) {
return `Pourvoi n°${numberToPrefix}`;
} else {
return `RG n°${numberToPrefix}`;
}
}
function computeTitleFromParsedCourtDecision({
source,
number,
appealNumber,
readableChamberName,
readableJurisdictionName,
date,
}: {
source: string;
number: number;
appealNumber: string | undefined;
readableChamberName: string;
readableJurisdictionName: string;
date?: Date;
}) {
const prefixedNumber = getNumberPrefix(
appealNumber,
source,
readableJurisdictionName,
);

if (source === 'juritj') {
readableJurisdictionName = `Tribunal judiciaire de ${readableJurisdictionName}`;
}

const readableNumber = `Décision n°${number}`;
const readableAppealNumber = appealNumber
? `pourvoi n°${appealNumber}`
: undefined;
const readableAppealNumber = prefixedNumber ? prefixedNumber : undefined;
const readableDate = date
? timeOperator.convertTimestampToReadableDate(date.getTime())
: undefined;
Expand Down
64 changes: 33 additions & 31 deletions packages/courDeCassation/src/scripts/updateRoute.ts
Original file line number Diff line number Diff line change
@@ -1,30 +1,44 @@
import yargs from 'yargs';
import { buildBackend, buildDocumentRepository, logger } from '@label/backend';
import { parametersHandler } from '../lib/parametersHandler';
import { documentType } from '@label/core';
import { extractRoute } from '../connector/mapper/extractors';
import * as readline from 'readline';

(async () => {
const { environment, settings } = await parametersHandler.getParameters();
const { status } = parseArgv();
const backend = buildBackend(environment, settings);

backend.runScript(() => updateRoute(status), {
shouldLoadDb: true,
const prompt = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
const { environment, settings } = await parametersHandler.getParameters();
prompt.question(
'Voulez vous mettre a jour le circuit de relecture de tous les documents free (yes/no)?',
(answer: any) => {
if (answer == 'yes') {
const backend = buildBackend(environment, settings);
backend.runScript(() => updateRouteForFreeDocuments(), {
shouldLoadDb: true,
});
} else {
logger.log({
operationName: 'updateRouteForFreeDocuments',
msg: `updateRouteForFreeDocuments script is canceled`,
});
}
prompt.close();
},
);
})();

async function updateRoute(status: documentType['status']) {
async function updateRouteForFreeDocuments() {
logger.log({
operationName: 'updateRoute',
msg: `Update route of documents with status ${status}`,
operationName: 'updateRouteForFreeDocuments',
msg: `Update route of documents with status Free`,
});

const documentRepository = buildDocumentRepository();

const documentsToUpdate = await documentRepository.findAllByStatus([status]);
const documentsToUpdate = await documentRepository.findAllByStatus(['free']);
logger.log({
operationName: 'updateRoute',
operationName: 'updateRouteForFreeDocuments',
msg: `${documentsToUpdate.length} documents to update route`,
});

Expand All @@ -48,31 +62,19 @@ async function updateRoute(status: documentType['status']) {
},
documentsToUpdate[index].source,
);

logger.log({
operationName: 'updateRoute',
operationName: 'updateRouteForFreeDocuments',
msg: `New route for the document ${documentsToUpdate[index]._id} : ${newRoute}`,
});

await documentRepository.updateRouteById(
documentsToUpdate[index]._id,
newRoute,
);
}
}

function parseArgv() {
const argv = yargs
.option({
status: {
demandOption: true,
description: 'status of the document you want to update route',
type: 'string',
},
})
.help()
.alias('help', 'h').argv;

return {
status: argv.status as documentType['status'],
};
if (newRoute === 'automatic') {
documentRepository.updateStatusById(documentsToUpdate[index]._id, 'done');
}
}
}
2 changes: 1 addition & 1 deletion packages/generic/backend/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
"jsonwebtoken": "^8.5.1",
"lodash": "^4.17.21",
"mongodb": "^3.6.1",
"sder": "https://github.com/Cour-de-cassation/sder#8eb7a3b9c04ce0324104c7870d2263c35951dbb8",
"sder": "https://github.com/Cour-de-cassation/sder#8d2dc027782d040e67d1164cdacdb85800b396b2",
"sder-core": "https://github.com/Cour-de-cassation/sder-core#f19400e5832d88b48d076b99bbea3e4cfd6803f4"
},
"devDependencies": {
Expand Down
Loading

0 comments on commit 9905273

Please sign in to comment.