$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; }
/** * 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; }
$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; }