/** * Build PID segement * * @param CHL7v2Event $event Event * * @return null */ function build(CHL7v2Event $event) { parent::build($event); $message = $event->message; $sender = $event->_sender; $group = $sender->loadRefGroup(); $domains_returned = $this->domains_returned; $patient = $this->patient; $data = array(); // PID-1: Set ID - PID (SI) (optional) $data[] = $this->set_id; // PID-2: Patient ID (CX) (optional) $data[] = null; $identifiers = array(); if (empty($domains_returned)) { $idex = new CIdSante400(); $idex->object_id = $patient->_id; $idex->object_class = "CPatient"; $ljoin = array(); $ljoin[] = "group_domain AS g1 ON g1.domain_id = domain.domain_id AND g1.object_class = 'CPatient'"; foreach ($idex->loadMatchingList() as $_idex) { $domain = new CDomain(); $where["tag"] = " = '{$_idex->tag}'"; $domain->loadObject($where, null, null, $ljoin); if (!$domain->_id) { continue; } $identifiers[] = array($_idex->id400, null, null, $this->getAssigningAuthority("domain", null, null, $domain), "MR"); } } else { foreach ($domains_returned as $_domain_returned) { $assigning_authority = $this->getAssigningAuthority("domain", null, null, $_domain_returned); $identifiers[] = array(CIdSante400::getValueFor($patient, $_domain_returned->tag), null, null, $assigning_authority, "MR"); } } // PID-3: Patient Identifier List (CX) (repeating) $data[] = $identifiers; // PID-4: Alternate Patient ID - PID (CX) (optional repeating) $data[] = null; // PID-5: Patient Name (XPN) (repeating) $data[] = $this->getXPN($patient); // PID-6: Mother's Maiden Name (XPN) (optional repeating) $data[] = null; // PID-7: Date/Time of Birth (TS) (optional) $data[] = CMbDT::isLunarDate($patient->naissance) ? null : $patient->naissance; // PID-8: Administrative Sex (IS) (optional) // Table - 0001 // F - Female // M - Male // O - Other // U - Unknown // A - Ambiguous // N - Not applicable $data[] = CHL7v2TableEntry::mapTo("1", $patient->sexe); // PID-9: Patient Alias (XPN) (optional repeating) $data[] = null; // PID-10: Race (CE) (optional repeating) $data[] = null; // PID-11: Patient Address (XAD) (optional repeating) $address = array(); if ($patient->adresse || $patient->ville || $patient->cp) { $linesAdress = explode("\n", $patient->adresse, 2); $address[] = array(CValue::read($linesAdress, 0), str_replace("\n", $message->componentSeparator, CValue::read($linesAdress, 1)), $patient->ville, $patient->province, $patient->cp, CPaysInsee::getAlpha3($patient->pays_insee), "H"); } if ($patient->lieu_naissance || $patient->cp_naissance || $patient->pays_naissance_insee) { $address[] = array(null, null, $patient->lieu_naissance, null, $patient->cp_naissance, CPaysInsee::getAlpha3($patient->pays_naissance_insee), "BDL"); } $data[] = $address; // PID-12: County Code (IS) (optional) $data[] = null; // PID-13: Phone Number - Home (XTN) (optional repeating) // Table - 0201 // ASN - Answering Service Number // BPN - Beeper Number // EMR - Emergency Number // NET - Network (email) Address // ORN - Other Residence Number // PRN - Primary Residence Number // VHN - Vacation Home Number // WPN - Work Number // Table - 0202 // BP - Beeper // CP - Cellular Phone // FX - Fax // Internet - Internet Address: Use Only If Telecommunication Use Code Is NET // MD - Modem // PH - Telephone // TDD - Telecommunications Device for the Deaf // TTY - Teletypewriter $phones = array(); if ($patient->tel) { $area_city_code = null; $local_number = null; if ($sender->_configs["send_area_local_number"]) { $area_city_code = substr($patient->tel, 0, 3); $local_number = substr($patient->tel, 3); } $phones[] = array(null, "PRN", "PH", null, null, $area_city_code, $local_number, null, null, null, null, $sender->_configs["send_area_local_number"] ? null : $patient->tel); } $data[] = $phones; // PID-14: Phone Number - Business (XTN) (optional repeating) $data[] = null; // PID-15: Primary Language (CE) (optional) $data[] = null; // PID-16: Marital Status (CE) (optional) $data[] = null; // PID-17: Religion (CE) (optional) $data[] = null; // PID-18: Patient Account Number (CX) (optional) if ($this->sejour) { $sejour = $this->sejour; $sejour->loadNDA($group->_id); $domain = new CDomain(); $domain->tag = $sejour->getTagNDA(); $domain->loadMatchingObject(); $data[] = $sejour->_NDA ? array(array($sejour->_NDA, null, null, $this->getAssigningAuthority("domain", null, null, $domain))) : null; } else { $data[] = null; } // PID-19: SSN Number - Patient (ST) (optional) $data[] = $patient->matricule; // PID-20: Driver's License Number - Patient (DLN) (optional) $data[] = null; // PID-21: Mother's Identifier (CX) (optional repeating) $data[] = null; // PID-22: Ethnic Group (CE) (optional repeating) $data[] = null; // PID-23: Birth Place (ST) (optional) $data[] = null; // PID-24: Multiple Birth Indicator (ID) (optional) $data[] = null; // PID-25: Birth Order (NM) (optional) $data[] = $patient->rang_naissance; // PID-26: Citizenship (CE) (optional repeating) $data[] = null; // PID-27: Veterans Military Status (CE) (optional) $data[] = null; // PID-28: Nationality (CE) (optional) $data[] = null; // PID-29: Patient Death Date and Time (TS) (optional) $data[] = $patient->deces ? $patient->deces : null; // PID-30: Patient Death Indicator (ID) (optional) $data[] = $patient->deces ? "Y" : "N"; // PID-31: Identity Unknown Indicator (ID) (optional) $data[] = null; // PID-32: Identity Reliability Code (IS) (optional repeating) $data[] = null; // PID-33: Last Update Date/Time (TS) (optional) $data[] = null; // PID-34: Last Update Facility (HD) (optional) $data[] = null; // PID-35: Species Code (CE) (optional) $data[] = null; // PID-36: Breed Code (CE) (optional) $data[] = null; // PID-37: Strain (ST) (optional) $data[] = null; // PID-38: Production Class Code (CE) (optional) $data[] = null; // PID-39: Tribal Citizenship (CWE) (optional repeating) $data[] = null; $this->fill($data); }
/** * Handle event * * @param CHL7v2PatientDemographicsAndVisitResponse $ack Acknowledgement * @param CPatient $patient Person * @param array $data Nodes data * * @return null|string */ function handle(CHL7v2PatientDemographicsAndVisitResponse $ack, CPatient $patient, $data) { $exchange_hl7v2 = $this->_ref_exchange_hl7v2; $sender = $exchange_hl7v2->_ref_sender; $sender->loadConfigValues(); $this->_ref_sender = $sender; $ds = $patient->getDS(); $where = array(); foreach ($this->getRequestPatient($data["QPD"]) as $field => $value) { if ($value == "") { continue; } if (!in_array($field, array("naissance", "cp"))) { $value = preg_replace("/[^a-z\\d\\*]/i", "_", $value); $value = preg_replace("/\\*+/", "%", $value); } $where["patients.{$field}"] = $ds->prepare("LIKE %", $value); } $ljoin = null; $identifier_list = $this->getRequestPatientIdentifierList($data["QPD"]); if (count(array_filter($identifier_list)) > 0) { $ljoin[10] = "id_sante400 AS id_pat_list ON id_pat_list.object_id = patients.patient_id"; $where[] = "`id_pat_list`.`object_class` = 'CPatient'"; // Requête sur un IPP if (!empty($identifier_list["id_number"]) && empty($identifier_list["namespace_id"]) && empty($identifier_list["universal_id"]) && empty($identifier_list["universal_id_type"])) { $where[] = $ds->prepare("id_pat_list.id400 = %", $identifier_list["id_number"]); } if (!empty($identifier_list["id_number"]) && (!empty($identifier_list["namespace_id"]) || !empty($identifier_list["universal_id"]))) { $namespace_id = $identifier_list["namespace_id"]; $universal_id = $identifier_list["universal_id"]; $domain = new CDomain(); if ($namespace_id) { $domain->namespace_id = $namespace_id; } if ($universal_id) { $domain->OID = $universal_id; } if ($domain->tag || $domain->OID) { $domain->loadMatchingObject(); } $where[] = $ds->prepare("id_pat_list.id400 = %", $identifier_list["id_number"]); $where[] = $ds->prepare("id_pat_list.tag = %", $domain->tag); } if (empty($identifier_list["id_number"]) && (!empty($identifier_list["namespace_id"]) || !empty($identifier_list["universal_id"]))) { $namespace_id = $identifier_list["namespace_id"]; $universal_id = $identifier_list["universal_id"]; $domain = new CDomain(); if ($namespace_id) { $domain->namespace_id = $namespace_id; } if ($universal_id) { $domain->OID = $universal_id; } if ($domain->namespace_id || $domain->OID) { $domain->loadMatchingObject(); $where[] = $ds->prepare("id_pat_list.tag = %", $domain->tag); } } } $request_admit = false; // Requête sur un NDA $identifier_list = $this->getRequestSejourIdentifierList($data["QPD"]); if (count(array_filter($identifier_list)) > 0) { $ljoin[100] = "sejour ON `patients`.`patient_id` = `sejour`.`patient_id`"; $ljoin[10] = "id_sante400 AS id_sej_list ON id_sej_list.object_id = sejour.sejour_id"; $where[] = "`id_sej_list`.`object_class` = 'CSejour'"; // Requête sur un IPP if (!empty($identifier_list["id_number"]) && empty($identifier_list["namespace_id"]) && empty($identifier_list["universal_id"]) && empty($identifier_list["universal_id_type"])) { $where[] = $ds->prepare("id_sej_list.id400 = %", $identifier_list["id_number"]); } if (!empty($identifier_list["id_number"]) && (!empty($identifier_list["namespace_id"]) || !empty($identifier_list["universal_id"]))) { $namespace_id = $identifier_list["namespace_id"]; $universal_id = $identifier_list["universal_id"]; $domain = new CDomain(); if ($namespace_id) { $domain->namespace_id = $namespace_id; } if ($universal_id) { $domain->OID = $universal_id; } if ($domain->namespace_id || $domain->OID) { $domain->loadMatchingObject(); } $where[] = $ds->prepare("id_sej_list.id400 = %", $identifier_list["id_number"]); $where[] = $ds->prepare("id_sej_list.tag = %", $domain->tag); } if (empty($identifier_list["id_number"]) && (!empty($identifier_list["namespace_id"]) || !empty($identifier_list["universal_id"]))) { $namespace_id = $identifier_list["namespace_id"]; $universal_id = $identifier_list["universal_id"]; $domain = new CDomain(); if ($namespace_id) { $domain->namespace_id = $namespace_id; } if ($universal_id) { $domain->OID = $universal_id; } if ($domain->namespace_id || $domain->OID) { $domain->loadMatchingObject(); $where[] = $ds->prepare("id_sej_list.tag = %", $domain->tag); } } } foreach ($this->getRequestSejour($data["QPD"]) as $field => $value) { if ($value == "") { continue; } $value = preg_replace("/[^a-z\\*]/i", "_", $value); $value = preg_replace("/\\*+/", "%", $value); $where["sejour.{$field}"] = $ds->prepare("LIKE %", $value); $request_admit = true; } if ($other_request = $this->getOtherRequestSejour($data["QPD"])) { $where = array_merge($other_request, $where); $request_admit = true; } $i = 1; $domains = array(); foreach ($this->getQPD8s($data["QPD"]) as $_QPD8) { // Requête sur un domaine particulier $domains_returned_namespace_id = $_QPD8["domains_returned_namespace_id"]; // Requête sur un OID particulier $domains_returned_universal_id = $_QPD8["domains_returned_universal_id"]; $domain = new CDomain(); if ($domains_returned_namespace_id) { $domain->namespace_id = $domains_returned_namespace_id; } if ($domains_returned_universal_id) { $domain->OID = $domains_returned_universal_id; } if ($domain->namespace_id || $domain->OID) { $domain->loadMatchingObject(); } $value = $domain->OID ? $domain->OID : $domain->tag; // Cas où le domaine n'est pas retrouvé if (!$domain->_id) { return $exchange_hl7v2->setPDRAE($ack, null, $value); } $domains[] = $domain; if ($domains_returned_namespace_id) { $ljoin[20 + $i] = "id_sante400 AS id{$i} ON id{$i}.object_id = patients.patient_id"; $where[] = $ds->prepare("id{$i}.tag = %", $domain->tag); $i++; } } $quantity_limited_request = $this->getQuantityLimitedRequest($data["RCP"]); $limit_quantity = !!$quantity_limited_request; $quantity_limited_request = $quantity_limited_request ? $quantity_limited_request : 100; $pointer = null; if (isset($data["DSC"])) { $pointer = $this->getContinuationPointer($data["DSC"]); } $objects = array(); if (!$request_admit) { // Pointeur pour continuer if ($pointer) { $patient->_pointer = $pointer; // is_numeric $where["patients.patient_id"] = $ds->prepare(" > %", $pointer); } $order = "patients.patient_id ASC"; if (!empty($where)) { $objects = $patient->loadList($where, $order, $quantity_limited_request, "patients.patient_id", $ljoin); // If we have no next match, we won't have to add a DSC segment if ($limit_quantity) { $next_one = $patient->loadList($where, $order, "{$quantity_limited_request},1", "patients.patient_id", $ljoin); if (count($next_one) == 0) { $limit_quantity = false; } } } } else { $ljoin[100] = "patients ON `patients`.`patient_id` = `sejour`.`patient_id`"; /** @var $sejour CSejour */ $sejour = new CSejour(); if (!empty($where)) { $objects = $sejour->loadList($where, null, $quantity_limited_request, "sejour.sejour_id", $ljoin); } } // Save information indicating that we are doing an incremental query $last = end($objects); if ($last && $limit_quantity) { $last->_incremental_query = true; } return $exchange_hl7v2->setPDRAA($ack, $objects, null, $domains); }