/** * Charge le séjour associé * * @return CSejour */ function loadRefSejour() { $this->_ref_sejour = new CSejour(); $this->_ref_sejour->load($this->sejour_id); $this->_ref_sejour->loadRefsFwd(); return $this->_ref_sejour; }
} CAppUI::setMsg("{$action} {$txt}", UI_MSG_OK); } //récupération de l'identifiant du séjour à fusionner $sejour_id_merge = CValue::post("sejour_id_merge"); // Récupération du rpu $rpu_id = CValue::post("rpu_id"); $rpu = new CRPU(); $rpu->load($rpu_id); $sejour = $rpu->loadRefSejour(); $sejour_rpu = $sejour; $properties_sejour = $sejour->getProperties(); //Cas d'une collision ou d'un rattachement d'un séjour if ($sejour_id_merge) { $sejour_merge = new CSejour(); $sejour_merge->load($sejour_id_merge); $sejour_merge->entree_reelle = $sejour->entree_reelle; $sejour_merge->mode_entree_id = $sejour->mode_entree_id; $sejour_merge->mode_entree = $sejour->mode_entree; $sejour_merge->provenance = $sejour->provenance; $msg = $sejour_merge->merge(array($sejour)); viewMsg($msg, "Fusion"); $sejour = $sejour_merge; $rpu->sejour_id = $sejour_merge->_id; } // Creation d'un séjour reliquat if (!CAppUI::conf("dPurgences create_sejour_hospit")) { // Clonage $sejour_rpu = new CSejour(); foreach ($properties_sejour as $name => $value) { $sejour_rpu->{$name} = $value;
if (isset($_POST["sc_venue_id"])) { $mbSejour->_NDA = $_POST["sc_venue_id"]; } if (isset($_POST["cmca_uf_code"])) { $object->code_uf = $_POST["cmca_uf_code"]; } if (isset($_POST["cmca_uf_libelle"])) { $object->libelle_uf = $_POST["cmca_uf_libelle"]; } } break; case "CSejour": $object = new CSejour(); // Chargement du séjour et génération du document $sejour_id = CValue::post("mb_sejour_id", CValue::getOrSession("object_id")); if ($object->load($sejour_id)) { $object->loadRefs(); $object->loadRefDossierMedical(); $object->loadNDA(); $NDA = $object->_NDA; $object->_ref_patient->loadIPP(); $IPP = $object->_ref_patient->_IPP; if (isset($_POST["sc_patient_id"])) { $object->_ref_patient->_IPP = $_POST["sc_patient_id"]; } if (isset($_POST["sc_venue_id"])) { $object->_NDA = $_POST["sc_venue_id"]; } } break; }
/** * Admit ? * * @param CSejour $mbVenue Admit * @param array $data Datas * * @return bool */ function admitFound(CSejour $mbVenue, $data) { $sender = $this->_ref_sender; $idSourceVenue = CValue::read($data, "idSourceVenue"); $idCibleVenue = CValue::read($data, "idCibleVenue"); $NDA = new CIdSante400(); if ($idSourceVenue) { $NDA = CIdSante400::getMatch("CSejour", $sender->_tag_sejour, $idSourceVenue); } if ($NDA->_id) { $mbVenue->load($NDA->object_id); return true; } if ($mbVenue->load($idCibleVenue)) { return true; } return false; }
<?php /* $Id $ */ /** * @package Mediboard * @subpackage hl7 * @version $Revision:$ * @author SARL OpenXtrem * @license GNU General Public License, see http://www.gnu.org/licenses/gpl.html */ CCanDo::checkAdmin(); $action = CValue::post("action", "modify"); $sejour = new CSejour(); switch ($action) { case "modify": while (!$sejour->load(rand(1, 5000))) { } // randomize libelle $sejour->libelle = $sejour->libelle ? $sejour->libelle : "un libelle pour le mettre dans l'ordre"; $libelle = str_split($sejour->libelle); shuffle($libelle); $sejour->libelle = implode("", $libelle); break; case "create": //$sejour->sample(); $sejour->group_id = 1; $sejour->praticien_id = 73; $sejour->patient_id = rand(1, 5000); $sejour->entree_prevue = CMbDT::dateTime(); $sejour->sortie_prevue = CMbDT::dateTime("+1 day"); //$patient->updateFormFields();
//$canModule = $module->canDo(); //$canModule->needsEdit(); $prat_id = CValue::post("_prat_id"); $patient_id = CValue::post("patient_id"); $_operation_id = CValue::post("_operation_id"); $_datetime = CValue::post("_datetime"); $callback = CValue::post("callback"); $type = CValue::post("type"); $_in_suivi = CValue::post("_in_suivi", 0); $grossesse_id = CValue::post("grossesse_id"); $uf_soins_id = CValue::post("_uf_soins_id"); if (!$_datetime || $_datetime == "now") { $_datetime = CMbDT::dateTime(); } $sejour = new CSejour(); $sejour->load(CValue::post("sejour_id")); // Cas des urgences if ($sejour->type === "urg" && !$_in_suivi) { if ($_datetime < $sejour->entree || $_datetime > $sejour->sortie) { CAppUI::setMsg("La prise en charge doit être dans les bornes du séjour", UI_MSG_ERROR); CAppUI::redirect("m=dPurgences"); } $sejour->loadRefsConsultations(); if ($sejour->_ref_consult_atu->_id) { CAppUI::setMsg("Patient déjà pris en charge par un praticien", UI_MSG_ERROR); CAppUI::redirect("m=dPurgences"); } // Changement de praticien pour le sejour if (CAppUI::conf("dPurgences pec_change_prat")) { $sejour->praticien_id = $prat_id; if ($msg = $sejour->store()) {
$pat->_ext_codes_cim = $dossier_medical->_ext_codes_cim; } if (isset($_result["prescription_line_medicament_id"])) { $line = new CPrescriptionLineMedicament(); $line->load($_result["prescription_line_medicament_id"]); $pat->_distant_line = $line; } else { if (isset($_result["prescription_line_mix_item_id"])) { $line = new CPrescriptionLineMixItem(); $line->load($_result["prescription_line_mix_item_id"]); $pat->_distant_line = $line; } } if ($sejour_filled) { $sejour = new CSejour(); $sejour->load($_result["sejour_id"]); $pat->_distant_object = $sejour; $pat->_age_epoque = intval(CMbDT::daysRelative($pat->naissance, $sejour->entree) / 365); } else { if ($consult_filled) { $consult = new CConsultation(); $consult->load($_result["consultation_id"]); $pat->_distant_object = $consult; $consult->loadRefPlageConsult(); $pat->_age_epoque = intval(CMbDT::daysRelative($pat->naissance, $consult->_ref_plageconsult->date) / 365); } else { if ($interv_filled) { $interv = new COperation(); $interv->load($_result["operation_id"]); $interv->loadRefPlageOp(); $pat->_distant_object = $interv;
<?php /** * $Id$ * * @package Mediboard * @subpackage Urgences * @author SARL OpenXtrem <*****@*****.**> * @license GNU General Public License, see http://www.gnu.org/licenses/gpl.html * @version $Revision$ */ $consult_id = CValue::get("consult_id"); $sejour_id = CValue::get("sejour_id"); $consult = new CConsultation(); $consult->load($consult_id); $sejour = new CSejour(); $sejour->load($sejour_id)->loadRefPatient()->loadRefPhotoIdentite(); // Création du template $smarty = new CSmartyDP(); $smarty->assign("consult", $consult); $smarty->assign("sejour", $sejour); $smarty->display("inc_rpu_docitems.tpl");
/** * Fusion and recording a stay with an num_dos in the system * * @param CHPrimXMLAcquittementsPatients $dom_acq Acquittement * @param CPatient $newPatient Patient * @param array $data Datas * * @return string acquittement **/ function fusionVenue(CHPrimXMLAcquittementsPatients $dom_acq, CPatient $newPatient, $data) { $echg_hprim = $this->_ref_echange_hprim; $sender = $echg_hprim->_ref_sender; $sender->loadConfigValues(); $this->_ref_sender = $sender; // Traitement du patient $domEnregistrementPatient = new CHPrimXMLEnregistrementPatient(); $domEnregistrementPatient->_ref_echange_hprim = $echg_hprim; $msgAcq = $domEnregistrementPatient->enregistrementPatient($dom_acq, $newPatient, $data); if ($echg_hprim->statut_acquittement != "OK") { return $msgAcq; } $dom_acq = new CHPrimXMLAcquittementsPatients(); $dom_acq->_identifiant_acquitte = $data['identifiantMessage']; $dom_acq->_sous_type_evt = $this->sous_type; $dom_acq->_ref_echange_hprim = $echg_hprim; $commentaire = $avertissement = ""; $codes = array(); $mbVenue = new CSejour(); $mbVenueEliminee = new CSejour(); $newVenue = new CSejour(); // Si CIP if (!CAppUI::conf('smp server')) { // Acquittement d'erreur : identifiants source et cible non fournis pour le venue / venueEliminee if (!$data['idSourceVenue'] && !$data['idCibleVenue'] && !$data['idSourceVenueEliminee'] && !$data['idCibleVenueEliminee']) { return $dom_acq->generateAcquittementsError("E100", $commentaire, $newVenue); } $etatVenue = CHPrimXMLEvenementsPatients::getEtatVenue($data['venue']); $etatVenueEliminee = CHPrimXMLEvenementsPatients::getEtatVenue($data['venueEliminee']); $tag = $etatVenue == "préadmission" ? CAppUI::conf('dPplanningOp CSejour tag_dossier_pa') . $sender->_tag_sejour : $sender->_tag_sejour; $idexVenue = CIdSante400::getMatch("CSejour", $tag, $data['idSourceVenue']); if ($mbVenue->load($data['idCibleVenue'])) { // Pas de test dans le cas ou la fusion correspond à un changement de numéro de dossier if ($etatVenue == "préadmission" || $etatVenueEliminee != "préadmission") { if ($idexVenue->object_id && $mbVenue->_id != $idexVenue->object_id) { $commentaire = "L'identifiant source fait référence au séjour : {$idexVenue->object_id} "; $commentaire .= "et l'identifiant cible au séjour : {$mbVenue->_id}."; return $dom_acq->generateAcquittementsError("E104", $commentaire, $newVenue); } } } if (!$mbVenue->_id) { $mbVenue->_id = $idexVenue->object_id; } $tag = $etatVenue == "préadmission" ? CAppUI::conf('dPplanningOp CSejour tag_dossier_pa') . $sender->_tag_sejour : $sender->_tag_sejour; $idexVenueEliminee = CIdSante400::getMatch("CSejour", $tag, $data['idSourceVenueEliminee']); if ($mbVenueEliminee->load($data['idCibleVenueEliminee'])) { if ($idexVenueEliminee->object_id && $mbVenueEliminee->_id != $idexVenueEliminee->object_id) { $commentaire = "L'identifiant source fait référence au séjour : {$idexVenueEliminee->object_id} "; $commentaire .= "et l'identifiant cible au séjour : {$mbVenueEliminee->_id}."; return $dom_acq->generateAcquittementsError("E141", $commentaire, $mbVenueEliminee); } } if (!$mbVenueEliminee->_id) { $mbVenueEliminee->_id = $idexVenueEliminee->object_id; } $messages = array(); $avertissement = null; // Cas 0 : Aucun séjour if (!$mbVenue->_id && !$mbVenueEliminee->_id) { $newVenue->patient_id = $newPatient->_id; $newVenue->group_id = CGroups::loadCurrent()->_id; $messages = $this->mapAndStoreVenue($newVenue, $data, $etatVenueEliminee, $idexVenue, $idexVenueEliminee); } else { if ($mbVenue->_id || $mbVenueEliminee->_id) { // Suppression de l'identifiant du séjour trouvé if ($mbVenue->_id) { $newVenue->load($mbVenue->_id); $messages['msgNumDosVenue'] = $idexVenue->delete(); } else { if ($mbVenueEliminee->_id) { $newVenue->load($mbVenueEliminee->_id); $messages['msgNumDosVenueEliminee'] = $idexVenueEliminee->delete(); } } // Cas 0 $messages = $this->mapAndStoreVenue($newVenue, $data, $etatVenueEliminee, $idexVenue, $idexVenueEliminee); $commentaire = "Séjour modifié : {$newVenue->_id}."; } else { if ($mbVenue->_id && $mbVenueEliminee->_id) { // Suppression des identifiants des séjours trouvés $messages['msgNumDosVenue'] = $idexVenue->delete(); $messages['msgNumDosVenueEliminee'] = $idexVenueEliminee->delete(); // Transfert des backsref $mbVenueEliminee->transferBackRefsFrom($mbVenue); // Suppression de la venue a éliminer $mbVenueEliminee->delete(); // Cas 0 $newVenue->load($mbVenue->_id); $messages = $this->mapAndStoreVenue($newVenue, $data, $etatVenueEliminee, $idexVenue, $idexVenueEliminee); } } } $codes = array($messages['msgVenue'] ? $messages['_code_Venue'] == "store" ? "A103" : "A102" : ($messages['_code_Venue'] == "store" ? "I102" : "I101"), $messages['msgNumDosVenue'] ? "A105" : $messages['_code_NumDos']); if ($messages['msgVenue']) { $avertissement = $messages['msgVenue']; } $commentaire = CEAISejour::getComment($newVenue, $mbVenueEliminee); } return $echg_hprim->setAck($dom_acq, $codes, $avertissement, $commentaire, $newVenue); }
/** * Handle receive order message * * @param CHL7v2ReceiveOrderMessageResponse $ack Acknowledgment * @param CPatient $patient Person * @param array $data Data * * @return string|void */ function handle(CHL7v2ReceiveOrderMessageResponse $ack, CPatient $patient, $data) { $exchange_hl7v2 = $this->_ref_exchange_hl7v2; $sender = $exchange_hl7v2->_ref_sender; $sender->loadConfigValues(); $this->_ref_sender = $sender; $patientPI = CValue::read($data['personIdentifiers'], "PI"); if (!$patientPI) { return $exchange_hl7v2->setORRError($ack, "E007"); } $IPP = CIdSante400::getMatch("CPatient", $sender->_tag_patient, $patientPI); // Patient non retrouvé par son IPP if (!$IPP->_id) { return $exchange_hl7v2->setORRError($ack, "E105"); } $patient->load($IPP->object_id); $venueAN = $this->getVenueAN($sender, $data); $NDA = CIdSante400::getMatch("CSejour", $sender->_tag_sejour, $venueAN); // Séjour non retrouvé par son NDA if (!$NDA->_id) { return $exchange_hl7v2->setORRError($ack, "E205"); } $sejour = new CSejour(); $sejour->load($NDA->object_id); // Common order - ORC $orc = $data["ORC"]; $obr = $data["OBR"]; $event_request = $this->getEventRequest($orc); $consultation = new CConsultation(); $placer_id = $this->getPlacerNumber($orc); $filler_id = $this->getFillerNumber($orc); switch ($event_request) { // new order case "SN": $datetime = $this->getDate($orc); $orc12 = $this->getDoctorNode($orc, $data); $mediuser = new CMediusers(); $medisuer_id = $this->getDoctor($orc12, $mediuser); if (!$medisuer_id) { return $exchange_hl7v2->setORRError($ack, "E801"); } $consultation->createByDatetime($datetime, $medisuer_id, $patient->_id); if (!$consultation->_id) { return $exchange_hl7v2->setORRError($ack, "E802"); } $idex = new CIdSante400(); $idex->id400 = $filler_id; $idex->tag = $sender->_tag_consultation; $idex->setObject($consultation); $idex->store(); break; //Modification //Modification case "SC": $consultation->load($placer_id); $status_code = $this->getStatusCode($orc); switch ($status_code) { case "CM": $status = CConsultation::TERMINE; break; case "OD": $status = CConsultation::PLANIFIE; break; case "IP": $status = CConsultation::EN_COURS; break; default: return $exchange_hl7v2->setORRError($ack, "E803"); } $consultation->chrono = $status; if ($msg = $consultation->store()) { return $exchange_hl7v2->setORRError($ack, "E804", $msg); } $obr4 = $this->getExamen("OBR.4", $obr, $data); //Identifiant de l'élément de prescription $examen_id = $this->getExamenID($obr4); $examen_name = $this->getExamenName($obr4); //todo gérer avec l'élément de prescription break; // cancel order request // cancel order request case "OC": $consultation->annule = "1"; if ($msg = $consultation->store()) { return $exchange_hl7v2->setORRError($ack, "E804", $msg); } $idex = CIdSante400::getMatchFor($consultation, $sender->_tag_consultation); $idex->id400 = "trash_{$idex->id400}"; if ($msg = $idex->store()) { return $exchange_hl7v2->setORRError($ack, "E805", $msg); } break; default: return $exchange_hl7v2->setORRError($ack, "E205"); } return $exchange_hl7v2->setORRSuccess($ack); }
// Cas des séances collectives if ($evenement->seance_collective_id) { CAppUI::displayMsg("Impossible de dupliquer des événements qui sont dans des seances collectives", "CEvenementSSR-msg-create"); continue; } // Autres rééducateurs global $can; $user = CAppUI::$user; $therapeute = $evenement->loadRefTherapeute(); if ($therapeute->function_id != $user->function_id && !$can->admin) { CAppUI::displayMsg("Impossible de dupliquer les événements d'un rééducateur d'une autre spécialié", "CEvenementSSR-msg-create"); continue; } // Chargements préparatoire au transferts automatiques de rééducateurs $sejour = new CSejour(); $sejour->load($evenement->sejour_id); $bilan = $sejour->loadRefBilanSSR(); $referant = $bilan->loadRefKineReferent(); $_day = CMbDT::date($evenement->debut); $therapeute_id = $evenement->therapeute_id; // Transfert kiné référent => kiné remplaçant si disponible if ($therapeute_id == $referant->_id) { $conge = new CPlageConge(); $conge->loadFor($therapeute_id, $_day); // Référent en congés if ($conge->_id) { $replacement = new CReplacement(); $replacement->conge_id = $conge->_id; $replacement->sejour_id = $sejour->_id; $replacement->loadMatchingObject(); if ($replacement->_id) {
/** * $Id$ * * @package Mediboard * @subpackage Urgences * @author SARL OpenXtrem <*****@*****.**> * @license GNU General Public License, see http://www.gnu.org/licenses/gpl.html * @version $Revision$ */ CCanDo::checkRead(); if (null == ($sip_barcode = CValue::get("sip_barcode"))) { return; } $values = array(); if (!preg_match("/SID([\\d]+)/i", $sip_barcode, $values)) { CAppUI::stepAjax("Le numéro saisi '%s' ne correspond pas à un idenfitiant de séjour", UI_MSG_WARNING, $sip_barcode); return; } $sejour = new CSejour(); $sejour->load($values[1]); if (!$sejour->_id) { CAppUI::stepAjax("Le séjour dont l'idenfitiant est '%s' n'existe pas", UI_MSG_WARNING, $sejour->_id); return; } $sejour->loadRefRPU(); if ($sejour->type != "urg" && !$sejour->_ref_rpu->_id) { CAppUI::stepAjax("Le séjour trouvé '%s' n'est pas un séjour d'urgences", UI_MSG_WARNING, $sejour->_view); return; } CAppUI::redirect("m=dPurgences&tab=vw_aed_rpu&sejour_id={$sejour->_id}");
$crequest->addLJoinClause("rpu", "`sejour`.`sejour_id` = `rpu`.`sejour_id`"); $crequest->addWhereClause("sejour.entree", "> '{$date}'"); $crequest->addGroup(array("`sejour_id`")); $crequest->addHaving(array("COUNT(`sejour`.`sejour_id`)>1")); $sejour = new CSejour(); $ds = $sejour->getDS(); $list_id_sejour = $ds->loadList($crequest->makeSelect()); usort($list_id_sejour, function ($a, $b) { return -strnatcmp($a["sortie"], $b["sortie"]); }); $list_sejour = array(); $patients = array(); $guesses = array(); foreach ($list_id_sejour as $_id_sejour) { $sejour = new CSejour(); $sejour->load($_id_sejour["sejour_id"]); $sejour->loadBackRefs("rpu"); $sejour->loadRefPatient(); $sejour->loadNDA(); if (!isset($patients[$sejour->patient_id])) { $patients["{$sejour->patient_id}"] = $sejour->_ref_patient; } $patients["{$sejour->patient_id}"]->_ref_sejours[$sejour->_id] = $sejour; } $mergeables_count = 0; foreach ($patients as $patient_id => $patient) { $patient->loadIPP(); $guess = array(); $nicer = array(); $guess["mergeable"] = isset($guesses[$patient_id]) ? true : false; // Sibling patients
if (!$_exchange->_id) { CAppUI::stepAjax("CExchangeAny-msg-delete", UI_MSG_ALERT); } CAppUI::stepAjax("CExchangeDataFormat-reprocessed"); } break; case "detect_collision": $collisions = array(); foreach ($exchanges as $_exchange) { if ($_exchange instanceof CExchangeHL7v2) { $hl7_message = new CHL7v2Message(); $hl7_message->parse($_exchange->_message); $xml = $hl7_message->toXML(null, false); $PV1 = $xml->queryNode("PV1"); $PV2 = $xml->queryNode("PV2"); $sejour = new CSejour(); $sejour->load($_exchange->object_id); $sejour_hl7 = new CSejour(); $sejour_hl7->entree_prevue = $xml->queryTextNode("PV2.8/TS.1", $PV2); $sejour_hl7->entree_reelle = $xml->queryTextNode("PV1.44/TS.1", $PV1); $sejour_hl7->sortie_prevue = $xml->queryTextNode("PV2.9/TS.1", $PV2); $sejour_hl7->sortie_reelle = $xml->queryTextNode("PV1.45/TS.1", $PV1); $collisions[] = array("hl7" => $sejour_hl7, "mb" => $sejour); } } $smarty->assign("collisions", $collisions); $smarty->display("inc_detect_collisions.tpl"); break; default: } CAppUI::js("next{$tool}()");
} $lit_id = CValue::post("lit_id"); $service_sortie_id = CValue::post("service_sortie_id"); $mode_sortie = CValue::post("mode_sortie"); $type = CValue::post("type"); $entree_preparee_trigger = CValue::post("_entree_preparee_trigger"); $sejour_id = CValue::post("sejour_id"); $create_affectation = CAppUI::conf("urgences create_affectation"); $sejour = new CSejour(); $sejour->load($sejour_id); $rpu = $sejour->loadRefRPU(); if ($rpu && $rpu->mutation_sejour_id) { $sejour_id = $sejour->_ref_rpu->mutation_sejour_id; } $sejour_hospit = new CSejour(); $sejour_hospit->load($sejour_id); $curr_affectation_hospit = $sejour_hospit->loadRefCurrAffectation(); // Pour un séjour ayant comme mode de sortie urgence: if ($create_affectation && $mode_sortie == "mutation" && $rpu && $rpu->_id && ($lit_id && $curr_affectation_hospit->lit_id != $lit_id || $service_sortie_id && $curr_affectation_hospit->service_id != $service_sortie_id)) { // Création de l'affectation d'hospitalisation $affectation_hospit = new CAffectation(); $affectation_hospit->entree = CMbDT::dateTime(); $affectation_hospit->lit_id = $lit_id; $affectation_hospit->service_id = $service_sortie_id; // Mutation en provenance des urgences $affectation_hospit->_mutation_urg = true; $sejour_hospit->forceAffectation($affectation_hospit); } // Lancement des formulaires automatiques sur le champ entrée préparée if ($sejour->_id && $entree_preparee_trigger && CModule::getActive("forms")) { $ex_class_events = CExClassEvent::getForObject($sejour, "preparation_entree_auto", "required");
// Création du template $smarty = new CSmartyDP(); $smarty->assign("praticien_id", $praticien_id); $smarty->assign("list_fields", $list_fields); $smarty->assign("patient", $patient); $smarty->assign("sejour", $sejour); $smarty->assign("intervention", $intervention); $smarty->assign("sejour_intervention", $sejour_intervention); $smarty->assign("msg_error", $msg_error); $smarty->display("dhe_externe.tpl"); return; } } // Gestion du séjour if ($sejour_id) { $sejour_resultat->load($sejour_id); if ($sejour_resultat->_id) { $sejour = $sejour_resultat; if (!$sejour->libelle) { $sejour->libelle = "automatique"; } $sejour_ok = true; } } if ($praticien_id && $sejour->libelle && !$sejour_ok) { $sejour->group_id = CGroups::loadCurrent()->_id; $sejour->praticien_id = $praticien_id; $sejour->patient_id = $patient->_id; if (!($msg_error = $sejour->check())) { // On recherche un séjour existant $sejour->updatePlainFields();
<?php /** * $Id$ * * @category Admissions * @package Mediboard * @author SARL OpenXtrem <*****@*****.**> * @license GNU General Public License, see http://www.gnu.org/licenses/gpl.html * @version $Revision$ * @link http://www.mediboard.org */ CCanDo::checkRead(); // Chargement du séjour s'il y en a un $sejour = new CSejour(); $sejour->load(CValue::get("sejour_id")); $service_id = $sejour->service_sortie_id; $service = new CService(); $service->load($service_id); // Chargement des services $order = "nom"; $services = $service->loadList(null, $order); // Création du template $smarty = new CSmartyDP(); $smarty->assign("service", $service); $smarty->assign("services", $services); $smarty->display("inc_vw_services.tpl");
* @version $Revision$ */ $sejour_id = CValue::post("sejour_id"); $original_sejour_id = CValue::post("original_sejour_id"); $sejour = new CSejour(); $sejour->load($sejour_id); // Chargement de la prescription de sejour $sejour->loadRefPrescriptionSejour(); // Verification que la prescription est vide if ($sejour->_ref_prescription_sejour->countBackRefs("prescription_line_element")) { CAppUI::setMsg("Impossible de dupliquer l'ancien séjour car ce séjour possède déjà une prescription", UI_MSG_WARNING); CAppUI::redirect('m=ssr&tab=vw_aed_sejour_ssr&sejour_id=' . $sejour_id); } // Chargement du sejour à dupliquer $original_sejour = new CSejour(); $original_sejour->load($original_sejour_id); // Chargement des references: bilan, fiche d'autonomie, prescriptions, evenements $bilan_ssr = $original_sejour->loadRefBilanSSR(); $fiche_autonomie = $original_sejour->loadRefFicheAutonomie(); $prescription_sejour = $original_sejour->loadRefPrescriptionSejour(); $lines_element = $prescription_sejour->loadRefsLinesElement(); // Chargement evenements de la derniere semaine complete $original_last_friday = CMbDT::date("last friday", CMbDT::date("+ 1 DAY", $original_sejour->sortie)); $monday = CMbDT::date("last monday", $original_last_friday); $next_monday = CMbDT::date("next monday", $monday); // 1er vendredi du nouveau sejour $next_friday = CMbDT::date("next friday", CMbDT::date("- 1 DAY", $sejour->entree)); // Calcul du nombre de decalage entre les 2 sejours $nb_decalage = CMbDT::daysRelative($original_last_friday, $next_friday); $evenement_ssr = new CEvenementSSR(); $where = array();
/** * Record admit * * @param CHPrimXMLAcquittementsPatients $dom_acq Acquittement * @param CPatient $newPatient Patient * @param array $data Data * @param CSejour &$newVenue Admit * * @return CHPrimXMLAcquittementsPatients $msgAcq **/ function venuePatient(CHPrimXMLAcquittementsPatients $dom_acq, CPatient $newPatient, $data, &$newVenue = null) { $echg_hprim = $this->_ref_echange_hprim; // Cas 1 : Traitement du patient $domEnregistrementPatient = new CHPrimXMLEnregistrementPatient(); $domEnregistrementPatient->_ref_echange_hprim = $echg_hprim; $msgAcq = $domEnregistrementPatient->enregistrementPatient($dom_acq, $newPatient, $data); if ($echg_hprim->statut_acquittement != "OK") { return $msgAcq; } // Cas 2 : Traitement de la venue $dom_acq = new CHPrimXMLAcquittementsPatients(); $dom_acq->_identifiant_acquitte = $data['identifiantMessage']; $dom_acq->_sous_type_evt = $this->sous_type; $dom_acq->_ref_echange_hprim = $echg_hprim; // Traitement du message des erreurs $avertissement = $msgID400 = $msgVenue = $msgNDA = ""; $_code_Venue = $_code_NumDos = $_num_dos_create = $_modif_venue = false; $sender = $echg_hprim->_ref_sender; $sender->loadConfigValues(); $this->_ref_sender = $sender; $idSourceVenue = $data['idSourceVenue']; $idCibleVenue = $data['idCibleVenue']; if (!$newVenue) { $newVenue = new CSejour(); } // Cas d'une annulation $cancel = false; if ($data['action'] == "suppression") { $cancel = true; } // Affectation du patient $newVenue->patient_id = $newPatient->_id; // Affectation de l'établissement $newVenue->group_id = $sender->group_id; $commentaire = ""; $codes = array(); // Si CIP if (!CAppUI::conf('smp server')) { // Acquittement d'erreur : identifiants source et cible non fournis pour le patient / venue if (!$idSourceVenue && !$idCibleVenue) { return $echg_hprim->setAckError($dom_acq, "E100", $commentaire, $newVenue); } $nda = CIdSante400::getMatch("CSejour", $sender->_tag_sejour, $idSourceVenue); // idSource non connu if (!$nda->_id) { // idCible fourni if ($idCibleVenue) { if ($newVenue->load($idCibleVenue)) { // Dans le cas d'une annulation de la venue if ($cancel) { if ($msgAcq = $this->doNotCancelVenue($newVenue, $dom_acq, $echg_hprim)) { return $msgAcq; } } // Recherche d'un num dossier déjà existant pour cette venue // Mise en trash du numéro de dossier reçu $newVenue->loadNDA(); if ($this->trashNDA($newVenue, $sender)) { $nda->_trash = true; } else { // Mapping du séjour si pas de numéro de dossier $newVenue = $this->mappingVenue($data['venue'], $newVenue, $cancel); $msgVenue = CEAISejour::storeSejour($newVenue, $sender); $commentaire = CEAISejour::getComment($newVenue); $_code_NumDos = "I121"; $_code_Venue = true; } } else { $_code_NumDos = "I120"; } } else { $_code_NumDos = "I122"; } if (!$newVenue->_id) { // Mapping du séjour $newVenue->_NDA = $nda->id400; $newVenue = $this->mappingVenue($data['venue'], $newVenue, $cancel); // Séjour retrouvé if (CAppUI::conf("hprimxml strictSejourMatch")) { if ($newVenue->loadMatchingSejour(null, true, $sender->_configs["use_sortie_matching"])) { // Dans le cas d'une annulation de la venue if ($cancel) { if ($msgAcq = $this->doNotCancelVenue($newVenue, $dom_acq, $echg_hprim)) { return $msgAcq; } } // Recherche d'un num dossier déjà existant pour cette venue // Mise en trash du numéro de dossier reçu $newVenue->loadNDA(); if ($this->trashNDA($newVenue, $sender)) { $nda->_trash = true; } else { // Mapping du séjour $newVenue = $this->mappingVenue($data['venue'], $newVenue, $cancel); $msgVenue = CEAISejour::storeSejour($newVenue, $sender); $commentaire = CEAISejour::getComment($newVenue); $_code_NumDos = "A121"; $_code_Venue = true; } } } else { $collision = $newVenue->getCollisions(); if (count($collision) == 1) { $newVenue = reset($collision); // Dans le cas d'une annulation de la venue if ($cancel) { if ($msgAcq = $this->doNotCancelVenue($newVenue, $dom_acq, $echg_hprim)) { return $msgAcq; } } // Recherche d'un num dossier déjà existant pour cette venue // Mise en trash du numéro de dossier reçu $newVenue->loadNDA(); if ($this->trashNDA($newVenue, $sender)) { $nda->_trash = true; } else { // Mapping du séjour $newVenue = $this->mappingVenue($data['venue'], $newVenue, $cancel); $msgVenue = CEAISejour::storeSejour($newVenue, $sender); $commentaire = CEAISejour::getComment($newVenue); $_code_NumDos = "A122"; $_code_Venue = true; } } } if (!$newVenue->_id && !isset($nda->_trash)) { // Mapping du séjour $newVenue = $this->mappingVenue($data['venue'], $newVenue, $cancel); $msgVenue = CEAISejour::storeSejour($newVenue, $sender); $commentaire = CEAISejour::getComment($newVenue); } } if (isset($nda->_trash)) { $nda->tag = CAppUI::conf('dPplanningOp CSejour tag_dossier_trash') . $sender->_tag_sejour; $nda->loadMatchingObject(); $codes = array("I125"); $commentaire = "Sejour non récupéré. Impossible d'associer le numéro de dossier."; } if ($cancel) { $codes[] = "A130"; $nda->tag = CAppUI::conf('dPplanningOp CSejour tag_dossier_trash') . $sender->_tag_sejour; } $msgNDA = CEAISejour::storeNDA($nda, $newVenue, $sender); if (!isset($nda->_trash)) { $codes = array($msgVenue ? $_code_Venue ? "A103" : "A102" : ($_code_Venue ? "I102" : "I101"), $msgNDA ? "A105" : $_code_NumDos); } if ($msgVenue || $msgNDA) { $avertissement = $msgVenue . " " . $msgNDA; } else { if (!isset($nda->_trash)) { $commentaire .= "Numéro dossier créé : {$nda->id400}."; } } } else { $newVenue->_NDA = $nda->id400; $newVenue->load($nda->object_id); // Dans le cas d'une annulation de la venue if ($cancel) { if ($msgAcq = $this->doNotCancelVenue($newVenue, $dom_acq, $echg_hprim)) { return $msgAcq; } } // Mapping du séjour $newVenue = $this->mappingVenue($data['venue'], $newVenue, $cancel); // idCible non fourni if (!$idCibleVenue) { $_code_NumDos = "I123"; } else { $tmpVenue = new CSejour(); // idCible connu if ($tmpVenue->load($idCibleVenue)) { if ($tmpVenue->_id != $nda->object_id) { $commentaire = "L'identifiant source fait référence au séjour : {$nda->object_id}"; $commentaire .= "et l'identifiant cible au séjour : {$tmpVenue->_id}."; return $dom_acq->generateAcquittementsError("E104", $commentaire, $newVenue); } $_code_NumDos = "I124"; } else { $_code_NumDos = "A120"; } } $msgVenue = CEAISejour::storeSejour($newVenue, $sender); $codes = array($msgVenue ? "A103" : "I102", $_code_NumDos); if ($cancel) { $codes[] = "A130"; $nda->tag = CAppUI::conf('dPplanningOp CSejour tag_dossier_trash') . $sender->_tag_sejour; $nda->last_update = CMbDT::dateTime(); $msgNDA = $nda->store(); } if ($msgVenue || $msgNDA) { $avertissement = $msgVenue . " " . $msgNDA; } $commentaire = CEAISejour::getComment($newVenue); } return $echg_hprim->setAck($dom_acq, $codes, $avertissement, $commentaire, $newVenue); } }
/** * Handle event A44 - move account information - patient account number * * @param CHL7Acknowledgment $ack Acknowledgment * @param CPatient $newPatient Person * @param array $data Datas * * @return string */ function handleA44(CHL7Acknowledgment $ack, CPatient $newPatient, $data) { // Traitement du message des erreurs $comment = ""; $exchange_hl7v2 = $this->_ref_exchange_hl7v2; $sender = $exchange_hl7v2->_ref_sender; // Impossibilité dans Mediboard de modifier le patient d'un séjour if (CAppUI::conf("dPplanningOp CSejour patient_id") == 0) { return $exchange_hl7v2->setAckAR($ack, "E700", null, $newPatient); } // On considère que l'on a qu'un changement à faire if (count($data["merge"]) > 1) { return $exchange_hl7v2->setAckAR($ack, "E701", null, $newPatient); } $data = CMbArray::get($data["merge"], 0); $venue = new CSejour(); $mbPatient = new CPatient(); $mbPatientChange = new CPatient(); $patientPI = CValue::read($data['personIdentifiers'], "PI"); $patientRI = CValue::read($data['personIdentifiers'], "RI"); $patientChangePI = CValue::read($data['personChangeIdentifiers'], "PI"); $patientChangeRI = CValue::read($data['personChangeIdentifiers'], "RI"); // Acquittement d'erreur : identifiants RI et PI non fournis if (!$patientRI && !$patientPI || !$patientChangeRI && !$patientChangePI) { return $exchange_hl7v2->setAckAR($ack, "E100", null, $newPatient); } $idexPatient = CIdSante400::getMatch("CPatient", $sender->_tag_patient, $patientPI); if ($mbPatient->load($patientRI)) { if ($mbPatient->_id != $idexPatient->object_id) { $comment = "L'identifiant source fait référence au patient : {$idexPatient->object_id}"; $comment .= " et l'identifiant cible au patient : {$mbPatient->_id}."; return $exchange_hl7v2->setAckAR($ack, "E601", $comment, $newPatient); } } if (!$mbPatient->_id) { $mbPatient->load($idexPatient->object_id); } $idexPatientChange = CIdSante400::getMatch("CPatient", $sender->_tag_patient, $patientChangePI); if ($mbPatientChange->load($patientChangeRI)) { if ($mbPatientChange->_id != $idexPatientChange->object_id) { $comment = "L'identifiant source fait référence au patient : {$idexPatientChange->object_id}"; $comment .= "et l'identifiant cible au patient : {$mbPatientChange->_id}."; return $exchange_hl7v2->setAckAR($ack, "E602", $comment, $newPatient); } } if (!$mbPatientChange->_id) { $mbPatientChange->load($idexPatientChange->object_id); } if (!$mbPatient->_id || !$mbPatientChange->_id) { $comment = !$mbPatient->_id ? "Le patient {$mbPatient->_id} est inconnu dans Mediboard." : "Le patient {$mbPatientChange->_id} est inconnu dans Mediboard."; return $exchange_hl7v2->setAckAR($ack, "E603", $comment, $newPatient); } $venueAN = $this->getVenueAN($sender, $data); $NDA = CIdSante400::getMatch("CSejour", $sender->_tag_sejour, $venueAN); if (!$venueAN && !$NDA->_id) { return $exchange_hl7v2->setAckAR($ack, "E604", $comment, $mbPatient); } $venue->load($NDA->object_id); // Impossibilité dans Mediboard de modifier le patient d'un séjour ayant une entrée réelle if (CAppUI::conf("dPplanningOp CSejour patient_id") == 2 && $venue->entree_reelle) { return $exchange_hl7v2->setAckAR($ack, "E605", null, $venue); } if ($venue->patient_id != $mbPatientChange->_id) { return $exchange_hl7v2->setAckAR($ack, "E606", null, $venue); } $venue->patient_id = $mbPatient->_id; if ($msg = $venue->store()) { return $exchange_hl7v2->setAckAR($ack, "E607", $msg, $venue); } $comment = CEAISejour::getComment($venue); return $exchange_hl7v2->setAckAA($ack, "I600", $comment, $venue); }
/** * $Id:$ * * @package Mediboard * @subpackage dPfacturation * @author SARL OpenXtrem <*****@*****.**> * @license GNU General Public License, see http://www.gnu.org/licenses/gpl.html * @version $Revision:$ */ CCanDo::checkEdit(); $facture_class = CValue::getOrSession("facture_class"); $object_id = CValue::getOrSession("object_id"); $object_class = CValue::getOrSession("object_class"); $patient_id = CValue::getOrSession("patient_id"); $numero = CValue::get("numero"); /* @var CFacture $facture*/ $facture = new $facture_class(); $facture->_sejour_id = $object_id; $facture->patient_id = $patient_id; $facture->loadRefPatient()->loadRefsCorrespondantsPatient(); $sejour = new CSejour(); $sejour->load($object_id); $sejour->loadRefsFactureEtablissement(); $facture->ouverture = $sejour->_ref_last_facture->ouverture; $facture->statut_pro = $sejour->_ref_last_facture->statut_pro; $facture->numero = $numero + 1; $facture->praticien_id = $sejour->praticien_id; // Création du template $smarty = new CSmartyDP(); $smarty->assign("facture", $facture); $smarty->display("vw_edit_facture.tpl");
$validation_naissance = true; $naissance->operation_id = $operation_id; } $naissance->date_time = $date_time; storeObject($naissance); $sejour = $naissance->loadRefSejourEnfant(); $patient = new CPatient(); $patient->load($sejour->patient_id); $patient->nom = $nom; $patient->prenom = $prenom; $patient->nom = $nom; $patient->sexe = $sexe; $patient->naissance = $date_naissance; storeObject($patient); $sejour_enfant = new CSejour(); $sejour_enfant->load($naissance->sejour_enfant_id); $sejour_enfant->praticien_id = $praticien_id; $sejour_enfant->_naissance = true; storeObject($sejour_enfant); // Effectuer l'admission si nécessaire (si issu d'un dossier provisoire) if ($validation_naissance) { // On passe la date de naissance du bébé au jour courant $patient->naissance = CMbDT::date(); storeObject($patient); // L'entrée réelle du séjour à maintenant $sejour_enfant->entree_reelle = $datetime; storeObject($sejour_enfant); // Checker également si l'affectation de la maman existe // Et dans ce cas, la créer pour le bébé if ($curr_affect->_id) { $affectation = $sejour_enfant->loadRefCurrAffectation();
function admitFound($NDA, CSejour $sejour) { $sender = $this->_ref_sender; // NDA $idexNDA = CIdSante400::getMatch("CSejour", $sender->_tag_sejour, $NDA); if ($idexNDA->_id) { $sejour->load($idexNDA->object_id); return true; } return false; }
$patient = new CPatient(); // Si on passe un numéro de dossier, // on charge le patient et le séjour correspondant if ($NDA = CValue::get("NDA")) { $sejour->loadFromNDA($NDA); if ($sejour->_id && $sejour->group_id == $group->_id) { $patient = $sejour->loadRefPatient(); CValue::setSession("sejour_id", $sejour->_id); CValue::setSession("patient_id", $patient->_id); } } // Si on n'a pas récupéré de patient via le numero de dossier, // on charge le dossier en session if (!$patient->_id) { $patient->load(CValue::getOrSession("patient_id")); $sejour->load(CValue::getOrSession("sejour_id")); // Si le séjour a un patient différent de celui selectionné, // on le déselectionne if ($patient->_id && $sejour->_id && $sejour->patient_id != $patient->_id) { CValue::setSession("sejour_id"); $sejour = new CSejour(); } // Si on a un séjour mais pas de patient, // on utilise le patient du séjour if ($sejour->_id && !$patient->_id) { $patient->load($sejour->patient_id); CValue::setSession("patient_id", $patient->_id); } } // Si on a un patient, // on charge ses références
/** * Mapping et enregistrement de la naissance * * @param CSejour $newVenue Admit * @param array $data Datas * * @return string|null */ function mapAndStoreNaissance(CSejour $newVenue, $data) { if ($this->queryTextNode("PV1.4", $data["PV1"]) != "N") { return null; } // Récupération du séjour de la maman if (!($mother_AN = $this->getANMotherIdentifier($data["PID"]))) { return CAppUI::tr("CHL7Event-AA-E227"); } $sender = $this->_ref_sender; $idex_mother = CIdSante400::getMatch("CSejour", $sender->_tag_sejour, $mother_AN); if (!$idex_mother->_id) { return CAppUI::tr("CHL7Event-AA-E228"); } $sejour_mother = new CSejour(); $sejour_mother->load($idex_mother->object_id); // Récupération de l'IPP de la maman if (!($mother_PI = $this->getPIMotherIdentifier($data["PID"]))) { return CAppUI::tr("CHL7Event-AA-E229"); } if (CIdSante400::getMatch("CPatient", $sender->_tag_patient, $mother_PI)->object_id != $sejour_mother->patient_id) { return CAppUI::tr("CHL7Event-AA-E230"); } $naissance = new CNaissance(); $naissance->sejour_enfant_id = $newVenue->_id; $naissance->sejour_maman_id = $sejour_mother->_id; $naissance->grossesse_id = $sejour_mother->grossesse_id; $naissance->loadMatchingObject(); $naissance->rang = $this->queryTextNode("PID.25", $data["PID"]); // On récupère l'entrée réelle ssi msg A01 pour indiquer l'heure de la naissance if ($this->_ref_exchange_hl7v2->code == "A01") { $naissance->date_time = $this->queryTextNode("PV1.44", $data["PV1"]); } // Notifier les autres destinataires autre que le sender $naissance->_eai_sender_guid = $sender->_guid; return $naissance->store(); }
/** * Enregistrement des interventions * * @param CHPrimXMLAcquittementsServeurActivitePmsi $dom_acq DOM Acquittement * @param CMbObject $mbObject Object * @param array $data Data that contain the nodes * * @return string Acquittement **/ function handle(CHPrimXMLAcquittementsServeurActivitePmsi $dom_acq, CMbObject $mbObject, $data) { $operation = $mbObject; $exchange_hprim = $this->_ref_echange_hprim; $sender = $exchange_hprim->_ref_sender; $sender->loadConfigValues(); $this->_ref_sender = $sender; $warning = null; $comment = null; // Acquittement d'erreur : identifiants source du patient / séjour non fournis if (!$data['idSourcePatient'] || !$data['idSourceVenue']) { return $exchange_hprim->setAckError($dom_acq, "E206", null, $mbObject); } // IPP non connu => message d'erreur $IPP = CIdSante400::getMatch("CPatient", $sender->_tag_patient, $data['idSourcePatient']); if (!$IPP->_id) { return $exchange_hprim->setAckError($dom_acq, "E013", null, $mbObject); } // Chargement du patient $patient = new CPatient(); $patient->load($IPP->object_id); // Num dossier non connu => message d'erreur $NDA = CIdSante400::getMatch("CSejour", $sender->_tag_sejour, $data['idSourceVenue']); if (!$NDA->_id) { return $exchange_hprim->setAckError($dom_acq, "E014", null, $mbObject); } // Chargement du séjour $sejour = new CSejour(); $sejour->load($NDA->object_id); // Si patient H'XML est différent du séjour if ($sejour->patient_id != $patient->_id) { return $exchange_hprim->setAckError($dom_acq, "E015", null, $mbObject); } // Chargement du patient du séjour $sejour->loadRefPatient(); $operation->sejour_id = $sejour->_id; // Mapping du séjour $sejour = $this->mappingVenue($data['venue'], $sejour); // Notifier les autres destinataires autre que le sender $sejour->_eai_sender_guid = $sender->_guid; /* TODO Supprimer ceci après l'ajout des times picker */ $sejour->_hour_entree_prevue = null; $sejour->_min_entree_prevue = null; $sejour->_hour_sortie_prevue = null; $sejour->_min_sortie_prevue = null; if ($msgVenue = $sejour->store()) { return $exchange_hprim->setAck($dom_acq, "A102", $msgVenue, null, $sejour); } // idex de l'intervention $idex = CIdSante400::getMatch("COperation", $sender->_tag_hprimxml, $data['idSourceIntervention']); if ($idex->_id) { $operation_source = new COperation(); $operation_source->load($idex->object_id); if ($operation_source->sejour_id != $sejour->_id) { return $exchange_hprim->setAckError($dom_acq, "E204", null, $mbObject); } $operation = $operation_source; } // ID Mediboard de l'intervention if ($data['idCibleIntervention']) { $operation_source = new COperation(); $operation_source->load($data['idCibleIntervention']); if ($operation_source->sejour_id != $sejour->_id) { return $exchange_hprim->setAckError($dom_acq, "E204", null, $mbObject); } if ($idex->_id && $operation->_id != $operation_source->_id) { return $exchange_hprim->setAckError($dom_acq, "E205", null, $mbObject); } $operation = $operation_source; } // Recherche de la salle $salle = $this->getSalle($data['intervention'], $sejour); if ($salle->nom && !$salle->_id) { $comment = "Salle '{$salle->nom}' inconnue dans l'infrastructure de l'établissement"; return $exchange_hprim->setAckError($dom_acq, "E202", $comment, $mbObject); } $operation->salle_id = $salle->_id; // Mapping du chirurgien $mediuser = $this->getParticipant($data['intervention'], $sejour); if ($mediuser->adeli && !$mediuser->_id || !$mediuser->adeli) { $comment = $mediuser->adeli ? "Participant '{$mediuser->adeli}' inconnu" : "Le code ADELI n'est pas renseigné"; return $exchange_hprim->setAckError($dom_acq, "E203", $comment, $mbObject); } $operation->chir_id = $mediuser->_id; // Mapping de la plage $this->mappingPlage($data['intervention'], $operation); $plageop_id = $operation->plageop_id; // Recherche d'une intervention existante sinon création if (!$operation->_id) { $operation->loadMatchingObject(); } // Si pas trouvé on recherche en hors plage if (!$operation->_id) { $operation->loadRefPlageOp(); $operation->plageop_id = null; $operation->temp_operation = null; $operation->time_operation = null; $operation->date = $operation->_ref_plageop->_id ? $operation->_ref_plageop->date : $operation->date; if ($operation->countMatchingList() == 1) { $operation->loadMatchingObject(); } if (!$operation->_id && $plageop_id) { $operation->plageop_id = $plageop_id; $operation->date = null; } } // Mapping de l'intervention $this->mappingIntervention($data, $operation); // Store de l'intervention // Notifier les autres destinataires autre que le sender $operation->_eai_sender_guid = $sender->_guid; $msgInterv = $operation->store(); CEAIMbObject::storeIdex($idex, $operation, $sender); $modified_fields = CEAIMbObject::getModifiedFields($operation); $codes = array($msgInterv ? "A201" : "I201"); if ($msgInterv) { $warning .= $msgInterv . " "; } else { $comment .= "Intervention : {$operation->_id}."; $comment .= $modified_fields ? " Les champs mis à jour sont les suivants : {$modified_fields}." : null; } return $exchange_hprim->setAck($dom_acq, $codes, $warning, $comment, $operation); }
/** * Enregistrement des actes CCAM * * @param CHPrimXMLAcquittementsServeurActivitePmsi $dom_acq DOM Acquittement * @param CMbObject $mbObject Object * @param array $data Data that contain the nodes * * @return string Acquittement **/ function handle(CHPrimXMLAcquittementsServeurActivitePmsi $dom_acq, CMbObject $mbObject, $data) { /** @var COperation $mbObject */ $exchange_hprim = $this->_ref_echange_hprim; $sender = $exchange_hprim->_ref_sender; $sender->loadConfigValues(); $this->_ref_sender = $sender; // Acquittement d'erreur : identifiants source du patient / séjour non fournis if (!$data['idSourcePatient'] || !$data['idSourceVenue']) { return $exchange_hprim->setAckError($dom_acq, "E206", null, $mbObject, $data); } // IPP non connu => message d'erreur $IPP = CIdSante400::getMatch("CPatient", $sender->_tag_patient, $data['idSourcePatient']); if (!$IPP->_id) { return $exchange_hprim->setAckError($dom_acq, "E013", null, $mbObject, $data); } // Chargement du patient $patient = new CPatient(); $patient->load($IPP->object_id); // Num dossier non connu => message d'erreur $NDA = CIdSante400::getMatch("CSejour", $sender->_tag_sejour, $data['idSourceVenue']); if (!$NDA->_id) { return $exchange_hprim->setAckError($dom_acq, "E014", null, $mbObject, $data); } // Chargement du séjour $sejour = new CSejour(); $sejour->load($NDA->object_id); // Si patient H'XML est différent du séjour if ($sejour->patient_id != $patient->_id) { return $exchange_hprim->setAckError($dom_acq, "E015", null, $mbObject, $data); } // Chargement du patient du séjour $sejour->loadRefPatient(); //Mapping actes CCAM $actes = array("CCAM" => $this->mappingActesCCAM($data), "NGAP" => $this->mappingActesNGAP($data)); $codes = array(); $warning = array(); foreach ($actes as $type => $_actes) { foreach ($_actes as $_key => $_acte) { $return = $this->storeActe($_acte, $type, $sejour, $patient, $sender->_tag_hprimxml); $number = $type == "CCAM" ? "0" : "1"; //Cas d'une erreur lors de l'ajoutement if (!is_object($return)) { $warning["A401"][] = $return; $codes[$_acte["idSourceActe{$type}"]] = array("code" => "A4{$number}1", "commentaires" => $return); $actes[$type][$_key]["statut"] = "avt"; continue; } $actes[$type][$_key]["statut"] = "ok"; //Cas d'une modification ou d'un ajout if ($return->_id) { $codes[$_acte["idSourceActe{$type}"]] = array("code" => "I4{$number}1", "commentaires" => null); continue; } //Cas de la suppression $codes[$_acte["idSourceActe{$type}"]] = array("code" => "I4{$number}2", "commentaires" => null); } } return $exchange_hprim->setAck($dom_acq, $codes, $warning, null, $sejour, $actes); }
/** * @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; }
/** * $Id$ * * @category Soins * @package Mediboard * @author SARL OpenXtrem <*****@*****.**> * @license GNU General Public License, see http://www.gnu.org/licenses/gpl.html * @version $Revision$ */ CCanDo::checkEdit(); $consult_id = CValue::get("consult_id", 0); $sejour_id = CValue::get("sejour_id", 0); $chir_id = CValue::get("chir_id", 0); $sejour = new CSejour(); $sejour->load($sejour_id); if ($sejour->_id) { $chir = new CMediusers(); if ($chir_id) { $chir->load($chir_id); } else { $chir->load($sejour->praticien_id); } $sejour->loadRefPraticien(); $sejour->loadRefsActes(); $sejour->updateFormFields(); $sejour->_datetime = CMbDT::dateTime(); // Récupération des tarifs /** @var CTarif $tarif */ $tarif = new CTarif(); $tarifs = array();
/** * Trigger before event merge * * @param CMbObject $mbObject Object * * @throws CMbException * * @return bool */ function onBeforeMerge(CMbObject $mbObject) { if (!parent::onBeforeMerge($mbObject)) { return false; } // Si pas en mode alternatif if (!CAppUI::conf("alternative_mode")) { throw new CMbException("no_alternative_mode"); } $sejour = $mbObject; $sejour_elimine = new CSejour(); $sejour_elimine->load(reset($mbObject->_merging)); // Si Client if (!CAppUI::conf('smp server')) { $mbObject->_fusion = array(); foreach (CGroups::loadGroups() as $_group) { $sender = CMbObject::loadFromGuid($mbObject->_eai_sender_guid); if ($sender && $sender->group_id == $_group->_id) { continue; } $sejour->_NDA = null; $sejour->loadNDA($_group->_id); $sejour1_nda = $sejour->_NDA; $sejour_elimine->_NDA = null; $sejour_elimine->loadNDA($_group->_id); $sejour2_nda = $sejour_elimine->_NDA; // Passage en trash des NDA des séjours $tag_NDA = CSejour::getTagNDA($_group->_id); if (!$tag_NDA) { continue; } $idexSejour = new CIdSante400(); $idexSejour->tag = $tag_NDA; $idexSejour->object_class = "CSejour"; $idexSejour->object_id = $sejour->_id; $idexsSejour = $idexSejour->loadMatchingList(); $idexSejourElimine = new CIdSante400(); $idexSejourElimine->tag = $tag_NDA; $idexSejourElimine->object_class = "CSejour"; $idexSejourElimine->object_id = $sejour_elimine->_id; $idexsSejourElimine = $idexSejourElimine->loadMatchingList(); /** @var CIdSante400[] $idexs */ $idexs = array_merge($idexsSejour, $idexsSejourElimine); $idexs_changed = array(); if (count($idexs) > 1) { foreach ($idexs as $_idex) { // On continue pour ne pas mettre en trash le NDA du séjour que l'on garde if ($_idex->id400 == $sejour1_nda) { continue; } $old_tag = $_idex->tag; $_idex->tag = CAppUI::conf('dPplanningOp CSejour tag_dossier_trash') . $tag_NDA; $_idex->last_update = CMbDT::dateTime(); if (!($msg = $_idex->store())) { if ($_idex->object_id == $sejour_elimine->_id) { $idexs_changed[$_idex->_id] = $old_tag; } } } } if (!$sejour1_nda && !$sejour2_nda) { continue; } $mbObject->_fusion[$_group->_id] = array("sejourElimine" => $sejour_elimine, "sejour1_nda" => $sejour1_nda, "sejour2_nda" => $sejour2_nda, "idexs_changed" => $idexs_changed); } } $this->sendFormatAction("onBeforeMerge", $mbObject); return true; }