/**
  * 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;
Example #3
0
            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;
Example #8
0
<?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) {
Example #12
0
/**
 * $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}");
Example #13
0
$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
Example #14
0
            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");
Example #16
0
         // 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();
Example #17
0
<?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;
 }