/**
  * @see parent::handle
  */
 function handle($ack, CMbObject $object, $data)
 {
     // Traitement du message des erreurs
     $exchange_hpr = $this->_ref_exchange_hpr;
     $exchange_hpr->_ref_sender->loadConfigValues();
     $sender = $exchange_hpr->_ref_sender;
     $this->_ref_sender = $sender;
     CMbObject::$useObjectCache = false;
     // Rejets partiels du message
     $errors = array();
     if (isset($data["REG"])) {
         $regs = $data["REG"];
     } else {
         $regs = $data["//REG"];
     }
     // Récupération des règlements
     foreach ($regs as $_REG) {
         $sejour = new CSejour();
         $NDA = $this->getNDA($_REG);
         $user_reg = $this->getUser($_REG);
         $segment_row = $this->getREGSegmentRow($_REG);
         // Recherche si on retrouve le séjour
         if (!$this->admitFound($NDA, $sejour)) {
             $errors[] = new CHPrimSanteError($exchange_hpr, "P", "06", array("REG", $segment_row, array($NDA, $user_reg)), "22.3");
             continue;
         }
         $consults = array();
         $consultations = $sejour->loadRefsConsultations();
         // Sélection des consultations éligibles
         foreach ($consultations as $_consult) {
             $user = $_consult->loadRefPraticien();
             if ($user_reg) {
                 if ($user->adeli == $user_reg) {
                     $consults[$_consult->_id] = $_consult;
                 }
                 continue;
             }
         }
         // Si une seule consultation donnée
         if (!count($consults) && count($consultations) == 1) {
             $consults = $consultations;
         }
         $consultation = new CConsultation();
         // On essaie d'en trouver une qui ne soit pas acquittée
         foreach ($consults as $_consult) {
             $facture = $_consult->loadRefFacture();
             if (!$facture->patient_date_reglement) {
                 $consultation = $_consult;
                 break;
             }
         }
         // Aucune consultation trouvée
         if (!$consultation->_id && count($consults) > 0) {
             $consultation = end($consults);
         }
         if (!$consultation || !$consultation->_id) {
             $errors[] = new CHPrimSanteError($exchange_hpr, "P", "01", array("REG", $segment_row, array($NDA, $user_reg)), "22.3");
             continue;
         }
         $facture = $consultation->loadRefFacture();
         if (!$facture->_id) {
             /* @TODO avant de transposer la création de la facture dans le store */
             $facture = $consultation->createFactureConsult();
             if (!$facture->_id) {
                 $errors[] = new CHPrimSanteError($exchange_hpr, "P", "02", array("REG", $segment_row, array($NDA, $user_reg)), "22.3");
                 continue;
             }
         }
         // Recherche d'un reglèment par tag + idex (nom fichier - id reg)
         $idex_value = $NDA . "_" . $segment_row;
         $tag = CHPrimSante::getTag($sender->group_id);
         $idex = CIdSante400::getMatch("CReglement", $tag, $idex_value);
         // Mapping des règlements
         $return_payment = $this->mapAndStorePayment($_REG, $facture, $idex);
         if (is_string($return_payment)) {
             $errors[] = new CHPrimSanteError($exchange_hpr, "P", "03", array("REG", $segment_row, array($NDA, $user_reg)), "22.3", $return_payment);
             continue;
         }
     }
     return $exchange_hpr->setAck($ack, $errors, $object);
 }
Beispiel #2
0
 /**
  * construct
  */
 function __construct()
 {
     $this->type = "REG";
     parent::__construct();
 }
 /**
  * Send en event
  *
  * @param CHPrimSanteEvent $evenement evenement
  * @param CMbObject        $mbObject  object
  *
  * @return null|String
  * @throws CMbException
  */
 function sendEvent($evenement, CMbObject $mbObject)
 {
     $evenement->_receiver = $this;
     $this->loadConfigValues();
     $evenement->build($mbObject);
     if (!($msg = $evenement->flatten())) {
         return null;
     }
     /** @var CExchangeHprimSante $exchange */
     $exchange = $evenement->_exchange_hpr;
     if (!$exchange->message_valide) {
         return null;
     }
     if (!$this->synchronous) {
         return null;
     }
     $source = CExchangeSource::get("{$this->_guid}-{$evenement->type}");
     if (!$source->_id || !$source->active) {
         return null;
     }
     $source->setData($msg, null, $exchange);
     try {
         $source->send();
     } catch (Exception $e) {
         throw new CMbException("CExchangeSource-no-response");
     }
     $exchange->date_echange = CMbDT::dateTime();
     $ack_data = $source->getACQ();
     if (!$ack_data) {
         $exchange->store();
         return null;
     }
     /** @var CHPrimSanteEvent $data_format */
     $data_format = CHPrimSante::getEvent($exchange);
     $ack = new CHPrimSanteAcknowledgment($data_format);
     $ack->handle($ack_data);
     $exchange->date_echange = CMbDT::dateTime();
     $exchange->statut_acquittement = $ack->getStatutAcknowledgment();
     $exchange->acquittement_valide = $ack->message->isOK(CHL7v2Error::E_ERROR) ? 1 : 0;
     $exchange->_acquittement = $ack_data;
     $exchange->store();
     return $ack_data;
 }