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 :

Conception d'un MCD pour une assurance automobile


Sujet :

Schéma

  1. #161
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 002
    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 002
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    Bonsoir à nouveau,


    Dans le post #159 apparaît subrepticement une table SOUSCRIPTEUR, référencée par les tables CONTRAT et VEHICULE. J’aimerais donc en savoir plus...

    Quoi qu’il en soit, votre MCD serait donc enrichi d’une entité-type SOUSCRIPTEUR et il s’agit probablement d’une conséquence de ma remarque dans le post #131 :

    « les assurés et souscripteurs ne sont pas pris en compte dans le MCD »

    Cette remarque faisant suite à ce que vous aviez écrit dans le post #127 :

    « nous avons l'assuré et le souscripteur. L' assuré est la personne à qui est accordée la garantie prévue par le contrat d’assurance. »

    Toujours dans le post #127, vous avez écrit :

    « je suis partie par la méthode de cascade en passant par le souscripteur ou assuré »

    J’interprète « méthode en cascade » par suivre les liens entre les objets (entités-types, associations) pour aller d’une entité-type A à une entité-type B.

    Mais il y a une difficulté : les concepts de « souscripteur » et d’« assuré » ne sont pas formellement définis, et les garanties dont on vient de faire très brièvement mention ne portent que sur les véhicules (association VEHIC_GARANT).

    Question Q1 : Le client (entité-type CLIENT) est-il forcément l’assuré ? Si c’est le cas, pour une meilleure lisibilité du MCD, renommer l’entité-type CLIENT en ASSURE, mais si ça n’est pas le cas, qu’est-ce qu’un client qui n’est pas l’assuré, et où est alors modélisé le concept d’assuré ? Si le client n’est pas l’assuré, est-il alors le souscripteur ? Si oui, les entités-types CLIENT et SOUSCRIPTEUR ne font qu’une, à moins que vous ne nous sortiez de derrière les fagots une catégorie de client autre que souscripteur et assuré. Qu’en est-il ? 

    Je suppose par ailleurs que l’assuré est en général le souscripteur, mais il est évident que ça n’est pas toujours le cas. En conséquence, cette question :

    Question Q2 : le souscripteur peut-il ne pas être l’assuré ? Dans ce cas, le souscripteur est-il le client (entité-type CLIENT) ? Cette question est à mettre en relation avec la question Q3.



    Citation Envoyé par Zidane7 Voir le message
    un véhicule peut être souscrit par une société qui désir mettre le nom de chaque conducteur sur chaque carte grise sous couvert le nom de la société.
    Si je comprends bien, le souscripteur est la société et le conducteur l’assuré.

    Question Q3 : C’est cela ? Dans ce contexte, qui est le client ?

    ____________________

    Question Q4 : Pourquoi une association entre SOUSCRIPTEUR et VEHICULE ?

    Dans le cas d’un contrat "mono", le souscripteur du contrat peut-il ne pas être celui du véhicule ?

    Dans le cas d’un contrat "flotte", un véhicule de la flotte peut-il avoir un souscripteur qui ne soit pas celui du contrat ?


    Citation Envoyé par Zidane7 Voir le message
    Par rapport à vos propositions des postes #157, #158, je trouve que c'est excellent.
    Alors votez pour eux...
    (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.

  2. #162
    Membre à l'essai
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2019
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Guinée

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Décembre 2019
    Messages : 83
    Points : 23
    Points
    23
    Par défaut
    Bonsoir Monsieur fsmrel,

    fsmrel
    Association selon laquelle un contrat "flotte" peut comporter plusieurs véhicules, mais un véhicule ne fait pas nécessairement partie d’un contrat de ce type (il s’agit alors du rattachement à un contrat "mono").

    Il est impératif que l’association VEH_FLOTTE fasse en SQL l’objet d’une table (voyez encore le post
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE TABLE VEH_FLOTTE
    (
            vehiculeId         INT
          , contratId          INT            NOT NULL
        , CONSTRAINT VEH_FLOTTE_PK PRIMARY KEY(vehiculeId)
        , CONSTRAINT VEH_FLOTTE_VEHICULE_FK FOREIGN KEY(vehiculeId) 
              REFERENCES VEHICULE(vehiculeId)
        , CONSTRAINT VEH_FLOTTE_CONTRAT_FLOTTE_FK FOREIGN KEY(contratId) 
              REFERENCES CONTRAT_FLOTTE(contratId)
    );
    Pour arriver à cela, il faut faire une demande à Looping : ouvrir la fenêtre d’association concernant l’association VEH_FLOTTE, cocher la case « Générer une table de correspondance dans le MLD », puis cliquer sur le bouton que j’ai référencé ainsi « Générer une table » :
    J'ai procédé à cela comme vous avez indiqué. Merci
    Envoyé par Zidane7
    Chaque FLOTTE_TYPE à au minimum 1 et au maximum n CATEGORIE c'est à dire (1,n) et une CATEGORIE peut ne pas être dans un FLOTTE_TYPE ou dans plusieurs c'est à dire (0,n). Ici, c'est pour permettre de contrôler les catégories appartenant aux types de flotte.
    Je suis évidemment d’accord sur le principe ! Mais la question que j’ai posée est la suivante :
    « Pourriez-vous fournir les paires de valeurs qui constitueront la table (SQL) FLOTTE_TYPE_CAT ? »

    J’ai besoin de voir ces paires de valeurs pour juger de la faisabilité de la valorisation raisonnable de la table.

    Pour y voir vraiment clair, j’ai aussi besoin de connaître les catégories ainsi que les sous-catégories et les types de flottes.

    Pour des raisons de confidentialité, vous pouvez me transmettre ces informations par message privé.
    OK, je vous ai bien compris et je vous enverrai en message privé. Merci encore.

    Dans le post #159 apparaît subrepticement une table SOUSCRIPTEUR, référencée par les tables CONTRAT et VEHICULE. J’aimerais donc en savoir plus...

    Quoi qu’il en soit, votre MCD serait donc enrichi d’une entité-type SOUSCRIPTEUR et il s’agit probablement d’une conséquence de ma remarque dans le post #131 :
    « les assurés et souscripteurs ne sont pas pris en compte dans le MCD »

    Cette remarque faisant suite à ce que vous aviez écrit dans le post #127 :
    « nous avons l'assuré et le souscripteur. L' assuré est la personne à qui est accordée la garantie prévue par le contrat d’assurance. »
    J’interprète « méthode en cascade » par suivre les liens entre les objets (entités-types, associations) pour aller d’une entité-type A à une entité-type B.

    Mais il y a une difficulté : les concepts de « souscripteur » et d’« assuré » ne sont pas formellement définis, et les garanties dont on vient de faire très brièvement mention ne portent que sur les véhicules (association VEHIC_GARANT).
    Ici l'assuré est celui ou celle à qui est accordée la garantie prévue par le contrat d'assurance. Le souscripteur est celui ou celle qui vient souscrire le contrat soit à son nom ou au nom d'une autre personne, donc le souscripteur peut ne pas être l'assuré si c'est en automobile. Merci pour la remarque.

    Question Q1 : Le client (entité-type CLIENT) est-il forcément l’assuré ? Si c’est le cas, pour une meilleure lisibilité du MCD, renommer l’entité-type CLIENT en ASSURE, mais si ça n’est pas le cas, qu’est-ce qu’un client qui n’est pas l’assuré, et où est alors modélisé le concept d’assuré ? Si le client n’est pas l’assuré, est-il alors le souscripteur ? Si oui, les entités-types CLIENT et SOUSCRIPTEUR ne font qu’une, à moins que vous ne nous sortiez de derrière les fagots une catégorie de client autre que souscripteur et assuré. Qu’en est-il ?
    J'ai corrigé le passage. Le client ici est l'assuré Merci.

    Envoyé par Zidane7
    un véhicule peut être souscrit par une société qui désir mettre le nom de chaque conducteur sur chaque carte grise sous couvert le nom de la société.
    Si je comprends bien, le souscripteur est la société et le conducteur l’assuré.

    Question Q3 : C’est cela ? Dans ce contexte, qui est le client ?
    Non ce n'est pas cela.

    Question Q4 : Pourquoi une association entre SOUSCRIPTEUR et VEHICULE ?
    C'est savoir quel véhicule que le souscripteur est venu souscrire son contrat?

    Dans le cas d’un contrat "mono", le souscripteur du contrat peut-il ne pas être celui du véhicule ?
    Dans le cas d’un contrat "flotte", un véhicule de la flotte peut-il avoir un souscripteur qui ne soit pas celui du contrat ?
    Il me faut revoir votre question pour une réponse claire.

    Quelle sont vos remarques et suggestions?
    Merci d'avance.

  3. #163
    Membre à l'essai
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2019
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Guinée

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Décembre 2019
    Messages : 83
    Points : 23
    Points
    23
    Par défaut Conception d'un MCD pour une assurance automobile
    Bonjour Monsieur fsmrel,

    fsmrel
    Envoyé par Zidane7
    un véhicule peut être souscrit par une société qui désir mettre le nom de chaque conducteur sur chaque carte grise sous couvert le nom de la société.
    Si je comprends bien, le souscripteur est la société et le conducteur l’assuré.
    Question Q3 : C’est cela ? Dans ce contexte, qui est le client ?
    Je vous disais ici non car le souscripteur est la société et sur les cartes grises, le nom des employés par exemple donc dans ce contexte l'employé est l'assuré.
    Avez vous d'autres remarques sur la partie?

    fsmrel
    Question Q4 : Pourquoi une association entre SOUSCRIPTEUR et VEHICULE ?
    C'est pour savoir quel véhicule que le souscripteur a souscrit et a quel contrat.
    Quelle est votre remarque?

    fsmrel
    Dans le cas d’un contrat "mono", le souscripteur du contrat peut-il ne pas être celui du véhicule ?
    Bien sûr oui car le souscripteur peut être un fils, père, ami, courtier, apporteur qui peut être différent de l'assuré.

    fsmrel
    Dans le cas d’un contrat "flotte", un véhicule de la flotte peut-il avoir un souscripteur qui ne soit pas celui du contrat ?
    Oui car une entreprise par exemple qui veut faire l'assurance des voitures de ses employés et que sur chaque carte grise c'est le nom des employés qui y figure alors l'employé est l'assuré, ou confit la souscription de l'assurance à un cabinet de courtage donc le souscripteur peut être différent de l'assuré dans le cadre d'une flotte.
    Avez-vous des remarques et suggestions sur ce point?

    Merci d'avance.

  4. #164
    Membre à l'essai
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2019
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Guinée

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Décembre 2019
    Messages : 83
    Points : 23
    Points
    23
    Par défaut Conception d'un MCD pour une assurance automobile
    Je constate quelque chose au niveau d'une entité dont j'ai changé le nom et les propriétés de cette entité, mais le nom et les propriétés dans ma requête SQL dans looping ne change pas. Pourquoi et comment faire pour changer?
    Voici ma requête ci-dessous:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE TABLE CLIENT(
       clientId INT IDENTITY,
       codeassure VARCHAR(10) NOT NULL,
       nomClient VARCHAR(50) NOT NULL,
       prenomClient VARCHAR(50) NOT NULL,
       adresseClient VARCHAR(50) NOT NULL,
       telephoneClient VARCHAR(30) NOT NULL,
       PRIMARY KEY(clientId),
       UNIQUE(codeassure)
    );
    Ce nom devrait être "ASSURE". Même si je change et j'enregistre, le nom et les propriétés ne changent toujours pas.
    Que faire?
    Merci d'avance.

  5. #165
    Membre émérite
    Avatar de Paprick
    Homme Profil pro
    Professeur des Universités
    Inscrit en
    Juin 2019
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Professeur des Universités
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2019
    Messages : 678
    Points : 2 716
    Points
    2 716
    Par défaut
    Bonsoir,

    La requête que vous nous montrez est-elle issue de la fenêtre SQL de Looping, ou du script SQL exporté au format TXT ?
    Dans le dernier cas, avez-vous regénéré ce fichier d'export ?
    Dans le premier cas, utilisez-vous des noms logiques différents des noms conceptuels ?

    Vous pouvez également m'envoyer le fichier .loo afin que je vérifie ce qui ne va pas.
    Patrick Bergougnoux - Professeur des Universités au Département Informatique de l'IUT de Toulouse III
    La simplicité est la sophistication suprême (Léonard de Vinci)
    LIVRE : Modélisation Conceptuelle de Données - Une Démarche Pragmatique
    Looping - Logiciel de modélisation gratuit et libre d'utilisation

  6. #166
    Membre à l'essai
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2019
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Guinée

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Décembre 2019
    Messages : 83
    Points : 23
    Points
    23
    Par défaut Conception d'un MCD pour une assurance automobile
    Bonjour Monsieur Paprick,

    Paprick
    Bonsoir,
    La requête que vous nous montrez est-elle issue de la fenêtre SQL de Looping, ou du script SQL exporté au format TXT ?
    Dans le dernier cas, avez-vous regénéré ce fichier d'export ?
    Dans le premier cas, utilisez-vous des noms logiques différents des noms conceptuels ?

    Vous pouvez également m'envoyer le fichier .loo afin que je vérifie ce qui ne va pas.
    L'erreur était que le nom logique était différent du nom situé en haut dans l'entité "ASSURE".
    Merci.

  7. #167
    Membre à l'essai
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2019
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Guinée

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Décembre 2019
    Messages : 83
    Points : 23
    Points
    23
    Par défaut Conception d'un MCD pour une assurance automobile
    Bonjour Messieurs,
    Pour ce qui concerne le cas des souscripteurs et assuré, voici comment la situation se presente:
    Un assuré est celui qui detient le contrat d'assurance et un souscripteur est celui qui est venu souscrire le contrat. Mais un assuré peut être à la fois assuré et souscripteur à condition qu'il vient lui-même souscrire son propre contrat et un souscripteur peut ne pas être assuré car il peut venir pour souscrire l'assurance d'une autre personne. En ce sens, voici le schéma c'est à dire le MCD et le code SQL en question:
    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
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
    377
    378
    379
    380
    381
    382
    383
    384
    385
    386
    387
    388
    389
    390
    391
    392
    393
    394
    395
    396
    397
    398
    399
    400
    401
    402
    403
    404
    405
    406
    407
    408
    409
    410
    411
    412
    413
    414
    415
    416
    417
    418
    419
    420
    421
    422
    423
    424
    425
    426
    427
    428
    429
    430
    431
    432
    433
    434
    435
    436
    437
    438
    439
    440
    441
    442
    443
    444
    445
    446
    447
    448
    449
    450
    451
    452
    453
    454
    455
    456
    457
    458
    459
    460
    461
    462
    463
    464
    465
    466
    467
    468
    469
    470
    471
    472
    473
    474
    475
    476
    477
    478
    479
    480
    481
    482
    483
    484
    485
    486
    487
    488
    489
    490
    491
    492
    493
    494
    495
    496
    497
    498
    499
    500
    501
    502
    503
    504
    505
    506
    507
    508
    509
    510
    511
    512
    513
    514
    515
    516
    517
    518
    519
    520
    521
    522
    523
    524
    525
    526
    527
    528
    529
    530
    531
    532
    533
    534
    535
    536
    537
    538
    539
    540
    541
    542
    543
    544
    545
    546
    547
    548
    549
    550
    551
    552
    553
    554
    555
    556
    557
    558
    559
    560
    561
    562
    563
    564
    565
    566
    567
    568
    569
    570
    571
    572
    573
    574
    575
    576
    577
    578
    579
    580
    581
    582
    583
    584
    585
    586
    587
    588
    589
    590
    591
    592
    593
    594
    595
    596
    597
    598
    599
    600
    601
    602
    603
    604
    605
    606
    607
    608
    609
    610
    611
    612
    613
    614
    615
    616
    617
    618
    619
    620
    621
    622
    CREATE TABLE ASSURE(
       assureId INT IDENTITY,
       codeassure VARCHAR(10) NOT NULL,
       nomassure VARCHAR(50) NOT NULL,
       prenomassure VARCHAR(50) NOT NULL,
       adresseassure VARCHAR(50) NOT NULL,
       telephoneassure VARCHAR(30) NOT NULL,
       PRIMARY KEY(assureId),
       UNIQUE(codeassure)
    );
    
    CREATE TABLE APPORTEUR(
       apporteurId INT IDENTITY,
       codeapporteur VARCHAR(5) NOT NULL,
       nomApporteur VARCHAR(50) NOT NULL,
       prenomApporteur VARCHAR(50) NOT NULL,
       PRIMARY KEY(apporteurId),
       UNIQUE(codeapporteur)
    );
    
    CREATE TABLE GARANTIE(
       garantieId INT IDENTITY,
       codegarantie CHAR(1) NOT NULL,
       Libelle_Garantie VARCHAR(50) NOT NULL,
       PRIMARY KEY(garantieId),
       UNIQUE(codegarantie)
    );
    
    CREATE TABLE PUISSANCE(
       puissanceId INT IDENTITY,
       codepuissance VARCHAR(3) NOT NULL,
       borneInf INT NOT NULL,
       borneSup INT NOT NULL,
       unite INT NOT NULL,
       PRIMARY KEY(puissanceId),
       UNIQUE(codepuissance)
    );
    
    CREATE TABLE AGENCE(
       agenceId INT IDENTITY,
       codeagence VARCHAR(4) NOT NULL,
       nomAgence VARCHAR(50) NOT NULL,
       dateCreation DATE NOT NULL,
       PRIMARY KEY(agenceId),
       UNIQUE(codeagence)
    );
    
    CREATE TABLE AVENANT_LIBELLE(
       avenantlibelleId INT IDENTITY,
       avenantlibellecode CHAR(3) NOT NULL,
       avenantlibellevaleur VARCHAR(50),
       PRIMARY KEY(avenantlibelleId),
       UNIQUE(avenantlibellecode)
    );
    
    CREATE TABLE MODEPAIEMENT(
       modepaiemenId INT IDENTITY,
       modepaiementcode VARCHAR(15) NOT NULL,
       modepaiement_libelle VARCHAR(50),
       PRIMARY KEY(modepaiemenId),
       UNIQUE(modepaiementcode)
    );
    
    CREATE TABLE CEDEAO(
       cedeaoId INT,
       codecedeao INT NOT NULL,
       cedeaodepuis DATE,
       cedeaovehicule INT NOT NULL,
       cedeaofin DATE,
       PRIMARY KEY(cedeaoId),
       UNIQUE(codecedeao)
    );
    
    CREATE TABLE TAUX_DEFENSE_RECOUR(
       tauxDrId INT IDENTITY,
       tauxDrdebut DATE NOT NULL,
       tauxDrfin DATE NOT NULL,
       tauxvaleure DECIMAL(2,2) NOT NULL,
       PRIMARY KEY(tauxDrId)
    );
    
    CREATE TABLE MARQUE(
       marqueId INT IDENTITY,
       libellemarque VARCHAR(50),
       PRIMARY KEY(marqueId)
    );
    
    CREATE TABLE TAUXFGA(
       tauxfgaId INT IDENTITY,
       tauxfgadebut DATE,
       tauxfgafin DATE,
       tauxfgavaleur DECIMAL(2,2),
       PRIMARY KEY(tauxfgaId)
    );
    
    CREATE TABLE TAUXTAXE(
       tauxtaxeId INT IDENTITY,
       tauxtaxedebut DATE,
       tauxtaxefin DATE,
       tauxtaxevaleur DECIMAL(2,2),
       PRIMARY KEY(tauxtaxeId)
    );
    
    CREATE TABLE TAUXPROTDRIVER(
       tauxprotdriverId INT IDENTITY,
       tauxprotdriverdebut DATE,
       tauxprotdriverfin DATE,
       tauxprotdrivervaleur DECIMAL(2,2),
       PRIMARY KEY(tauxprotdriverId)
    );
    
    CREATE TABLE ANPRORATA(
       prorataId INT IDENTITY,
       proratadatemini CHAR(3),
       proratadatemaxi CHAR(3),
       PRIMARY KEY(prorataId)
    );
    
    CREATE TABLE COUTPOLICE(
       coupoliceId VARCHAR(2),
       coutpolice INT NOT NULL,
       libellecoupolice VARCHAR(50),
       PRIMARY KEY(coupoliceId)
    );
    
    CREATE TABLE BRANCHE(
       brancheId INT IDENTITY,
       branchecode CHAR(3) NOT NULL,
       libelle_branche VARCHAR(50),
       PRIMARY KEY(brancheId),
       UNIQUE(branchecode)
    );
    
    CREATE TABLE OPTIONSECURITE(
       optionsecuriteId VARCHAR(50),
       codeoptionsecurite VARCHAR(1) NOT NULL,
       optionmontant INT,
       garantieId INT NOT NULL,
       PRIMARY KEY(optionsecuriteId),
       UNIQUE(codeoptionsecurite),
       FOREIGN KEY(garantieId) REFERENCES GARANTIE(garantieId)
    );
    
    CREATE TABLE OPTIONVALEUR(
       optionvaleurId VARCHAR(50),
       optionvaleurlibelle VARCHAR(30),
       optionvaleurmontant INT NOT NULL,
       optionsecuriteId VARCHAR(50) NOT NULL,
       PRIMARY KEY(optionvaleurId),
       FOREIGN KEY(optionsecuriteId) REFERENCES OPTIONSECURITE(optionsecuriteId)
    );
    
    CREATE TABLE FLOTTE_TYPE(
       flotte_typeId INT IDENTITY,
       flotte_typecode CHAR(3) NOT NULL,
       flottetypelibelle VARCHAR(40),
       PRIMARY KEY(flotte_typeId),
       UNIQUE(flotte_typecode)
    );
    
    CREATE TABLE SOUSCRIPTEUR(
       souscripteurId INT IDENTITY,
       nomsouscripteur VARCHAR(45),
       prenomsouscripteur VARCHAR(45),
       PRIMARY KEY(souscripteurId)
    );
    
    CREATE TABLE COURTIER(
       courtierId INT IDENTITY,
       codecourtier CHAR(3) NOT NULL,
       libellecourtier VARCHAR(50),
       PRIMARY KEY(courtierId),
       UNIQUE(codecourtier)
    );
    
    CREATE TABLE TAUXDOMMAGE(
       tauxdommageId INT IDENTITY,
       tauxdommagedebu DATE NOT NULL,
       tauxdommagefin DATE,
       tauxdommagevaleur DECIMAL(2,2),
       PRIMARY KEY(tauxdommageId)
    );
    
    CREATE TABLE TAUXINCENDIE(
       tauxincendieId INT IDENTITY,
       tauxincendiedebut DATE NOT NULL,
       tauxincendiefin DATE,
       tauxincendievaleur DECIMAL(2,2),
       PRIMARY KEY(tauxincendieId)
    );
    
    CREATE TABLE TAUXVOL(
       tauxvolId INT IDENTITY,
       tauxvoldebut DATE NOT NULL,
       tauxvolfin DATE NOT NULL,
       tauxvolvaleur DECIMAL(2,2),
       PRIMARY KEY(tauxvolId)
    );
    
    CREATE TABLE TAUXBRISDEGLACE(
       tauxbrisdeglaceId INT IDENTITY,
       tauxbrisdeglacedebut DATE NOT NULL,
       tauxbrisdeglacefin DATE NOT NULL,
       tauxbrisdeglacevaleur DECIMAL(2,2) NOT NULL,
       PRIMARY KEY(tauxbrisdeglaceId)
    );
    
    CREATE TABLE ENERGIE(
       energieId INT IDENTITY,
       libelleenergie VARCHAR(10) NOT NULL,
       PRIMARY KEY(energieId),
       UNIQUE(libelleenergie)
    );
    
    CREATE TABLE TAUX_COMMISSION(
       taux_commissionId DECIMAL(2,2),
       taux_commissiondebut DATE,
       taux_commissionfin DATE,
       taux_commissionvaleur DECIMAL(2,2),
       agenceId INT,
       PRIMARY KEY(taux_commissionId),
       FOREIGN KEY(agenceId) REFERENCES AGENCE(agenceId)
    );
    
    CREATE TABLE TYPE_AGENCE(
       type_agenceId VARCHAR(50),
       codetype_agence CHAR(2) NOT NULL,
       typelibelle VARCHAR(50),
       PRIMARY KEY(type_agenceId),
       UNIQUE(codetype_agence)
    );
    
    CREATE TABLE UTILISATEUR(
       utilisateurId VARCHAR(50),
       codeutilisateur CHAR(4) NOT NULL,
       nomutilisateur VARCHAR(50),
       PRIMARY KEY(utilisateurId),
       UNIQUE(codeutilisateur)
    );
    
    CREATE TABLE CONNEXION(
       utilisateurId VARCHAR(50),
       connexionId VARCHAR(50),
       codeconnexion CHAR(4) NOT NULL,
       login VARCHAR(25),
       connexionpassworde VARCHAR(30),
       connexiontemp DATETIME2,
       PRIMARY KEY(utilisateurId, connexionId),
       UNIQUE(codeconnexion),
       FOREIGN KEY(utilisateurId) REFERENCES UTILISATEUR(utilisateurId)
    );
    
    CREATE TABLE CONDUCTEUR(
       conducteurId INT IDENTITY,
       codeconducteur CHAR(4) NOT NULL,
       conducteurabituel VARCHAR(50),
       adresseconducteur VARCHAR(50),
       PRIMARY KEY(conducteurId),
       UNIQUE(codeconducteur)
    );
    
    CREATE TABLE CATEGORIE(
       categorieId INT IDENTITY,
       codecategorie CHAR(3) NOT NULL,
       categorie VARCHAR(50) NOT NULL,
       taux_commissionId DECIMAL(2,2),
       brancheId INT NOT NULL,
       PRIMARY KEY(categorieId),
       UNIQUE(codecategorie),
       FOREIGN KEY(taux_commissionId) REFERENCES TAUX_COMMISSION(taux_commissionId),
       FOREIGN KEY(brancheId) REFERENCES BRANCHE(brancheId)
    );
    
    CREATE TABLE PRODUCTEUR(
       agenceId INT,
       producteurId INT IDENTITY,
       codeproducteur VARCHAR(5) NOT NULL,
       Nomproducteur VARCHAR(50) NOT NULL,
       Prenomprodcteur VARCHAR(50) NOT NULL,
       PRIMARY KEY(agenceId, producteurId),
       UNIQUE(codeproducteur),
       FOREIGN KEY(agenceId) REFERENCES AGENCE(agenceId)
    );
    
    CREATE TABLE CAISSIERE(
       caissiereId INT IDENTITY,
       codecaissiere VARCHAR(4) NOT NULL,
       prenomcaissiere VARCHAR(40) NOT NULL,
       nomcaissiere VARCHAR(40) NOT NULL,
       agenceId INT,
       producteurId INT,
       PRIMARY KEY(caissiereId),
       UNIQUE(codecaissiere),
       FOREIGN KEY(agenceId, producteurId) REFERENCES PRODUCTEUR(agenceId, producteurId)
    );
    
    CREATE TABLE CATCOMPLEMENT(
       categorieId INT,
       catcomplementId INT,
       catcomplementcode CHAR(3) NOT NULL,
       catcomplementlibelle VARCHAR(100) NOT NULL,
       cedeaoId INT NOT NULL,
       PRIMARY KEY(categorieId, catcomplementId),
       FOREIGN KEY(categorieId) REFERENCES CATEGORIE(categorieId),
       FOREIGN KEY(cedeaoId) REFERENCES CEDEAO(cedeaoId)
    );
    
    CREATE TABLE FLOTTE_TYPE_CAT(
       flotte_typeId INT,
       categorieId INT,
       PRIMARY KEY(flotte_typeId, categorieId),
       FOREIGN KEY(flotte_typeId) REFERENCES FLOTTE_TYPE(flotte_typeId),
       FOREIGN KEY(categorieId) REFERENCES CATEGORIE(categorieId)
    );
    
    CREATE TABLE CONTRAT(
       agenceId INT,
       contratId INT IDENTITY,
       codecontrat CHAR(14) NOT NULL,
       dateemissioncontrat DATE NOT NULL,
       dateEffetContrat DATE NOT NULL,
       dateExpirationContrat DATE NOT NULL,
       reduction DECIMAL(2,2),
       contrat_emission_bornes DATE,
       courtierId INT,
       souscripteurId INT NOT NULL,
       coupoliceId VARCHAR(2) NOT NULL,
       assureId INT NOT NULL,
       apporteurId INT,
       agenceId_1 INT NOT NULL,
       producteurId INT NOT NULL,
       PRIMARY KEY(agenceId, contratId),
       UNIQUE(codecontrat),
       FOREIGN KEY(agenceId) REFERENCES AGENCE(agenceId),
       FOREIGN KEY(courtierId) REFERENCES COURTIER(courtierId),
       FOREIGN KEY(souscripteurId) REFERENCES SOUSCRIPTEUR(souscripteurId),
       FOREIGN KEY(coupoliceId) REFERENCES COUTPOLICE(coupoliceId),
       FOREIGN KEY(assureId) REFERENCES ASSURE(assureId),
       FOREIGN KEY(apporteurId) REFERENCES APPORTEUR(apporteurId),
       FOREIGN KEY(agenceId_1, producteurId) REFERENCES PRODUCTEUR(agenceId, producteurId)
    );
    
    CREATE TABLE AVENANT(
       agenceId INT,
       contratId INT,
       avenantId INT IDENTITY,
       codeavenant VARCHAR(10) NOT NULL,
       libelleAvenant VARCHAR(50) NOT NULL,
       dateemissionavenant DATE,
       dateEffetAvenant DATE NOT NULL,
       dateExpirationAvenant DATE NOT NULL,
       bonus DECIMAL(2,2),
       malus DECIMAL(2,2),
       avenantlibelleId INT NOT NULL,
       PRIMARY KEY(agenceId, contratId, avenantId),
       UNIQUE(codeavenant),
       FOREIGN KEY(agenceId, contratId) REFERENCES CONTRAT(agenceId, contratId),
       FOREIGN KEY(avenantlibelleId) REFERENCES AVENANT_LIBELLE(avenantlibelleId)
    );
    
    CREATE TABLE TARIF(
       categorieId INT,
       catcomplementId INT,
       puissanceId INT,
       datetarifdepuis DATE NOT NULL,
       responsabilitecivile INT NOT NULL,
       PRIMARY KEY(categorieId, catcomplementId, puissanceId),
       FOREIGN KEY(categorieId, catcomplementId) REFERENCES CATCOMPLEMENT(categorieId, catcomplementId),
       FOREIGN KEY(puissanceId) REFERENCES PUISSANCE(puissanceId)
    );
    
    CREATE TABLE TARIFHISTO(
       categorieId INT,
       catcomplementId INT,
       puissanceId INT,
       tarifhistoId INT,
       tarifhistodurantdebut DATE NOT NULL,
       tarifhistodurantfin DATE NOT NULL,
       responsabilitecivilehisto INT NOT NULL,
       PRIMARY KEY(categorieId, catcomplementId, puissanceId, tarifhistoId),
       FOREIGN KEY(categorieId, catcomplementId, puissanceId) REFERENCES TARIF(categorieId, catcomplementId, puissanceId)
    );
    
    CREATE TABLE ENCAISSEMENT_C(
       agenceId INT,
       contratId INT,
       encaisseCtrId INT IDENTITY,
       encaisseCtrMontant INT,
       encaisseCtrDate DATE,
       modepaiemenId INT NOT NULL,
       caissiereId INT NOT NULL,
       PRIMARY KEY(agenceId, contratId, encaisseCtrId),
       FOREIGN KEY(agenceId, contratId) REFERENCES CONTRAT(agenceId, contratId),
       FOREIGN KEY(modepaiemenId) REFERENCES MODEPAIEMENT(modepaiemenId),
       FOREIGN KEY(caissiereId) REFERENCES CAISSIERE(caissiereId)
    );
    
    CREATE TABLE CONTRAT_FLOTTE(
       agenceId INT,
       contratId INT,
       contratflotteId INT IDENTITY,
       flotte_typeId INT NOT NULL,
       PRIMARY KEY(agenceId, contratId, contratflotteId),
       UNIQUE(agenceId, contratId),
       FOREIGN KEY(agenceId, contratId) REFERENCES CONTRAT(agenceId, contratId),
       FOREIGN KEY(flotte_typeId) REFERENCES FLOTTE_TYPE(flotte_typeId)
    );
    
    CREATE TABLE VEHICULE(
       vehiculeId INT IDENTITY,
       codevehicule CHAR(5) NOT NULL,
       immatriculation VARCHAR(10) NOT NULL,
       type VARCHAR(50) NOT NULL,
       serie VARCHAR(40) NOT NULL,
       vehiculepuissance INT NOT NULL,
       nombreDePlaceCarteGrise INT NOT NULL,
       nombreDePlaceCabine BIGINT NOT NULL,
       nombrePlacehorscabine INT,
       valeurneuve INT,
       valeurvenale INT,
       conducteurId INT NOT NULL,
       energieId INT NOT NULL,
       courtierId INT,
       souscripteurId INT,
       agenceId INT,
       contratId INT,
       contratflotteId INT,
       marqueId INT NOT NULL,
       puissanceId INT NOT NULL,
       categorieId INT NOT NULL,
       catcomplementId INT NOT NULL,
       assureId INT NOT NULL,
       PRIMARY KEY(vehiculeId),
       UNIQUE(codevehicule),
       FOREIGN KEY(conducteurId) REFERENCES CONDUCTEUR(conducteurId),
       FOREIGN KEY(energieId) REFERENCES ENERGIE(energieId),
       FOREIGN KEY(courtierId) REFERENCES COURTIER(courtierId),
       FOREIGN KEY(souscripteurId) REFERENCES SOUSCRIPTEUR(souscripteurId),
       FOREIGN KEY(agenceId, contratId, contratflotteId) REFERENCES CONTRAT_FLOTTE(agenceId, contratId, contratflotteId),
       FOREIGN KEY(marqueId) REFERENCES MARQUE(marqueId),
       FOREIGN KEY(puissanceId) REFERENCES PUISSANCE(puissanceId),
       FOREIGN KEY(categorieId, catcomplementId) REFERENCES CATCOMPLEMENT(categorieId, catcomplementId),
       FOREIGN KEY(assureId) REFERENCES ASSURE(assureId)
    );
    
    CREATE TABLE CONTRAT_MONO(
       agenceId INT,
       contratId INT,
       vehiculeId INT NOT NULL,
       PRIMARY KEY(agenceId, contratId),
       UNIQUE(vehiculeId),
       FOREIGN KEY(agenceId, contratId) REFERENCES CONTRAT(agenceId, contratId),
       FOREIGN KEY(vehiculeId) REFERENCES VEHICULE(vehiculeId)
    );
    
    CREATE TABLE VEHIC_GARANT(
       vehiculeId INT,
       garantieId INT,
       PRIMARY KEY(vehiculeId, garantieId),
       FOREIGN KEY(vehiculeId) REFERENCES VEHICULE(vehiculeId),
       FOREIGN KEY(garantieId) REFERENCES GARANTIE(garantieId)
    );
    
    CREATE TABLE APPORT_TAUX_COM(
       apporteurId INT,
       taux_commissionId DECIMAL(2,2),
       PRIMARY KEY(apporteurId, taux_commissionId),
       FOREIGN KEY(apporteurId) REFERENCES APPORTEUR(apporteurId),
       FOREIGN KEY(taux_commissionId) REFERENCES TAUX_COMMISSION(taux_commissionId)
    );
    
    CREATE TABLE AGENCE_TYPE_AGENCE(
       agenceId INT,
       type_agenceId VARCHAR(50),
       PRIMARY KEY(agenceId, type_agenceId),
       FOREIGN KEY(agenceId) REFERENCES AGENCE(agenceId),
       FOREIGN KEY(type_agenceId) REFERENCES TYPE_AGENCE(type_agenceId)
    );
    
    GO
    CREATE FUNCTION CONTRAT_SEQUENCE_FN(@agenceCode as CHAR(3)
                                      , @categorieCode as CHAR(3)
                                      , @anneeEmission as CHAR(2)) 
        RETURNS CHAR(14)  
    AS   
    BEGIN
      
    DECLARE @n INT = 0 ;
    DECLARE @agenceId INT ; 
    DECLARE @categorieId INT ;
    DECLARE @@contratCodeLen INT = 14 ;
    DECLARE @contratCodeNouveau CHAR(14) ;
    DECLARE @contratCodeNew CHAR(14) ;
    DECLARE @contratCodePrecedent CHAR(14) ;
    DECLARE @SequenceDebutAnnee CHAR(6) = '000001' ;
    DECLARE @SequenceContrat CHAR(6) ;
    DECLARE @SequenceContratNum INT ;
    DECLARE @SequenceContratPrecedent CHAR(6) ;
    DECLARE @SequenceContratPrecedentNum INT ;
    DECLARE @seqLen as INT = 6
    DECLARE @anneeContratOffset INT = 7
    DECLARE @anneeMax  INT ;
    DECLARE @anneeContratPrecedent CHAR(2) ;
    DECLARE @zero CHAR(6) = '000000' ;
    DECLARE @anneeErreur CHAR(6) = '??????' ;
    
    SET @agenceId = (SELECT agenceId FROM AGENCE WHERE agenceCode = @agenceCode)
    SET @categorieId = (SELECT categorieId FROM CATEGORIE WHERE categorieCode = @categorieCode)       
    SET @contratCodeNouveau = CONCAT(@agenceCode, @categorieCode, @anneeEmission, @anneeErreur)
    
    ----------------------------------------------------
    -- On regarde si la table CONTRAT contient au moins 
    -- un contrat pour l’agence et l'année concernées.
    ----------------------------------------------------
    
    SET @anneeMax = (SELECT MAX(SUBSTRING(contratCode, @anneeContratOffset, 2))
                     FROM   CONTRAT 
                     WHERE  agenceId = @agenceId) ;
    
    SET @n = (SELECT COUNT(*) 
              FROM   CONTRAT 
              WHERE  agenceId = @agenceId
                AND  SUBSTRING(contratCode, @anneeContratOffset, 2) = @anneeEmission) ;
    
    -----------------------------------------------------
    -- Si la table CONTRAT contient au moins un contrat
    -- pour l'agence et l'année concernées, on récupère 
    -- dans le dernier contrat créé correspondant :
    --   son numéro de série, 
    --   son code contrat, 
    --   sa date d'émission.
    -----------------------------------------------------
    
    IF @n > 0 
        BEGIN
            SET @SequenceContratPrecedent = 
                  (SELECT MAX(RIGHT(contratCode,@seqLen))
                   FROM   CONTRAT 
                   WHERE  agenceId = @agenceId 
                     AND  SUBSTRING(contratCode, @anneeContratOffset, 2) = @anneeEmission)
    
            SET @contratCodePrecedent = 
                  (SELECT contratCode
                   FROM   CONTRAT 
                   WHERE  agenceId = @agenceId 
                     AND  SUBSTRING(contratCode, @anneeContratOffset, 2) = @anneeEmission
                     AND RIGHT(contratCode,@seqLen) = @SequenceContratPrecedent) ;
    
            SET @anneeContratPrecedent = SUBSTRING(@contratCodePrecedent, @anneeContratOffset, 2) ;
       END
    
    ELSE
    
    --------------------------------------------------------------
    -- Si la table CONTRAT ne contient aucun contrat pour
    -- l’agence et l'année concernées, alors on force le numéro  
    -- de police à '000001' pour le contrat à créer.
    --------------------------------------------------------------
    
        BEGIN
               SET @contratCodeNouveau = 
                   CONCAT(@agenceCode
                 , @categorieCode
                 , @anneeEmission
                 , @SequenceDebutAnnee)
        END
    
    -----------------------------------------------------
    -- Si pour l’agence concernée, le dernier contrat 
    -- créé Cn est de la même année que celui qui est à
    -- créer, on incrémente d'une unité le numéro de 
    -- police récupéré dans le contrat Cn 
    -- (variable @SequenceContrat). 
    -----------------------------------------------------
    
    IF  @n > 0 AND @anneeEmission = @anneeContratPrecedent 
        BEGIN
            SET @SequenceContratPrecedent = RIGHT(@contratCodePrecedent, @seqLen) ;
            SET @SequenceContratPrecedentNum = CAST(@SequenceContratPrecedent as INT) ;
    
            SET @SequenceContratNum = 1 + @SequenceContratPrecedentNum
            SET @SequenceContrat = CAST(@SequenceContratNum as CHAR(6))
            SET @contratCodeNouveau = 
                   CONCAT
                  (
                   @agenceCode
                 , @categorieCode
                 , @anneeEmission
                 , LEFT(@zero, LEN(@zero) - LEN(@SequenceContrat))
                 , @SequenceContrat
                  )
        END 
    
    --------------------------------------
    -- On sort, en fournissant le nouveau
    -- code contrat.
    --------------------------------------
    
    RETURN @contratCodeNouveau 
     
    END 
    
    GO
    
    GO
    CREATE VEHICULE_MONO_FLOTTE_EXCLUSION_FIN()
    RETURN INT
    AS 
    BEGIN
    DECLARE @n INT
    SELECT@n=COUNT(*) FROM VEH_FLOTTE as x
     JOIN CONTRA_MONO as y ON x.vehiculeId=y.vehiculeId
    RETURN @n
    END;
    GO
    ALTER TABLE CONTRAT_MONO 
    ADD CONSTRAINT CONTRAT_MONO_EXCLUSION_CHECK
    CHECK (dbo.VEHICULE_MONO_FLOTTE_EXCLUSION_FIN()=0)
    
    ALTER TABLE VEH_FLOTTE
    ADD CONSTRAINT FLOTTE_TYPE_MONO_EXCLUSION_CHECK
    CHECK(dbo.VEHICULE_MONO_FLOTTE_EXCLUSION_FIN()=0);
    Que pensez-vous?
    Merci d'avance
    Images attachées Images attachées  

  8. #168
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 002
    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 002
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    Bonsoir Zidane7,


    Citation Envoyé par Zidane7 Voir le message
    une entreprise par exemple qui veut faire l'assurance des voitures de ses employés et que sur chaque carte grise c'est le nom des employés qui y figure alors l'employé est l'assuré.
    D’accord. Mais doit on considérer qu’on est seulement alors dans le cas d’une flotte ? D’un contrat mono s’il n’ y a qu’un employé à assurer pour l’entreprise qui souscrit ?


    Citation Envoyé par Zidane7 Voir le message
    ou confie la souscription de l'assurance à un cabinet de courtage donc le souscripteur peut être différent de l'assuré dans le cadre d'une flotte.
    Dans le cas où le souscripteur est un cabinet de courtage, on serait forcément dans le cas d’une flotte. C’est bien ça ?


    Du point de vue de la modélisation, vous n’échapperez pas à la spécialisation des entités-types...
    En effet, le souscripteur peut être soit l’assuré, soit un tiers. Dans votre propre MCD, vous avez deux entités-types, à savoir ASSURE et SOUSCRIPTEUR. Si donc l’assuré Raoul est aussi le souscripteur, vous devrez avoir deux fois le nom, le prénom et autres attributs de Raoul, une fois par entité-type, d’où une redondance à surveiller de très près : il est bien préférable de n’avoir ces informations qu’une seule fois, d’où l’intérêt de la spécialisation ; ASSURE et SOUSCRIPTEUR sont des spécialisations d’une entité-type générique, appelons celle-ci CLIENT :

    Nom : Zidane7_assurance_auto (20)contrats(spécialisation).png
Affichages : 436
Taille : 19,7 Ko

    Par ailleurs, il y a les apporteurs et les courtiers. Si j’ai bien compris, un apporteur ne participerait pas au financement des contrats, donc on l’isole. Par contre, chaque courtier a pour vocation de financer des contrats : le subodore que la règle est la suivante : un contrat est financé soit par un souscripteur, soit par un courtier mais pas les deux à la fois, d’où une contrainte d’exclusion (ou plutôt de partitionnement) entre les associations SOUSCRIRE et FINANCER :
    Nom : Zidane7_assurance_auto (20)contrats(assuré_apporteur).png
Affichages : 436
Taille : 37,6 Ko

    Si les codes des courtiers (attribut courtierCode) ne sont pas en conflit avec ceux des clients (attribut clientCode), on peut envisager de rendre COURTIER spécialisation de CLIENT, vous me direz.

    Je n’ai mis aucune relation entre SOUSCRIPTEUR et VEHICULE, ni pour COURTIER et VEHICULE. En effet, à moins de cas particuliers à justifier, connaissant un contrat on connaît les véhicules assurés.


    A suivre...
    (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. #169
    Membre à l'essai
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2019
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Guinée

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Décembre 2019
    Messages : 83
    Points : 23
    Points
    23
    Par défaut Conception d'un MCD pour une assurance automobile
    Bonsoir Monsieur fsmrel
    fsmrel
    Mais doit-on considérer qu’on est seulement alors dans le cas d’une flotte ? D’un contrat mono s’il n’y a qu’un employé à assurer pour l’entreprise qui souscrit ?
    Non ce n’est pas seulement dans le cadre d’une flotte, même si c’était un employé que l’entreprise décidait de souscrire pour lui, alors l’entreprise est le souscripteur et l’employé reste toujours l’assuré.

    fsmrel
    Dans le cas où le souscripteur est un cabinet de courtage, on serait forcément dans le cas d’une flotte. C’est bien ça ?
    Non, il y a des particuliers ou contrat mono qui font confiance aux cabinets de courtage. Donc toute entité de personne ou groupe de personnes ou société qui passe par un cabinet de courtage, alors le cabinet de courtage est le souscripteur et ceux ou celles qui ont confié leur gestion d’assurance à ce cabinet deviennent des assurés par rapport à l’entreprise d’assurance.

    fsmrel
    Du point de vue de la modélisation, vous n’échapperez pas à la spécialisation des entités-types...
    En effet, le souscripteur peut être soit l’assuré, soit un tiers. Dans votre propre MCD, vous avez deux entités-types, à savoir ASSURE et SOUSCRIPTEUR. Si donc l’assuré Raoul est aussi le souscripteur, vous devrez avoir deux fois le nom, le prénom et autres attributs de Raoul, une fois par entité-type, d’où une redondance à surveiller de très près : il est bien préférable de n’avoir ces informations qu’une seule fois, d’où l’intérêt de la spécialisation ; ASSURE et SOUSCRIPTEUR sont des spécialisations d’une entité-type générique, appelons celle-ci CLIENT
    Je suis vraiment d’accord avec cette hypothèse. C’est vraiment normal. Mais j’aimerais que vous éclaircissiez par schéma plus clair de liaison entre assuré et client et entre client et souscripteur. Avec leurs cardinalités et propriétés de chaque entité.

    fsmrel
    Par ailleurs, il y a les apporteurs et les courtiers. Si j’ai bien compris, un apporteur ne participerait pas au financement des contrats, donc on l’isole. Par contre, chaque courtier a pour vocation de financer des contrats : le subodore que la règle est la suivante : un contrat est financé soit par un souscripteur, soit par un courtier mais pas les deux à la fois, d’où une contrainte d’exclusion (ou plutôt de partitionnement) entre les associations SOUSCRIRE et FINANCER
    C’est aussi bon, mais j’aimerais que vous mettiez un schéma plus explicite ou clair.

    fsmrel
    Si les codes des courtiers (attribut courtierCode) ne sont pas en conflit avec ceux des clients (attribut clientCode), on peut envisager de rendre COURTIER spécialisation de CLIENT, vous me direz.
    Effectivement (attribut courtierCode) et (attribut clientCode) ne sont pas en conflit car ils n’ont pas les mêmes dimensions.

    fsmrel
    Je n’ai mis aucune relation entre SOUSCRIPTEUR et VEHICULE, ni pour COURTIER et VEHICULE. En effet, à moins de cas particuliers à justifier, connaissant un contrat on connaît les véhicules assurés.
    Ok, mais si le véhicule subit une modification ou avenant, que faire ?
    Merci d'avance.

  10. #170
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 002
    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 002
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    Bonsoir Zidane7,


    Citation Envoyé par Zidane7 Voir le message
    Citation Envoyé par fsmrel Voir le message
    D’accord. Mais doit on considérer qu’on est seulement alors dans le cas d’une flotte ? D’un contrat mono s’il n’ y a qu’un employé à assurer pour l’entreprise qui souscrit ?
    Non ce n’est pas seulement dans le cadre d’une flotte, même si c’était un employé que l’entreprise décidait de souscrire pour lui alors l’entreprise est le souscripteur et l’employé reste toujours l’assuré.
    Que l’employé reste toujours l’assuré, bien entendu. Je reformule autrement ma question : le contrat concernant cet assuré peut-il être flotte ? peut-il être mono ?


    Citation Envoyé par Zidane7 Voir le message
    Citation Envoyé par fsmrel Voir le message
    Dans le cas où le souscripteur est un cabinet de courtage, on serait forcément dans le cas d’une flotte. C’est bien ça ?
    Non il y a des particuliers ou contrat mono qui font confiance aux cabinets de courtage. Donc toute entité de personne ou groupe de personne ou société qui passe par un cabinet de courtage, alors le cabinet de courtage est le souscripteur et ceux ou celle qui ont confié leur gestion d’assurance à ce cabinet deviennent des assurés par rapport à l’entreprise d’assurance.
    Même observation de ma part que celle que je viens de faire, mais si je comprends bien, un courtier peut financer aussi bien des contrats de type flotte que des contrats de type mono. C’est bien ça ?


    Citation Envoyé par Zidane7 Voir le message
    j’aimerais que vous éclaircissez par schéma plus claire de liaison entre assuré et client et entre client et souscripteur. Avec leur cardinalité et propriété de chaque entité.
    Dans le cadre de la spécialisation, la cardinalité portée par le lien connectant CLIENT et ASSURE est implicitement 0,1 (à cause de la nature de la relation entre ces entités-types : un client peut être un assuré (même principe pour le lien entre CLIENT et SOUSCRIPTEUR), alors que l’emploi du verbe « avoir » n’aurait aucun sens, sinon allant dans celui de « se faire avoir »...)

    Quant à modéliser la spécialisation d’un point de vue technique (Looping), je déroule le film. Dans le post #168, CLIENT est une entité-type générique (surtype), spécialisée en ASSURE et SOUSCRIPTEUR (sous-types).

    Au passage, je vous renvoie à la page 108 de l’ouvrage de référence de D. Nanci et B. Espinasse Ingénierie des systèmes d'information : Merise deuxième génération (4e édition, 2001) où l’on trouve un exemple qui peut vous aider.

    A la page 108, on a donc le MCD ci-dessous qui a un air de famille avec celui que je vous ai proposé.

    Nom : Figure 7-14 (spécialisation) page 108.png
Affichages : 409
Taille : 25,6 Ko


    Pour arriver à ses fins, concrètement :  

    Avec Looping, commencer par exemple par représenter les 3 entités-types en cause :
    Nom : Zidane7_assurance_auto (21)contrats(specialisation client)a.png
Affichages : 399
Taille : 7,3 Ko

    Dans un 2e temps, cliquer sur le triangle d’héritage dans la barre d’outils, déposer le triangle puis utiliser l’outil « Lien » pour le lier à l’entité-type CLIENT. Au résultat :
    Nom : Zidane7_assurance_auto (21)contrats(specialisation client)b.png
Affichages : 401
Taille : 19,7 Ko


    Dans un 3e temps tirer un lien entre le triangle et les sous-types ASSURE et SOUSCRIPTEUR.  
    Nom : Zidane7_assurance_auto (21)contrats(specialisation client)c.png
Affichages : 403
Taille : 8,8 Ko

    Terminé. Visualiser alors le code SQL généré, c’est le même que celui résultant de :
    Nom : Zidane7_assurance_auto (21)contrats(specialisation client)d.png
Affichages : 400
Taille : 11,4 Ko


    Mais, bien qu’équivalente en résultat, cette dernière version (en mode « identification relative ») paradoxalement plus bavarde est bien moins parlante, et les concepteurs préfèrent de loin utiliser la version « triangle » rendue populaire dès qu’elle fut proposée, c’est-à-dire vers la fin des années quatre-vingts.


    Citation Envoyé par Zidane7 Voir le message
    Citation Envoyé par fsmrel Voir le message
    un contrat est financé soit par un souscripteur, soit par un courtier mais pas les deux à la fois, d’où une contrainte d’exclusion (ou plutôt de partitionnement) entre les associations SOUSCRIRE et FINANCER
    j’aimerais que vous mettez un schéma plus explicite ou claire
    Je ne peux guère faire mieux ! Le symbole XT inscrit dans le cercle lié à SOUSCRIRE et FINANCER marque le partitionnement (exclusion (ou exclusivité) + totalité). Avec Looping on utilise pour cela l’outil « Contrainte ». Je vous renvoie aussi à la page 122 de l’ouvrage de D. Nanci et B. Espinasse (figure 7.32).


    Citation Envoyé par Zidane7 Voir le message
    Citation Envoyé par fsmrel Voir le message
    Je n’ai mis aucune relation entre SOUSCRIPTEUR et VEHICULE, ni pour COURTIER et VEHICULE. En effet, à moins de cas particuliers à justifier, connaissant un contrat on connaît les véhicules assurés.
    mais si le véhicule subit une modification ou avenant, que faire ?
    Si le contrat est mono, une modification ou un avenant au contrat ne pose pas de problème puisque le véhicule détermine le contrat qui le concerne (chemin VEHICULE → CONTRAT_MONO → CONTRAT), tandis que CONTRAT détermine à son tour une seule personne (souscripteur ou courtier).
    Le cas des véhicules appartenant à une flotte mérite d’être creusé. En effet, comme dans le cas des contrats mono, le véhicule détermine le contrat qui le concerne (chemin VEHICULE → CONTRAT_FLOTTE → CONTRAT), et là encore le contrat détermine à son tour une seule personne (souscripteur ou courtier). Vos associations VEH_COURT et VEH_SOUS sont la matérialisation des chemins que je viens de rappeler et sont donc redondantes, elles n’ont pas de valeur ajoutée, au contraire. Si un véhicule d’une flotte subit une modification ayant un impact sur le contrat auquel il se rattache, il faudra peut-être envisager de lui affecter une sorte d’avenant de niveau VEHICULE. A étudier.
    (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.

  11. #171
    Membre à l'essai
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2019
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Guinée

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Décembre 2019
    Messages : 83
    Points : 23
    Points
    23
    Par défaut Conception d'un MCD pour une assurance automobile
    Bonjour monsieur fsmrel,

    fsmrel
    Si le contrat est mono, une modification ou un avenant au contrat ne pose pas de problème puisque le véhicule détermine le contrat qui le concerne (chemin VEHICULE → CONTRAT_MONO → CONTRAT), tandis que CONTRAT détermine à son tour une seule personne (souscripteur ou courtier).
    Le cas des véhicules appartenant à une flotte mérite d’être creusé. En effet, comme dans le cas des contrats mono, le véhicule détermine le contrat qui le concerne (chemin VEHICULE → CONTRAT_FLOTTE → CONTRAT), et là encore le contrat détermine à son tour une seule personne (souscripteur ou courtier). Vos associations VEH_COURT et VEH_SOUS sont la matérialisation des chemins que je viens de rappeler et sont donc redondantes, elles n’ont pas de valeur ajoutée, au contraire. Si un véhicule d’une flotte subit une modification ayant un impact sur le contrat auquel il se rattache, il faudra peut-être envisager de lui affecter une sorte d’avenant de niveau VEHICULE. A étudier.
    Supposons que le véhicule subit une modification, soit un remplacement par un autre véhicule de la même catégorie par le même assuré. Nous devons faire cette modification par un avenant. Comment faire?
    Ou bien à travers la police et son avenant nous pouvons connaitre l'assuré?
    Ensuite, y a t-il une relation entre les entités Client et le véhicule ou entre les entités Client et Contrat ou l'entité client est elle isolé?
    Merci d'avance.

  12. #172
    Membre à l'essai
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2019
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Guinée

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Décembre 2019
    Messages : 83
    Points : 23
    Points
    23
    Par défaut Conception d'un MCD pour une assurance automobile
    Bonsoir Messieurs,
    Pour la gestion des commissions, voici comment se présente la situation:
    Un apporteur, courtier, Agence, ont des commissions, mais l'agence principale ou bureau direct siège ou un bureau direct non. Si un agent du bureau direct apporte une grande affaire ou une flotte, il peut bénéficier d'une commission et dans ce cas on le crée comme apporteur. Ensuite chaque apporteur, courtier, Agence, peut avoir un taux de commission différent des autres et cela dépend de la négociation faite entre lui et la direction. Aussi chaque taux de commission est en fonction de la catégorie. Les taux de commission sont calculés sur la prime net.
    Voici le MCD et le code sql ci-dessous:
    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
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
    377
    378
    379
    380
    381
    382
    383
    384
    385
    386
    387
    388
    389
    390
    391
    392
    393
    394
    395
    396
    397
    398
    399
    400
    401
    402
    403
    404
    405
    406
    407
    408
    409
    410
    411
    412
    413
    414
    415
    416
    417
    418
    419
    420
    421
    422
    423
    424
    425
    426
    427
    428
    429
    430
    431
    432
    433
    434
    435
    436
    437
    438
    439
    440
    441
    442
    443
    444
    445
    446
    447
    448
    449
    450
    451
    452
    453
    454
    455
    456
    457
    458
    459
    460
    461
    462
    463
    464
    465
    466
    467
    468
    469
    470
    471
    472
    473
    474
    475
    476
    477
    478
    479
    480
    481
    482
    483
    484
    485
    486
    487
    488
    489
    490
    491
    492
    493
    494
    495
    496
    497
    498
    499
    500
    501
    502
    503
    504
    505
    506
    507
    508
    509
    510
    511
    512
    513
    514
    515
    516
    517
    518
    519
    520
    521
    522
    523
    524
    525
    526
    527
    528
    529
    530
    531
    532
    533
    534
    535
    536
    537
    538
    539
    540
    541
    542
    543
    544
    545
    546
    547
    548
    549
    550
    551
    552
    553
    554
    555
    556
    557
    558
    559
    560
    561
    562
    563
    564
    565
    566
    567
    568
    569
    570
    571
    572
    573
    574
    575
    576
    577
    578
    579
    580
    581
    582
    583
    584
    585
    586
    587
    588
    589
    590
    591
    592
    593
    594
    595
    596
    597
    598
    599
    600
    601
    602
    603
    604
    605
    606
    607
    608
    609
    610
    611
    612
    613
    614
    615
    616
    CREATE TABLE APPORTEUR(
       apporteurId INT IDENTITY,
       codeapporteur VARCHAR(5) NOT NULL,
       nomApporteur VARCHAR(50) NOT NULL,
       prenomApporteur VARCHAR(50) NOT NULL,
       PRIMARY KEY(apporteurId),
       UNIQUE(codeapporteur)
    );
    
    CREATE TABLE GARANTIE(
       garantieId INT IDENTITY,
       codegarantie CHAR(1) NOT NULL,
       Libelle_Garantie VARCHAR(50) NOT NULL,
       PRIMARY KEY(garantieId),
       UNIQUE(codegarantie)
    );
    
    CREATE TABLE PUISSANCE(
       puissanceId INT IDENTITY,
       codepuissance VARCHAR(3) NOT NULL,
       borneInf INT NOT NULL,
       borneSup INT NOT NULL,
       unite INT NOT NULL,
       PRIMARY KEY(puissanceId),
       UNIQUE(codepuissance)
    );
    
    CREATE TABLE AGENCE(
       agenceId INT IDENTITY,
       codeagence VARCHAR(4) NOT NULL,
       nomAgence VARCHAR(50) NOT NULL,
       dateCreation DATE NOT NULL,
       PRIMARY KEY(agenceId),
       UNIQUE(codeagence)
    );
    
    CREATE TABLE AVENANT_LIBELLE(
       avenantlibelleId INT IDENTITY,
       avenantlibellecode CHAR(3) NOT NULL,
       avenantlibellevaleur VARCHAR(50),
       PRIMARY KEY(avenantlibelleId),
       UNIQUE(avenantlibellecode)
    );
    
    CREATE TABLE MODEPAIEMENT(
       modepaiemenId INT IDENTITY,
       modepaiementcode VARCHAR(15) NOT NULL,
       modepaiement_libelle VARCHAR(50),
       PRIMARY KEY(modepaiemenId),
       UNIQUE(modepaiementcode)
    );
    
    CREATE TABLE CEDEAO(
       cedeaoId INT,
       codecedeao INT NOT NULL,
       cedeaodepuis DATE,
       cedeaovehicule INT NOT NULL,
       cedeaofin DATE,
       PRIMARY KEY(cedeaoId),
       UNIQUE(codecedeao)
    );
    
    CREATE TABLE TAUX_DEFENSE_RECOUR(
       tauxDrId INT IDENTITY,
       tauxDrdebut DATE NOT NULL,
       tauxDrfin DATE NOT NULL,
       tauxvaleure DECIMAL(2,2) NOT NULL,
       PRIMARY KEY(tauxDrId)
    );
    
    CREATE TABLE MARQUE(
       marqueId INT IDENTITY,
       libellemarque VARCHAR(50),
       PRIMARY KEY(marqueId)
    );
    
    CREATE TABLE TAUXFGA(
       tauxfgaId INT IDENTITY,
       tauxfgadebut DATE,
       tauxfgafin DATE,
       tauxfgavaleur DECIMAL(2,2),
       PRIMARY KEY(tauxfgaId)
    );
    
    CREATE TABLE TAUXTAXE(
       tauxtaxeId INT IDENTITY,
       tauxtaxedebut DATE,
       tauxtaxefin DATE,
       tauxtaxevaleur DECIMAL(2,2),
       PRIMARY KEY(tauxtaxeId)
    );
    
    CREATE TABLE TAUXPROTDRIVER(
       tauxprotdriverId INT IDENTITY,
       tauxprotdriverdebut DATE,
       tauxprotdriverfin DATE,
       tauxprotdrivervaleur DECIMAL(2,2),
       PRIMARY KEY(tauxprotdriverId)
    );
    
    CREATE TABLE ANPRORATA(
       prorataId INT IDENTITY,
       proratadatemini CHAR(3),
       proratadatemaxi CHAR(3),
       PRIMARY KEY(prorataId)
    );
    
    CREATE TABLE COUTPOLICE(
       coupoliceId VARCHAR(2),
       coutpolice INT NOT NULL,
       libellecoupolice VARCHAR(50),
       PRIMARY KEY(coupoliceId)
    );
    
    CREATE TABLE BRANCHE(
       brancheId INT IDENTITY,
       branchecode CHAR(3) NOT NULL,
       libelle_branche VARCHAR(50),
       PRIMARY KEY(brancheId),
       UNIQUE(branchecode)
    );
    
    CREATE TABLE OPTIONSECURITE(
       optionsecuriteId VARCHAR(50),
       codeoptionsecurite VARCHAR(1) NOT NULL,
       optionmontant INT,
       garantieId INT NOT NULL,
       PRIMARY KEY(optionsecuriteId),
       UNIQUE(codeoptionsecurite),
       FOREIGN KEY(garantieId) REFERENCES GARANTIE(garantieId)
    );
    
    CREATE TABLE OPTIONVALEUR(
       optionvaleurId VARCHAR(50),
       optionvaleurlibelle VARCHAR(30),
       optionvaleurmontant INT NOT NULL,
       optionsecuriteId VARCHAR(50) NOT NULL,
       PRIMARY KEY(optionvaleurId),
       FOREIGN KEY(optionsecuriteId) REFERENCES OPTIONSECURITE(optionsecuriteId)
    );
    
    CREATE TABLE FLOTTE_TYPE(
       flotte_typeId INT IDENTITY,
       flotte_typecode CHAR(3) NOT NULL,
       flottetypelibelle VARCHAR(40),
       PRIMARY KEY(flotte_typeId),
       UNIQUE(flotte_typecode)
    );
    
    CREATE TABLE COURTIER(
       courtierId INT IDENTITY,
       codecourtier CHAR(3) NOT NULL,
       libellecourtier VARCHAR(50),
       PRIMARY KEY(courtierId),
       UNIQUE(codecourtier)
    );
    
    CREATE TABLE TAUXDOMMAGE(
       tauxdommageId INT IDENTITY,
       tauxdommagedebu DATE NOT NULL,
       tauxdommagefin DATE,
       tauxdommagevaleur DECIMAL(2,2),
       PRIMARY KEY(tauxdommageId)
    );
    
    CREATE TABLE TAUXINCENDIE(
       tauxincendieId INT IDENTITY,
       tauxincendiedebut DATE NOT NULL,
       tauxincendiefin DATE,
       tauxincendievaleur DECIMAL(2,2),
       PRIMARY KEY(tauxincendieId)
    );
    
    CREATE TABLE TAUXVOL(
       tauxvolId INT IDENTITY,
       tauxvoldebut DATE NOT NULL,
       tauxvolfin DATE NOT NULL,
       tauxvolvaleur DECIMAL(2,2),
       PRIMARY KEY(tauxvolId)
    );
    
    CREATE TABLE TAUXBRISDEGLACE(
       tauxbrisdeglaceId INT IDENTITY,
       tauxbrisdeglacedebut DATE NOT NULL,
       tauxbrisdeglacefin DATE NOT NULL,
       tauxbrisdeglacevaleur DECIMAL(2,2) NOT NULL,
       PRIMARY KEY(tauxbrisdeglaceId)
    );
    
    CREATE TABLE ENERGIE(
       energieId INT IDENTITY,
       libelleenergie VARCHAR(10) NOT NULL,
       PRIMARY KEY(energieId),
       UNIQUE(libelleenergie)
    );
    
    CREATE TABLE TAUX_COMMISSION(
       taux_commissionId DECIMAL(2,2),
       taux_commissiondebut DATE,
       taux_commissionfin DATE,
       taux_commissionvaleur DECIMAL(2,2),
       courtierId INT,
       apporteurId INT,
       agenceId INT,
       PRIMARY KEY(taux_commissionId),
       FOREIGN KEY(courtierId) REFERENCES COURTIER(courtierId),
       FOREIGN KEY(apporteurId) REFERENCES APPORTEUR(apporteurId),
       FOREIGN KEY(agenceId) REFERENCES AGENCE(agenceId)
    );
    
    CREATE TABLE TYPE_AGENCE(
       type_agenceId VARCHAR(50),
       codetype_agence CHAR(2) NOT NULL,
       typelibelle VARCHAR(50),
       PRIMARY KEY(type_agenceId),
       UNIQUE(codetype_agence)
    );
    
    CREATE TABLE UTILISATEUR(
       utilisateurId VARCHAR(50),
       codeutilisateur CHAR(4) NOT NULL,
       nomutilisateur VARCHAR(50),
       PRIMARY KEY(utilisateurId),
       UNIQUE(codeutilisateur)
    );
    
    CREATE TABLE CONNEXION(
       utilisateurId VARCHAR(50),
       connexionId VARCHAR(50),
       codeconnexion CHAR(4) NOT NULL,
       login VARCHAR(25),
       connexionpassworde VARCHAR(30),
       connexiontemp DATETIME2,
       PRIMARY KEY(utilisateurId, connexionId),
       UNIQUE(codeconnexion),
       FOREIGN KEY(utilisateurId) REFERENCES UTILISATEUR(utilisateurId)
    );
    
    CREATE TABLE CONDUCTEUR(
       conducteurId INT IDENTITY,
       codeconducteur CHAR(4) NOT NULL,
       conducteurabituel VARCHAR(50),
       adresseconducteur VARCHAR(50),
       PRIMARY KEY(conducteurId),
       UNIQUE(codeconducteur)
    );
    
    CREATE TABLE CLIENT(
       clienId INT IDENTITY,
       clientcode CHAR(5) NOT NULL,
       clientnom VARCHAR(50),
       clientprenom VARCHAR(50),
       clientadresse VARCHAR(50),
       PRIMARY KEY(clienId),
       UNIQUE(clientcode)
    );
    
    CREATE TABLE CATEGORIE(
       categorieId INT IDENTITY,
       codecategorie CHAR(3) NOT NULL,
       categorie VARCHAR(50) NOT NULL,
       taux_commissionId DECIMAL(2,2),
       brancheId INT NOT NULL,
       PRIMARY KEY(categorieId),
       UNIQUE(codecategorie),
       FOREIGN KEY(taux_commissionId) REFERENCES TAUX_COMMISSION(taux_commissionId),
       FOREIGN KEY(brancheId) REFERENCES BRANCHE(brancheId)
    );
    
    CREATE TABLE ASSURE(
       clienId INT,
       PRIMARY KEY(clienId),
       FOREIGN KEY(clienId) REFERENCES CLIENT(clienId)
    );
    
    CREATE TABLE PRODUCTEUR(
       agenceId INT,
       producteurId INT IDENTITY,
       codeproducteur VARCHAR(5) NOT NULL,
       Nomproducteur VARCHAR(50) NOT NULL,
       Prenomprodcteur VARCHAR(50) NOT NULL,
       PRIMARY KEY(agenceId, producteurId),
       UNIQUE(codeproducteur),
       FOREIGN KEY(agenceId) REFERENCES AGENCE(agenceId)
    );
    
    CREATE TABLE CAISSIERE(
       caissiereId INT IDENTITY,
       codecaissiere VARCHAR(4) NOT NULL,
       prenomcaissiere VARCHAR(40) NOT NULL,
       nomcaissiere VARCHAR(40) NOT NULL,
       agenceId INT,
       producteurId INT,
       PRIMARY KEY(caissiereId),
       UNIQUE(codecaissiere),
       FOREIGN KEY(agenceId, producteurId) REFERENCES PRODUCTEUR(agenceId, producteurId)
    );
    
    CREATE TABLE CATCOMPLEMENT(
       categorieId INT,
       catcomplementId INT,
       catcomplementcode CHAR(3) NOT NULL,
       catcomplementlibelle VARCHAR(100) NOT NULL,
       cedeaoId INT NOT NULL,
       PRIMARY KEY(categorieId, catcomplementId),
       FOREIGN KEY(categorieId) REFERENCES CATEGORIE(categorieId),
       FOREIGN KEY(cedeaoId) REFERENCES CEDEAO(cedeaoId)
    );
    
    CREATE TABLE SOUSCRIPTEUR(
       clienId INT,
       PRIMARY KEY(clienId),
       FOREIGN KEY(clienId) REFERENCES CLIENT(clienId)
    );
    
    CREATE TABLE FLOTTE_TYPE_CAT(
       flotte_typeId INT,
       categorieId INT,
       PRIMARY KEY(flotte_typeId, categorieId),
       FOREIGN KEY(flotte_typeId) REFERENCES FLOTTE_TYPE(flotte_typeId),
       FOREIGN KEY(categorieId) REFERENCES CATEGORIE(categorieId)
    );
    
    CREATE TABLE CONTRAT(
       agenceId INT,
       contratId INT IDENTITY,
       codecontrat CHAR(14) NOT NULL,
       dateemissioncontrat DATE NOT NULL,
       dateEffetContrat DATE NOT NULL,
       dateExpirationContrat DATE NOT NULL,
       reduction DECIMAL(2,2),
       contrat_emission_bornes DATE,
       courtierId INT,
       clienId INT NOT NULL,
       coupoliceId VARCHAR(2) NOT NULL,
       clienId_1 INT NOT NULL,
       apporteurId INT,
       agenceId_1 INT NOT NULL,
       producteurId INT NOT NULL,
       PRIMARY KEY(agenceId, contratId),
       UNIQUE(codecontrat),
       FOREIGN KEY(agenceId) REFERENCES AGENCE(agenceId),
       FOREIGN KEY(courtierId) REFERENCES COURTIER(courtierId),
       FOREIGN KEY(clienId) REFERENCES SOUSCRIPTEUR(clienId),
       FOREIGN KEY(coupoliceId) REFERENCES COUTPOLICE(coupoliceId),
       FOREIGN KEY(clienId_1) REFERENCES ASSURE(clienId),
       FOREIGN KEY(apporteurId) REFERENCES APPORTEUR(apporteurId),
       FOREIGN KEY(agenceId_1, producteurId) REFERENCES PRODUCTEUR(agenceId, producteurId)
    );
    
    CREATE TABLE AVENANT(
       agenceId INT,
       contratId INT,
       avenantId INT IDENTITY,
       codeavenant VARCHAR(10) NOT NULL,
       libelleAvenant VARCHAR(50) NOT NULL,
       dateemissionavenant DATE,
       dateEffetAvenant DATE NOT NULL,
       dateExpirationAvenant DATE NOT NULL,
       bonus DECIMAL(2,2),
       malus DECIMAL(2,2),
       avenantlibelleId INT NOT NULL,
       PRIMARY KEY(agenceId, contratId, avenantId),
       UNIQUE(codeavenant),
       FOREIGN KEY(agenceId, contratId) REFERENCES CONTRAT(agenceId, contratId),
       FOREIGN KEY(avenantlibelleId) REFERENCES AVENANT_LIBELLE(avenantlibelleId)
    );
    
    CREATE TABLE TARIF(
       categorieId INT,
       catcomplementId INT,
       puissanceId INT,
       datetarifdepuis DATE NOT NULL,
       responsabilitecivile INT NOT NULL,
       PRIMARY KEY(categorieId, catcomplementId, puissanceId),
       FOREIGN KEY(categorieId, catcomplementId) REFERENCES CATCOMPLEMENT(categorieId, catcomplementId),
       FOREIGN KEY(puissanceId) REFERENCES PUISSANCE(puissanceId)
    );
    
    CREATE TABLE TARIFHISTO(
       categorieId INT,
       catcomplementId INT,
       puissanceId INT,
       tarifhistoId INT,
       tarifhistodurantdebut DATE NOT NULL,
       tarifhistodurantfin DATE NOT NULL,
       responsabilitecivilehisto INT NOT NULL,
       PRIMARY KEY(categorieId, catcomplementId, puissanceId, tarifhistoId),
       FOREIGN KEY(categorieId, catcomplementId, puissanceId) REFERENCES TARIF(categorieId, catcomplementId, puissanceId)
    );
    
    CREATE TABLE ENCAISSEMENT_C(
       agenceId INT,
       contratId INT,
       encaisseCtrId INT IDENTITY,
       encaisseCtrMontant INT,
       encaisseCtrDate DATE,
       modepaiemenId INT NOT NULL,
       caissiereId INT NOT NULL,
       PRIMARY KEY(agenceId, contratId, encaisseCtrId),
       FOREIGN KEY(agenceId, contratId) REFERENCES CONTRAT(agenceId, contratId),
       FOREIGN KEY(modepaiemenId) REFERENCES MODEPAIEMENT(modepaiemenId),
       FOREIGN KEY(caissiereId) REFERENCES CAISSIERE(caissiereId)
    );
    
    CREATE TABLE CONTRAT_FLOTTE(
       agenceId INT,
       contratId INT,
       contratflotteId INT IDENTITY,
       flotte_typeId INT NOT NULL,
       PRIMARY KEY(agenceId, contratId, contratflotteId),
       UNIQUE(agenceId, contratId),
       FOREIGN KEY(agenceId, contratId) REFERENCES CONTRAT(agenceId, contratId),
       FOREIGN KEY(flotte_typeId) REFERENCES FLOTTE_TYPE(flotte_typeId)
    );
    
    CREATE TABLE VEHICULE(
       vehiculeId INT IDENTITY,
       codevehicule CHAR(5) NOT NULL,
       immatriculation VARCHAR(10) NOT NULL,
       type VARCHAR(50) NOT NULL,
       serie VARCHAR(40) NOT NULL,
       vehiculepuissance INT NOT NULL,
       nombreDePlaceCarteGrise INT NOT NULL,
       nombreDePlaceCabine BIGINT NOT NULL,
       nombrePlacehorscabine INT,
       valeurneuve INT,
       valeurvenale INT,
       conducteurId INT NOT NULL,
       energieId INT NOT NULL,
       agenceId INT,
       contratId INT,
       contratflotteId INT,
       marqueId INT NOT NULL,
       puissanceId INT NOT NULL,
       categorieId INT NOT NULL,
       catcomplementId INT NOT NULL,
       PRIMARY KEY(vehiculeId),
       UNIQUE(codevehicule),
       FOREIGN KEY(conducteurId) REFERENCES CONDUCTEUR(conducteurId),
       FOREIGN KEY(energieId) REFERENCES ENERGIE(energieId),
       FOREIGN KEY(agenceId, contratId, contratflotteId) REFERENCES CONTRAT_FLOTTE(agenceId, contratId, contratflotteId),
       FOREIGN KEY(marqueId) REFERENCES MARQUE(marqueId),
       FOREIGN KEY(puissanceId) REFERENCES PUISSANCE(puissanceId),
       FOREIGN KEY(categorieId, catcomplementId) REFERENCES CATCOMPLEMENT(categorieId, catcomplementId)
    );
    
    CREATE TABLE CONTRAT_MONO(
       agenceId INT,
       contratId INT,
       vehiculeId INT NOT NULL,
       PRIMARY KEY(agenceId, contratId),
       UNIQUE(vehiculeId),
       FOREIGN KEY(agenceId, contratId) REFERENCES CONTRAT(agenceId, contratId),
       FOREIGN KEY(vehiculeId) REFERENCES VEHICULE(vehiculeId)
    );
    
    CREATE TABLE VEHIC_GARANT(
       vehiculeId INT,
       garantieId INT,
       PRIMARY KEY(vehiculeId, garantieId),
       FOREIGN KEY(vehiculeId) REFERENCES VEHICULE(vehiculeId),
       FOREIGN KEY(garantieId) REFERENCES GARANTIE(garantieId)
    );
    
    CREATE TABLE AGENCE_TYPE_AGENCE(
       agenceId INT,
       type_agenceId VARCHAR(50),
       PRIMARY KEY(agenceId, type_agenceId),
       FOREIGN KEY(agenceId) REFERENCES AGENCE(agenceId),
       FOREIGN KEY(type_agenceId) REFERENCES TYPE_AGENCE(type_agenceId)
    );
    
    GO
    CREATE FUNCTION CONTRAT_SEQUENCE_FN(@agenceCode as CHAR(3)
                                      , @categorieCode as CHAR(3)
                                      , @anneeEmission as CHAR(2)) 
        RETURNS CHAR(14)  
    AS   
    BEGIN
      
    DECLARE @n INT = 0 ;
    DECLARE @agenceId INT ; 
    DECLARE @categorieId INT ;
    DECLARE @@contratCodeLen INT = 14 ;
    DECLARE @contratCodeNouveau CHAR(14) ;
    DECLARE @contratCodeNew CHAR(14) ;
    DECLARE @contratCodePrecedent CHAR(14) ;
    DECLARE @SequenceDebutAnnee CHAR(6) = '000001' ;
    DECLARE @SequenceContrat CHAR(6) ;
    DECLARE @SequenceContratNum INT ;
    DECLARE @SequenceContratPrecedent CHAR(6) ;
    DECLARE @SequenceContratPrecedentNum INT ;
    DECLARE @seqLen as INT = 6
    DECLARE @anneeContratOffset INT = 7
    DECLARE @anneeMax  INT ;
    DECLARE @anneeContratPrecedent CHAR(2) ;
    DECLARE @zero CHAR(6) = '000000' ;
    DECLARE @anneeErreur CHAR(6) = '??????' ;
    
    SET @agenceId = (SELECT agenceId FROM AGENCE WHERE agenceCode = @agenceCode)
    SET @categorieId = (SELECT categorieId FROM CATEGORIE WHERE categorieCode = @categorieCode)       
    SET @contratCodeNouveau = CONCAT(@agenceCode, @categorieCode, @anneeEmission, @anneeErreur)
    
    ----------------------------------------------------
    -- On regarde si la table CONTRAT contient au moins 
    -- un contrat pour l’agence et l'année concernées.
    ----------------------------------------------------
    
    SET @anneeMax = (SELECT MAX(SUBSTRING(contratCode, @anneeContratOffset, 2))
                     FROM   CONTRAT 
                     WHERE  agenceId = @agenceId) ;
    
    SET @n = (SELECT COUNT(*) 
              FROM   CONTRAT 
              WHERE  agenceId = @agenceId
                AND  SUBSTRING(contratCode, @anneeContratOffset, 2) = @anneeEmission) ;
    
    -----------------------------------------------------
    -- Si la table CONTRAT contient au moins un contrat
    -- pour l'agence et l'année concernées, on récupère 
    -- dans le dernier contrat créé correspondant :
    --   son numéro de série, 
    --   son code contrat, 
    --   sa date d'émission.
    -----------------------------------------------------
    
    IF @n > 0 
        BEGIN
            SET @SequenceContratPrecedent = 
                  (SELECT MAX(RIGHT(contratCode,@seqLen))
                   FROM   CONTRAT 
                   WHERE  agenceId = @agenceId 
                     AND  SUBSTRING(contratCode, @anneeContratOffset, 2) = @anneeEmission)
    
            SET @contratCodePrecedent = 
                  (SELECT contratCode
                   FROM   CONTRAT 
                   WHERE  agenceId = @agenceId 
                     AND  SUBSTRING(contratCode, @anneeContratOffset, 2) = @anneeEmission
                     AND RIGHT(contratCode,@seqLen) = @SequenceContratPrecedent) ;
    
            SET @anneeContratPrecedent = SUBSTRING(@contratCodePrecedent, @anneeContratOffset, 2) ;
       END
    
    ELSE
    
    --------------------------------------------------------------
    -- Si la table CONTRAT ne contient aucun contrat pour
    -- l’agence et l'année concernées, alors on force le numéro  
    -- de police à '000001' pour le contrat à créer.
    --------------------------------------------------------------
    
        BEGIN
               SET @contratCodeNouveau = 
                   CONCAT(@agenceCode
                 , @categorieCode
                 , @anneeEmission
                 , @SequenceDebutAnnee)
        END
    
    -----------------------------------------------------
    -- Si pour l’agence concernée, le dernier contrat 
    -- créé Cn est de la même année que celui qui est à
    -- créer, on incrémente d'une unité le numéro de 
    -- police récupéré dans le contrat Cn 
    -- (variable @SequenceContrat). 
    -----------------------------------------------------
    
    IF  @n > 0 AND @anneeEmission = @anneeContratPrecedent 
        BEGIN
            SET @SequenceContratPrecedent = RIGHT(@contratCodePrecedent, @seqLen) ;
            SET @SequenceContratPrecedentNum = CAST(@SequenceContratPrecedent as INT) ;
    
            SET @SequenceContratNum = 1 + @SequenceContratPrecedentNum
            SET @SequenceContrat = CAST(@SequenceContratNum as CHAR(6))
            SET @contratCodeNouveau = 
                   CONCAT
                  (
                   @agenceCode
                 , @categorieCode
                 , @anneeEmission
                 , LEFT(@zero, LEN(@zero) - LEN(@SequenceContrat))
                 , @SequenceContrat
                  )
        END 
    
    --------------------------------------
    -- On sort, en fournissant le nouveau
    -- code contrat.
    --------------------------------------
    
    RETURN @contratCodeNouveau 
     
    END 
    
    GO
    
    GO
    CREATE VEHICULE_MONO_FLOTTE_EXCLUSION_FIN()
    RETURN INT
    AS 
    BEGIN
    DECLARE @n INT
    SELECT@n=COUNT(*) FROM VEH_FLOTTE as x
     JOIN CONTRA_MONO as y ON x.vehiculeId=y.vehiculeId
    RETURN @n
    END;
    GO
    ALTER TABLE CONTRAT_MONO 
    ADD CONSTRAINT CONTRAT_MONO_EXCLUSION_CHECK
    CHECK (dbo.VEHICULE_MONO_FLOTTE_EXCLUSION_FIN()=0)
    
    ALTER TABLE VEH_FLOTTE
    ADD CONSTRAINT FLOTTE_TYPE_MONO_EXCLUSION_CHECK
    CHECK(dbo.VEHICULE_MONO_FLOTTE_EXCLUSION_FIN()=0);
    Quelles sont vos remarques et suggestions?
    Merci d'avance.

    Images attachées Images attachées  

  13. #173
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 002
    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 002
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    Bonsoir Zidane7,


    Je réponds pour le moment à votre message du 17/03.


    Citation Envoyé par Zidane7 Voir le message
    y a t-il une relation entre les entités Client et le véhicule ou entre les entités Client et Contrat ou l'entité client est elle isolé?
    Il n’y a pas à connecter directement les entités-types CLIENT et VEHICULE.

    Si le client est l’assuré, pour retrouver ses véhicules :

    (a) cas des contrats "mono", on passe par le chemin

    [CLIENT] > [ASSURE] > (EST_ASSURE) > [CONTRAT] >(CCM) > [CONTRAT_MONO] > (VEH_MONO) > [VEHICULE] ;

    (b) cas des contrats "flotte", on passe par le chemin

    [CLIENT] > [ASSURE] > (EST_ASSURE) > [CONTRAT] >(CCF) > [CONTRAT_FLOTTE] > (VEH_FLOTTE) > [VEHICULE].

    Pour aller d’un véhicule au client assuré, on emprunte le chemin dans l’autre sens.

    Si le client est le souscripteur, pour retrouver ses véhicules, on passe par le chemin :

    [CLIENT] > [SOUSCRIPTEUR] > (SOUS_CONTRAT) > [CONTRAT]

    Puis on passe par le chemin défini pour l’assuré, c’est-à-dire en fonction du caractère "mono" ou "flotte" du contrat.

    Pour aller d’un véhicule au client souscripteur, on emprunte le chemin dans l’autre sens.


    Citation Envoyé par Zidane7 Voir le message
    Supposons que le véhicule subit une modification, soit un remplacement par un autre véhicule de la même catégorie par le même assuré. Nous devons faire cette modification par un avenant. Comment faire?
    Si le véhicule v fait l’objet d’une modification, je pense à un scénario selon lequel on lui attacherait un avenant spécifique (entité-type AVENANT_VEHICULE). Dans la mesure où ce véhicule peut subir des modifications successives dans le temps, cet avenant vaut pour une période (date début, date de fin, laquelle est le 31/12/9999 pour le dernier avenant attaché au véhicule).

    Si le véhicule v1 est remplacé par le véhicule v2, scénario du même genre que le précédent, v1 fait l’objet d’un avenant avec date début, date de fin au 31/12/9999.


    Dans tous les cas, prévoir une entité-type du genre TYPE_AVENANT_VEHICULE, afin de savoir si un avenant portant sur un véhicule est de type "modification", "remplacement" ou autre motif.

    Nom : Zidane7_contrats_avenants_vehicules.png
Affichages : 384
Taille : 12,6 Ko
    (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.

  14. #174
    Membre à l'essai
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2019
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Guinée

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Décembre 2019
    Messages : 83
    Points : 23
    Points
    23
    Par défaut Conception d'un MCD pour une assurance automobile
    Bonjour Monsieur fsmrel,
    Vous avez raison, mais par rapport au nom de l'avenant et les liens entre Véhicule-Avenent et Contrat-Avenant et les code sql, voici comment j'ai fait:
    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
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
    377
    378
    379
    380
    381
    382
    383
    384
    385
    386
    387
    388
    389
    390
    391
    392
    393
    394
    395
    396
    397
    398
    399
    400
    401
    402
    403
    404
    405
    406
    407
    408
    409
    410
    411
    412
    413
    414
    415
    416
    417
    418
    419
    420
    421
    422
    423
    424
    425
    426
    427
    428
    429
    430
    431
    432
    433
    434
    435
    436
    437
    438
    439
    440
    441
    442
    443
    444
    445
    446
    447
    448
    449
    450
    451
    452
    453
    454
    455
    456
    457
    458
    459
    460
    461
    462
    463
    464
    465
    466
    467
    468
    469
    470
    471
    472
    473
    474
    475
    476
    477
    478
    479
    480
    481
    482
    483
    484
    485
    486
    487
    488
    489
    490
    491
    492
    493
    494
    495
    496
    497
    498
    499
    500
    501
    502
    503
    504
    505
    506
    507
    508
    509
    510
    511
    512
    513
    514
    515
    516
    517
    518
    519
    520
    521
    522
    523
    524
    525
    526
    527
    528
    529
    530
    531
    532
    533
    534
    535
    536
    537
    538
    539
    540
    541
    542
    543
    544
    545
    546
    547
    548
    549
    550
    551
    552
    553
    554
    555
    556
    557
    558
    559
    560
    561
    562
    563
    564
    565
    566
    567
    568
    569
    570
    571
    572
    573
    574
    575
    576
    577
    578
    579
    580
    581
    582
    583
    584
    585
    586
    587
    588
    589
    590
    591
    592
    593
    594
    595
    596
    597
    598
    599
    600
    601
    602
    603
    604
    605
    606
    607
    608
    609
    610
    611
    612
    613
    614
    615
    616
    617
    618
    CREATE TABLE APPORTEUR(
       apporteurId INT IDENTITY,
       codeapporteur VARCHAR(5) NOT NULL,
       nomApporteur VARCHAR(50) NOT NULL,
       prenomApporteur VARCHAR(50) NOT NULL,
       PRIMARY KEY(apporteurId),
       UNIQUE(codeapporteur)
    );
    
    CREATE TABLE GARANTIE(
       garantieId INT IDENTITY,
       codegarantie CHAR(1) NOT NULL,
       Libelle_Garantie VARCHAR(50) NOT NULL,
       PRIMARY KEY(garantieId),
       UNIQUE(codegarantie)
    );
    
    CREATE TABLE PUISSANCE(
       puissanceId INT IDENTITY,
       codepuissance VARCHAR(3) NOT NULL,
       borneInf INT NOT NULL,
       borneSup INT NOT NULL,
       unite INT NOT NULL,
       PRIMARY KEY(puissanceId),
       UNIQUE(codepuissance)
    );
    
    CREATE TABLE AGENCE(
       agenceId INT IDENTITY,
       codeagence VARCHAR(4) NOT NULL,
       nomAgence VARCHAR(50) NOT NULL,
       dateCreation DATE NOT NULL,
       PRIMARY KEY(agenceId),
       UNIQUE(codeagence)
    );
    
    CREATE TABLE AVENANT_LIBELLE(
       avenantlibelleId INT IDENTITY,
       avenantlibellecode CHAR(3) NOT NULL,
       avenantlibellevaleur VARCHAR(50),
       PRIMARY KEY(avenantlibelleId),
       UNIQUE(avenantlibellecode)
    );
    
    CREATE TABLE MODEPAIEMENT(
       modepaiemenId INT IDENTITY,
       modepaiementcode VARCHAR(15) NOT NULL,
       modepaiement_libelle VARCHAR(50),
       PRIMARY KEY(modepaiemenId),
       UNIQUE(modepaiementcode)
    );
    
    CREATE TABLE CEDEAO(
       cedeaoId INT,
       codecedeao INT NOT NULL,
       cedeaodepuis DATE,
       cedeaovehicule INT NOT NULL,
       cedeaofin DATE,
       PRIMARY KEY(cedeaoId),
       UNIQUE(codecedeao)
    );
    
    CREATE TABLE TAUX_DEFENSE_RECOUR(
       tauxDrId INT IDENTITY,
       tauxDrdebut DATE NOT NULL,
       tauxDrfin DATE NOT NULL,
       tauxvaleure DECIMAL(2,2) NOT NULL,
       PRIMARY KEY(tauxDrId)
    );
    
    CREATE TABLE MARQUE(
       marqueId INT IDENTITY,
       libellemarque VARCHAR(50),
       PRIMARY KEY(marqueId)
    );
    
    CREATE TABLE TAUXFGA(
       tauxfgaId INT IDENTITY,
       tauxfgadebut DATE,
       tauxfgafin DATE,
       tauxfgavaleur DECIMAL(2,2),
       PRIMARY KEY(tauxfgaId)
    );
    
    CREATE TABLE TAUXTAXE(
       tauxtaxeId INT IDENTITY,
       tauxtaxedebut DATE,
       tauxtaxefin DATE,
       tauxtaxevaleur DECIMAL(2,2),
       PRIMARY KEY(tauxtaxeId)
    );
    
    CREATE TABLE TAUXPROTDRIVER(
       tauxprotdriverId INT IDENTITY,
       tauxprotdriverdebut DATE,
       tauxprotdriverfin DATE,
       tauxprotdrivervaleur DECIMAL(2,2),
       PRIMARY KEY(tauxprotdriverId)
    );
    
    CREATE TABLE ANPRORATA(
       prorataId INT IDENTITY,
       proratadatemini CHAR(3),
       proratadatemaxi CHAR(3),
       PRIMARY KEY(prorataId)
    );
    
    CREATE TABLE COUTPOLICE(
       coupoliceId VARCHAR(2),
       coutpolice INT NOT NULL,
       libellecoupolice VARCHAR(50),
       PRIMARY KEY(coupoliceId)
    );
    
    CREATE TABLE BRANCHE(
       brancheId INT IDENTITY,
       branchecode CHAR(3) NOT NULL,
       libelle_branche VARCHAR(50),
       PRIMARY KEY(brancheId),
       UNIQUE(branchecode)
    );
    
    CREATE TABLE OPTIONSECURITE(
       optionsecuriteId VARCHAR(50),
       codeoptionsecurite VARCHAR(1) NOT NULL,
       optionmontant INT,
       garantieId INT NOT NULL,
       PRIMARY KEY(optionsecuriteId),
       UNIQUE(codeoptionsecurite),
       FOREIGN KEY(garantieId) REFERENCES GARANTIE(garantieId)
    );
    
    CREATE TABLE OPTIONVALEUR(
       optionvaleurId VARCHAR(50),
       optionvaleurlibelle VARCHAR(30),
       optionvaleurmontant INT NOT NULL,
       optionsecuriteId VARCHAR(50) NOT NULL,
       PRIMARY KEY(optionvaleurId),
       FOREIGN KEY(optionsecuriteId) REFERENCES OPTIONSECURITE(optionsecuriteId)
    );
    
    CREATE TABLE FLOTTE_TYPE(
       flotte_typeId INT IDENTITY,
       flotte_typecode CHAR(3) NOT NULL,
       flottetypelibelle VARCHAR(40),
       PRIMARY KEY(flotte_typeId),
       UNIQUE(flotte_typecode)
    );
    
    CREATE TABLE COURTIER(
       courtierId INT IDENTITY,
       codecourtier CHAR(3) NOT NULL,
       libellecourtier VARCHAR(50),
       PRIMARY KEY(courtierId),
       UNIQUE(codecourtier)
    );
    
    CREATE TABLE TAUXDOMMAGE(
       tauxdommageId INT IDENTITY,
       tauxdommagedebu DATE NOT NULL,
       tauxdommagefin DATE,
       tauxdommagevaleur DECIMAL(2,2),
       PRIMARY KEY(tauxdommageId)
    );
    
    CREATE TABLE TAUXINCENDIE(
       tauxincendieId INT IDENTITY,
       tauxincendiedebut DATE NOT NULL,
       tauxincendiefin DATE,
       tauxincendievaleur DECIMAL(2,2),
       PRIMARY KEY(tauxincendieId)
    );
    
    CREATE TABLE TAUXVOL(
       tauxvolId INT IDENTITY,
       tauxvoldebut DATE NOT NULL,
       tauxvolfin DATE NOT NULL,
       tauxvolvaleur DECIMAL(2,2),
       PRIMARY KEY(tauxvolId)
    );
    
    CREATE TABLE TAUXBRISDEGLACE(
       tauxbrisdeglaceId INT IDENTITY,
       tauxbrisdeglacedebut DATE NOT NULL,
       tauxbrisdeglacefin DATE NOT NULL,
       tauxbrisdeglacevaleur DECIMAL(2,2) NOT NULL,
       PRIMARY KEY(tauxbrisdeglaceId)
    );
    
    CREATE TABLE ENERGIE(
       energieId INT IDENTITY,
       libelleenergie VARCHAR(10) NOT NULL,
       PRIMARY KEY(energieId),
       UNIQUE(libelleenergie)
    );
    
    CREATE TABLE TAUX_COMMISSION(
       taux_commissionId DECIMAL(2,2),
       taux_commissiondebut DATE,
       taux_commissionfin DATE,
       taux_commissionvaleur DECIMAL(2,2),
       courtierId INT,
       apporteurId INT,
       agenceId INT,
       PRIMARY KEY(taux_commissionId),
       FOREIGN KEY(courtierId) REFERENCES COURTIER(courtierId),
       FOREIGN KEY(apporteurId) REFERENCES APPORTEUR(apporteurId),
       FOREIGN KEY(agenceId) REFERENCES AGENCE(agenceId)
    );
    
    CREATE TABLE TYPE_AGENCE(
       type_agenceId VARCHAR(50),
       codetype_agence CHAR(2) NOT NULL,
       typelibelle VARCHAR(50),
       PRIMARY KEY(type_agenceId),
       UNIQUE(codetype_agence)
    );
    
    CREATE TABLE UTILISATEUR(
       utilisateurId VARCHAR(50),
       codeutilisateur CHAR(4) NOT NULL,
       nomutilisateur VARCHAR(50),
       PRIMARY KEY(utilisateurId),
       UNIQUE(codeutilisateur)
    );
    
    CREATE TABLE CONNEXION(
       utilisateurId VARCHAR(50),
       connexionId VARCHAR(50),
       codeconnexion CHAR(4) NOT NULL,
       login VARCHAR(25),
       connexionpassworde VARCHAR(30),
       connexiontemp DATETIME2,
       PRIMARY KEY(utilisateurId, connexionId),
       UNIQUE(codeconnexion),
       FOREIGN KEY(utilisateurId) REFERENCES UTILISATEUR(utilisateurId)
    );
    
    CREATE TABLE CONDUCTEUR(
       conducteurId INT IDENTITY,
       codeconducteur CHAR(4) NOT NULL,
       conducteurabituel VARCHAR(50),
       adresseconducteur VARCHAR(50),
       PRIMARY KEY(conducteurId),
       UNIQUE(codeconducteur)
    );
    
    CREATE TABLE CLIENT(
       clienId INT IDENTITY,
       clientcode CHAR(5) NOT NULL,
       clientnom VARCHAR(50),
       clientprenom VARCHAR(50),
       clientadresse VARCHAR(50),
       PRIMARY KEY(clienId),
       UNIQUE(clientcode)
    );
    
    CREATE TABLE CATEGORIE(
       categorieId INT IDENTITY,
       codecategorie CHAR(3) NOT NULL,
       categorie VARCHAR(50) NOT NULL,
       taux_commissionId DECIMAL(2,2),
       brancheId INT NOT NULL,
       PRIMARY KEY(categorieId),
       UNIQUE(codecategorie),
       FOREIGN KEY(taux_commissionId) REFERENCES TAUX_COMMISSION(taux_commissionId),
       FOREIGN KEY(brancheId) REFERENCES BRANCHE(brancheId)
    );
    
    CREATE TABLE ASSURE(
       clienId INT,
       PRIMARY KEY(clienId),
       FOREIGN KEY(clienId) REFERENCES CLIENT(clienId)
    );
    
    CREATE TABLE PRODUCTEUR(
       agenceId INT,
       producteurId INT IDENTITY,
       codeproducteur VARCHAR(5) NOT NULL,
       Nomproducteur VARCHAR(50) NOT NULL,
       Prenomprodcteur VARCHAR(50) NOT NULL,
       PRIMARY KEY(agenceId, producteurId),
       UNIQUE(codeproducteur),
       FOREIGN KEY(agenceId) REFERENCES AGENCE(agenceId)
    );
    
    CREATE TABLE CAISSIERE(
       caissiereId INT IDENTITY,
       codecaissiere VARCHAR(4) NOT NULL,
       prenomcaissiere VARCHAR(40) NOT NULL,
       nomcaissiere VARCHAR(40) NOT NULL,
       agenceId INT,
       producteurId INT,
       PRIMARY KEY(caissiereId),
       UNIQUE(codecaissiere),
       FOREIGN KEY(agenceId, producteurId) REFERENCES PRODUCTEUR(agenceId, producteurId)
    );
    
    CREATE TABLE CATCOMPLEMENT(
       categorieId INT,
       catcomplementId INT,
       catcomplementcode CHAR(3) NOT NULL,
       catcomplementlibelle VARCHAR(100) NOT NULL,
       cedeaoId INT NOT NULL,
       PRIMARY KEY(categorieId, catcomplementId),
       FOREIGN KEY(categorieId) REFERENCES CATEGORIE(categorieId),
       FOREIGN KEY(cedeaoId) REFERENCES CEDEAO(cedeaoId)
    );
    
    CREATE TABLE SOUSCRIPTEUR(
       clienId INT,
       PRIMARY KEY(clienId),
       FOREIGN KEY(clienId) REFERENCES CLIENT(clienId)
    );
    
    CREATE TABLE FLOTTE_TYPE_CAT(
       flotte_typeId INT,
       categorieId INT,
       PRIMARY KEY(flotte_typeId, categorieId),
       FOREIGN KEY(flotte_typeId) REFERENCES FLOTTE_TYPE(flotte_typeId),
       FOREIGN KEY(categorieId) REFERENCES CATEGORIE(categorieId)
    );
    
    CREATE TABLE CONTRAT(
       agenceId INT,
       contratId INT IDENTITY,
       codecontrat CHAR(14) NOT NULL,
       dateemissioncontrat DATE NOT NULL,
       dateEffetContrat DATE NOT NULL,
       dateExpirationContrat DATE NOT NULL,
       reduction DECIMAL(2,2),
       contrat_emission_bornes DATE,
       courtierId INT,
       clienId INT NOT NULL,
       coupoliceId VARCHAR(2) NOT NULL,
       clienId_1 INT NOT NULL,
       apporteurId INT,
       agenceId_1 INT NOT NULL,
       producteurId INT NOT NULL,
       PRIMARY KEY(agenceId, contratId),
       UNIQUE(codecontrat),
       FOREIGN KEY(agenceId) REFERENCES AGENCE(agenceId),
       FOREIGN KEY(courtierId) REFERENCES COURTIER(courtierId),
       FOREIGN KEY(clienId) REFERENCES SOUSCRIPTEUR(clienId),
       FOREIGN KEY(coupoliceId) REFERENCES COUTPOLICE(coupoliceId),
       FOREIGN KEY(clienId_1) REFERENCES ASSURE(clienId),
       FOREIGN KEY(apporteurId) REFERENCES APPORTEUR(apporteurId),
       FOREIGN KEY(agenceId_1, producteurId) REFERENCES PRODUCTEUR(agenceId, producteurId)
    );
    
    CREATE TABLE TARIF(
       categorieId INT,
       catcomplementId INT,
       puissanceId INT,
       datetarifdepuis DATE NOT NULL,
       responsabilitecivile INT NOT NULL,
       PRIMARY KEY(categorieId, catcomplementId, puissanceId),
       FOREIGN KEY(categorieId, catcomplementId) REFERENCES CATCOMPLEMENT(categorieId, catcomplementId),
       FOREIGN KEY(puissanceId) REFERENCES PUISSANCE(puissanceId)
    );
    
    CREATE TABLE TARIFHISTO(
       categorieId INT,
       catcomplementId INT,
       puissanceId INT,
       tarifhistoId INT,
       tarifhistodurantdebut DATE NOT NULL,
       tarifhistodurantfin DATE NOT NULL,
       responsabilitecivilehisto INT NOT NULL,
       PRIMARY KEY(categorieId, catcomplementId, puissanceId, tarifhistoId),
       FOREIGN KEY(categorieId, catcomplementId, puissanceId) REFERENCES TARIF(categorieId, catcomplementId, puissanceId)
    );
    
    CREATE TABLE ENCAISSEMENT_C(
       agenceId INT,
       contratId INT,
       encaisseCtrId INT IDENTITY,
       encaisseCtrMontant INT,
       encaisseCtrDate DATE,
       modepaiemenId INT NOT NULL,
       caissiereId INT NOT NULL,
       PRIMARY KEY(agenceId, contratId, encaisseCtrId),
       FOREIGN KEY(agenceId, contratId) REFERENCES CONTRAT(agenceId, contratId),
       FOREIGN KEY(modepaiemenId) REFERENCES MODEPAIEMENT(modepaiemenId),
       FOREIGN KEY(caissiereId) REFERENCES CAISSIERE(caissiereId)
    );
    
    CREATE TABLE CONTRAT_FLOTTE(
       agenceId INT,
       contratId INT,
       contratflotteId INT IDENTITY,
       flotte_typeId INT NOT NULL,
       PRIMARY KEY(agenceId, contratId, contratflotteId),
       UNIQUE(agenceId, contratId),
       FOREIGN KEY(agenceId, contratId) REFERENCES CONTRAT(agenceId, contratId),
       FOREIGN KEY(flotte_typeId) REFERENCES FLOTTE_TYPE(flotte_typeId)
    );
    
    CREATE TABLE VEHICULE(
       vehiculeId INT IDENTITY,
       codevehicule CHAR(5) NOT NULL,
       immatriculation VARCHAR(10) NOT NULL,
       type VARCHAR(50) NOT NULL,
       serie VARCHAR(40) NOT NULL,
       vehiculepuissance INT NOT NULL,
       nombreDePlaceCarteGrise INT NOT NULL,
       nombreDePlaceCabine BIGINT NOT NULL,
       nombrePlacehorscabine INT,
       valeurneuve INT,
       valeurvenale INT,
       conducteurId INT NOT NULL,
       energieId INT NOT NULL,
       agenceId INT,
       contratId INT,
       contratflotteId INT,
       marqueId INT NOT NULL,
       puissanceId INT NOT NULL,
       categorieId INT NOT NULL,
       catcomplementId INT NOT NULL,
       PRIMARY KEY(vehiculeId),
       UNIQUE(codevehicule),
       FOREIGN KEY(conducteurId) REFERENCES CONDUCTEUR(conducteurId),
       FOREIGN KEY(energieId) REFERENCES ENERGIE(energieId),
       FOREIGN KEY(agenceId, contratId, contratflotteId) REFERENCES CONTRAT_FLOTTE(agenceId, contratId, contratflotteId),
       FOREIGN KEY(marqueId) REFERENCES MARQUE(marqueId),
       FOREIGN KEY(puissanceId) REFERENCES PUISSANCE(puissanceId),
       FOREIGN KEY(categorieId, catcomplementId) REFERENCES CATCOMPLEMENT(categorieId, catcomplementId)
    );
    
    CREATE TABLE AVENANT(
       vehiculeId INT,
       agenceId INT,
       contratId INT,
       avenantId INT IDENTITY,
       codeavenant VARCHAR(10) NOT NULL,
       libelleAvenant VARCHAR(50) NOT NULL,
       dateemissionavenant DATE,
       dateEffetAvenant DATE NOT NULL,
       dateExpirationAvenant DATE NOT NULL,
       bonus DECIMAL(2,2),
       malus DECIMAL(2,2),
       avenantlibelleId INT NOT NULL,
       PRIMARY KEY(vehiculeId, agenceId, contratId, avenantId),
       UNIQUE(codeavenant),
       FOREIGN KEY(vehiculeId) REFERENCES VEHICULE(vehiculeId),
       FOREIGN KEY(agenceId, contratId) REFERENCES CONTRAT(agenceId, contratId),
       FOREIGN KEY(avenantlibelleId) REFERENCES AVENANT_LIBELLE(avenantlibelleId)
    );
    
    CREATE TABLE CONTRAT_MONO(
       agenceId INT,
       contratId INT,
       vehiculeId INT NOT NULL,
       PRIMARY KEY(agenceId, contratId),
       UNIQUE(vehiculeId),
       FOREIGN KEY(agenceId, contratId) REFERENCES CONTRAT(agenceId, contratId),
       FOREIGN KEY(vehiculeId) REFERENCES VEHICULE(vehiculeId)
    );
    
    CREATE TABLE VEHIC_GARANT(
       vehiculeId INT,
       garantieId INT,
       PRIMARY KEY(vehiculeId, garantieId),
       FOREIGN KEY(vehiculeId) REFERENCES VEHICULE(vehiculeId),
       FOREIGN KEY(garantieId) REFERENCES GARANTIE(garantieId)
    );
    
    CREATE TABLE AGENCE_TYPE_AGENCE(
       agenceId INT,
       type_agenceId VARCHAR(50),
       PRIMARY KEY(agenceId, type_agenceId),
       FOREIGN KEY(agenceId) REFERENCES AGENCE(agenceId),
       FOREIGN KEY(type_agenceId) REFERENCES TYPE_AGENCE(type_agenceId)
    );
    
    GO
    CREATE FUNCTION CONTRAT_SEQUENCE_FN(@agenceCode as CHAR(3)
                                      , @categorieCode as CHAR(3)
                                      , @anneeEmission as CHAR(2)) 
        RETURNS CHAR(14)  
    AS   
    BEGIN
      
    DECLARE @n INT = 0 ;
    DECLARE @agenceId INT ; 
    DECLARE @categorieId INT ;
    DECLARE @@contratCodeLen INT = 14 ;
    DECLARE @contratCodeNouveau CHAR(14) ;
    DECLARE @contratCodeNew CHAR(14) ;
    DECLARE @contratCodePrecedent CHAR(14) ;
    DECLARE @SequenceDebutAnnee CHAR(6) = '000001' ;
    DECLARE @SequenceContrat CHAR(6) ;
    DECLARE @SequenceContratNum INT ;
    DECLARE @SequenceContratPrecedent CHAR(6) ;
    DECLARE @SequenceContratPrecedentNum INT ;
    DECLARE @seqLen as INT = 6
    DECLARE @anneeContratOffset INT = 7
    DECLARE @anneeMax  INT ;
    DECLARE @anneeContratPrecedent CHAR(2) ;
    DECLARE @zero CHAR(6) = '000000' ;
    DECLARE @anneeErreur CHAR(6) = '??????' ;
    
    SET @agenceId = (SELECT agenceId FROM AGENCE WHERE agenceCode = @agenceCode)
    SET @categorieId = (SELECT categorieId FROM CATEGORIE WHERE categorieCode = @categorieCode)       
    SET @contratCodeNouveau = CONCAT(@agenceCode, @categorieCode, @anneeEmission, @anneeErreur)
    
    ----------------------------------------------------
    -- On regarde si la table CONTRAT contient au moins 
    -- un contrat pour l’agence et l'année concernées.
    ----------------------------------------------------
    
    SET @anneeMax = (SELECT MAX(SUBSTRING(contratCode, @anneeContratOffset, 2))
                     FROM   CONTRAT 
                     WHERE  agenceId = @agenceId) ;
    
    SET @n = (SELECT COUNT(*) 
              FROM   CONTRAT 
              WHERE  agenceId = @agenceId
                AND  SUBSTRING(contratCode, @anneeContratOffset, 2) = @anneeEmission) ;
    
    -----------------------------------------------------
    -- Si la table CONTRAT contient au moins un contrat
    -- pour l'agence et l'année concernées, on récupère 
    -- dans le dernier contrat créé correspondant :
    --   son numéro de série, 
    --   son code contrat, 
    --   sa date d'émission.
    -----------------------------------------------------
    
    IF @n > 0 
        BEGIN
            SET @SequenceContratPrecedent = 
                  (SELECT MAX(RIGHT(contratCode,@seqLen))
                   FROM   CONTRAT 
                   WHERE  agenceId = @agenceId 
                     AND  SUBSTRING(contratCode, @anneeContratOffset, 2) = @anneeEmission)
    
            SET @contratCodePrecedent = 
                  (SELECT contratCode
                   FROM   CONTRAT 
                   WHERE  agenceId = @agenceId 
                     AND  SUBSTRING(contratCode, @anneeContratOffset, 2) = @anneeEmission
                     AND RIGHT(contratCode,@seqLen) = @SequenceContratPrecedent) ;
    
            SET @anneeContratPrecedent = SUBSTRING(@contratCodePrecedent, @anneeContratOffset, 2) ;
       END
    
    ELSE
    
    --------------------------------------------------------------
    -- Si la table CONTRAT ne contient aucun contrat pour
    -- l’agence et l'année concernées, alors on force le numéro  
    -- de police à '000001' pour le contrat à créer.
    --------------------------------------------------------------
    
        BEGIN
               SET @contratCodeNouveau = 
                   CONCAT(@agenceCode
                 , @categorieCode
                 , @anneeEmission
                 , @SequenceDebutAnnee)
        END
    
    -----------------------------------------------------
    -- Si pour l’agence concernée, le dernier contrat 
    -- créé Cn est de la même année que celui qui est à
    -- créer, on incrémente d'une unité le numéro de 
    -- police récupéré dans le contrat Cn 
    -- (variable @SequenceContrat). 
    -----------------------------------------------------
    
    IF  @n > 0 AND @anneeEmission = @anneeContratPrecedent 
        BEGIN
            SET @SequenceContratPrecedent = RIGHT(@contratCodePrecedent, @seqLen) ;
            SET @SequenceContratPrecedentNum = CAST(@SequenceContratPrecedent as INT) ;
    
            SET @SequenceContratNum = 1 + @SequenceContratPrecedentNum
            SET @SequenceContrat = CAST(@SequenceContratNum as CHAR(6))
            SET @contratCodeNouveau = 
                   CONCAT
                  (
                   @agenceCode
                 , @categorieCode
                 , @anneeEmission
                 , LEFT(@zero, LEN(@zero) - LEN(@SequenceContrat))
                 , @SequenceContrat
                  )
        END 
    
    --------------------------------------
    -- On sort, en fournissant le nouveau
    -- code contrat.
    --------------------------------------
    
    RETURN @contratCodeNouveau 
     
    END 
    
    GO
    
    GO
    CREATE VEHICULE_MONO_FLOTTE_EXCLUSION_FIN()
    RETURN INT
    AS 
    BEGIN
    DECLARE @n INT
    SELECT@n=COUNT(*) FROM VEH_FLOTTE as x
     JOIN CONTRA_MONO as y ON x.vehiculeId=y.vehiculeId
    RETURN @n
    END;
    GO
    ALTER TABLE CONTRAT_MONO 
    ADD CONSTRAINT CONTRAT_MONO_EXCLUSION_CHECK
    CHECK (dbo.VEHICULE_MONO_FLOTTE_EXCLUSION_FIN()=0)
    
    ALTER TABLE VEH_FLOTTE
    ADD CONSTRAINT FLOTTE_TYPE_MONO_EXCLUSION_CHECK
    CHECK(dbo.VEHICULE_MONO_FLOTTE_EXCLUSION_FIN()=0);
    Que pensez-vous?
    Merci d'avance.
    Images attachées Images attachées  

  15. #175
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 002
    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 002
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    Bonsoir Zidane7,

    Par référence à vos posts #172 et précédents, un avenant fait référence à un et un seul contrat, un avenant est rattaché directement à un contrat.

    Dans votre dernier MCD (post #174), l’entité-type AVENANT devient une association entre CONTRAT et VEHICULE.

    En effet, vous modélisez les choses ainsi :

    [CONTRAT]--0,N--(CONTRAT_AV)--1,1(R)--[AVENANT]--1,1(R)--(VEH_AV)--0,N--[VEHICULE]

    Ce qui doit en fait être lu ainsi :

    [CONTRAT]--0,N--(AVENANT)--0,N--[VEHICULE]

    Autrement dit, un avenant devient une association entre un contrat et un véhicule...

    Mais on a déjà établi les liens entre les contrats et les véhicules, c’est ce que je rappelle par exemple pour les contrats "mono" dans le post #156 :

    Citation Envoyé par fsmrel Voir le message
    observons qu’un contrat "mono" fait référence à un et un seul véhicule, et en tout cas c’est ce que j’ai modélisé pour ma part dans le post #152, avec le chemin :

    [CONTRAT] > (CCM) > [CONTRAT_MONO] > (VEH_MONO) > [VEHICULE].

    Même principe pour les contrats "flotte" :

    [CONTRAT] >(CCF) > [CONTRAT_FLOTTE] > (VEH_FLOTTE) > [VEHICULE].

    Il ressort que désormais vous établissez une association supplémentaire, AVENANT, redondante donc inutile et dangereuse entre CONTRAT et VEHICULE : si un contrat "flotte" concerne N véhicules, il faudra obligatoirement établir N avenants (N fois le même...). En effet, selon votre dernier MCD, chaque avenant doit nécessairement faire référence à un véhicule et un seul, même s’il ne concerne qu’un contrat, indépendamment des véhicules !

    Si vous confirmez qu’il y a des avenants concernant seulement des contrats, quels que soient les véhicules attachés à ces contrats, et si par ailleurs il peut exister des avenants visant plus précisément des véhicules, alors il faut en revenir à la situation initiale, c’est-à-dire couper le lien entre AVENANT et VEHICULE, et créer l’entité-type AVENANT_VEHICULE, telle que je l’ai proposée dans mon message précédent :

    Nom : Zidane7_assurance_auto (20)contrats(avenants).png
Affichages : 380
Taille : 32,4 Ko

    Pour éviter les confusions possibles, l’entité-type AVENANT attachée à CONTRAT pourrait être renommée ainsi, AVENANT_CONTRAT.

    Au stade SQL on pourrait créer une vue CONTRAT qui soit l’union des tables AVENANT_CONTRAT et AVENANT_VEHICULE, afin d’avoir une vision simple de l’ensemble des avenants de chaque contrat. Je pourrai vous fournir le code SQL correspondant.
    (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.

  16. #176
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 002
    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 002
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    Bonsoir Zidane7,


    Concernant les avenants : comme vous avez vu le voir, dans mon MCD précédent j’ai rattaché directement aux véhicules les avenants qui leur sont propres.

    Je joins les structures correspondantes des tables et un jeu d’essai.

    Pour ne pas trop alourdir, je n’ai pas créé certaines tables telles que CATEGORIE, CAT_COMPLEMENT.

    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
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
     
    CREATE TABLE AGENCE
    (
            agenceId          INT IDENTITY
          , agenceCode        VARCHAR(4)      NOT NULL
          , agenceNom         VARCHAR(48)     NOT NULL
        , CONSTRAINT AGENCE_PK PRIMARY KEY(agenceId)
        , CONSTRAINT AGENCE_AK UNIQUE(agenceCode)
    );
     
    CREATE TABLE CLIENT
    (
            clientId         INT IDENTITY
          , clientCode       VARCHAR(10)      NOT NULL
          , clientNom        VARCHAR(48)      NOT NULL
          , clientPrenom     VARCHAR(48)      NOT NULL
          , clientAdresse    VARCHAR(95)      NOT NULL
          , clientTelephone  VARCHAR(20)      NOT NULL
        , CONSTRAINT CLIENT_PK PRIMARY KEY (clientId)
        , CONSTRAINT CLIENT_AK UNIQUE (clientCode)
    );
     
    CREATE TABLE ASSURE
    (
            clientId           INT        NOT NULL
        , CONSTRAINT ASSURE_PK PRIMARY KEY (clientId)
        , CONSTRAINT ASSURE_CLIENT_FK FOREIGN KEY(clientId) 
              REFERENCES CLIENT (clientId)
    );
     
    CREATE TABLE CONTRAT
    (
            contratId                 INT IDENTITY 
          , contratCode               CHAR(14)   NOT NULL
          , agenceId                  INT        NOT NULL
          , clientId                  INT        NOT NULL
          , contratDateEmission       DATE       NOT NULL
          , contratDateEffet          DATE       NOT NULL
          , contratdateExpiration     DATE       NOT NULL
        , CONSTRAINT CONTRAT_PK PRIMARY KEY(contratId)
        , CONSTRAINT CONTRAT_AK UNIQUE(contratCode)
        , CONSTRAINT CONTRAT_AGENCE_FK FOREIGN KEY(agenceId) 
              REFERENCES AGENCE(agenceId)
        , CONSTRAINT CONTRAT_ASSURE_FK FOREIGN KEY(clientId) 
              REFERENCES ASSURE (clientId)
    ) ;
     
    CREATE TABLE VEHICULE
    (
            vehiculeId         INT IDENTITY
          , vehiculeCode       CHAR(8)        NOT NULL
          , vehiculeSerie      CHAR(17)       NOT NULL
          , vehiculePuissance  INT            NOT NULL
          , vehiculeMarque     VARCHAR(24)    NOT NULL
        , CONSTRAINT VEHICULE_PK PRIMARY KEY(vehiculeId)
        , CONSTRAINT VEHICULE_AK UNIQUE(vehiculeCode)
    );
     
    CREATE TABLE CONTRAT_MONO
    (
            contratId          INT        NOT NULL 
          , vehiculeId         INT        NOT NULL
        , CONSTRAINT CONTRAT_MONO_PK PRIMARY KEY(contratId)
        , CONSTRAINT CONTRAT_MONO_AK UNIQUE(vehiculeId)
        , CONSTRAINT CONTRAT_MONO_CONTRAT_FK FOREIGN KEY(contratId) 
              REFERENCES CONTRAT(contratId)
        , CONSTRAINT CONTRAT_MONO_VEHICULE_FK FOREIGN KEY(vehiculeId) 
              REFERENCES VEHICULE(vehiculeId)
    );
    CREATE TABLE VEH_MONO
    (
            contratId          INT        NOT NULL 
          , vehiculeId         INT        NOT NULL
        , CONSTRAINT VEH_MONO_PK PRIMARY KEY(contratId)
        , CONSTRAINT VEH_MONO_AK UNIQUE (vehiculeId)
        , CONSTRAINT VEH_MONO_CONTRAT_FK FOREIGN KEY(contratId) 
              REFERENCES CONTRAT (contratId)
        , CONSTRAINT VEH_MONO_VEHICULE_FK FOREIGN KEY(vehiculeId) 
              REFERENCES VEHICULE(vehiculeId)
    );
     
    CREATE TABLE FLOTTE_TYPE
    (
            flotteTypeId          INT IDENTITY
          , flotteTypeCode        CHAR(3)          NOT NULL
          , flotteTypeLibelle     VARCHAR(64)      NOT NULL
        , CONSTRAINT FLOTTE_TYPE_PK PRIMARY KEY(flotteTypeId)
        , CONSTRAINT FLOTTE_TYPE_AK UNIQUE(flotteTypeCode)
    );
     
    CREATE TABLE CONTRAT_FLOTTE
    (
            contratId          INT            NOT NULL
          , flotteTypeId       INT            NOT NULL
        , CONSTRAINT CONTRAT_FLOTTE_PK PRIMARY KEY(contratId)
        , CONSTRAINT CONTRAT_FLOTTE_CONTRAT_FK FOREIGN KEY(contratId) 
              REFERENCES CONTRAT(contratId)
        , CONSTRAINT CONTRAT_FLOTTE_FLOTTE_TYPE_FK FOREIGN KEY(flotteTypeId) 
              REFERENCES FLOTTE_TYPE(flotteTypeId)
    );
     
    CREATE TABLE VEH_FLOTTE
    (
            vehiculeId         INT            NOT NULL
          , contratId          INT            NOT NULL
        , CONSTRAINT VEH_FLOTTE_PK PRIMARY KEY(vehiculeId)
        , CONSTRAINT VEH_FLOTTE_VEHICULE_FK FOREIGN KEY(vehiculeId) 
              REFERENCES VEHICULE(vehiculeId)
        , CONSTRAINT VEH_FLOTTE_CONTRAT_FLOTTE_FK FOREIGN KEY(contratId) 
              REFERENCES CONTRAT_FLOTTE(contratId)
    );
     
    CREATE TABLE TYPE_AVENANT_VEHICULE
    (
            typeAvenantVehId         INT IDENTITY 
          , typeAvenantVehCode       CHAR(2)     NOT NULL
          , typeAvenantVehLibelle    VARCHAR(48) NOT NULL 
        , CONSTRAINT TYPE_AVENANT_VEHICULE_PK PRIMARY KEY(typeAvenantVehId)
        , CONSTRAINT TYPE_AVENANT_VEHICULE_AK UNIQUE(typeAvenantVehCode)
    );
    CREATE TABLE AVENANT_VEHICULE
    (
            vehiculeId         INT            NOT NULL
          , dateDebut          DATE           NOT NULL
          , dateFin            DATE           NOT NULL
          , etc_               VARCHAR(48)    NOT NULL
          , typeAvenantVehId   INT            NOT NULL
        , CONSTRAINT AVENANT_VEHICULE_PK PRIMARY KEY(vehiculeId, dateDebut)
        , CONSTRAINT AVENANT_VEHICULE_VEHICULE_FK FOREIGN KEY(vehiculeId) 
              REFERENCES VEHICULE (vehiculeId)
        , CONSTRAINT AVENANT_VEHICULE_TYPE_AVENANT_VEHICULE_FK FOREIGN KEY(typeAvenantVehId) 
              REFERENCES TYPE_AVENANT_VEHICULE(typeAvenantVehId)
    );


    Un bout de jeu d’essai :

    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
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    INSERT INTO AGENCE (agenceCode, agenceNom)
    VALUES 
        ('2100', 'Siège')
      , ('33K0', 'agence K')
      , ('44Y0', 'agence Y')
    ;
     
    INSERT INTO CLIENT (clientCode, clientNom, clientPrenom, clientAdresse, clientTelephone)
    VALUES
        ('cli001', 'Naudin', 'Fernand', '3, rue Spirou, Montauban', '0567890123')
      , ('cli002', 'Volfoni', 'Raoul', 'La péniche, Paris', '0123456789')
      , ('cli003', 'Volfoni', 'Paul', 'La péniche, Paris', '0123456789')
      , ('cli004', 'Folace', '', '5, rue en pente, Paris', '0123456780')
      , ('cli005', 'Tomate', '', 'Le clandé', '0123456781')
    ;
     
    INSERT INTO ASSURE (clientId)
    VALUES
    ((SELECT clientId FROM CLIENT WHERE clientCode = 'cli001'))
    ,
    ((SELECT clientId FROM CLIENT WHERE clientCode = 'cli002'))
    ,
    ((SELECT clientId FROM CLIENT WHERE clientCode = 'cli003'))
    ,
    ((SELECT clientId FROM CLIENT WHERE clientCode = 'cli004'))
    ;
     
    INSERT INTO CONTRAT (contratCode, contratDateEmission
                       , contratDateEffet, contratdateExpiration
                       , agenceId, clientId)
    VALUES
    (
        '21004102100011'
      , '2021-01-01', '2021-01-02', '2024-12-31'
      , (SELECT agenceId FROM AGENCE WHERE agenceCode = '2100')
      , (SELECT clientId FROM CLIENT WHERE clientCode = 'cli001')
    ) 
    ,
    (
        '21004102100012'
      , '2021-01-02', '2021-01-03', '2024-12-31'
      , (SELECT agenceId FROM AGENCE WHERE agenceCode = '2100')
      , (SELECT clientId FROM CLIENT WHERE clientCode = 'cli001')
    )
    ,
    (
        '21004102100021'
      , '2021-01-04', '2021-01-04', '2024-12-31'
      , (SELECT agenceId FROM AGENCE WHERE agenceCode = '2100')
      , (SELECT clientId FROM CLIENT WHERE clientCode = 'cli002')
    )
     ,
    (
        '21004102100022'
      , '2021-01-05', '2021-01-05', '2024-12-31'
      , (SELECT agenceId FROM AGENCE WHERE agenceCode = '2100')
      , (SELECT clientId FROM CLIENT WHERE clientCode = 'cli002')
    )
     ,
    (
        '21004102100023'
      , '2021-01-05', '2021-01-05', '2024-12-31'
      , (SELECT agenceId FROM AGENCE WHERE agenceCode = '2100')
      , (SELECT clientId FROM CLIENT WHERE clientCode = 'cli002')
    )
     ,
    (
        '21004102100031'
      , '2021-01-05', '2021-01-05', '2024-12-31'
      , (SELECT agenceId FROM AGENCE WHERE agenceCode = '2100')
      , (SELECT clientId FROM CLIENT WHERE clientCode = 'cli003')
    )
     ,
    (
        '21004102100032'
      , '2021-01-05', '2021-01-05', '2024-12-31'
      , (SELECT agenceId FROM AGENCE WHERE agenceCode = '2100')
      , (SELECT clientId FROM CLIENT WHERE clientCode = 'cli003')
    )
     ,
    (
        '21004102100041'
      , '2021-01-05', '2021-01-05', '2024-12-31'
      , (SELECT agenceId FROM AGENCE WHERE agenceCode = '2100')
      , (SELECT clientId FROM CLIENT WHERE clientCode = 'cli004')
    )
     ,
    (
        '21004102100042'
      , '2021-01-05', '2021-01-05', '2024-12-31'
      , (SELECT agenceId FROM AGENCE WHERE agenceCode = '2100')
      , (SELECT clientId FROM CLIENT WHERE clientCode = 'cli004')
    )
    ;
     
    INSERT INTO VEHICULE (vehiculeCode, vehiculeSerie, vehiculePuissance, vehiculeMarque)
    VALUES
        ('veh011', 'VM345678901234567', 15 , 'Mercedes')
    ,   ('veh012', 'VR345678901234567', 7, 'Renault')
    ,   ('veh013', 'VR456789012345678', 8, 'Ford')
    ,   ('veh014', 'VR567890123456789', 6, 'Ford')
    ,   ('veh015', 'MO567890123456789', 10, 'Honda') 
    ,   ('veh016', 'MO678901234567890', 12, 'Triumph') 
     
     ,  ('veh021', 'WM345678901234567', 14 , 'Cadillac')
    ,   ('veh022', 'WR345678901234567', 7, 'Renault')
    ,   ('veh023', 'WR456789012345678', 8, 'Citroën')
    ,   ('veh024', 'WR567890123456789', 6, 'Ford')
    ,   ('veh025', 'NO567890123456789', 10, 'Citroën') 
    ,   ('veh026', 'NO678901234567890', 12, 'Citroën') 
    ;
     
    INSERT INTO CONTRAT_MONO (contratId, vehiculeId)
    VALUES
        ((SELECT contratId FROM CONTRAT WHERE contratCode = '21004102100011')
        ,(SELECT vehiculeId FROM VEHICULE WHERE vehiculeCode = 'veh011'))
    ,
        ((SELECT contratId FROM CONTRAT WHERE contratCode = '21004102100023')
        ,(SELECT vehiculeId FROM VEHICULE WHERE vehiculeCode = 'veh023'))
    ;
     
    INSERT INTO FLOTTE_TYPE (flotteTypeCode, flotteTypeLibelle)
    VALUES
        ('fl1', 'flotte type 1'), ('fl2', 'flotte type 2')
    ;
     
    INSERT INTO CONTRAT_FLOTTE (contratId, flotteTypeId)
    VALUES
        (
         (SELECT contratId FROM CONTRAT WHERE contratCode = '21004102100021')
        ,(SELECT flotteTypeId FROM FLOTTE_TYPE WHERE flotteTypeCode = 'fl1')
        )
    ;
     
    INSERT INTO VEH_FLOTTE (vehiculeId, contratId)
    VALUES
        (
          (SELECT vehiculeId  FROM VEHICULE WHERE  vehiculeCode = 'veh021')
        , (SELECT contratId FROM CONTRAT WHERE contratCode = '21004102100021') 
        )
    ,
        (
          (SELECT vehiculeId  FROM VEHICULE WHERE  vehiculeCode = 'veh022')
        , (SELECT contratId FROM CONTRAT WHERE contratCode = '21004102100021') 
        )
    ;
     
    INSERT INTO VEH_FLOTTE (vehiculeId, contratId)
    VALUES
        (
          (SELECT vehiculeId  FROM VEHICULE WHERE  vehiculeCode = 'veh021')
        , (SELECT contratId FROM CONTRAT WHERE contratCode = '21004102100021') 
        )
    ,
        (
          (SELECT vehiculeId  FROM VEHICULE WHERE  vehiculeCode = 'veh022')
        , (SELECT contratId FROM CONTRAT WHERE contratCode = '21004102100021') 
        )
    ;
    SELECT '' as VEH_FLOTTE, * FROM VEH_FLOTTE ;
     
    INSERT INTO TYPE_AVENANT_VEHICULE (typeAvenantVehCode, typeAvenantVehLibelle)
    VALUES
        ('t1', 'modification'), ('t2', 'remplacement'), ('t3', 'autre')
    ;
    INSERT INTO AVENANT_VEHICULE (vehiculeId, dateDebut, dateFin, etc_, typeAvenantVehId)
    VALUES
        (
           (SELECT vehiculeId FROM VEHICULE WHERE vehiculeCode = 'veh011')
           , '2021-03-21', '2021-04-30', 'à suivre'
         , (SELECT typeAvenantVehId FROM TYPE_AVENANT_VEHICULE WHERE typeAvenantVehCode = 't1')
        )
    ,
       (
           (SELECT vehiculeId FROM VEHICULE WHERE vehiculeCode = 'veh011')
          , '2021-05-01', '2021-05-31', 'à suivre'
        , (SELECT typeAvenantVehId FROM TYPE_AVENANT_VEHICULE WHERE typeAvenantVehCode = 't1')
        )
    ,
       (
           (SELECT vehiculeId FROM VEHICULE WHERE vehiculeCode = 'veh011')
          , '2021-06-01', '9999-12-31', 'à surveiller'
        , (SELECT typeAvenantVehId FROM TYPE_AVENANT_VEHICULE WHERE typeAvenantVehCode = 't2')
        )
    ,
       (
           (SELECT vehiculeId FROM VEHICULE WHERE vehiculeCode = 'veh021')
          , '2021-04-01', '9999-12-31', 'à surveiller'
        , (SELECT typeAvenantVehId FROM TYPE_AVENANT_VEHICULE WHERE typeAvenantVehCode = 't2')
        )
    ,
       (
           (SELECT vehiculeId FROM VEHICULE WHERE vehiculeCode = 'veh022')
          , '2021-04-01', '9999-12-31', 'à surveiller'
        , (SELECT typeAvenantVehId FROM TYPE_AVENANT_VEHICULE WHERE typeAvenantVehCode = 't2')
        )
    ,
       (
           (SELECT vehiculeId FROM VEHICULE WHERE vehiculeCode = 'veh023')
          , '2021-04-01', '9999-12-31', 'à surveiller'
        , (SELECT typeAvenantVehId FROM TYPE_AVENANT_VEHICULE WHERE typeAvenantVehCode = 't2')
        )
    ;


    Une vue pour connaître les avenants des véhicules de type mono et flotte par client

    go
    CREATE VIEW VEHICULE_AVENANT_V
        (clientCode, contratCode, vehiculeCode, debutAvenant, typeAvenant, typeContrat) 
    AS
    SELECT clientCode, contratCode, vehiculeCode, u.dateDebut
         , typeAvenantVehLibelle, 'mono'
    FROM   CLIENT as x
      JOIN CONTRAT as y ON x.clientId = y.clientId
      JOIN CONTRAT_MONO as z ON y.contratId = z.contratId
      JOIN VEHICULE as t ON z.vehiculeId = t.vehiculeId
      JOIN AVENANT_VEHICULE as u ON t.vehiculeId = u.vehiculeId
      JOIN TYPE_AVENANT_VEHICULE as v ON u.typeAvenantVehId = v.typeAvenantVehId
    
    UNION 
    
    SELECT clientCode, contratCode, vehiculeCode, v.dateDebut
         , typeAvenantVehLibelle,  'flotte'  
    FROM   CLIENT as x
      JOIN CONTRAT as y ON x.clientId = y.clientId
      JOIN CONTRAT_FLOTTE as z ON y.contratId = z.contratId
      JOIN VEH_FLOTTE as t ON z.contratId = t.contratId
      JOIN VEHICULE as u ON t.vehiculeId = u.vehiculeId
      JOIN AVENANT_VEHICULE as v ON u.vehiculeId = v.vehiculeId
      JOIN TYPE_AVENANT_VEHICULE as w ON v.typeAvenantVehId = w.typeAvenantVehId
    ;
    go
    
    SELECT * FROM VEHICULE_AVENANT_V ;
    
    
    =>

    clientCode contratCode    vehiculeCode debutAvenant typeAvenant    typeContrat
    
    cli001     21004102100011 veh011       2021-03-21   modification    mono
    cli001     21004102100011 veh011       2021-05-01   modification    mono
    cli001     21004102100011 veh011       2021-06-01   remplacement    mono
    cli002     21004102100021 veh021       2021-04-01   remplacement    flotte
    cli002     21004102100021 veh022       2021-04-01   remplacement    flotte
    cli002     21004102100023 veh023       2021-04-01   remplacement    mono
    
    (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.

  17. #177
    Membre à l'essai
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2019
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Guinée

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Décembre 2019
    Messages : 83
    Points : 23
    Points
    23
    Par défaut Conception d'un MCD pour une assurance automobile
    Bonjour Monsieur,
    Je m’excuse beaucoup du temps perdu pour pouvoir répondre et poser mes différentes questions.
    Concernant les avenants, j'ai fait une recherche pour vous permettre de bien comprendre le passage dont voici.
    AVENANT
    Avenant de transfert (Ici on remplace une personne par une autre c’est-à-dire une personne vend sa voiture à une autre)
    Avenant de substitution, ici on a :
    a) Avenant de substitution simple (Ici on remplace une voiture par une autre de même catégorie, même intervalle de puissance)
    b) Avenant de substitution avec complément de prime (ici on remplace un véhicule par un autre de même catégorie mais l’intervalle de puissance du second véhicule est supérieur au premier (existant), donc l’assuré paye une prime complémentaire pour assurer le second véhicule)
    c) Avenant de substitution avec ristourne (ici on remplace un véhicule de même catégorie mais dont l’intervalle de puissance du second véhicule est inférieur au premier véhicule donc l’assureur paye une prime ou ristourne à l’assuré).
    a, b, c s’applique au mono
    On a aussi l’avenant de substitution de catégorie (qui signifie qu’un véhicule qui change de catégorie ou usage ou mode d’exploitation), à ce niveau, on procède généralement à la résiliation du premier contrat et ensuite créer un autre contrat pour le second véhicule car le processus est long à réaliser.
    Avenant d’extension de garantie (ici c’est pour étendre ou augmenter les garanties d’un véhicule, c’est possible pour les mono et flotte.
    Avenant d’incorporation pour les flottes, on peut incorporer un véhicule ou plusieurs véhicules dans une flotte. Si on veut faire pour les mono, il faut changer le numéro de police selon notre codification car la police est codée en fonction aussi de la catégorie.
    Avenant de suspension valable pour les flottes et mono.
    Avenant de remise en vigueur :
    a) Avec remboursement pour véhicule mono et flotte
    b) Sans remboursement uniquement pour les véhicules mono
    Avenant de correction d’une émission soit de nom d’assuré ou de véhicule par erreur de saisie.
    Avenant de résiliation
    Avenant d’annulation
    Avenant de changement d’immatriculation
    Avenant de retrait.
    Avez-vous des remarques et suggestions.
    Merci par avance.

  18. #178
    Membre à l'essai
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2019
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Guinée

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Décembre 2019
    Messages : 83
    Points : 23
    Points
    23
    Par défaut Conception d'un MCD pour une assurance automobile
    Bonsoir Messieurs,
    Ce passage des avenants me parait être complique et j'aimerais avoir une assistance sur cette partie.
    Avez-vous des remarques et suggestions?
    Merci par avance.

  19. #179
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 002
    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 002
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    Bonsoir Zidane7,


    Citation Envoyé par Zidane7 Voir le message
    Avenant de transfert (Ici on remplace une personne par une autre c’est-à-dire une personne vend sa voiture à une autre)

    Je me manifeste tardivement, mais je suis très occupé par ailleurs. Commençons par les avenants de transfert. Vous dites qu’en l’occurrence une personne P1 (l’assuré ? Le souscripteur ? …) vend sa voiture à une autre personne, P2, mais je suppose que le contrat C1 signé par P1 ne pourra pas concerner P2, donc qu’il y aura un nouveau contrat C2 pour P2, tandis que C1 sera résilié. Dans ce contexte, je vois mal ce que signifie un avenant de transfert et en tout cas à quel contrat le rattacher si avenant il y a…

    Merci d’illustrer par un exemple concret les conséquences d’une vente de voiture.
    (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.

  20. #180
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 002
    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 002
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    Bonsoir Zidane7,


    Dans mon message précédent, j’ai oublié de préciser qu’il s’agissait du cas simple, c’est-à-dire que le contrat est de type "mono". Il faudrait que vous exposiez le problème posé pour la vente, quel scénario envisager dans le cas d’un véhicule de type "flotte"…
    (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.

Discussions similaires

  1. Réponses: 2
    Dernier message: 28/03/2008, 19h23
  2. Mcd pour une suivi de materiel simple SVP
    Par moumio dans le forum Forms
    Réponses: 1
    Dernier message: 25/11/2007, 14h47
  3. [MCD] Conception d'un MCD pour des étudiants d'une fac
    Par beegees dans le forum Schéma
    Réponses: 7
    Dernier message: 16/10/2006, 02h05
  4. Réponses: 3
    Dernier message: 12/01/2006, 18h47
  5. [Conception] - Organisation des pages pour une requete.
    Par ShinJava dans le forum PHP & Base de données
    Réponses: 14
    Dernier message: 24/10/2005, 15h33

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