$codePresc = $lines[$fl + 11];
    //IPP
    if ($lines[$fl] != '') {
        $patient->_IPP = $ipp;
        $patient->loadFromIPP();
    }
    //search
    if (!$patient->_id && $nom != '' && $prenom != "") {
        $where = array();
        $where[] = "`nom` LIKE '{$nom}%' OR `nom_jeune_fille` LIKE '{$nom}%'";
        $where["prenom"] = "LIKE '{$prenom}%' ";
        $where["naissance"] = "LIKE '{$naissance}' ";
        $patient->loadObject($where);
    }
    //NDA
    if ($patient->_id && $nda) {
        $dossier->loadFromNDA($nda);
    }
    // patient + date (et pas de nda)
    if ($patient->_id && !$dossier->_id && $date) {
        $where = array();
        $where[] = " '{$date}' BETWEEN entree AND sortie ";
        $where["patient_id"] = " = '{$patient->_id}'";
        $dossier->loadObject($where);
    }
}
$smarty = new CSmartyDP();
$smarty->assign("mail_id", $mail_id);
$smarty->assign("patient", $patient);
$smarty->assign("dossier_id", $dossier->_id);
$smarty->display("inc_vw_attach_piece.tpl");
 /**
  * @see parent::store()
  * @todo Refactoring complet de la fonction store de la consultation
  *
  *   ANALYSE DU CODE
  *  1. Gestion du désistement
  *  2. Premier if : creation d'une consultation à laquelle on doit attacher
  *     un séjour (conf active): comportement DEPART / ARRIVEE
  *  3. Mise en cache du forfait FSE et facturable : uniquement dans le cas d'un séjour
  *  4. On load le séjour de la consultation
  *  5. On initialise le _adjust_sejour à false
  *  6. Dans le cas ou on a un séjour
  *   6.1. S'il est de type consultation, on ajuste le séjour en fonction du comportement DEPART / ARRIVEE
  *   6.2. Si la plage de consultation a été modifiée, adjust_sejour passe à true et on ajuste le séjour
  *        en fonction du comportement DEPART / ARRIVEE (en passant par l'adjustSejour() )
  *   6.3. Si on a un id (à virer) et que le chrono est modifié en PATIENT_ARRIVE,
  *        si on gère les admissions auto (conf) on met une entrée réelle au séjour
  *  7. Si le patient est modifié, qu'on est pas en train de merger et qu'on a un séjour,
  *     on empeche le store
  *  8. On appelle le parent::store()
  *  9. On passe le forfait SE et facturable au séjour
  * 10. On propage la modification du patient de la consultation au séjour
  * 11. Si on a ajusté le séjour et qu'on est dans un séjour de type conclut et que le séjour
  *     n'a plus de consultations, on essaie de le supprimer, sinon on l'annule
  * 12. Gestion du tarif et précodage des actes (bindTarif)
  * 13. Bind FSE
  * ACTIONS
  * - Faire une fonction comportement_DEPART_ARRIVEE()
  * - Merger le 2, le 6.1 et le 6.2 (et le passer en 2 si possible)
  * - Faire une fonction pour le 6.3, le 7, le 10, le 11
  * - Améliorer les fonctions 12 et 13 en incluant le test du behaviour fields
  *
  * COMPORTEMENT DEPART ARRIVEE
  * modif de la date d'une consultation ayant un séjour sur le modèle DEPART / ARRIVEE:
  * 1. Pour le DEPART :
  * -> on décroche la consultation de son ancien séjour
  * -> on ne touche pas à l'ancien séjour si :
  * - il est de type autre que consultation
  * - il a une entrée réelle
  * - il a d'autres consultations
  * -> sinon on l'annule
  *
  *   2. Pour l'ARRIVEE
  * -> si on a un séjour qui englobe : on la colle dedans
  * -> sinon on crée un séjour de consultation
  *
  *   TESTS A EFFECTUER
  *  0. Création d'un pause
  *  0.1. Déplacement d'une pause
  *  1. Création d'une consultation simple C1 (Séjour S1)
  *  2. Création d'une deuxième consultation le même jour / même patient C2 (Séjour S1)
  *  3. Création d'une troisième consultation le même jour / même patient C3 (Séjour S1)
  *  4. Déplacement de la consultation C1 un autre jour (Séjour S2)
  *  5. Changement du nom du patient C2 (pas de modification car une autre consultation)
  *  6. Déplacement de C3 au même jour (Toujours séjour S1)
  *  7. Annulation de C1 (Suppression ou annulation de S1)
  *  8. Déplacement de C2 et C3 à un autre jour (séjour S3 créé, séjour S1 supprimé ou annulé)
  *  9. Arrivée du patient pour C2 (S3 a une entrée réelle)
  * 10. Déplacement de C3 dans un autre jour (S4)
  * 11. Déplacement de C2 dans un autre jour (S5 et S3 reste tel quel)
  */
 function store()
 {
     $this->completeField('sejour_id', 'heure', 'plageconsult_id', 'si_desistement', 'annule');
     if ($this->si_desistement === null) {
         $this->si_desistement = 0;
     }
     $this->annule = $this->annule === null || $this->annule === '' ? 0 : $this->annule;
     $uf_soins_id = $this->_uf_soins_id;
     // Consultation dans un séjour
     $sejour = new CSejour();
     if (!$this->_id && !$this->sejour_id && CAppUI::conf("dPcabinet CConsultation attach_consult_sejour") && $this->patient_id || $this->_force_create_sejour) {
         // Recherche séjour englobant
         $facturable = $this->_facturable;
         if ($facturable === null) {
             $facturable = 1;
         }
         $this->loadRefPlageConsult();
         $function = new CFunctions();
         if ($this->_function_secondary_id) {
             $function->load($this->_function_secondary_id);
         } else {
             $user = new CMediusers();
             $user->load($this->_ref_chir->_id);
             $function->load($user->function_id);
         }
         $datetime = $this->_datetime;
         $minutes_before_consult_sejour = CAppUI::conf("dPcabinet CConsultation minutes_before_consult_sejour");
         $where = array();
         $where['annule'] = " = '0'";
         $where['type'] = " != 'seances'";
         $where['patient_id'] = " = '{$this->patient_id}'";
         if (!CAppUI::conf("dPcabinet CConsultation search_sejour_all_groups")) {
             $where['group_id'] = " = '{$function->group_id}'";
         }
         $where['facturable'] = " = '{$facturable}'";
         $datetime_before = CMbDT::dateTime("+{$minutes_before_consult_sejour} minute", "{$this->_date} {$this->heure}");
         $where[] = "`sejour`.`entree` <= '{$datetime_before}' AND `sejour`.`sortie` >= '{$datetime}'";
         if (!$this->_force_create_sejour) {
             $sejour->loadObject($where);
         } else {
             $sejour->_id = "";
         }
         // Si pas de séjour et config alors le créer en type consultation
         if (!$sejour->_id && CAppUI::conf("dPcabinet CConsultation create_consult_sejour")) {
             $sejour->patient_id = $this->patient_id;
             $sejour->praticien_id = $this->_ref_chir->_id;
             $sejour->group_id = $function->group_id;
             $sejour->type = "consult";
             $sejour->facturable = $facturable;
             $sejour->uf_soins_id = $uf_soins_id;
             $datetime = $this->_date && $this->heure ? "{$this->_date} {$this->heure}" : null;
             if ($this->chrono == self::PLANIFIE) {
                 $sejour->entree_prevue = $datetime;
             } else {
                 $sejour->entree_reelle = $datetime;
             }
             $sejour->sortie_prevue = "{$this->_date} 23:59:59";
             if ($msg = $sejour->store()) {
                 return $msg;
             }
         }
         $this->sejour_id = $sejour->_id;
     }
     // must be BEFORE loadRefSejour()
     $facturable = $this->_facturable;
     $forfait_se = $this->_forfait_se;
     $forfait_sd = $this->_forfait_sd;
     $this->_adjust_sejour = false;
     $this->loadRefSejour();
     if ($this->sejour_id) {
         $this->loadRefPlageConsult();
         // Si le séjour est de type consult
         if ($this->_ref_sejour->type == 'consult') {
             $this->_ref_sejour->loadRefsConsultations();
             $this->_ref_sejour->_hour_entree_prevue = null;
             $this->_ref_sejour->_min_entree_prevue = null;
             $this->_ref_sejour->_hour_sortie_prevue = null;
             $this->_ref_sejour->_min_sortie_prevue = null;
             $date_consult = CMbDT::date($this->_datetime);
             // On déplace l'entrée et la sortie du séjour
             $entree = $this->_datetime;
             $sortie = $date_consult . " 23:59:59";
             // Si on a une entrée réelle et que la date de la consultation est avant l'entrée réelle, on sort du store
             if ($this->_ref_sejour->entree_reelle && $date_consult < CMbDT::date($this->_ref_sejour->entree_reelle)) {
                 return CAppUI::tr("CConsultation-denyDayChange");
             }
             // Si on a une sortie réelle et que la date de la consultation est après la sortie réelle, on sort du store
             if ($this->_ref_sejour->sortie_reelle && $date_consult > CMbDT::date($this->_ref_sejour->sortie_reelle)) {
                 return CAppUI::tr("CConsultation-denyDayChange-exit");
             }
             // S'il n'y a qu'une seule consultation dans le séjour, et que le praticien de la consultation est modifié
             // (changement de plage), alors on modifie également le praticien du séjour
             if ($this->_id && $this->fieldModified("plageconsult_id") && count($this->_ref_sejour->_ref_consultations) == 1 && !$this->_ref_sejour->entree_reelle) {
                 $this->_ref_sejour->praticien_id = $this->_ref_plageconsult->chir_id;
             }
             // S'il y a d'autres consultations dans le séjour, on étire l'entrée et la sortie
             // en parcourant la liste des consultations
             foreach ($this->_ref_sejour->_ref_consultations as $_consultation) {
                 if ($_consultation->_id != $this->_id) {
                     $_consultation->loadRefPlageConsult();
                     if ($_consultation->_datetime < $entree) {
                         $entree = $_consultation->_datetime;
                     }
                     if ($_consultation->_datetime > $sortie) {
                         $sortie = CMbDT::date($_consultation->_datetime) . " 23:59:59";
                     }
                 }
             }
             $this->_ref_sejour->entree_prevue = $entree;
             $this->_ref_sejour->sortie_prevue = $sortie;
             $this->_ref_sejour->updateFormFields();
             $this->_ref_sejour->_check_bounds = 0;
             $this->_ref_sejour->store();
         }
         // Changement de journée pour la consult
         if ($this->fieldModified("plageconsult_id")) {
             $this->_adjust_sejour = true;
             // Pas le permettre si admission est déjà faite
             $max_hours = CAppUI::conf("dPcabinet CConsultation hours_after_changing_prat");
             if ($this->_ref_sejour->entree_reelle && CMbDT::dateTime("+ {$max_hours} HOUR", $this->_ref_sejour->entree_reelle) < CMbDT::dateTime()) {
                 return CAppUI::tr("CConsultation-denyPratChange", $max_hours);
             }
             $this->loadRefPlageConsult();
             $dateTimePlage = $this->_datetime;
             $where = array();
             $where['patient_id'] = " = '{$this->patient_id}'";
             $where[] = "`sejour`.`entree` <= '{$dateTimePlage}' AND `sejour`.`sortie` >= '{$dateTimePlage}'";
             $sejour = new CSejour();
             $sejour->loadObject($where);
             $this->adjustSejour($sejour, $dateTimePlage);
         }
         if ($this->_id && $this->fieldModified("chrono", self::PATIENT_ARRIVE)) {
             $this->completeField("plageconsult_id");
             $this->loadRefPlageConsult();
             $this->_ref_chir->loadRefFunction();
             $function = $this->_ref_chir->_ref_function;
             if ($function->admission_auto) {
                 $sejour = new CSejour();
                 $sejour->load($this->sejour_id);
                 $sejour->entree_reelle = $this->arrivee;
                 if ($msg = $sejour->store()) {
                     return $msg;
                 }
             }
         }
     }
     $patient_modified = $this->fieldModified("patient_id");
     // Si le patient est modifié et qu'il y a plus d'une consult dans le sejour, on empeche le store
     if (!$this->_forwardRefMerging && $this->sejour_id && $patient_modified && !$this->_skip_count && !$this->_sync_consults_from_sejour) {
         $this->loadRefSejour();
         $consultations = $this->_ref_sejour->countBackRefs("consultations");
         if ($consultations > 1) {
             return "Vous ne pouvez changer le patient d'une consultation si celle ci est contenue dans un séjour. Dissociez la consultation ou modifier le patient du séjour.";
         }
     }
     // Synchronisation AT
     $this->getType();
     if ($this->_type === "urg" && $this->fieldModified("date_at")) {
         $rpu = $this->_ref_sejour->_ref_rpu;
         if (!$rpu->_date_at) {
             $rpu->_date_at = true;
             $rpu->date_at = $this->date_at;
             if ($msg = $rpu->store()) {
                 return $msg;
             }
         }
     }
     // Update de reprise at
     // Par défaut, j+1 par rapport à fin at
     if ($this->fieldModified("fin_at") && $this->fin_at) {
         $this->reprise_at = CMbDT::dateTime("+1 DAY", $this->fin_at);
     }
     //Lors de la validation de la consultation
     // Enregistrement de la facture
     if ($this->fieldModified("valide", "1")) {
         //Si le DH est modifié, ceui ci se répercute sur le premier acte coté
         if ($this->fieldModified("secteur2") && (count($this->_tokens_ngap) || count($this->_tokens_ccam)) && count($this->loadRefsActes())) {
             $acte = reset($this->_ref_actes);
             $acte->montant_depassement += $this->secteur2 - $this->_old->secteur2;
             if ($msg = $acte->store()) {
                 return $msg;
             }
         }
         $facture = $this->sejour_id ? new CFactureEtablissement() : new CFactureCabinet();
         $facture->group_id = CGroups::loadCurrent()->_id;
         $facture->_consult_id = $this->_id;
         $facture->du_patient = $this->du_patient;
         $facture->du_tiers = $this->du_tiers;
         $facture->du_tva = $this->du_tva;
         $facture->taux_tva = $this->taux_tva;
         if (!count($this->loadRefsFraisDivers(1)) && count($this->loadRefsFraisDivers(2)) && $this->du_tva) {
             $facture->du_patient = $this->du_patient - $this->du_tva - $this->secteur3;
             $facture->du_tva = 0;
             $facture->taux_tva = $this->taux_tva;
         }
         if ($msg = $facture->store()) {
             echo $msg;
         }
     }
     //Lors de dévalidation de la consultation
     if ($this->fieldModified("valide", "0")) {
         $this->loadRefFacture();
         foreach ($this->_ref_factures as $_facture) {
             $_facture->_consult_id = $this->_id;
             $_facture->cancelConsult();
         }
     }
     if ($this->fieldModified("annule", "1")) {
         $this->loadRefConsultAnesth();
         foreach ($this->_refs_dossiers_anesth as $_dossier_anesth) {
             if ($_dossier_anesth->operation_id) {
                 $_dossier_anesth->operation_id = '';
                 if ($msg = $_dossier_anesth->store()) {
                     return $msg;
                 }
             }
         }
     }
     if ($this->fieldModified("annule", "0") || $this->annule == 0 && $this->motif_annulation) {
         $this->motif_annulation = "";
     }
     // Standard store
     if ($msg = parent::store()) {
         return $msg;
     }
     if (CAppUI::pref("create_dossier_anesth")) {
         $this->createConsultAnesth();
     }
     $this->completeField("_line_element_id");
     // Création d'une tâche si la prise de rdv est issue du plan de soin
     if ($this->_line_element_id) {
         $task = new CSejourTask();
         $task->consult_id = $this->_id;
         $task->sejour_id = $this->sejour_id;
         $task->prescription_line_element_id = $this->_line_element_id;
         $task->description = "Consultation prévue le " . $this->_ref_plageconsult->getFormattedValue("date");
         $line_element = new CPrescriptionLineElement();
         $line_element->load($this->_line_element_id);
         $this->motif = ($this->motif ? "{$this->motif}\n" : "") . $line_element->_view;
         $this->rques = ($this->rques ? "{$this->rques}\n" : "") . "Prescription d'hospitalisation, prescrit par le Dr " . $line_element->_ref_praticien->_view;
         // Planification manuelle à l'heure de la consultation
         $administration = new CAdministration();
         $administration->administrateur_id = CAppUI::$user->_id;
         $administration->dateTime = $this->_datetime;
         $administration->quantite = $administration->planification = 1;
         $administration->unite_prise = "aucune_prise";
         $administration->setObject($line_element);
         $this->element_prescription_id = $line_element->element_prescription_id;
         if ($msg = $administration->store()) {
             return $msg;
         }
         if ($msg = $task->store()) {
             return $msg;
         }
         if ($msg = parent::store()) {
             return $msg;
         }
     }
     // On note le résultat de la tâche si la consultation est terminée
     if ($this->chrono == CConsultation::TERMINE) {
         /** @var $task CSejourTask */
         $task = $this->loadRefTask();
         if ($task->_id) {
             $task->resultat = "Consultation terminée";
             $task->realise = 1;
             if ($msg = $task->store()) {
                 return $msg;
             }
         }
     }
     // Forfait SE et facturable. A laisser apres le store()
     if ($this->sejour_id && CAppUI::conf("dPcabinet CConsultation attach_consult_sejour")) {
         if ($forfait_se !== null || $facturable !== null || $forfait_sd !== null) {
             $this->_ref_sejour->forfait_se = $forfait_se;
             $this->_ref_sejour->forfait_sd = $forfait_sd;
             $this->_ref_sejour->facturable = $facturable;
             $this->_ref_sejour->uf_soins_id = $uf_soins_id;
             if ($msg = $this->_ref_sejour->store()) {
                 return $msg;
             }
             $this->_forfait_se = null;
             $this->_forfait_sd = null;
             $this->_facturable = null;
             $this->_uf_soins_id = null;
         }
     }
     if ($this->_adjust_sejour && $this->_ref_sejour->type === "consult" && $sejour->_id) {
         $consultations = $this->_ref_sejour->countBackRefs("consultations");
         if ($consultations < 1) {
             if ($msg = $this->_ref_sejour->delete()) {
                 $this->_ref_sejour->annule = 1;
                 if ($msg = $this->_ref_sejour->store()) {
                     return $msg;
                 }
             }
         }
     }
     // Gestion du tarif et precodage des actes
     if ($this->_bind_tarif && $this->_id) {
         if ($msg = $this->bindTarif()) {
             return $msg;
         }
     }
     // Bind FSE
     if ($this->_bind_fse && $this->_id) {
         if (CModule::getActive("fse")) {
             $fse = CFseFactory::createFSE();
             if ($fse) {
                 $fse->bindFSE($this);
             }
         }
     }
     return null;
 }
 /**
  * @param string $patient_id Import patient ID
  * @param string $prat       Import praticien ID
  * @param string $date       Date
  * @param string $idex       External ID
  *
  * @return bool|CSejour|CStoredObject Finds a sejour from a patient, praticien and date
  */
 function findSejour($patient_id, $prat, $date, $idex = null)
 {
     if ($idex) {
         $object = $this->getMbObjectByClass("CSejour", $idex);
         if ($object->_id) {
             return $object;
         }
     }
     // Trouver ou importer le patient
     $patient = $this->getOrImportObject($this->_patient_class, $patient_id);
     if (!$patient || !$patient->_id) {
         CAppUI::setMsg("Patient non retrouvé et non importé : {$patient_id}", UI_MSG_WARNING);
         return false;
     }
     // Trouver le praticien du sejour
     $user = $this->getMbObjectByClass("CMediusers", $prat);
     if (!$user->_id) {
         CAppUI::setMsg("Praticien du séjour non retrouvé : {$prat}", UI_MSG_WARNING);
         return false;
     }
     // Recherche d'un séjour dont le debut peut
     // commencer 1 jour apres la date ou finir 2 jours avant
     $date = CMbDT::date($date);
     $sejour = new CSejour();
     $where = array("patient_id" => "= '{$patient->_id}'", "praticien_id" => "= '{$user->_id}'", "DATE_SUB(`sejour`.`entree`, INTERVAL 1 DAY) < '{$date}'", "DATE_ADD(`sejour`.`sortie`, INTERVAL 2 DAY) > '{$date}'");
     $sejour->loadObject($where);
     if ($sejour->_id && $idex) {
         $this->storeIdExt($sejour, $idex);
     }
     if (!$sejour->_id) {
         CAppUI::setMsg("Séjour non trouvé : {$patient_id} / {$prat} / {$date}", UI_MSG_WARNING);
         return false;
     }
     return $sejour;
 }
