<?php

/**
 * $Id: ajax_trigger_ex_classes.php 23812 2014-07-02 11:49:14Z phenxdesign $
 *
 * @package    Mediboard
 * @subpackage forms
 * @author     SARL OpenXtrem <*****@*****.**>
 * @license    GNU General Public License, see http://www.gnu.org/licenses/gpl.html
 * @version    $Revision: 23812 $
 */
//CCanDo::checkAdmin(); // Don't check permissions
$object_guid = CValue::get("object_guid");
$event_name = CValue::get("event_name");
$object = CMbObject::loadFromGuid($object_guid);
CExClassConstraint::$_load_lite = true;
$ex_class_event = new CExClassEvent();
$ds = $ex_class_event->_spec->ds;
$group_id = CGroups::loadCurrent()->_id;
$where = array("ex_class_event.host_class" => $ds->prepare("=%", $object->_class), "ex_class_event.event_name" => $ds->prepare("=%", $event_name), "ex_class_event.disabled" => $ds->prepare("=%", 0), "ex_class.conditional" => $ds->prepare("=%", 0), $ds->prepare("ex_class.group_id = % OR ex_class.group_id IS NULL", $group_id));
$ljoin = array("ex_class" => "ex_class.ex_class_id = ex_class_event.ex_class_id");
/** @var CExClassEvent[] $ex_class_events */
$ex_class_events = $ex_class_event->loadList($where, null, null, null, $ljoin);
CStoredObject::massLoadBackRefs($ex_class_events, "constraints");
$ex_class_events_struct = array();
foreach ($ex_class_events as $_ex_class_event) {
    if ($_ex_class_event->checkConstraints($object)) {
        $ex_class_events_struct[] = array("ex_class_event_id" => $_ex_class_event->_id, "ex_class_id" => $_ex_class_event->ex_class_id, "event_name" => $event_name, "object_guid" => $object_guid);
    }
}
CApp::json($ex_class_events_struct);
<?php

/**
 * $Id: ajax_edit_ex_constraint.php 17759 2013-01-14 11:27:24Z phenxdesign $
 *
 * @package    Mediboard
 * @subpackage forms
 * @author     SARL OpenXtrem <*****@*****.**>
 * @license    GNU General Public License, see http://www.gnu.org/licenses/gpl.html
 * @version    $Revision: 17759 $
 */
