@tricoteuses/senat
Version:
Handle French Sénat's open data
35 lines (34 loc) • 1.81 kB
JavaScript
import { DateTime, Settings } from "luxon";
Settings.twoDigitCutoffYear = 50;
export const STANDARD_DATE_FORMAT = "yyyy-MM-dd";
export const ID_DATE_FORMAT = "yyyyMMdd";
export const AKN_IDENTIFICATION_STRUCTURE_REGEXP = /^\/akn\/fr\/(?<type>[a-z]+)\/(?<session>\d{4}-\d{4})\/?(?<numTexte>\d+)\/fr@(?<version>\b(?:RECT|RECT_BIS|RECT_TER|RECT_QUATER|RECT_QUINQUIES)\b)?/;
export const AKN_WORKFLOW_IDENTIFICATION_STRUCTURE_REGEXP = /^\/akn\/fr\/(?<type>[a-z]+)\/(?<session>\d{2,4})\/?(?<numTexte>[a-zA-Z0-9]+)\/fr@(?<version>\b(?:RECT|RECT_BIS|RECT_TER|RECT_QUATER|RECT_QUINQUIES)\b)?/;
export const SIGNET_STRUCTURE_REGEXP = /^(?<type>[a-z]+)(?<session>\d{2,4})-?(?<numTexte>\d+)?/;
export function getSessionFromSignet(signet) {
const signetParts = SIGNET_STRUCTURE_REGEXP.exec(signet)?.groups;
if (signetParts && "session" in signetParts) {
const { session } = signetParts;
return formatToFourDigitSession(session);
}
return null;
}
function formatToFourDigitSession(session) {
if (session.length >= 2) {
const sessionFirstTwoDigits = session.substring(0, 2);
const sessionLastTwoDigits = session.substring(session.length - 2);
const twoDigitSession = parseInt(sessionFirstTwoDigits) === parseInt(sessionLastTwoDigits) - 1
? sessionFirstTwoDigits
: sessionLastTwoDigits;
return parseInt(DateTime.fromFormat(String(twoDigitSession), "yy").toFormat("yyyy"));
}
return null;
}
export function getSessionFromDate(date, format = STANDARD_DATE_FORMAT) {
const parsedDate = DateTime.fromFormat(date, format);
const endSessionDate = DateTime.fromObject({ year: parsedDate.year, month: 9, day: 30 });
if (parsedDate < endSessionDate) {
return parsedDate.year - 1;
}
return parsedDate.year;
}