* $Id: ajax_purge_tasks.php 24397 2014-08-12 12:52:55Z aurelie17 $ * * @package Mediboard * @subpackage Soins * @author SARL OpenXtrem <*****@*****.**> * @license GNU General Public License, see http://www.gnu.org/licenses/gpl.html * @version $Revision: 24397 $ */ CCanDo::checkAdmin(); $type = CValue::get("type", "check"); $where = array(); $where["realise"] = " = '1'"; $where[] = "date_realise IS NULL"; $where[] = "author_realise_id IS NULL"; $where[] = "author_id IS NOT NULL"; $task = new CSejourTask(); if ($type == "repair") { $tasks = $task->loadList($where, null, 100); } else { $tasks = $task->loadIds($where); } CAppUI::stepAjax("Taches à corriger: " . count($tasks), UI_MSG_OK); if ($type == "repair") { $correction = 0; foreach ($tasks as $_task) { /* @var CSejourTask $_task*/ $_task->date_realise = $_task->date; $_task->author_realise_id = $_task->author_id; if ($msg = $_task->store()) { mbTrace($msg); } else {
<?php /* $Id: $ */ /** * @package Mediboard * @subpackage soins * @version $Revision: $ * @author SARL OpenXtrem * @license GNU General Public License, see http://www.gnu.org/licenses/gpl.html */ CCanDo::checkEdit(); $task_id = CValue::get("task_id"); $sejour_id = CValue::get("sejour_id"); $prescription_line_element_id = CValue::get("prescription_line_element_id"); $task = new CSejourTask(); $task->load($task_id); $task_element = false; if ($prescription_line_element_id) { $task->prescription_line_element_id = $prescription_line_element_id; $task->loadMatchingObject(); $task_element = true; } if (!$task->_id) { $task->author_id = Cuser::get()->_id; $task->date = CMbDT::dateTime(); } $task->loadRefConsult()->loadRefsFwd(); // Smarty template $smarty = new CSmartyDP(); $smarty->assign("sejour_id", $sejour_id); $smarty->assign("task", $task);
CSejour::massLoadNDA($sejours); $count_my_patient = 0; foreach ($sejours as $sejour) { $count_my_patient += count($sejour->loadRefsUserSejour($userCourant)); $sejour->loadRefPatient(); $sejour->loadRefPraticien(); $sejour->checkDaysRelative($date); $sejour->loadRefPrescriptionSejour(); $prescription = $sejour->_ref_prescription_sejour; if ($prescription->_id) { $prescription->loadJourOp(CMbDT::date()); } // Chargement des taches non effectuées $sejour->_count_tasks = $sejour->_count["taches_non_realisees"]; if ($print) { $task = new CSejourTask(); $task->sejour_id = $sejour->_id; $task->realise = 0; $sejour->_ref_tasks = $task->loadMatchingList(); foreach ($sejour->_ref_tasks as $_task) { $_task->loadRefPrescriptionLineElement(); } } if ($only_non_checked && !$prescription->_id) { unset($sejours[$sejour->_id]); continue; } $sejour->_count_tasks_not_created = 0; $sejour->_ref_tasks_not_created = array(); if ($prescription->_id) { // Chargement des lignes non associées à des taches
/** * @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; }
$date_transmission = CAppUI::conf("soins synthese transmission_date_limit", $group->_guid) ? CMbDT::dateTime() : null; $sejour->loadRefsTransmissions($cible_importante, true, false, null, $date_transmission); $sejour->loadRefsObservations(true); $sejour->loadRefsTasks(); $sejour->loadRefsNotes(); foreach ($sejour->_ref_tasks as $key => $_task) { if ($_task->realise) { unset($sejour->_ref_tasks[$key]); continue; } $_task->loadRefPrescriptionLineElement(); $_task->setDateAndAuthor(); $_task->loadRefAuthor(); $_task->loadRefAuthorRealise(); } CSejourTask::sortByDate($sejour->_ref_tasks); // Tri des transmissions par catégorie $transmissions = array(); foreach ($sejour->_ref_transmissions as $_trans) { $_trans->loadRefUser()->loadRefFunction(); $_trans->loadTargetObject(); $_trans->calculCibles(); $sort_key_pattern = "{$_trans->_class} {$_trans->user_id} {$_trans->object_id} {$_trans->object_class} {$_trans->libelle_ATC}"; $sort_key = "{$_trans->date} {$sort_key_pattern}"; $date_before = CMbDT::dateTime("-1 SECOND", $_trans->date); $sort_key_before = "{$date_before} {$sort_key_pattern}"; $date_after = CMbDT::dateTime("+1 SECOND", $_trans->date); $sort_key_after = "{$date_after} {$sort_key_pattern}"; // Aggrégation à -1 sec if (array_key_exists($sort_key_before, $transmissions)) { $sort_key = $sort_key_before;