<?php

ini_set('max_execution_time', 0);

class Notas_pedidos_v13_model extends Databases {

    private $db = DB_NAME_HEAD;
    protected $login = FALSE;
    protected $arr_proveedores;
    protected $proveedores;

    public function __construct() {
        parent::__construct();

        if (isset($_SERVER['PHP_AUTH_USER'])) {
            $this->validar($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']);
        }
    }

    public function validar($usuario, $password) {
        $password = md5($password);

        $sql = "SELECT * FROM " . $this->db . ".dbo.WS_USUARIOS WHERE USUARIO='$usuario' and PASS LIKE '$password'";
        $data = parent::query($sql);

        if ($data && count($data) > 0) {
            $data = $data[0];
            if ($data['PROVEEDORES']) {
                $this->arr_proveedores = explode('|', $data['PROVEEDORES']);
                $this->proveedores = "(" . implode(',', $this->arr_proveedores) . ")";
            }
            $this->login = $data['ID'];
        }

        $return = $this->_checkUsuario();
        if ($return) {
            return $return;
        } else {
            return array(
                'return' => 1,
                'data' => "datos correctos"
            );
        }
    }

    public function getProveedores() {
        if ($return = $this->_checkUsuario()) {
            return $return;
        }
        return $this->proveedores;
    }

    public function getNotasPedidosPendientes() {
        if ($return = $this->_checkUsuario()) {
            return $return;
        }

        if ($this->proveedores) {
            $sql = "SELECT EMP, ID, COD_PROVEE, FECHA_ARMADO, FECHA_ANULADO, FECHA_ENTREGA, TIP, TCO, SUC, NCO, ESTADO AS NRO_PEDIDO FROM " . $this->db . ".dbo.A_NOTA_PED_CAB WHERE ESTADO=1 AND (FECHA_ENTREGADO IS NULL OR FECHA_ENTREGADO='19000101 00:00:00') AND COD_PROVEE IN {$this->proveedores}";
            $pedidos = parent::query($sql);

            if ($pedidos && count($pedidos) > 0) {
                $ids = array();

                $emps = array();
                foreach ($pedidos as $k => $pedido) {
                    if (($detalle = $this->_datosNotaPedido($pedido['ID'], $pedido['EMP']))) {
                        $emps[] = $pedido['EMP'];
                        $ids[] = $pedido['ID'];
                        unset($pedido[$k]['ID']);
                        $pedidos[$k]['detalle'] = $detalle;
                    } else {
                        unset($pedidos[$k]); //si no tiene datos la nota de pedido no se pasa
                    }
                }

                $emps = implode(',', $emps);

                if (count($pedidos) > 0) {
                    $_fecha_entregado = date('Y-m-d H:i');
                    $fecha_entregado = str_replace('-', '', $_fecha_entregado);

                    $cantRegistros = count($ids);
                    $ids = implode(',', $ids);

                    $pedido = array(
                        'FECHA_SOLICITADO' => date('Ymd H:i'),
                        'CANT_REG' => $cantRegistros
                    );

                    if (parent::insert($this->db .'.dbo.A_NOTA_PED_NRO', $pedido)) {
                        $nroPedido = parent::query("SELECT TOP 1 NRO_PEDIDO FROM " . $this->db . ".dbo.A_NOTA_PED_NRO ORDER BY NRO_PEDIDO DESC");
                        $nroPedido = $nroPedido[0]['NRO_PEDIDO'];

                        foreach ($pedidos as $k => $pedido) {
                            $sql = "UPDATE " . $this->db . ".dbo.A_NOTA_PED_CAB SET FECHA_ENTREGADO='$fecha_entregado', ESTADO='$nroPedido' WHERE ID=" . $pedido['ID'] . " AND EMP=" . $pedido['EMP'];
                            $data = parent::query($sql);

                            $pedidos[$k]['NRO_PEDIDO'] = $nroPedido;
                            $pedidos[$k]['FECHA_ENTREGADO'] = $_fecha_entregado;
                        }
                    }
                }

                return array('return' => TRUE, 'data' => $pedidos);
            }

            return array('return' => TRUE, 'data' => FALSE);
        }

        return $this->_sinProveedor();
    }

    public function getPaquetesPedidos($limite = 5) {
        if ($return = $this->_checkUsuario()) {
            return $return;
        }

        if ($this->proveedores) {
            $sql = "SELECT TOP $limite NRO_PEDIDO, FECHA_SOLICITADO, CANT_REG FROM " . $this->db . ".dbo.A_NOTA_PED_NRO WHERE NRO_PEDIDO IN (SELECT ESTADO FROM " . $this->db . ".dbo.A_NOTA_PED_CAB WHERE COD_PROVEE IN {$this->proveedores} AND FECHA_ENTREGADO!='19000101 00:00:00' GROUP BY ESTADO) ORDER BY FECHA_SOLICITADO DESC";

            $pedidos = parent::query($sql);

            if (!($pedidos && count($pedidos) > 0)) {
                $pedidos = FALSE;
            }

            return array('return' => TRUE, 'data' => $pedidos);
        }

        return $this->_sinProveedor();
    }

    public function getNotasNroPedido($nroPedido) {
        if ($return = $this->_checkUsuario()) {
            return $return;
        }

        if ($this->proveedores) {
            $sql = "SELECT EMP, ID, COD_PROVEE, FECHA_ARMADO, FECHA_ANULADO, FECHA_ENTREGA, TIP, TCO, SUC, NCO, ESTADO AS NRO_PEDIDO FROM " . $this->db . ".dbo.A_NOTA_PED_CAB WHERE COD_PROVEE IN {$this->proveedores} AND ESTADO=$nroPedido";
            $notas = parent::query($sql);

            if ($notas && count($notas) > 0) {
                foreach ($notas as $k => $nota) {
                    $notas[$k]['detalle'] = $this->_datosNotaPedido($nota['ID'], $nota['EMP']);
                }
            } else {
                $nota = FALSE;
            }

            return array('return' => TRUE, 'data' => $notas);
        }

        return $this->_sinProveedor();
    }

    public function getNotasPedido($local, $numero) {
        if ($return = $this->_checkUsuario()) {
            return $return;
        }

        if ($this->proveedores) {
            $sql = "SELECT EMP, ID, COD_PROVEE, FECHA_ARMADO, FECHA_ANULADO, FECHA_ENTREGA, TIP, TCO, SUC, NCO, ESTADO AS NRO_PEDIDO FROM " . $this->db . ".dbo.A_NOTA_PED_CAB WHERE COD_PROVEE IN {$this->proveedores} AND EMP=$local AND ID=$numero";
            $notas = parent::query($sql);

            if ($notas && count($notas) > 0) {
                foreach ($notas as $k => $nota) {
                    if ($nota['FECHA_ANULADO'] != '1900-01-01 00:00:00') {
                        $notas[$k]['NRO_PEDIDO'] = 0;
                    }
                    $notas[$k]['detalle'] = $this->_datosNotaPedido($nota['ID'], $nota['EMP']);
                }
            } else {
                $notas = FALSE;
            }

            return array('return' => TRUE, 'data' => $notas);
        }

        return $this->_sinProveedor();
    }

    public function getNotasPedidosPendientesXml() {
        $result = $this->array2XML($this->getNotasPedidosPendientes());
        return $result;
    }

    public function _checkUsuario() {
        if ($this->login) {
            return FALSE;
        } else {
            return array(
                'return' => -1,
                'error' => 'Acceso denegado'
            );
        }
    }

    private function array2XML($data, $rootNodeName = 'results', $xml = NULL) {
        if ($xml == null) {
            $xml = simplexml_load_string('<?xml version="1.0" encoding="utf-8"?><' . $rootNodeName . ' />');
        }

        foreach ($data as $key => $value) {
            if (is_numeric($key)) {
                $key = "nodeId_" . (string) $key;
            }

            if (is_array($value)) {
                $node = $xml->addChild($key);
                $this->array2XML($value, $rootNodeName, $node);
            } else {
                $value = htmlentities($value);
                $xml->addChild($key, $value);
            }
        }

        return html_entity_decode($xml->asXML());
    }

    private function _datosNotaPedido($idPedido, $EMP) {
        $sql = "SELECT b.SEC,B.COD, a.CAN_PEDIDA, b.DET FROM " . $this->db . ".dbo.A_NOTA_PED_DET a JOIN " . $this->db . ".dbo.ARTICULOS b ON (a.ART=b.COD AND a.SEC=b.SEC) WHERE a.ID_CAB=$idPedido AND a.EMP=$EMP";
        $data = parent::query($sql);
        if ($data && count($data) > 0) {
            foreach ($data as $k => $v) {
                $data[$k]['DET'] = utf8_decode($v['DET']);
            }
            return $data;
        } else {
            return FALSE;
        }
    }

    private function _sinProveedor() {
        return array('return' => -1, 'error' => "Usuario sin proveedor");
    }

}
