IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Schéma Discussion :

Base de données pour un logiciel de notes de frais


Sujet :

Schéma

  1. #1
    Membre confirmé
    Femme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2022
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2022
    Messages : 89
    Par défaut Base de données pour un logiciel de notes de frais
    Je n'ai pas de visualisation entre mes tables sur phpMyAdmin car les tables que j'ai crée sont dans la base que mon site web
    Est ce qu'il y'a un soucis avec ma conception actuelle?

    Projet : un utilisateur dois pouvoir déclarer ses frais de notes ,celle ci ne peux être validé que par son manager
    Les options :
    dans le formulaire, l'utilisateur dispose d'un numéro de code analytique qu'il peux modifier, ce code permets d'attribué les frais au service concerné, un utilisateur peux avoir plusieurs code analytique
    L'utilisateur dispose également d'un code tiers ( équivalent a un matricule ), ce code est attribué lors de la création de la première feuille de note sur un logiciel externe ( on le rentrera a la main, au départ car pas de liaison entre les 2)
    On récupère l'utilisateur et le nom du manager ainsi que le code analytique, ticket restaurant, puissance véhicules, via la table déjà existante sur WordPress ( wp_user)

    Les différents frais : l'utilisateur peux avoir un remboursement de 50 € pour frais de grand déplacement, ce montant est pour la totalité de l'événement quelques sois le nombre de jours de celui-ci

    Dans le formulaire, nous devons récupérer le mois et l'année de l'évènement, le lieu, le motif , les dépenses liées à celles ci

    Les dépenses :

    les dépenses se décompose de frais de repas, frais divers, frais d'hébergement ,frais de transport
    les frais de repas peux s'étaler sur plusieurs jours pour un évènement

    Les frais de repas
    on dois récupérer le montant payé ttc, le jour du repas, la pièce jointe, le type de repas , désignation du repas ( midi ou/soir), la tva 10, la tva 5.5, la tva 20 ainsi que le montant HT, la date de l'évènement
    Chaque repas dois avoir tous ses détails
    Sachant que dans une journée, on peux prendre en charge 2 repas ( midi et soir si nécessaire)

    Les frais hébergement
    nous devons récupérer la date de l'évènement , le type d'hébergement, le montant de l'hébergement et la pièce jointe ( pas de champ de TVA car celle ci ne sont pas récupérables )

    Les frais transports
    nous récupérons si besoin la puissance du véhicule ( qui est déjà présent dans la table wp_users) si l'utilisateur à utilisé son véhicule personnel pour son déplacement , on récupère les kilomètres effectuées avec son véhicule personnel, on récupère le calcul entre ses kilomètres et sa puissance, le montant de l'essence si véhicule de société , le montant du péage , le montant du taxi, transport en commun ( bus, métro), le montant du train, l'avion, le HT péage, tva péage, tva essence, parking ttc, parking tva, parking ht, ainsi qu'une pièce jointe par champ de dépense

    les frais divers
    Ce sont tous les frais non listées dans les champs au dessus avec les mm caractéristiques ( montant HT, tva 5.5 , tva 10 , tva 20 ,montant ttc, objet du frais , pièce jointe par frais, la date de l'évènement )


    Le formulaire dois permette d'ajouter autant de journées que l'évènement se compose, chaque dépense dois être déclaré journalièrement

    La note de frais dois être soumise maximum sous 3 mois

    VoiciNom : 2025-02-27_15h04_30.png
Affichages : 98
Taille : 165,1 Ko un graphique comment j'ai construit ma BDD

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 514
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 514
    Billets dans le blog
    10
    Par défaut
    Bonjour gabinou7.

    La notion de mission n'apparait pas dans les explications, pourtant, je suppose que les différents frais sont liés à une mission ?

    Si c'est bien le cas, une mission possède une date (et heure si besoin) de début et une date (et heure) de fin.
    Pour chaque frais, on vérifiera que les dates sont incluses (date de péage, de plein de carburant, de location de chambre d'hôtel) dans la période de la mission, sans quoi c'est incohérent.

    Je suppose également que les frais doivent être justifiés par une document (note de péage, facture d'hôtel...), à joindre à chaque demande, la notion de justificatif n'est pas non plus mentionnée dans votre énoncé.

    Je suppose aussi que la personne qui valide une note de frais ne peut pas être la même que la personne qui émet la demande de remboursement, sinon ce serait trop facile .
    Il faudra préciser en ce cas si le valideur est obligatoirement le hiérarchique, une personne d'un certain service de l'entreprise ou une personne exerçant un rôle particulier dans l'entreprise...
    Il faudra également préciser si une validation peut être partielle, par exemple, s'il manque les justificatifs de repas, mais que ceux de transports sont complets ?


    Merci de confirmer ces différentes hypothèses ou d'expliquer, compléter le cas échéant.

  3. #3
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 514
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 514
    Billets dans le blog
    10
    Par défaut
    Si les hypothèses qui précèdent sont les bonnes, voici à quoi pourrait ressembler une base de MCD :

    Nom : Sans titre.png
Affichages : 59
Taille : 33,2 Ko


    La contrainte d'exclusion (X) matérialise la règle selon laquelle le valideur d'une note de frais ne peut pas être son émetteur, on créera pour ce besoin une UDF associée à la contrainte check.

    J'ai ajouté la ville de base de la personne missionnée et la ville où se situe la mission, ce qui permettra de vérifier le kilométrage et donc la validité des frais de transport le cas échéant.
    La localisation de la personne missionnée est à date, pour permettre à une personne d'émettre une demande de remboursement de frais alors que cette personne a été mutée sur un autre site depuis cette mission.

    J'ai créé au cas où la notion de hiérarchie encadrant/encadré, mais ce ne sera peut-être pas utile dans votre contexte.

    Le nom du type d'entité [CA_calendrier] est entre parenthèses, car l'entité ne sert qu'à participer à certaines associations, mais ne deviendra pas une table.

    L'association (MS_missionner) est liée à [CA_calendrier], car j'ai imaginé que certaines personnes puissent être missionnées pour une partie seulement de la période totale de la mission.
    Évidemment, si chaque mission ne concerne qu'une et une seule personne ou plusieurs personnes, mais systématiquement pour toute la durée de la mission, on peut simplifier.

    Et voici le script DDL généré par Looping après avoir choisi le SGBD-R MySQL puisqu'il me semble que c'est le votre (merci de le confirmer) :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    CREATE TABLE PE_personne(
       PE_ident INT AUTO_INCREMENT,
       PE_matricule SMALLINT NOT NULL,
       PE_prenom VARCHAR(50) NOT NULL,
       PE_ddn DATE NOT NULL,
       PE_nom VARCHAR(50) NOT NULL,
       PRIMARY KEY(PE_ident),
       UNIQUE(PE_matricule)
    );
     
    CREATE TABLE VH_vehicule(
       VH_ident INT AUTO_INCREMENT,
       VH_immat CHAR(9) NOT NULL,
       VH_puissance DECIMAL(3,0) NOT NULL,
       PRIMARY KEY(VH_ident),
       UNIQUE(VH_immat)
    );
     
    CREATE TABLE VI_ville(
       VI_ident INT AUTO_INCREMENT,
       VI_insee CHAR(5) NOT NULL,
       VI_nom VARCHAR(50) NOT NULL,
       PRIMARY KEY(VI_ident)
    );
     
    CREATE TABLE YF_type_frais(
       YF_ident INT AUTO_INCREMENT,
       YF_code CHAR(2) NOT NULL,
       YF_libelle VARCHAR(50) NOT NULL,
       PRIMARY KEY(YF_ident),
       UNIQUE(YF_code)
    );
     
    CREATE TABLE MI_mission(
       MI_ident INT AUTO_INCREMENT,
       MI_dtdeb DATETIME NOT NULL,
       MI_dtfin DATETIME NOT NULL,
       VI_ident INT NOT NULL,
       PRIMARY KEY(MI_ident),
       FOREIGN KEY(VI_ident) REFERENCES VI_ville(VI_ident)
    );
     
    CREATE TABLE NF_note_frais(
       NF_ident INT AUTO_INCREMENT,
       NF_date DATE NOT NULL,
       MI_ident INT NOT NULL,
       PE_ident INT NOT NULL,
       PRIMARY KEY(NF_ident),
       FOREIGN KEY(MI_ident) REFERENCES MI_mission(MI_ident),
       FOREIGN KEY(PE_ident) REFERENCES PE_personne(PE_ident)
    );
     
    CREATE TABLE JU_justificatif(
       NF_ident INT,
       JS_seq SMALLINT,
       JS_mtht DECIMAL(7,2) NOT NULL,
       JS_mtva DECIMAL(7,2) NOT NULL,
       JS_mttc DECIMAL(7,2) NOT NULL,
       YF_ident INT NOT NULL,
       PRIMARY KEY(NF_ident, JS_seq),
       FOREIGN KEY(NF_ident) REFERENCES NF_note_frais(NF_ident),
       FOREIGN KEY(YF_ident) REFERENCES YF_type_frais(YF_ident)
    );
     
    CREATE TABLE EN_encadrer(
       PE_ident_collab INT,
       PE_ident_hierarchique INT NOT NULL,
       PRIMARY KEY(PE_ident_collab),
       FOREIGN KEY(PE_ident_collab) REFERENCES PE_personne(PE_ident),
       FOREIGN KEY(PE_ident_hierarchique) REFERENCES PE_personne(PE_ident)
    );
     
    CREATE TABLE MS_missionner(
       PE_ident INT,
       MI_ident INT,
       CA_dtdeb DATETIME,
       MS_dtfin DATETIME NOT NULL,
       PRIMARY KEY(PE_ident, MI_ident, CA_dtdeb),
       FOREIGN KEY(PE_ident) REFERENCES PE_personne(PE_ident),
       FOREIGN KEY(MI_ident) REFERENCES MI_mission(MI_ident)
    );
     
    CREATE TABLE valider(
       PE_ident INT,
       NF_ident INT,
       PRIMARY KEY(PE_ident, NF_ident),
       FOREIGN KEY(PE_ident) REFERENCES PE_personne(PE_ident),
       FOREIGN KEY(NF_ident) REFERENCES NF_note_frais(NF_ident)
    );
     
    CREATE TABLE BA_baser(
       PE_ident INT,
       VI_ident INT,
       CA_dtdeb DATETIME,
       BA_dtfin DATE NOT NULL,
       PRIMARY KEY(PE_ident, VI_ident, CA_dtdeb),
       FOREIGN KEY(PE_ident) REFERENCES PE_personne(PE_ident),
       FOREIGN KEY(VI_ident) REFERENCES VI_ville(VI_ident)
    );
     
    CREATE TABLE AF_affecter(
       MI_ident INT,
       VH_ident INT,
       CA_dtdeb DATETIME,
       PRIMARY KEY(MI_ident, VH_ident, CA_dtdeb),
       FOREIGN KEY(MI_ident) REFERENCES MI_mission(MI_ident),
       FOREIGN KEY(VH_ident) REFERENCES VH_vehicule(VH_ident)
    );
     
    alter table NF_note_frais
    add constraint NF_valideur_exc_emetteur
    check (udf_NF_valideur(NF_ident)) ;

    EDIT 1 : un véhicule ne pouvant à un instant "t" n'être affecté qu'à une seule mission, il faudra ajouter un contrainte vers la mission, contrainte qui sera symbolisée par une flèche de l'association (affecter) vers l'entité-type [MISSION]

    EDIT 2 : j'ai nommé JU_justificatif le type d'entité, mais préfixé ses attributs par JS_, il faudra bien évidemment harmoniser ça (soit JS_ partout, soit JU_)

    EDIT 3 : l'association (valider) ayant une cardinalité n de part et d'autre, elle deviendra une table, aussi, on la renommera VA_valider pour rester dans la même codification

    On ne se relit décidément jamais assez

  4. #4
    Membre confirmé
    Femme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2022
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2022
    Messages : 89
    Par défaut
    bonjour,

    Je ne comprend ta MCD
    Elle m'a l'air bien complexe par rapport a celle que j'ai réalisée

    Une mission est ma table générale

    La ville c'est juste pour info
    Le vehicule , pas besoin, car on le reserve sur un autre logiciel , donc pour info aussi ( manager, tickets restaurant etc ...)

    Sur les comptes de WordPress, j'ai ajouté déjà sur le profil, la puissance du véhicule personnel ainsi que autre champs

    Quant a la personne , on récupère deja tout sur la BDD de wp_users donc je ne récupère que l'id de cette table
    Idem pour le manager, je le récupère sur le compte

    J'ai effectivement oublié de noté les pieces justificatifs malgré qu'elle y étaient

    la base que j'ai crée

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
      // Création de la table `monlogiciel_demande_frais`
        if ($wpdb->get_var("SHOW TABLES LIKE '$table_demande_frais'") != $table_demande_frais) {
            $sql = "CREATE TABLE $table_demande_frais (
                id_general INT NOT NULL AUTO_INCREMENT,
                code_analytique VARCHAR(50) DEFAULT NULL,  -- Ajout du code analytique
                lieu_deplacement VARCHAR(60) NOT NULL,
                date_mois CHAR(7) DEFAULT NULL,  -- Ajout de la date sous forme de mois (YYYY-MM)
                motif VARCHAR(255) DEFAULT NULL,  -- Ajout du motif
                status ENUM('en_attente', 'valide', 'refuse') DEFAULT 'en_attente',
                user_id BIGINT(20) UNSIGNED NOT NULL,
                manager_id INT(11) NOT NULL,
                prime_grand_deplacement tinyint(1) DEFAULT '0',
                date_validation DATETIME DEFAULT CURRENT_TIMESTAMP,
                PRIMARY KEY (id),
                KEY user_id (user_id),
                KEY manager_id (manager_id)
            ) $charset_collate;";
        
            require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
            dbDelta($sql);
        }
    
        // Création de la table `monlogiciel_repas_frais`
        if ($wpdb->get_var("SHOW TABLES LIKE '$table_repas_frais'") != $table_repas_frais) {
            $sql = "CREATE TABLE $table_repas_frais (
                     `id_repas` int(11) NOT NULL,
                    `demande_frais_id` int(11) NOT NULL,
                    `date_evenement` date DEFAULT NULL,
                    `montant_repas_midi` decimal(10,2) DEFAULT NULL,
                    `montant_repas_soir` decimal(10,2) DEFAULT NULL,
                    `piece_jointe_repas_midi` varchar(255) COLLATE utf8mb4_unicode_520_ci DEFAULT NULL,
                    `piece_jointe_repas_soir` varchar(255) COLLATE utf8mb4_unicode_520_ci DEFAULT NULL,
                    `style_restauration_midi` enum('restaurant','magasin','preleveur') COLLATE utf8mb4_unicode_520_ci DEFAULT NULL,
                    `style_restauration_soir` enum('restaurant','magasin') COLLATE utf8mb4_unicode_520_ci DEFAULT NULL,
                    `montant_ht_midi` decimal(10,2) DEFAULT NULL,
                    `tva_5_5_midi` decimal(10,2) DEFAULT NULL,
                    `tva_10_midi` decimal(10,2) DEFAULT NULL,
                    `tva_20_midi` decimal(10,2) DEFAULT NULL,
                    `montant_ht_soir` decimal(10,2) DEFAULT NULL,
                    `tva_5_5_soir` decimal(10,2) DEFAULT NULL,
                    `tva_10_soir` decimal(10,2) DEFAULT NULL,
                    `tva_20_soir` decimal(10,2) DEFAULT NULL,  -- URL de la pièce jointe (si disponible)
                    PRIMARY KEY (id),
                    FOREIGN KEY (demande_frais_id) REFERENCES $table_demande_frais(id) ON DELETE CASCADE
                    ) $charset_collate;";
    
            require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
            dbDelta($sql);  // Créer la table si elle n'existe pas;
            }
    
        // Création de la table `monlogiciel_transport_frais`
        if ($wpdb->get_var("SHOW TABLES LIKE '$table_transport_frais'") != $table_transport_frais) {
            $sql = "CREATE TABLE $table_transport_frais (
                 `id_transport` int(11) NOT NULL,
                `demande_frais_id` int(11) NOT NULL,
                `date_evenement` date DEFAULT NULL,
                `puissance` int(11) DEFAULT NULL,
                `kilometres` int(11) DEFAULT NULL,
                `frais_kilometrique` decimal(10,2) DEFAULT NULL,
                `essence_montant` decimal(10,2) DEFAULT NULL,
                `piece_jointe_essence` varchar(255) COLLATE utf8mb4_unicode_520_ci DEFAULT NULL,
                `peage_montant` decimal(10,2) DEFAULT NULL,
                `piece_jointe_peage` varchar(255) COLLATE utf8mb4_unicode_520_ci DEFAULT NULL,
                `taxi_montant` decimal(10,2) DEFAULT NULL,
                `piece_jointe_taxi` varchar(255) COLLATE utf8mb4_unicode_520_ci DEFAULT NULL,
                `transport_en_commun_montant` decimal(10,2) DEFAULT NULL,
                `piece_jointe_transport_en_commun` varchar(255) COLLATE utf8mb4_unicode_520_ci DEFAULT NULL,
                `train_montant` decimal(10,2) DEFAULT NULL,
                `piece_jointe_train` varchar(255) COLLATE utf8mb4_unicode_520_ci DEFAULT NULL,
                `avion_montant` decimal(10,2) DEFAULT NULL,
                `piece_jointe_avion` varchar(255) COLLATE utf8mb4_unicode_520_ci DEFAULT NULL,
                `ht_peage` decimal(10,2) DEFAULT NULL,
                `tva_peage` decimal(10,2) DEFAULT NULL,
                `ht_essence` decimal(10,2) DEFAULT NULL,
                `tva_essence` decimal(10,2) DEFAULT NULL,
                `parking_ttc` tinyint(1) DEFAULT NULL,
                `parking_tva` decimal(10,2) DEFAULT NULL,
                `parking_ht` decimal(10,2) DEFAULT NULL,
                `piece_jointe_parking` varchar(255) COLLATE utf8mb4_unicode_520_ci DEFAULT NULL,
                PRIMARY KEY (id),
                FOREIGN KEY (demande_frais_id) REFERENCES $table_demande_frais(id)
                ) $charset_collate;";
            
            require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
            dbDelta($sql);
        }
    
        // Création de la table `monlogiciel_hebergement_frais`
        if ($wpdb->get_var("SHOW TABLES LIKE '$table_hebergement_frais'") != $table_hebergement_frais) {
            $sql = "CREATE TABLE $table_hebergement_frais (
                id_hebergement INT NOT NULL AUTO_INCREMENT,
                demande_frais_id INT NOT NULL,
                date_evenement DATE  DEFAULT NULL,  
                type_hebergement VARCHAR(50) DEFAULT NULL,
                montant_hebergement DECIMAL(10,2) DEFAULT NULL,
                piece_jointe_hebergement VARCHAR(255) DEFAULT NULL,
                PRIMARY KEY (id),
                FOREIGN KEY (demande_frais_id) REFERENCES $table_demande_frais(id)
                ) $charset_collate;";
            
            require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
            dbDelta($sql);
        }
        //creation de la table des frais divers
        if ($wpdb->get_var("SHOW TABLES LIKE '$table_divers_frais'") != $table_divers_frais) {
            $sql = "CREATE TABLE $table_divers_frais (
                `id_frais` int(11) NOT NULL,
                `demande_frais_id` int(11) NOT NULL,
                `date_evenement` date DEFAULT NULL,
                `objet_frais` varchar(255) COLLATE utf8mb4_unicode_520_ci DEFAULT NULL,
                `montant_ht` decimal(10,2) DEFAULT NULL,
                `tva_20` decimal(5,2) DEFAULT NULL,
                `montant_ttc` decimal(10,2) DEFAULT NULL,
                `piece_jointe` varchar(255) COLLATE utf8mb4_unicode_520_ci DEFAULT NULL,
                `tva_5_5` decimal(5,2) DEFAULT NULL,
                `tva_10` decimal(5,2) DEFAULT NULL, 
                PRIMARY KEY (id),
                FOREIGN KEY (demande_frais_id) REFERENCES $table_demande_frais(id) ON DELETE CASCADE
                ) $charset_collate;";
            
            require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
            dbDelta($sql);
        }
    J'aimerai juste que tu m'explique ce qui ne va pas avec ma BDD ?

  5. #5
    Membre chevronné
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2022
    Messages
    265
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 21
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2022
    Messages : 265
    Par défaut
    Redondance de donnée : tva , prix_essences ...
    Données superflues : Des dates évenement dans une table qui cause de l'hébergement par exemple
    Problèmes de normalisation (id_frais qui se transforme en "id" dans la contrainte de clé primaire.
    Des nommages hasardeux style : date_mois par exemple (char(7)).

    Id unsign : https://stackoverflow.com/questions/...when-to-use-it

    40 champs tva 5 etc ... Stocke le pourcentage de tva SI JAMAIS besoin s'en fait , et sinon tu fais les calculs à la volé ...

    Il serait plus rapide de se fier à escartefigue qui à pris le temps de te répondre.
    Merci à lui
    Un problème sans solution est un problème mal posé. (Albert Einstein)

  6. #6
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 514
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 514
    Billets dans le blog
    10
    Par défaut
    Citation Envoyé par gabinou7 Voir le message
    Je ne comprend ta MCD
    Elle m'a l'air bien complexe par rapport a celle que j'ai réalisée
    De mon coté, j'ai ébauché un MCD à partir du peu d'éléments à disposition (comme indiqué, il manque les règles de gestion), le MCD c'est un modèle conceptuel
    De votre coté, il y a un MLD, c'est à dire un modèle tabulaire.
    Il est nettement préférable de commencer par le MCD, ça évite bien des erreurs, sachant que quand le MCD est validé, avec n'importe quel outil de modélisation, le MLD est créé automatiquement.


    Citation Envoyé par gabinou7 Voir le message
    Une mission est ma table générale
    D'accord, mais en ce cas, il faut appeler un chat un chat, cette table devrait s'appeler "mission" et il n'y a aucun intérêt à préfixer le nom de chaque table par "table_"


    Citation Envoyé par gabinou7 Voir le message
    La ville c'est juste pour info
    Comme je l'ai indiqué plus, haut, la ville peut avoir un intérêt si l'on veut vérifier que le kilométrage déclaré est cohérent avec le kilométrage réel.
    De plus, dans votre table "general" il y a une notion de lieu, on a donc bien besoin de cette notion et elle n'a rien à faire dans "general" (voir plus bas).


    Citation Envoyé par gabinou7 Voir le message
    Le vehicule , pas besoin, car on le reserve sur un autre logiciel , donc pour info aussi ( manager, tickets restaurant etc ...)
    Le fait de gérer le véhicule sur un autre logiciel ne veut pas dire qu'on en n'a pas besoin. On a besoin à minima de son identifiant pour pouvoir retrouver sa puissance fiscale.
    Donc conceptuellement (c'est à dire au niveau du MCD) il faut modéliser une entité_type [VEHICULE], par contre, s'il est géré ailleurs, on déclarera cette entité_type comme fictive pour ne pas générer une table (et en ce cas, inutile de déclarer les autres attributs que l'identifiant).


    Citation Envoyé par gabinou7 Voir le message
    Quant a la personne , on récupère deja tout sur la BDD de wp_users donc je ne récupère que l'id de cette table
    Même réponse que pour le véhicule : conceptuellement on a bel et bien besoin de la personne, on ne déclarera donc que l'identifiant de la personne et on ne génèrera pas la table correspondante.


    Citation Envoyé par gabinou7 Voir le message
    J'aimerai juste que tu m'explique ce qui ne va pas avec ma BDD ?
    de très nombreuses choses :
    • dans la table "repas", les données répétées, comme la TVA à 5,5%, 10% et 20% du midi puis du soir, c'est aberrant, si une personne ne prends qu'un seul repas avec une TVA à 5% on se trimballe 5 colonnes inutiles. et si demain j'ai besoin de prévoir des frais de petit déjeuner, il faudra que je modifie ma table... C'est tout le contraire de ce qu'il faut faire : il faut une ligne de frais avec un seul montant et un seul taux de TVA, ligne à répéter autant que nécessaire.
      De plus, les taux de TVA changent de temps à autre selon les décisions gouvernementales, donc prévoir à l'avance le nombre de taux est mission impossible...
      Même combat concernant les "styles de restauration" (de quoi s'agit il ?) ;
    • dans la table "transport", on trouve à la fois des frais d'avion, de train, de parking, de péage... là encore, on va avoir plein de colonnes inutilisées et des colonnes manquantes si par exemple il y a plusieurs billets de train ou d'avion. Là aussi, on ne doit créer qu'une ligne par frais, et répéter les lignes.
       Dans un classeur excel on répète les colonnes, mais dans une base de données relationnelle, on répète les lignes ;
    • dans la table "générale" (à renommer en "mission"), le lieu ne doit pas apparaitre sous forme littérale, mais sous forme de lien (via une foreign key) grâce à un identifiant de lieu (et donc une table des lieux, que j'ai nommée "ville"). En effet, si vous stockez des lieu ici, alors les orthographes pourront varier d'une ligne à l'autre et vous serez dans l'incapacité de retrouver tous les déplacements qui concernent un même lieu ;
    • dans la table "frais_divers", on trouve là aussi une collection de TVA diverses, voir remarques liées à la table "repas" ;
    • dans la table "hebergement", le type d'hébergement devrait être externalisé dans une table des typologies d'hébergement en faisant là aussi le lien par une FK.

  7. #7
    Membre confirmé
    Femme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2022
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2022
    Messages : 89
    Par défaut
    Merci de vos réponses et de l'aide apportée à vous 2 cependant ne comprenant pas vos élaborations,

    D'après vos commentaire, il faut refaire toute ma base et donc tout le code derrière, tout ca pour une boucle qui ne fonctionne pas

    Je n'ai ni les compétences de vos niveau en BDD , ni le temps pour refaire de A a Z tout ce programme

    On m'a demandé d'avoir le détail de toutes les tva de chaque frais sur le formulaire, donc si l'utilisateur les rentre, je les enregistre, je ne sais pas ce qu'il veux faire ensuite si ils vont les additionner

    J'avoue que j'ai toujours construits mes tables sans l'aide aucun logiciel , juste un crayon et un papier :-)


    On ne vérifie pas la destination car il n'y a pas de point de départ fixe car notre société à plusieurs sites et on peux partir de n'importe quel site donc pas prévu de vérifier les kilomètres
    Les kilomètres c'est juste si on utilise notre voiture, chose qui arrive 1 fois par an si rupture des véhicules d'entreprise ( chose qui est rarement le cas)
    Si véhicules d'entreprise, elle dispose d'un badge pour autoroute, d'une carte essence, donc les frais c'est uniquement si la carte ne fonctionne pas
    La puissance fiscale c'est juste si on utilise notre vehicule perso , pas le vehicule de société , ca evite a l'utilisateur de le rentrer vu que je l'enregistre quand je crée un nouyveau compte sur notre intranet


    Le lieu est indiqué dans la table de la mission, car une mission est un lieu unique
    il servira peut être par la suite pour faire des statistique dans les déplacements


    Je récupère déjà l'id de l'utilisateur et l'id du manager

    et si la personne prévois 2 repas, je ne peux pas le savoir d'avance , le petit déjeuner est inclus uniquement avec l'hôtel d'après leur demande
    Je sais que ca fais énormément de champ NULL si l'utilisateur n'a pas tous ses frais mais je ne voyais pas comment faire autrement

    le style de repas c'est paracerque il y'a un montant de remboursement maximum par type , ex : 15e40 par resto, 9.40 par achats magasin , hôtel province :88 euros, hotel grande vilel 120€ etc ...

    Idem pour les transport, il veulle savoir au détail pret quels sont les différents frais donc c'est pour cela que j'ai crée un champ pour chaque frais de transport, et si on prend l'avion 2 fois, on declare 2 journé dans le logiciel, la journée de l'aller, la journée du retour
    effectivement quand on achète un billet d'avion ou de train, on achète l'aller en mm temps que le retour :-)

    En tout cas, la comptabilité veux récupérer tous ses champs détaillées, je ne sais pas encore quelles serons nos prochains echanges et ceux qu'il en feront mais voila


    Concernant le nom des tables c'est pour infos pour mieux comprendre mais en réalité, elle s'appelle comme cela , je suis obligé pour pouvoir les repérer dans la base du site internet fais avec WordPress

    Nom : 2025-03-03_15h12_10.png
Affichages : 36
Taille : 34,1 Ko

    dans la table "générale" (à renommer en "mission"), le lieu ne doit pas apparaitre sous forme littérale, mais sous forme de lien (via une foreign key) grâce à un identifiant de lieu (et donc une table des lieux, que j'ai nommée "ville"). En effet, si vous stockez des lieu ici, alors les orthographes pourront varier d'une ligne à l'autre et vous serez dans l'incapacité de retrouver tous les déplacements qui concernent un même lieu


    Je peux mettre une regex dans le formulaire apres certes, je suis pas l'abri de champ libre et je ne comprend pas cette histoire sous forme de lien (via une foreign key), comment l'utilisateur l'a rentre dans le formulaire ?

    dans la table "transport", on trouve à la fois des frais d'avion, de train, de parking, de péage... là encore, on va avoir plein de colonnes inutilisées et des colonnes manquantes si par exemple il y a plusieurs billets de train ou d'avion. Là aussi, on ne doit créer qu'une ligne par frais, et répéter les lignes.

    Actuellement chaque jour à sa ligne avec tous les frais de transports , je ne vois pas comment faire une ligne par transport a moins que je fasse une table par moyen de transport

    dans la table "hebergement", le type d'hébergement devrait être externalisé dans une table des typologies d'hébergement en faisant là aussi le lien par une FK.

    Pourquoi externiser le type de l'hebergement , le type permets de rembourser le montant dédié au type

    Données superflues : Des dates évènement dans une table qui cause de l'hébergement par exemple

    Cette donnée n'est pas superflues, il correspond a la journée de la dépense

    Quant a date-mois, il s'agit du mois et de l'année de l'évènement

  8. #8
    Expert éminent
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 142
    Billets dans le blog
    16
    Par défaut
    @ gabinou7,

    La validité, la crédibilité, la robustesse, etc., d’une base de données, tout cela passe par la maîtrise de sa conception. Pour y parvenir, un conseil : passer une quinzaine de jour à étudier les études de cas d’un ouvrage fondamental, à savoir celui de Patrick Bergougnoux (Paprick).
    C’est clair, limpide et riche d’enseignements :

    Conception des Bases de Données - De la modélisation conceptuelle à la génération SQL du schéma relationnel
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  9. #9
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 514
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 514
    Billets dans le blog
    10
    Par défaut
    Citation Envoyé par gabinou7 Voir le message
    Je n'ai ni les compétences de vos niveau en BDD , ni le temps pour refaire de A a Z tout ce programme
    En ce cas deux solutions,
    • soit déléguer à un sachant la création de la BDD, il n'y a aucune honte à déléguer une partie des travaux, bien au contraire, c'est nettement préférable que de tenter de faire ce pour quoi l'on n'a pas été formé, on évite ainsi une solution inadaptée, qui sera a terme bien plus coûteuse et inadaptée.
      Je ne sais pas piloter un avion : je me garderai bien d'en prendre les commandes, imaginez les conséquences ;
    • soit se former, en lisant les ouvrages didactiques tels que celui suggéré par Fsmrel ci-dessus, ou en suivant des sessions de formation.



    Citation Envoyé par gabinou7 Voir le message
    D'après vos commentaire, il faut refaire toute ma base et donc tout le code derrière, tout ca pour une boucle qui ne fonctionne pas
    Une boucle qui ne fonctionne pas c'est une chose, très facile à corriger, une base mal modélisée, c'est une intégrité des données hasardeuse, une évolutivité limitée, des performances désastreuses, des coûts prohibitifs et un mécontentement tant coté maîtrise d'ouvrage que maîtrise d'oeuvre.



    Citation Envoyé par gabinou7 Voir le message
    On m'a demandé d'avoir le détail de toutes les tva de chaque frais sur le formulaire, donc si l'utilisateur les rentre, je les enregistre, je ne sais pas ce qu'il veux faire ensuite si ils vont les additionner
    Les enregistrer, certes, mais pas "en vrac" comme vous l'avez fait.



    Citation Envoyé par gabinou7 Voir le message
    Le lieu est indiqué dans la table de la mission, car une mission est un lieu unique
    il servira peut être par la suite pour faire des statistique dans les déplacements
    Ce qui plaide grandement en faveur d'une table des lieux, sinon vous aurez des missions enregistrées à "Boulogne" d'autres à "Boulogne Billancourt" d'autres à "Boulogne-Billancourt" voire "Boullogne" ou encore "Boulogne. B" etc... Et là ce sera le drame pour vos statistiques !

  10. #10
    Membre confirmé
    Femme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2022
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2022
    Messages : 89
    Par défaut
    Le soucis , c'est que lors de cette mission, le cahier des charges fus: reproduis le logiciel existant donc champ libre pour le lieu etc ..., ajout moi juste la dématérialisation et au fur a mesure de l'avancé, d'autre option s'ajoute

    Merci pour le conseil du livre , je vais voir pour me le faire payer par mon entreprise .

    Ma société n'étant pas dans le domaine de l'informatique, je suis la seule développeuse et trouve que les prestataires facturent trop cher

    Je ne demande qu'a m'améliorer et à apprendre

    J'apprend sur le tas depuis presque 4 ans seule dans cette société et je dois être polyvalente

Discussions similaires

  1. Réponses: 4
    Dernier message: 25/02/2014, 18h15
  2. Réponses: 9
    Dernier message: 16/02/2011, 19h59
  3. Base de données pour gérer les notes
    Par netsabes dans le forum Schéma
    Réponses: 6
    Dernier message: 23/11/2007, 19h52
  4. [Conception] Probleme pour mettre ajour ma base de donne
    Par pierrot10 dans le forum PHP & Base de données
    Réponses: 18
    Dernier message: 21/09/2006, 19h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo