1.1.0 • Published 1 year ago

@fibre44/dsn-parser v1.1.0

Weekly downloads
-
License
MIT
Repository
github
Last release
1 year ago

DSN Parser


Table des matières


Description

Cette librairie permet d'extraire les données d'un fichier au format de la Déclaration Sociale Nominative (DSN).

La librairie se base sur le cahier technique 2023 . Le parser est capable de gérer les normes :

  • 2022
  • 2023

Tableau récapitulatif des données exportées

BlocLibelléMéthodeCommentaire
S10.G00.00EntêteMéthode Dsn
S10.G00.01EmetteurMéthode Emetteur
S10.G00.01Contact EmetteurMéthode Emetteur
S20.G00.05DéclarationMéthode statement
S20.G00.06EntrepriseMéthode Society
S20.G00.07Contact chez le déclaréMéthode contact
S20.G00.08Identifiant de l'organisme destinataireNon géréEn cours de développement
S21.G00.06EntrepriseMéthode Society
S21.G00.11EtablissementMéthode Establishment
S21.G00.12Coordonnées bancaires spécifiquesspecificBankDetailsEn cours de développemet
S21.G00.13Complément OETHcomplementOETHEn cours de développemet
S21.G00.15Adhésion PrévoyanceMéthode Mutual
S21.G00.16Changements destinataire Adhésion PrévoyanceNon géréEn cours de développemet
S21.G00.20Versement organisme de protection socialeSocialPayment
S21.G00.22Bordereau de cotisation dueNon géréEn cours de developpement
S21.G00.23Cotisation agrégéeMéthode cotisationsEn cours de developpement
S21.G00.30IndividuMéthode Employee
S21.G00.34Compte Professionnel de Prévention (Ex-Pénibilité)Non géréEn cours de développement
S21.G00.40Contrat (contrat de travail, convention, mandat)Méthode WorkContract
S21.G00.41Changements ContratMéthode WorkContract
S21.G00.44Assujettissement fiscalNon géréEn cours de développement
S21.G00.45Données précédemment déclaréesNon géréEn cours de développement
S21.G00.50Versement individuNon géréEn cours de développement
S21.G00.51RémunérationNon géréEn cours de développement
S21.G00.52Prime, gratification et indemnitéNon géréEn cours de développement
S21.G00.54Autre élément de revenu brutNon géréEn cours de développement
S21.G00.55Composant de versementNon géréEn cours de développement
S21.G00.56Régularisation de prélèvement à la sourceNon géréEn cours de développement
S21.G00.56Arrêt de travailMéthode Arret de travail
S21.G00.62Fin du contratNon géréEn cours de développement
S21.G00.63Préavis de fin de contratNon géréEn cours de développement
S21.G00.65Autre suspension de l'exécution du contratNon géréEn cours de développement
S21.G00.66Temps partiel ThérapeutiqueNon géréEn cours de développement
S21.G00.70Affiliation PrévoyanceMéthode MutuelEmployee
S21.G00.71Retraite complémentaireNon géréEn cours de développement
S21.G00.72Affiliation à tort à un régime de retraiteNon géréEn cours de développement
S21.G00.73Ayant-droitNon géréEn cours de développement
S21.G00.78Base assujettieNon géréEn cours de développement
S21.G00.79Composant de base assujettieNon géréEn cours de développement
S21.G00.81Cotisation individuelleNon géréEn cours de développement
S21.G00.82Cotisation établissementNon géréEn cours de développement
S21.G00.83Période d'affiliation à tort à un régime de retraite complémentaireNon géréEn cours de développement
S21.G00.84Base assujettie déclarée à tort pour un régime de retraite complémentaireNon géréEn cours de développement
S21.G00.85Lieu de travail ou établissement utilisateurNon géréEn cours de développement
S21.G00.86AnciennetéNon géréEn cours de développement
S21.G00.95Base assujettie déclarée à tort pour un régime de base risque maladie, AT/MP ou vieillesseNon géréEn cours de développement
S21.G00.98Saisie administrative à tiers détenteurNon géréEn cours de développement

Installation

    npm i @fibre44/dsn-parser

Exemples d'utilisation

Exemple dans un composant React avec le framework next Js.

import { DsnParser } from "@fibre44/dsn-parser";
import { fileURLToPath } from 'node:url';
import { dirname, join } from 'node:path';