Exemple #4
0
 /**
  * Chargement du séjour probablement demandeur du séjour SSR
  * (dont la sortie est proche de l'entree du séjour SSR)
  *
  * @return CSejour
  */
 function loadRefSejourDemandeur()
 {
     // Effet de cache
     if ($this->_ref_sejour_demandeur) {
         return $this->_ref_sejour_demandeur;
     }
     // Requête
     $sejour_ssr = $this->loadRefSejour();
     $tolerance = CAppUI::conf("ssr CBilanSSR tolerance_sejour_demandeur");
     $date_min = CMbDT::date("- {$tolerance} DAYS", $sejour_ssr->entree);
     $date_max = CMbDT::date("+ {$tolerance} DAYS", $sejour_ssr->entree);
     $where["sortie"] = "BETWEEN '{$date_min}' AND '{$date_max}'";
     $where["patient_id"] = "= '{$sejour_ssr->patient_id}'";
     $where["annule"] = " = '0'";
     $where["type"] = " != 'ssr'";
     // Chargement
     $sejour = new CSejour();
     $sejour->loadObject($where);
     return $this->_ref_sejour_demandeur = $sejour;
 }
Exemple #5
0
        $sejour->loadFromNDA($nda);
    } elseif ($patient->_id) {
        if (!$date_sejour) {
            CAppUI::stepAjax("context-sejour-patientOK-date-required", UI_MSG_ERROR, $view);
        }
        $date_sejour = CMbDT::dateTime($date_sejour);
        $where = array();
        $where[] = "'{$date_sejour}' BETWEEN entree AND sortie";
        $where["patient_id"] = " = '{$patient->_id}'";
        $sejours = $sejour->countList($where);
        switch ($sejours) {
            case 0:
                CAppUI::stepAjax("context-none-sejour", UI_MSG_ERROR);
                break;
            case 1:
                $sejour->loadObject($where);
                break;
            default:
                CAppUI::stepAjax("context-multiple-sejour", UI_MSG_ERROR, $sejours);
                break;
        }
    } else {
        CAppUI::stepAjax("context-nda-or-PatientPlusDate-required", UI_MSG_ERROR, $view);
    }
}
//-----------------------------------------------------------------
if ($mods_available[$view][2] == "patient") {
    if (!$patient->_id) {
        if ($patient->_IPP) {
            CAppUI::stepAjax("context-nonexisting-patient-ipp%s", UI_MSG_ERROR, $patient->_IPP);
        } else {
 /**
  * Load admit PES
  *
  * @param CPatient $patient Person
  *
  * @throws CMbException
  *
  * @return CSejour $sejour
  */
 static function loadAdmitPES(CPatient $patient)
 {
     $sejour = new CSejour();
     $where["patient_id"] = " = '{$patient->_id}'";
     $where["libelle"] = " = 'Séjour ITI-31 - {$patient->nom}'";
     $order = "sejour_id DESC";
     $sejour->loadObject($where, $order);
     if (!$sejour->_id) {
         throw new CMbException("La séjour du patient '{$patient->nom}' n'a pas été retrouvé");
     }
     return $sejour;
 }