/**
  * Get admit HL7 event code
  *
  * @param CSejour $sejour Admit
  *
  * @return null|string
  */
 function getCodeSejour(CSejour $sejour)
 {
     $current_log = $sejour->loadLastLog();
     if (!in_array($current_log->type, array("create", "store"))) {
         return null;
     }
     $receiver = $sejour->_receiver;
     $configs = $receiver->_configs;
     $sejour->loadOldObject();
     // Cas d'une pré-admission
     if ($sejour->_etat == "preadmission") {
         // Création d'une pré-admission
         if ($current_log->type == "create") {
             // Pending admit
             if ($configs["iti31_pending_event_management"] && $sejour->recuse == -1) {
                 return "A14";
             }
             return "A05";
         }
         // Cancel the pending admission
         if ($configs["iti31_pending_event_management"] && $sejour->recuse == -1 && $sejour->fieldModified("annule", "1")) {
             return "A27";
         }
         // Modification d'une pré-admission
         // Cas d'une annulation ?
         if ($sejour->fieldModified("annule", "1")) {
             return "A38";
         }
         // Cas d'un rétablissement d'annulation ?
         if ($sejour->fieldModified("annule", "0") && $sejour->_old->annule == 1) {
             return "A05";
         }
         // Annulation de l'admission
         if ($sejour->_old->entree_reelle && !$sejour->entree_reelle) {
             return "A11";
         }
         // Réattribution dossier administratif
         if ($sejour->fieldModified("patient_id")) {
             return "A44";
         }
         if (!$configs["modification_before_admit"] && !$sejour->entree_reelle) {
             return;
         }
         // Simple modification ?
         return $this->getModificationAdmitCode($sejour->_receiver);
     }
     // Cas d'un séjour en cours (entrée réelle)
     if ($sejour->_etat == "encours") {
         // Admission faite
         $sejour_old = $sejour->_old;
         if ($sejour->fieldModified("entree_reelle") && !$sejour_old->entree_reelle || $sejour->entree_reelle && !$sejour_old->entree_reelle) {
             // Patient externe
             if (in_array($sejour->type, self::$outpatient)) {
                 return "A04";
             }
             // Admission hospitalisé
             return "A01";
         }
         // Confirmation de sortie
         if ($sejour->fieldFirstModified("confirme")) {
             return "A16";
         }
         // Annulation confirmation de sortie
         if ($sejour->fieldEmptyValued("confirme")) {
             return "A25";
         }
         // Bascule du type et type_pec
         if ($sejour->fieldModified("type")) {
             $sejour->_old->_receiver = $sejour->_receiver;
             return $this->getBasculeCode($sejour->_old, $sejour);
         }
         // Changement du médecin responsable
         if ($sejour->fieldModified("praticien_id")) {
             $first_log = $sejour->loadFirstLog();
             $praticien_id = $sejour->getValueAtDate($first_log->date, "praticien_id");
             $send_change_attending_doctor = $configs["send_change_attending_doctor"];
             // Annulation du médecin responsable
             if ($sejour->praticien_id == $praticien_id) {
                 return $send_change_attending_doctor == "A54" ? "A55" : $this->getModificationAdmitCode($receiver);
             }
             return $send_change_attending_doctor == "A54" ? "A54" : $this->getModificationAdmitCode($receiver);
         }
         // Réattribution dossier administratif
         if ($sejour->fieldModified("patient_id")) {
             return "A44";
         }
         // Cas d'une annulation
         if ($sejour->fieldModified("annule", "1")) {
             return "A11";
         }
         // Cas d'une rétablissement on simule une nouvelle admission
         if ($sejour->fieldModified("annule", "0")) {
             // Patient externe
             if (in_array($sejour->type, self::$outpatient)) {
                 return "A04";
             }
             // Admission hospitalisé
             return "A01";
         }
         // Annulation de la sortie réelle
         if ($sejour->_old->sortie_reelle && !$sejour->sortie_reelle) {
             return "A13";
         }
         // Notification sur le transfert
         if ($configs["iti31_pending_event_management"] && $sejour->fieldModified("mode_sortie") && $sejour->mode_sortie == "transfert") {
             return "A15";
         }
         // Annulation de la notification sur le transfert
         if ($configs["iti31_pending_event_management"] && $sejour->_old->mode_sortie && $sejour->_old->mode_sortie == "transfert" && !$sejour->mode_sortie) {
             return "A26";
         }
         // On ne transmet pas les modifications d'un séjour dès lors que celui-ci a une entrée réelle
         if (!$receiver->_configs["send_change_after_admit"]) {
             return null;
         }
         // Simple modification ?
         return $this->getModificationAdmitCode($sejour->_receiver);
     }
     // Cas d'un séjour clôturé (sortie réelle)
     if ($sejour->_etat == "cloture") {
         // Sortie réelle renseignée
         if ($sejour->fieldModified("sortie_reelle") && !$sejour->_old->sortie_reelle) {
             return "A03";
         }
         // Modification de l'admission
         // Cas d'une annulation ?
         if ($sejour->fieldModified("annule", "1")) {
             return "A13";
         }
         // On ne transmet pas les modifications d'un séjour dès lors que celui-ci a une entrée réelle
         if (!$receiver->_configs["send_change_after_admit"]) {
             return null;
         }
         // Simple modification ?
         return $this->getModificationAdmitCode($sejour->_receiver);
     }
     return null;
 }