Esempio n. 1
0
/**
 * $Id: vw_traceability.php 19286 2013-05-26 16:59:04Z phenxdesign $
 *
 * @package    Mediboard
 * @subpackage Stock
 * @author     SARL OpenXtrem <*****@*****.**>
 * @license    GNU General Public License, see http://www.gnu.org/licenses/gpl.html
 * @version    $Revision: 19286 $
 */
CCanDo::checkRead();
$code = CValue::getOrSession('code');
$codes = array();
$products = array();
if (strlen($code) > 2) {
    $where = array('code' => "LIKE '%{$code}%'");
    $delivery = new CProductDeliveryTrace();
    $list_deliveries = $delivery->loadList($where, 'date_delivery');
    $reception = new CProductOrderItemReception();
    $list_order_reception = $reception->loadList($where, 'date');
    foreach ($list_order_reception as $trace) {
        if (!isset($codes[$trace->code])) {
            $codes[$trace->code] = array();
        }
        $trace->loadRefsFwd();
        if (!isset($products[$trace->code])) {
            $trace->loadRefOrderItem();
            $trace->_ref_order_item->loadReference();
            $trace->_ref_order_item->_ref_reference->loadRefsFwd();
            $products[$trace->code] = $trace->_ref_order_item->_ref_reference->_ref_product;
        }
        // date_reception
 }
 $max = max($max, $total);
 $series[0]["data"][] = array(count($series[0]["data"]) * 2 - 0.6, $total);
 // Hack pour les etablissements qui ont un service "Périmés"
 $where_services = array("nom" => "= 'Périmés'");
 $services_expired = new CService();
 $services_expired_ids = $services_expired->loadIds($where_services);
 // Output //////////////////
 $where = array("product_delivery.stock_class" => "= 'CProductStockGroup'", "product_delivery.stock_id" => "= '{$product->_ref_stock_group->_id}'", "product_delivery_trace.date_delivery" => "BETWEEN '{$date}' AND '{$to}'");
 if (count($services_expired_ids)) {
     $where[100] = "(product_delivery.type != 'expired' OR product_delivery.type IS NULL)\r\n                   AND product_delivery.service_id NOT IN (" . implode(',', $services_expired_ids) . ")";
 } else {
     $where[100] = "product_delivery.type != 'expired' OR product_delivery.type IS NULL";
 }
 $ljoin = array("product_delivery" => "product_delivery.delivery_id = product_delivery_trace.delivery_id");
 $trace = new CProductDeliveryTrace();
 /** @var CProductDeliveryTrace $traces */
 $traces = $trace->loadList($where, null, null, null, $ljoin);
 $total = 0;
 foreach ($traces as $_trace) {
     $total += $_trace->quantity;
 }
 $max = max($max, $total);
 $series[1]["data"][] = array(count($series[1]["data"]) * 2, $total);
 // Output expired ///////////////////
 if (count($services_expired_ids)) {
     $where[100] = "product_delivery.type = 'expired' OR product_delivery.service_id IN (" . implode(',', $services_expired_ids) . ")";
 } else {
     $where[100] = "product_delivery.type = 'expired'";
 }
 $traces = $trace->loadList($where, null, null, null, $ljoin);
 /**
  * @see parent::store()
  */
 function store()
 {
     $is_new = !$this->_id;
     if ($is_new) {
         if (!$this->datetime_min) {
             $this->datetime_min = $this->date_dispensation;
         }
         if (!$this->datetime_max) {
             $this->datetime_max = $this->date_dispensation;
         }
         if (!$this->preparateur_id) {
             $this->preparateur_id = CMediusers::get()->_id;
         }
     }
     $order_to_0 = $this->fieldModified("order", "0");
     if ($msg = parent::store()) {
         return $msg;
     }
     if ($this->_prises) {
         $prises = json_decode(stripslashes($this->_prises), true);
         foreach ($prises as $_prise) {
             $prise_dispensation = new CPriseDispensation();
             $prise_dispensation->delivery_id = $this->_id;
             $prise_dispensation->datetime = $_prise["datetime"];
             $prise_dispensation->quantite_adm = $_prise["quantite_adm"];
             $prise_dispensation->unite_adm = utf8_decode($_prise["unite_adm"]);
             $prise_dispensation->quantite_disp = $_prise["quantite_disp"];
             $prise_dispensation->object_id = $_prise["object_id"];
             $prise_dispensation->object_class = $_prise["object_class"];
             $prise_dispensation->store();
         }
         $this->_prises = null;
     }
     // Sortie manuelle ou autotrace et passage de "commande" à "pas commande"
     if ($is_new && $this->manual || ($is_new || $order_to_0) && $this->_auto_trace) {
         $delivery_trace = new CProductDeliveryTrace();
         $delivery_trace->delivery_id = $this->_id;
         $delivery_trace->quantity = $this->quantity;
         $delivery_trace->date_delivery = $this->date_delivery ? $this->date_delivery : CMbDT::dateTime();
         $delivery_trace->_code_cis = $this->_code_cis;
         $delivery_trace->_code_cip = $this->_code_cip;
         $delivery_trace->_datetime_min = $this->datetime_min;
         if ($this->manual) {
             $delivery_trace->date_reception = $delivery_trace->date_delivery;
         }
         $product = $this->loadRefStock()->loadRefProduct();
         $location = CProductStockLocation::getDefaultLocation($this->loadRefService(), $product);
         $delivery_trace->target_location_id = $location->_id;
         if ($msg = $delivery_trace->store()) {
             CAppUI::setMsg("La commande a été validée, mais n'a pas pu etre délivrée automatiquement pour la raison suivante: <br />{$msg}", UI_MSG_WARNING);
         } else {
             CAppUI::setMsg("CProductDeliveryTrace-msg-create");
         }
     }
     if (!$is_new) {
         return null;
     }
     $this->loadRefStock()->loadRefsFwd();
     if ($this->_auto_deliver || $this->_ref_stock->_ref_product->auto_dispensed || $this->_auto_trace) {
         $this->date_dispensation = CMbDT::dateTime();
         $this->order = 0;
         return parent::store();
     }
     return null;
 }