UNPKG

@tricoteuses/senat

Version:

Handle French Sénat's open data

35 lines (34 loc) 1.81 kB
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; }