/** * Handle event A47 * * @param CHL7Acknowledgment $ack Acknowledgment * @param CPatient $patient Person * @param array $data Data * * @return string */ function handleA47(CHL7Acknowledgment $ack, CPatient $patient, $data) { $exchange_hl7v2 = $this->_ref_exchange_hl7v2; $sender = $exchange_hl7v2->_ref_sender; $sender->loadConfigValues(); $this->_ref_sender = $sender; $incorrect_identifier = null; // Traitement du mode simple, cad if (CHL7v2Message::$handle_mode == "simple") { $MRG_4 = $this->queryNodes("MRG.4", $data["MRG"])->item(0); $incorrect_identifier = $this->queryTextNode("CX.1", $MRG_4); $patient->load($incorrect_identifier); // ID non connu (non fourni ou non retrouvé) if (!$incorrect_identifier || !$patient->_id) { return $exchange_hl7v2->setAckAR($ack, "E141", null, $patient); } } else { $MRG_1 = $this->queryNodes("MRG.1", $data["MRG"])->item(0); if ($this->queryTextNode("CX.5", $MRG_1) == "PI") { $incorrect_identifier = $this->queryTextNode("CX.1", $MRG_1); } // Chargement de l'IPP $IPP_incorrect = new CIdSante400(); if ($incorrect_identifier) { $IPP_incorrect = CIdSante400::getMatch("CPatient", $sender->_tag_patient, $incorrect_identifier); } // PI non connu (non fourni ou non retrouvé) if (!$incorrect_identifier || !$IPP_incorrect->_id) { return $exchange_hl7v2->setAckAR($ack, "E141", null, $patient); } $patient->load($IPP_incorrect->object_id); // Passage en trash de l'IPP du patient a éliminer if ($msg = $patient->trashIPP($IPP_incorrect)) { return $exchange_hl7v2->setAckAR($ack, "E140", $msg, $patient); } } // Sauvegarde du nouvel IPP $IPP = new CIdSante400(); $IPP->object_id = $patient->_id; $IPP->object_class = "CPatient"; $IPP->id400 = $data['personIdentifiers']["PI"]; $IPP->tag = $sender->_tag_patient; $IPP->last_update = CMbDT::dateTime(); if ($msg = $IPP->store()) { return $exchange_hl7v2->setAckAR($ack, "E140", $msg, $patient); } return $exchange_hl7v2->setAckAA($ack, "I140", null, $patient); }
/** * Search and map a user inside the LDAP * * @param CUser $user * @param CSourceLDAP $source_ldap * @param resource $ldapconn * @param string $person [optional] * @param string $filter [optional] * @param boolean $force_create [optional] * * @return CUser */ static function searchAndMap(CUser $user, CSourceLDAP $source_ldap, $ldapconn, $person = null, $filter = null, $force_create = false) { if (!$person) { $person = $user->user_username; } $person = utf8_encode($person); if (!$filter) { $filter = "(samaccountname={$person})"; } $results = $source_ldap->ldap_search($ldapconn, $filter); if (!$results || $results["count"] == 0) { $user->_bound = false; $user->_count_ldap = 0; return $user; } if ($results["count"] > 1) { throw new CMbException("CSourceLDAP_too-many-results"); } $results = $results[0]; $idex = new CIdSante400(); $idex->tag = CAppUI::conf("admin LDAP ldap_tag"); $idex->object_class = "CUser"; $idex->id400 = self::getObjectGUID($results); $idex->loadMatchingObject(); // On sauvegarde le password renseigné $user_password = $user->user_password; $_user_password = $user->_user_password; // objectguid retrouvé on charge le user if ($idex->_id) { $user = new CUser(); $user->load($idex->object_id); } else { // objectguid non retrouvé on associe à l'user courant l'objectguid // Si on est pas en mode création on le recherche if (!$force_create) { // Suppression du password pour le loadMatchingObject $user->user_password = null; $user->_user_password = null; $user->loadMatchingObject(); if (!$user->_id) { throw new CMbException("Auth-failed-user-unknown"); } } } $user->_bound = true; $user = self::mapTo($user, $results); // Save Mediuser variables $actif = $user->_user_actif; $deb_activite = $user->_user_deb_activite; $fin_activite = $user->_user_fin_activite; // Restore User password variables $user->user_password = $user_password; $user->_user_password = $_user_password; if (!$user->user_type) { $user->user_type = 0; } // Pas de profil $user->template = 0; $user->user_login_errors = 0; $user->repair(); $msg = $user->store(); if ($msg) { throw new CMbException($msg); } if (!$force_create && !$user->_ref_mediuser->actif || $force_create && !$actif) { throw new CMbException("Auth-failed-user-deactivated"); } // Restore Mediuser variables $user->_user_actif = $actif; $user->_user_deb_activite = $deb_activite; $user->_user_fin_activite = $fin_activite; $user->_count_ldap = 1; if (!$idex->_id) { $idex->object_id = $user->_id; $idex->last_update = CMbDT::dateTime(); if ($msg = $idex->store()) { throw new CMbException($msg); } } return $user; }
/** * Store Acte * * @param String[] $data Value * @param String $type CCAM or NGAP * @param CSejour $sejour Sejour * @param CPatient $patient Patient * @param String $tag Tag * * @return String|CActe; */ function storeActe($data, $type, $sejour, $patient, $tag) { $code_acte = "code"; if ($type == "CCAM") { $field_object = "codes_ccam"; $code_acte = "code_acte"; } $action = $data["action"]; $idex = CIdSante400::getMatch("CActe{$type}", $tag, $data["idSourceActe{$type}"]); $executant_id = $data["executant_id"]; if ($idex->_id) { $class = "CActe{$type}"; /** @var CActeCCAM|CActeNGAP $acte */ $acte = new $class(); $acte->load($idex->object_id); $object = $acte->loadTargetObject(); if ($action === "suppression") { if ($type == "CCAM") { $code = $acte->{$code_acte}; $replace = explode("|", $object->{$field_object}); CMbArray::removeValue($code, $replace); $object->{$field_object} = $replace ? implode("|", $replace) : ""; } if ($msg = $this->deleteActe($acte, $object, $idex)) { return $msg; } return $acte; } /** @var CActeCCAM|CActeNGAP $new_acte */ $new_acte = $this->{"createActe{$type}"}($data["acte{$type}"], $object, $executant_id); $modification = $new_acte->{$code_acte} != $acte->{$code_acte}; if ($modification) { if ($type == "CCAM") { $new_code = preg_replace("#{$acte}->{$code_acte}#", $new_acte->{$code_acte}, $object->{$field_object}, 1); $object->{$field_object} = $new_code; } if ($msg = $this->deleteActe($acte, $object, $idex)) { return $msg; } $acte = new $class(); } $acte->extendsWith($new_acte, true); if ($msg = $acte->store()) { return $msg; } if ($modification) { $idex->setObject($acte); if ($msg = $idex->store()) { return $msg; } } return $acte; } if ($action !== "création") { return "{$action} impossible car l'acte n'a pas été trouvé"; } $date = CMbDT::date($data["acte{$type}"]["date"]); $object = $this->getObject($date, $executant_id, $patient->_id); $object = $object ? $object : $sejour; /** @var CActe $acte */ $acte = $this->{"createActe{$type}"}($data["acte{$type}"], $object, $executant_id); if ($type == "CCAM") { $object->{$field_object} .= $object->{$field_object} ? "|{$acte->{$code_acte}}" : $acte->{$code_acte}; } if ($msg = $object->store()) { return $msg; } if ($msg = $acte->store()) { return $msg; } $idex = new CIdSante400(); $idex->id400 = $data["idSourceActe{$type}"]; $idex->tag = $tag; $idex->setObject($acte); if ($msg = $idex->store()) { return $msg; } return $acte; }
/** * Recording RI sender * * @param string $RI_sender Idex value * @param CPatient $patient Patient * @param CInteropSender $sender Sender * * @return null|string null if successful otherwise returns and error message */ static function storeRISender($RI_sender, CPatient $patient, CInteropSender $sender) { $domain = $sender->loadRefDomain(); $idex = new CIdSante400(); $idex->object_class = "CPatient"; $idex->object_id = $patient->_id; $idex->tag = $domain->tag; $idex->id400 = $RI_sender; return $idex->store(); }
/** * Merge an array of objects * * @param self[] $objects An array of CMbObject to merge * @param bool $fast Tell wether to use SQL (fast) or PHP (slow but checked and logged) algorithm * * @return string|null */ function merge($objects, $fast = false) { $alternative_mode = $this->_id != null; // Modes and object count check if ($alternative_mode && count($objects) > 1) { return "mergeAlternativeTooManyObjects"; } if (!$alternative_mode && count($objects) < 2) { return "mergeTooFewObjects"; } // Trigger before event $this->notify("BeforeMerge"); if (!$this->_id && ($msg = $this->store())) { $this->notify("MergeFailure"); return $msg; } foreach ($objects as $object) { $this->_merging[$object->_id] = $object; } foreach ($objects as &$object) { $msg = $fast ? $this->fastTransferBackRefsFrom($object) : $this->transferBackRefsFrom($object); if ($msg) { $this->notify("MergeFailure"); return $msg; } $object_id = $object->_id; $object->_mergeDeletion = true; if ($msg = $object->delete()) { return $msg; } // If external IDs are available, we save old objects' id as external IDs if (CModule::getInstalled("dPsante400")) { $idex = new CIdSante400(); $idex->setObject($this); $idex->tag = "merged"; $idex->id400 = $object_id; $idex->last_update = CMbDT::dateTime(); $idex->store(); } } // Trigger after event $this->notify("AfterMerge"); return $this->store(); }
/** * Trigger when merge failed * * @param CMbObject $mbObject Object * * @return bool */ function onMergeFailure(CMbObject $mbObject) { if (!$this->isHandled($mbObject)) { return false; } // On va réatribuer les idexs en cas de problème dans la fusion foreach ($mbObject->_fusion as $group_id => $infos_fus) { if (!$infos_fus || !array_key_exists("idexs_changed", $infos_fus)) { return false; } foreach ($infos_fus["idexs_changed"] as $idex_id => $tag_name) { $idex = new CIdSante400(); $idex->load($idex_id); if (!$idex->_id) { continue; } // Réattribution sur l'objet non supprimé $sejour_elimine = $infos_fus["sejourElimine"]; $idex->object_id = $sejour_elimine->_id; $idex->tag = $tag_name; $idex->last_update = CMbDT::dateTime(); $idex->store(); } } }
* @license GNU General Public License, see http://www.gnu.org/licenses/gpl.html * @version SVN: $Id:$ * @link http://www.mediboard.org */ CApp::setTimeLimit(240); CApp::setMemoryLimit("512M"); CCanDo::checkAdmin(); $d1_id = CValue::request("domain_1_id"); $d2_id = CValue::request("domain_2_id"); $idex_ids = CValue::request("idex_ids", array()); /* Traitement prélable pour passer en "trash" les idexs en erreurs */ foreach ($idex_ids as $_idex => $idex_id) { $idex = new CIdSante400(); $idex->load($idex_id); $idex->tag = "trash_{$idex->tag}"; $idex->store(); } /* checkMerge */ $domains_id = array($d1_id, $d2_id); $domains = array(); $checkMerge = array(); if (count($domains_id) != 2) { $checkMerge[] = CAppUI::tr("mergeTooFewObjects"); } foreach ($domains_id as $domain_id) { $domain = new CDomain(); // the CMbObject is loaded if (!$domain->load($domain_id)) { CAppUI::setMsg("Chargement impossible de l'objet [{$domain_id}]", UI_MSG_ERROR); continue; }
if ($verouillee) { $tagCatalogue = CAppUI::conf('dPlabo CCatalogueLabo remote_name'); $prescription_labo_id = CValue::post("prescription_labo_id"); $prescription = new CPrescriptionLabo(); $prescription->load($prescription_labo_id); if (!$prescription->verouillee) { $prescription->loadRefsFwd(); // Chargement de l'id400 "labo code4" du praticien $prat =& $prescription->_ref_praticien; $tagCode4 = "labo code4"; $idSantePratCode4 = new CIdSante400(); $idSantePratCode4->loadLatestFor($prat, $tagCode4); // creation de l'id400 de la prescription $idPresc = new CIdSante400(); //Paramétrage de l'id 400 $idPresc->tag = "{$tagCatalogue} Prat:" . str_pad($idSantePratCode4->id400, 4, '0', STR_PAD_LEFT); // tag LABO Prat: 0017 $idPresc->object_class = "CPrescriptionLabo"; // Chargement du dernier id externe de prescription du praticien s'il existe $idPresc->loadMatchingObject("id400 DESC"); // Incrementation de l'id400 $idPresc->id400++; $idPresc->id400 = str_pad($idPresc->id400, 4, '0', STR_PAD_LEFT); $idPresc->_id = null; $idPresc->last_update = CMbDT::dateTime(); $idPresc->object_id = $prescription->_id; $idPresc->store(); } } $do = new CDoObjectAddEdit("CPrescriptionLabo"); $do->doIt();
/** * Recording idex * * @param CIdSante400 $idex Object id400 * @param CMbObject $object Object * @param CInteropSender $sender Sender * * @return null|string null if successful otherwise returns and error message */ static function storeIdex(CIdSante400 $idex, CMbObject $object, CInteropSender $sender) { $idex->object_id = $object->_id; $idex->last_update = CMbDT::dateTime(); return $idex->store(); }
/** * store the idex * * @param CPatient|CSejour $object patient or sejour * @param String[] $identifier identifiers * @param String $tag tag * * @return null|String */ function storeIdex($object, $identifier, $tag) { $idex = new CIdSante400(); $idex->tag = "{$tag}"; $idex->id400 = "{$identifier}"; $idex->setObject($object); $idex->loadMatchingObject(); if ($msg = $idex->store()) { return $msg; } return null; }
/** * @see parent::store() */ function store() { $this->completeField("type"); if ($this->type == "alle") { $this->loadRefDossierMedical(); $dossier_medical = $this->_ref_dossier_medical; if ($dossier_medical->object_class == "CPatient") { DSHM::remKeys("alertes-*-CPatient-" . $dossier_medical->object_id); } } // Save owner and creation date if (!$this->_id) { if (!$this->creation_date) { $this->creation_date = CMbDT::dateTime(); } if (!$this->owner_id) { $this->owner_id = CMediusers::get()->_id; } } // Standard store if ($msg = parent::store()) { return $msg; } // DossierMedical store $this->checkCodeCim10(); // Sauvegarde de l'identifiant externe (code composant de la BDM pour le cas des allergies) if ($this->_idex_code && $this->_idex_tag) { $idex = new CIdSante400(); $idex->setObject($this); $idex->id400 = $this->_idex_code; $idex->tag = $this->_idex_tag; $idex->store(); } return null; }
/** * Mapping et enregistrement de la venue * * @param CSejour &$newVenue Séjour * @param array $data Datas * @param string $etatVenueEliminee État de la venue à éliminer * @param CIdSante400 &$idexVenue Idex de la venue * @param CIdSante400 &$idexVenueEliminee Idex de la venue à éliminer * * @return array */ private function mapAndStoreVenue(&$newVenue, $data, $etatVenueEliminee, CIdSante400 &$idexVenue, CIdSante400 &$idexVenueEliminee) { $sender = new CDestinataireHprim(); $sender->nom = $data['idClient']; $sender->loadMatchingObject(); $messages = array(); // Mapping de la venue a éliminer $newVenue = $this->mappingVenue($data['venueEliminee'], $newVenue); // Mapping de la venue a garder $newVenue = $this->mappingVenue($data['venue'], $newVenue); // Notifier les autres destinataires $newVenue->_eai_sender_guid = $sender->_guid; // Séjour retrouvé if ($newVenue->loadMatchingSejour() || $newVenue->_id) { $messages['_code_NumDos'] = "A121"; $messages['_code_Venue'] = "store"; } else { $messages['_code_NumDos'] = "I122"; $messages['_code_Venue'] = "create"; } $messages['msgVenue'] = $newVenue->store(); $messages['commentaire'] = CEAISejour::getComment($newVenue); $idexVenue->object_id = $newVenue->_id; $idexVenue->last_update = CMbDT::dateTime(); $messages['msgNumDosVenue'] = $idexVenue->store(); $idexVenueEliminee->tag = $etatVenueEliminee != "préadmission" ? CAppUI::conf('dPplanningOp CSejour tag_dossier_cancel') . $sender->_tag_sejour : CAppUI::conf('dPplanningOp CSejour tag_dossier_pa') . $sender->_tag_sejour; $idexVenueEliminee->object_id = $newVenue->_id; $idexVenueEliminee->last_update = CMbDT::dateTime(); $messages['msgNumDosVenueEliminee'] = $idexVenueEliminee->store(); return $messages; }
/** * 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); }
$mediuser->insGroupPermission(); $results[$i]["result"] = 0; $results[$i]["username"] = $mediuser->_user_username; $results[$i]["password"] = $mediuser->_user_password; $number_idex = $results[$i]["idex"]; if (!$number_idex) { continue; } $idex = new CIdSante400(); $idex->tag = CMediusers::getTagMediusers($group_id); $idex->id400 = $number_idex; if ($idex->loadMatchingObject()) { $unfound["idex"][$number_idex] = true; CAppUI::setMsg("Identifiant déjà existant", UI_MSG_WARNING); continue; } $idex->setObject($mediuser); $msg = $idex->store(); if ($msg) { CAppUI::setMsg($msg, UI_MSG_ERROR); } } fclose($fp); } CAppUI::callbackAjax('$("systemMsg").insert', CAppUI::getMsg()); // Création du template $smarty = new CSmartyDP(); $smarty->assign("dryrun", $dryrun); $smarty->assign("results", $results); $smarty->assign("unfound", $unfound); $smarty->display("user_import_csv.tpl");
function getIdExterne() { $idExterne = new CIdSante400(); // Chargement de l'id externe de la prescription (tag: Imeds) $idExterne->loadLatestFor($this, "iMeds"); if (!$idExterne->_id) { // Afactoriser : assez complexe (concatenation du code 4 praticien et du code 4 prescription) $tagCatalogue = CAppUI::conf('dPlabo CCatalogueLabo remote_name'); $this->loadRefsFwd(); $prat =& $this->_ref_praticien; $tagCode4 = "labo code4"; $idSantePratCode4 = new CIdSante400(); $idSantePratCode4->loadLatestFor($prat, $tagCode4); $idPresc = new CIdSante400(); $idPresc->tag = "{$tagCatalogue} Prat:" . str_pad($idSantePratCode4->id400, 4, '0', STR_PAD_LEFT); // tag LABO Prat: 0017 $idPresc->object_class = "CPrescriptionLabo"; $idPresc->loadMatchingObject("id400 DESC"); $numprovisoire = str_pad($idSantePratCode4->id400, 4, '0', STR_PAD_LEFT) . str_pad($idPresc->id400, 4, '0', STR_PAD_LEFT); // Envoi à la source créée 'get_id_prescriptionlabo' (SOAP) $exchange_source = CExchangeSource::get("get_id_prescriptionlabo", "soap"); $exchange_source->setData(array("NumMedi" => $numprovisoire, "pwd" => $exchange_source->password)); $exchange_source->send("NDOSLAB"); $idExterne->tag = "iMeds"; $idExterne->object_class = "CPrescriptionLabo"; $idExterne->object_id = $this->_id; $idExterne->id400 = $exchange_source->getACQ()->NDOSLABResult; $idExterne->last_update = CMbDT::dateTime(); $idExterne->store(); } return $idExterne; }
<?php /** * $Id$ * * @category CDA * @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 */ $group_type = CValue::post("group_type"); $group_id = CValue::post("group_id"); $group = new CGroups(); $group->load($group_id); $idex = new CIdSante400(); $idex->tag = "cda_association_code"; $idex->setObject($group); $idex->loadMatchingObject(); $idex->last_update = CMbDT::dateTime(); $idex->id400 = $group_type; if ($group_type && ($msg = $idex->store())) { CAppUI::setMsg($msg, UI_MSG_ERROR); } CAppUI::setMsg("Configuration effectué");
$where["entree"] = "BETWEEN '{$date_min}' AND '{$date_max}'"; $where["type"] = "!= 'consult'"; $where["annule"] = "= '0'"; $listSej = $sejour->loadList($where); if (count($listSej) > 1) { $moresej++; continue; } if (!count($listSej)) { continue; } $sejour = reset($listSej); if ($sejour->_id) { $nda->object_id = $sejour->_id; $nda->last_update = CMbDT::dateTime(); $nda->store(); $_sejour->sejour_id = $sejour->_id; $_sejour->store(); $echg_hprim->object_class = $nda->object_class; $echg_hprim->object_id = $nda->object_id; $echg_hprim->id_permanent = $nda->id400; $echg_hprim->store(); $nouv++; } } CAppUI::stepAjax("Séjours utilisés : '{$total}'"); CAppUI::stepAjax("Séjours sans patient rapprochés : '{$nopat}'"); CAppUI::stepAjax("Séjours anciennement rapprochés : '{$anc}'"); CAppUI::stepAjax("Séjours multiples trouvés : '{$moresej}'"); CAppUI::stepAjax("Nouveaux séjours rapprochés : '{$nouv}'"); if ($total - $nopat - $anc - $moresej > 0) {
/** * Recording NDA * * @param CIdSante400 $NDA Object id400 * @param CSejour $sejour Admit * @param CInteropSender $sender Sender * * @return null|string null if successful otherwise returns and error message */ static function storeNDA(CIdSante400 $NDA, CSejour $sejour, CInteropSender $sender) { /* Gestion du numéroteur */ $group = new CGroups(); $group->load($sender->group_id); $group->loadConfigValues(); // Purge du NDA existant sur le séjour et on le remplace par le nouveau if ($sender->_configs["purge_idex_movements"]) { // On charge le NDA courant du séjour $sejour->loadNDA($sender->group_id); $ref_NDA = $sejour->_ref_NDA; if ($ref_NDA) { // Si le NDA actuel est identique à celui qu'on reçoit on ne fait rien if ($ref_NDA->id400 == $NDA->id400) { return; } // On passe le NDA courant en trash $ref_NDA->tag = CAppUI::conf("dPplanningOp CSejour tag_dossier_trash") . $ref_NDA->tag; $ref_NDA->_eai_sender_guid = $sender->_guid; $ref_NDA->store(); } // On sauvegarde le nouveau $NDA->tag = $sender->_tag_sejour; $NDA->object_class = "CSejour"; $NDA->object_id = $sejour->_id; $NDA->last_update = CMbDT::dateTime(); $NDA->_eai_sender_guid = $sender->_guid; return $NDA->store(); } // Génération du NDA ? // Non if (!$group->_configs["smp_idex_generator"]) { if (!$NDA->id400) { return null; } if ($sejour) { $NDA->object_id = $sejour->_id; } $NDA->last_update = CMbDT::dateTime(); $NDA->_eai_sender_guid = $sender->_guid; return $NDA->store(); } else { $NDA_temp = CIdSante400::getMatch("CSejour", $sender->_tag_sejour, null, $sejour->_id); if ($NDA_temp->_id) { return; } // Pas de NDA passé if (!$NDA->id400) { if (!CIncrementer::generateIdex($sejour, $sender->_tag_sejour, $sender->group_id)) { return CAppUI::tr("CEAISejour-error-generate-idex"); } return null; } else { $incrementer = $sender->loadRefGroup()->loadDomainSupplier("CSejour"); if ($incrementer && $NDA->id400 < $incrementer->range_min || $NDA->id400 > $incrementer->range_max) { return CAppUI::tr("CEAISejour-idex-not-in-the-range"); } $NDA->object_id = $sejour->_id; $NDA->last_update = CMbDT::dateTime(); $NDA->_eai_sender_guid = $sender->_guid; return $NDA->store(); } } }
/** * @see parent::cancel() */ function cancel($docItem) { $this->initClientSOAP(); // Identifiant de la dernière transaction concernant le document if (null == ($transactionId = $this->getTransactionId($docItem))) { return; } $parameters = array("idTransaction" => $transactionId); // Annulation de la transaction if (null == ($transactionAnnulationId = $this->clientSOAP->cancelDocument($parameters))) { return; } $transactionAnnulationId = $transactionAnnulationId->cancelDocumentResult; // Création de l'identifiant externe $idex = new CIdSante400(); //Paramétrage de l'id 400 $idex->object_class = $docItem->_class; $idex->tag = CMedinetSender::$tag; // Affectation de l'id400 a la transaction $idex->id400 = $transactionAnnulationId; $idex->object_id = $docItem->_id; $idex->_id = null; $idex->last_update = CMbDT::dateTime(); $idex->store(); // Change l'etat du document $docItem->etat_envoi = "non"; return true; }
function mapAndStorePayment(DOMNode $node, CFactureCabinet $facture, CIdSante400 $idex) { $reglement = new CReglement(); $reglement->load($idex->object_id); // Recherche du règlement si pas retrouvé par son idex $reglement->setObject($facture); $reglement->date = $this->getDatePayment($node) . " 00:00:00"; $amount_paid = $this->getAmountPaid($node); $reglement->montant = $amount_paid; $direction = $this->getDirection($node); if ($direction == "-") { $reglement->montant = $reglement->montant * -1; } $reglement->emetteur = "tiers"; $reglement->mode = "autre"; $reglement->loadOldObject(); if ($reglement->_old && round($reglement->montant, 3) == round($reglement->_old->montant, 3)) { return $reglement; } // Mise à jour du montant (du_tiers) de la facture $value = $reglement->_old ? $reglement->montant - $reglement->_old->montant : $reglement->montant; // Acquittement de la facture associée ? if ($msg = $reglement->store()) { return $msg; } // Gestion de l'idex if (!$idex->object_id) { $idex->object_id = $reglement->_id; } $idex->last_update = CMbDT::dateTime(); if ($msg = $idex->store()) { return $msg; } if ($direction != "+") { return $reglement; } return $reglement; }
/** * Handle event * * @param CHL7Acknowledgment $ack Acknowledgement * @param CPatient $patient Person * @param array $data Nodes data * * @return null|string */ function handle(CHL7Acknowledgment $ack, CPatient $patient, $data) { // Traitement du message des erreurs $comment = ""; $object = null; $exchange_hl7v2 = $this->_ref_exchange_hl7v2; $exchange_hl7v2->_ref_sender->loadConfigValues(); $sender = $this->_ref_sender = $exchange_hl7v2->_ref_sender; // Patient $patientPI = CValue::read($data['personIdentifiers'], "PI"); if (!$patientPI) { return $exchange_hl7v2->setAckAR($ack, "E007", null, $patient); } $IPP = CIdSante400::getMatch("CPatient", $sender->_tag_patient, $patientPI); // Patient non retrouvé par son IPP if (!$IPP->_id) { return $exchange_hl7v2->setAckAR($ack, "E105", null, $patient); } $patient->load($IPP->object_id); $sejour = null; // Sejour $venueAN = CValue::read($data["personIdentifiers"], "AN"); if (!$venueAN) { $venueAN = CValue::read($data["admitIdentifiers"], "AN"); } if ($venueAN) { $NDA = CIdSante400::getMatch("CSejour", $sender->_tag_sejour, $venueAN); // Séjour non retrouvé par son NDA if (!$NDA->_id) { return $exchange_hl7v2->setAckAR($ack, "E205", null, $patient); } /** @var CSejour $sejour */ $sejour = $NDA->loadTargetObject(); if (!$sejour->_id) { return $exchange_hl7v2->setAckAR($ack, "E220", null, $patient); } if ($sejour->patient_id !== $patient->_id) { return $exchange_hl7v2->setAckAR($ack, "E606", null, $patient); } } // Pas d'observations $first_result = reset($data["observations"]); if (!$first_result) { return $exchange_hl7v2->setAckAR($ack, "E225", null, $patient); } // Recherche par date $observation_dt = $this->getOBRObservationDateTime($first_result["OBR"]); if (!$sejour) { $sejours = $patient->getCurrSejour($observation_dt); //FIXME ignorer les annulés $sejour = reset($sejours); if (!$sejour || !$sejour->_id) { return $exchange_hl7v2->setAckAR($ack, "E220", null, $patient); } } // Récupération des observations foreach ($data["observations"] as $_observation) { // Récupération de la date du relevé $observation_dt = $this->getOBRObservationDateTime($_observation["OBR"]); $name = $this->getOBRServiceIdentifier($_observation["OBR"]); // OBR identity identifier $OBR_identity_identifier = null; $handle_OBR_identity_identifier = $sender->_configs["handle_OBR_identity_identifier"]; if ($handle_OBR_identity_identifier) { $OBR_identity_identifier = $this->queryTextNode($handle_OBR_identity_identifier, $_observation["OBR"]); } foreach ($_observation["OBX"] as $key => $_OBX) { $status = $this->getObservationResultStatus($_OBX); if ($status === "X") { continue; } // OBX.2 : Value type $value_type = $this->getOBXValueType($_OBX); $date = $observation_dt ? $observation_dt : $this->getOBXObservationDateTime($_OBX); $praticien_id = $this->getObservationAuthor($_OBX); // Recherche de l'objet avec la date correspondante fourni dans l'observation $object = $this->getObjectWithDate($date, $patient, $praticien_id, $sejour); if (!$object || !$object->_id) { return $exchange_hl7v2->setAckAR($ack, "E301", null, $patient); } $name = $name . $key; switch ($value_type) { // Reference Pointer to External Report case "RP": if (!$this->getReferencePointerToExternalReport($_OBX, $object, $name)) { return $exchange_hl7v2->setAckAR($ack, $this->codes, null, $object); } break; // Encapsulated Data // Encapsulated Data case "ED": if (!$this->getEncapsulatedData($_OBX, $object, $name)) { return $exchange_hl7v2->setAckAR($ack, $this->codes, null, $object); } break; // Pulse Generator and Lead Observation Results // Pulse Generator and Lead Observation Results case "ST": case "CWE": case "DTM": case "NM": case "SN": if (!$this->getPulseGeneratorAndLeadObservationResults($_OBX, $patient, $object, $observation_dt)) { return $exchange_hl7v2->setAckAR($ack, $this->codes, null, $object); } break; // Not supported // Not supported default: return $exchange_hl7v2->setAckAR($ack, "E302", null, $object); } // On store l'idex de l'identifiant du système tiers $idex = new CIdSante400(); $idex->object_class = $object->_class; $idex->object_id = $object->_id; $idex->tag = "OBR_{$sender->_tag_hl7}"; $idex->id400 = $OBR_identity_identifier; $idex->loadMatchingObject(); $idex->store(); } } return $exchange_hl7v2->setAckCA($ack, $this->codes, $comment, $object); }
static function generateIdex(CMbObject $object, $tag, $group_id) { $group = CGroups::loadFromGuid("CGroups-{$group_id}"); // On préfère générer un identifiant d'un établissement virtuel pour les séjours non-facturables $group_id_pour_sejour_facturable = CAppUI::conf('dPsante400 CDomain group_id_pour_sejour_facturable', $group); if ($object instanceof CSejour && !$object->facturable && $group_id_pour_sejour_facturable) { $group_id = $group_id_pour_sejour_facturable; } $group_domain = new CGroupDomain(); $group_domain->object_class = $object->_class; $group_domain->group_id = $group_id; $group_domain->master = 1; $group_domain->loadMatchingObject(); if (!$group_domain->_id) { return; } $domain = $group_domain->loadRefDomain(); $conf = CAppUI::conf("dPsante400 CIncrementer"); $cluster_count = abs(intval($conf["cluster_count"])); $cluster_position = abs(intval($conf["cluster_position"])); if ($cluster_count == 0) { $cluster_count = 1; } if ($cluster_count == 1) { $cluster_position = 0; } $mutex = new CMbSemaphore("incrementer-{$object->_class}"); $mutex->acquire(); $incrementer = $domain->loadRefIncrementer(); // Chargement du dernier 'increment' s'il existe sinon on déclenche une erreur if (!$incrementer->_id) { $mutex->release(); return; } // Incrementation de l'idex $value = $incrementer->value; // Valeur compatible avec la position dans le cluster do { $value++; } while ($value % $cluster_count != $cluster_position); do { // Idex vraiment disponible ? $idex = new CIdSante400(); $idex->object_class = $object->_class; $idex->tag = $tag; $idex->id400 = self::formatValue($object, $incrementer->pattern, $value); $idex->loadMatchingObject(); } while ($idex->_id && ($value += $cluster_count)); $incrementer->value = $value; $incrementer->last_update = CMbDT::dateTime(); $incrementer->store(); // Création de l'identifiant externe $idex->object_id = $object->_id; $idex->last_update = CMbDT::dateTime(); $idex->store(); $mutex->release(); return $idex; }
/** * Store the external ID of the given object * * @param CMbObject $object The MB to store the external ID of * @param string $db_id The Import ID to store on the MB Object * * @return string The external ID store error message */ function storeIdExt(CMbObject $object, $db_id) { $id_ext = new CIdSante400(); $id_ext->setObject($object); $id_ext->tag = $this->getImportTag(); $id_ext->id400 = $db_id; $id_ext->escapeValues(); $id_ext->loadMatchingObject(); $id_ext->last_update = CMbDT::dateTime(); $id_ext->unescapeValues(); return $id_ext->store(); }
/** * Trash IPP * * @param CIdSante400 $IPP IPP * * @return string */ function trashIPP(CIdSante400 $IPP) { $IPP->tag = CAppUI::conf("dPpatients CPatient tag_ipp_trash") . $IPP->tag; $IPP->last_update = CMbDT::dateTime(); return $IPP->store(); }
$obj = new $class(); $key = $obj->_spec->key; $where = array(); $where[] = "{$field_sex} IS NULL OR {$field_sex} = 'u'"; $where["prenom"] = "IS NOT NULL"; $found = $obj->countList($where); CAppUI::stepAjax("Objets concernés : " . $found); $where[$key] = " > '{$start}' "; $objs = $obj->loadList($where, "{$key} ASC", "0, {$limit}"); if (count($objs)) { foreach ($objs as $_obj) { $idex->object_id = $_obj->_id; if ($msg = $_obj->store()) { CAppUI::stepAjax($msg, UI_MSG_WARNING); } else { CAppUI::stepAjax($_obj->{$field_sex} . " | " . $_obj->_view, $_obj->{$field_sex} == "u" ? UI_MSG_WARNING : UI_MSG_OK); } } if ($msg = $idex->store()) { CAppUI::stepAjax($msg, UI_MSG_ERROR); } } else { $use_callback = false; } } else { CAppUI::stepAjax("%s_not_managed_by_the_system", UI_MSG_ERROR, $class); } if ($callback && $use_callback) { CAppUI::js("getForm('{$callback}').onsubmit();"); } CApp::rip();