CCanDo::checkEdit();
$ex_constraint_id = CValue::get("ex_constraint_id");
$ex_class_event_id = CValue::get("ex_class_event_id");
$ex_constraint = new CExClassConstraint();
if (!$ex_constraint->load($ex_constraint_id)) {
    $ex_constraint->ex_class_event_id = $ex_class_event_id;
} else {
    $ex_constraint->loadRefsNotes();
}
$ex_constraint->loadTargetObject();
$event = $ex_constraint->loadRefExClassEvent();
$options = $event->getHostClassOptions();
$host_field_suggestions = CValue::read($options, "hostfield_sugg", array());
$list = $event->buildHostFieldsList();
$smarty = new CSmartyDP();
$smarty->assign("ex_constraint", $ex_constraint);
$smarty->assign("class_fields", $list);
$smarty->assign("host_field_suggestions", $host_field_suggestions);
$smarty->display("inc_edit_ex_constraint.tpl");
 /**
  * attention aux dates, il faut surement checker le log de derniere modif des champs du concept
  *
  * @fixme pas trop optimisé
  */
 function getReportedValues(CExClassEvent $event)
 {
     $ex_class = $this->_ref_ex_class;
     $fields = $ex_class->loadRefsAllFields(true);
     if ($this->_id) {
         return $fields;
     }
     self::$_multiple_load = true;
     CExClassField::$_load_lite = true;
     $this->loadRefsLinks();
     $latest_ex_objects = array($ex_class->getLatestExObject($this->_ref_object), $ex_class->getLatestExObject($this->_ref_reference_object_1), $ex_class->getLatestExObject($this->_ref_reference_object_2));
     if ($this->_ref_object->_id) {
         $this->_ref_object->loadComplete();
     }
     if ($this->_ref_reference_object_1->_id) {
         $this->_ref_reference_object_1->loadComplete();
     }
     if ($this->_ref_reference_object_2->_id) {
         $this->_ref_reference_object_2->loadComplete();
     }
     CStoredObject::massLoadFwdRef($fields, "ex_group_id");
     $all_concepts = CStoredObject::massLoadFwdRef($fields, "concept_id");
     $all_back_fields = CStoredObject::massLoadBackRefs($all_concepts, "class_fields");
     $ex_groups = CStoredObject::massLoadFwdRef($all_back_fields, "ex_group_id");
     CStoredObject::massLoadFwdRef($ex_groups, "ex_class_id");
     // Cache de concepts
     $concepts = array();
     $ex_classes = array();
     // on cherche les champs reportés de l'objet courant
     foreach ($fields as $_field) {
         $field_name = $_field->name;
         $this->_reported_fields[$field_name] = null;
         // valeur par défaut
         $spec_obj = $_field->getSpecObject();
         $this->{$field_name} = CExClassField::unescapeProp($spec_obj->default);
         $_concept = null;
         if ($_field->concept_id) {
             $_concept = $_field->loadRefConcept();
         }
         // si champ pas reporté, on passe au suivant
         if (!($_field->report_class || $_field->concept_id && $_concept->native_field)) {
             continue;
         }
         // Native fields
         if ($_concept && $_concept->native_field) {
             list($_class, $_path) = explode(" ", $_concept->native_field, 2);
             if (isset($this->_preview)) {
                 $this->_reported_fields[$field_name] = new $_class();
                 $this->{$field_name} = "Test";
             } else {
                 if ($this->_ref_object->_class == $_class) {
                     $_object = $this->_ref_object;
                 } elseif ($this->_ref_reference_object_1->_class == $_class) {
                     $_object = $this->_ref_reference_object_1;
                 } elseif ($this->_ref_reference_object_2->_class == $_class) {
                     $_object = $this->_ref_reference_object_2;
                 }
                 list($_object, $_path) = CExClassConstraint::getFieldAndObjectStatic($_object, $_path);
                 $_resolved = CExClassConstraint::resolveObjectFieldStatic($_object, $_path);
                 $_obj = $_resolved["object"];
                 $_field_name = $_resolved["field"];
                 $this->_reported_fields[$field_name] = $_object;
                 $this->{$field_name} = $_obj->{$_field_name};
             }
             if ($this->{$field_name}) {
                 continue;
             }
         }
         $_report_class = $_field->report_class;
         // si champ basé sur un concept, il faut parcourir
         // tous les formulaires qui ont un champ du meme concept
         if ($_field->concept_id) {
             if (!isset($concepts[$_field->concept_id])) {
                 $_concept_fields = $_concept->loadRefClassFields();
                 foreach ($_concept_fields as $_concept_field) {
                     if (!isset($ex_classes[$_concept_field->ex_group_id])) {
                         $ex_classes[$_concept_field->ex_group_id] = $_concept_field->loadRefExClass();
                     } else {
                         $_concept_field->_ref_ex_class = $ex_classes[$_concept_field->ex_group_id];
                     }
                 }
                 $concepts[$_field->concept_id] = array($_concept, $_concept_fields);
             } else {
                 list(, $_concept_fields) = $concepts[$_field->concept_id];
             }
             /** @var CExObject $_latest */
             $_latest = null;
             $_latest_value = null;
             // on regarde tous les champs du concept
             foreach ($_concept_fields as $_concept_field) {
                 $_ex_class = $_concept_field->_ref_ex_class;
                 $_concept_latest = null;
                 if ($this->_ref_object->_class == $_report_class) {
                     $_concept_latest = $_ex_class->getLatestExObject($this->_ref_object);
                 } elseif ($this->_ref_reference_object_1->_class == $_report_class) {
                     $_concept_latest = $_ex_class->getLatestExObject($this->_ref_reference_object_1);
                 } elseif ($this->_ref_reference_object_2->_class == $_report_class) {
                     $_concept_latest = $_ex_class->getLatestExObject($this->_ref_reference_object_2);
                 }
                 // si pas d'objet precedemment enregistré
                 if (!$_concept_latest || !$_concept_latest->_id || $_concept_latest->{$_concept_field->name} == "") {
                     continue;
                 }
                 if (!$_latest) {
                     $_latest = $_concept_latest;
                     $_latest_value = $_latest->{$_concept_field->name};
                 } else {
                     $_date = $_concept_latest->getEditDate();
                     if ($_date > $_latest->getEditDate()) {
                         $_latest = $_concept_latest;
                         $_latest_value = $_latest->{$_concept_field->name};
                     }
                 }
             }
             if ($_latest) {
                 $_latest->loadTargetObject()->loadComplete();
                 $this->_reported_fields[$field_name] = $_latest;
                 $this->{$field_name} = self::typeSetSpecIntersect($_field, $_latest_value);
             }
         } else {
             $escape = true;
             foreach ($latest_ex_objects as $_latest_ex_object) {
                 if ($_latest_ex_object->_id) {
                     $escape = false;
                     break;
                 }
             }
             if ($escape) {
                 continue;
             }
             /** @var CMbObject $_base */
             /*
              * Comprendre pourquoi parfois il n'y a pas de $_latest_ex_object
              */
             $_base = null;
             foreach ($latest_ex_objects as $_latest_ex_object) {
                 if (!$_latest_ex_object) {
                     continue;
                 }
                 if ($_latest_ex_object->_ref_reference_object_1 && $_latest_ex_object->_ref_reference_object_1->_class == $_report_class) {
                     $_base = $_latest_ex_object->_ref_reference_object_1;
                     break;
                 } elseif ($_latest_ex_object->_ref_reference_object_2 && $_latest_ex_object->_ref_reference_object_2->_class == $_report_class) {
                     $_base = $_latest_ex_object->_ref_reference_object_2;
                     break;
                 } elseif ($_latest_ex_object->_ref_object && $_latest_ex_object->_ref_object->_class == $_report_class) {
                     $_base = $_latest_ex_object->_ref_object;
                     break;
                 }
             }
             if ($this->_ref_object->_id && !$_base) {
                 //$_field_view = CAppUI::tr("$this->_class-$_field->name");
                 //CAppUI::setMsg("Report de données impossible pour le champ '$_field_view'", UI_MSG_WARNING);
                 continue;
             }
             if ($_base->{$field_name} == "") {
                 continue;
             }
             $_base->loadTargetObject()->loadComplete();
             $_base->loadLastLog();
             $this->_reported_fields[$field_name] = $_base;
             $this->{$field_name} = self::typeSetSpecIntersect($_field, $_base->{$field_name});
         }
     }
     self::$_multiple_load = false;
     CExClassField::$_load_lite = false;
     return $fields;
 }