/** * Redéfinition du store * * @return void|string **/ function store() { $this->completeField("numero", "group_id"); if (!$this->group_id) { $this->group_id = CGroups::loadCurrent()->_id; } if ($this->_id && $this->_duplicate) { $this->_duplicate = null; if ($msg = $this->duplicate()) { return $msg; } $this->annule = 1; $this->definitive = 1; } if (!$this->cloture && $this->fieldModified("cloture") && count($this->_ref_reglements)) { return "Vous ne pouvez pas décloturer une facture ayant des règlements"; } if (!$this->cloture && $this->fieldModified("cloture") && count($this->_ref_relances)) { return "Vous ne pouvez pas décloturer une facture ayant des relances"; } $create_lignes = false; if (!$this->_id && CAppUI::conf("dPfacturation " . $this->_class . " use_auto_cloture")) { $this->cloture = CMbDT::date(); $create_lignes = true; } //Si on cloture la facture création des lignes de la facture //Si on décloture on les supprime if ($this->cloture && $this->fieldModified("cloture") && !$this->_old->cloture) { $create_lignes = true; } elseif (!$this->cloture && $this->fieldModified("cloture")) { //Suppression des tous les items de la facture $this->loadRefsItems(); foreach ($this->_ref_items as $item) { /** @var CFactureItem $item*/ $item->delete(); } $this->facture = 0; } // Etat des règlement à propager sur les consultations if ($this->fieldModified("patient_date_reglement") || $this->fieldModified("tiers_date_reglement")) { $this->loadRefsConsultation(); foreach ($this->_ref_consults as $_consultation) { $_consultation->patient_date_reglement = $this->patient_date_reglement; $_consultation->tiers_date_reglement = $this->tiers_date_reglement; if ($msg = $_consultation->store()) { return $msg; } } if ($this->isRelancable() && $this->_ref_last_relance->_id) { $this->_ref_last_relance->etat = $this->patient_date_reglement ? "regle" : "emise"; $this->_ref_last_relance->store(); } } $_object_id = null; $_object_class = null; //Lors de la validation de la cotation d'une consultation if ($this->_consult_id) { $consult = new CConsultation(); $consult->load($this->_consult_id); $consult->loadRefPlageConsult(); // Si la facture existe déjà on la met à jour $where = array(); $ljoin = array(); $plage = $consult->_ref_plageconsult; if (CAppUI::conf("ref_pays") == 2) { $where["patient_id"] = "= '{$consult->patient_id}'"; $where["praticien_id"] = "= '" . ($plage->pour_compte_id ? $plage->pour_compte_id : $plage->chir_id) . "'"; $where["cloture"] = "IS NULL"; } else { $table = $consult->sejour_id ? "facture_etablissement" : "facture_cabinet"; $ljoin["facture_liaison"] = "facture_liaison.facture_id = {$table}.facture_id"; $where["facture_liaison.object_id"] = " = '{$this->_consult_id}'"; $where["facture_liaison.object_class"] = " = 'CConsultation'"; $where["facture_liaison.facture_class"] = " = '{$this->_class}'"; $where["numero"] = " = '{$this->numero}'"; } //Si la facture existe déjà if ($this->loadObject($where, null, "facture_id", $ljoin)) { //Dans le cas Suisse if (CAppUI::conf("ref_pays") == 2 && CModule::getActive("dPfacturation")) { $ligne = new CFactureLiaison(); $ligne->facture_id = $this->_id; $ligne->facture_class = $this->_class; $ligne->object_id = $this->_consult_id; $ligne->object_class = 'CConsultation'; if (!$ligne->loadMatchingObject()) { $ligne->store(); } } } else { // Sinon on la crée $this->ouverture = CMbDT::date(); $this->patient_id = $consult->patient_id; $this->praticien_id = $plage->pour_compte_id ? $plage->pour_compte_id : $plage->chir_id; $this->type_facture = $consult->pec_at == 'arret' ? "accident" : "maladie"; if (CAppUI::conf("dPfacturation {$this->_class} use_auto_cloture")) { $this->cloture = CMbDT::date(); $create_lignes = true; } if ($this->numero > 1 && !count($consult->loadRefsFraisDivers(1)) && count($consult->loadRefsFraisDivers($this->numero)) && $consult->du_tva) { $frais = 0; foreach ($consult->loadRefsFraisDivers($this->numero) as $_frais) { $frais += $_frais->montant_base; } $this->du_patient = $frais + $consult->du_tva; $this->du_tva = $consult->du_tva; $this->taux_tva = $consult->taux_tva; } } $_object_id = $this->_consult_id; $_object_class = "CConsultation"; } //Lors de la création d'une facture de séjour if ($this->_sejour_id) { $_object_id = $this->_sejour_id; $_object_class = "CSejour"; } $this->completeField("assurance_maladie", "assurance_accident", "type_facture"); if ($this->type_facture != "accident" && $this->assurance_accident) { $this->assurance_accident = ""; } if ($this->type_facture != "maladie" && $this->assurance_maladie) { $this->assurance_maladie = ""; } // Standard store if ($msg = parent::store()) { return $msg; } if ($_object_id) { $ligne = new CFactureLiaison(); $ligne->facture_id = $this->_id; $ligne->facture_class = $this->_class; $ligne->object_id = $_object_id; $ligne->object_class = $_object_class; if (!$ligne->loadMatchingObject()) { $ligne->store(); } } if ($create_lignes) { $this->creationLignesFacture(); } }