Esempio n. 1
0
 * $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 {
Esempio n. 2
0
<?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);
Esempio n. 3
0
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;