export default function UploadFileDsn() {
    const router = useRouter()
    const addDSnData: Dsn[] = []

    const [loading, setLoading] = useState(false)
    const [progress, setProgress] = useState(0)
    const parseFile = async (file: File, random: string) => {
        return new Promise((resolve, reject) => {
            const dsnRows: any = []
            const dsnRowsObject: { id: string, value: string }[] = []
            const reader = new FileReader()
            reader.readAsText(file, 'ISO-8859-1');
            reader.onload = function (e: any) {
                // Le contenu du fichier est dans e.target.result
                dsnRows.splice(0, dsnRows.length)
                //On récupère le texte dans la variable dsnRows
                if (e.target && e.target.result) {
                    const text = e.target.result as string; //Une structure DSN ressemble à ca S10.G00.00.003,'11.0.9.0.2'
                    const lines = text.split('\n'); //On split le texte en lignes
                    dsnRows.push(...lines);
                    for (const row of dsnRows) {
                        let lineSplit = row.split(`,'`) //On split chaque ligne en colonnes
                        let id = lineSplit.at(0)
                        let value = lineSplit.at(1).replace(/'/g, "").replace(/\r/g, "")
                        dsnRowsObject.push({
                            id,
                            value
                        });
                    }
                }
                resolve(dsnRowsObject);

            }//Fin boucle lecture
            reader.onerror = function (e) {
                reject(new Error("Erreur de lecture du fichier : " + e));
            };
        })
    }
    const handleSubmit = async (e: React.FormEvent<HTMLFormElement>) => {
        e.preventDefault()
        setLoading(true)
        const dsn = (e.target as HTMLFormElement).elements[0] as HTMLInputElement
        const files = dsn.files ? Array.from(dsn.files) : []
        for (let file of files) {
            const random = Math.random().toString(36).substring(7)
            const dsnRows = await parseFile(file, random) as { id: string, value: string }[]
            addDSnData.push({ dsnId: random, dsnRows: dsnRows })
        }

        try {
            let totalFiles = files.length
            let progressIncrement = 0
            for (const dsn of addDSnData) {
                progressIncrement = progressIncrement + 1
                setProgress(() => progressIncrement / totalFiles * 100)
                const extraction = await extractionData(dsn)
                //uploadFileDsn is server action
                const action = await uploadFileDsn({
                    dsnData: extraction
                }
                )
                if (action?.serverError) {
                    setLoading(false);
                    toast(`${action.serverError}`, {
                        description: new Date().toLocaleDateString(),
                        action: {
                            label: "fermer",
                            onClick: () => console.log("fermeture"),
                        },
                    });
                }
            }

        } catch (err) {
            setLoading(false);
            toast(`${err}`, {
                description: new Date().toLocaleDateString(),
                action: {
                    label: "fermer",
                    onClick: () => console.log("fermeture"),
                },
            });
            console.error(err);
        }
        router.push(`/project/`)
        setLoading(false);

    }

    const extractionData = async (dsnData: Dsn): Promise<ExtractionDsn> => {
        let dsnId = dsnData.dsnId
        const parser = new DsnParser(dsnData.dsnRows)
        const dsnDetail = parser.dsn
        const society = parser.society
        const establishment = parser.establishment
        const bank = parser.bank
        const jobs = parser.job
        const idcc = parser.idcc
        const employees = parser.employees
        const workContracts = parser.workContracts
        const mutuals = parser.mutual
        const mutualEmployees = parser.mutualEmployee
        return {
            dsnId: dsnId,
            dsn: dsnDetail,
            society: society,
            establishment: establishment,
            jobs: jobs,
            idcc: idcc,
            employees: employees,
            workContracts: workContracts,
            mutuals: mutuals,
            mutualEmployees: mutualEmployees
        }
    }

    return (
        <form onSubmit={handleSubmit}>
            <Label htmlFor="dsn">DSN</Label>
            <Input id="dsn" name="dsn" type="file" accept=".dsn" required multiple />
            {!loading && <Button type="submit">Envoyer</Button>}
            {loading && <Progress value={progress} />}
        </form>
    )
}

Les options

Fichier d'option par default.

 options = {
       controleDsnVersion: true,//Controle que le fichier utilise bien la dernière norme de la DSN
       deleteFile: false //Autorise la suppression du fichier après le traitement
   }
1.1.0

1 year ago

1.0.5

1 year ago

1.0.4

1 year ago

1.0.3

1 year ago

1.0.2

1 year ago

1.0.1

1 year ago

1.0.0

1 year ago

0.9.8

1 year ago

0.9.9

1 year ago

0.9.7

2 years ago

0.9.6

2 years ago

0.9.4

2 years ago

0.9.3

2 years ago

0.9.5

2 years ago

0.9.0

2 years ago

0.8.1

2 years ago

0.8.0

2 years ago

0.9.2

2 years ago

0.9.1

2 years ago

0.7.7

2 years ago

0.7.6

2 years ago

0.7.5

2 years ago

0.7.4

2 years ago

0.7.2

2 years ago

0.7.1

2 years ago

0.7.3

2 years ago

0.7.0

2 years ago

0.6.0

2 years ago

0.5.2

3 years ago

0.5.1

3 years ago

0.5.0

3 years ago

0.4.0

3 years ago

0.3.0

3 years ago

0.2.1

3 years ago

0.2.0

3 years ago

0.1.1

3 years ago

0.1.0

3 years ago

0.0.1

3 years ago