<?php
class PedidosModel extends Query{
    private $id_cliente,$numeroFactura,$cuf,$fechaEmision,$codigoMetodoPago,$montoTotal,$montoTotalSujetoIva,$descuentoAdicional,$productos,$codigoRecepcion,$raiz,$cufd,$cuis,$tipoEmision,$estado,$puntoventa; 
    public function __construct()
    {
        parent::__construct();
    }

    public function buscarCliente(string $documentoid)
    {
        $sql="select * from clientes where documentoid='$documentoid'";
        $data=$this->select($sql);
        return $data;
    }


    public function buscarFactura(int $numero)
    {
        $sql="select * from facturas where id_factura=$numero";
        $data=$this->select($sql);
        return $data;
    }

    public function reporteFacturas(int $tipoPago, string $desde, string $hasta) {
        $sql = "SELECT f.*, c.documentoid, t.descripcion
                FROM facturas f
                inner join clientes c on c.id_cliente=f.id_cliente
                inner join stipometodopagos t on t.codigo=f.codigoMetodoPago
                WHERE codigoMetodoPago = $tipoPago and factura_estado = 1
                  AND DATE(fechaEmision) BETWEEN '$desde' AND '$hasta'  ORDER BY f.numeroFactura";
        $data = $this->selectAll($sql);
        return $data;
    }

    public function getNroPedidos(int $pv){
        $sql="select count(*) as 'cantidad' from facturas where puntoventa=".$pv;
        $data=$this->select($sql);
        return $data;
    }

    public function buscarProducto(string $codigo)
    {
        $sql="select p.*, m.descripcion,m.codigo as codigoMedida, c.codigoProducto
        from productos p
        inner join stipounidadesmedidas m on m.codigo=p.id_medida
        inner join slistaproductos c on c.id=p.id_categoria where p.codigo='$codigo'";
        $data=$this->select($sql);
        return $data;
    }
    public function getProductos($cod,$act){
        $sql="select *
        from productos
        where codigo like '%".$cod."%' and 
        id_categoria in (select id 
        from slistaproductos 
        where codigoActividad=".$act.") 
        LIMIT 0, 10";
        $data=$this->selectAll($sql);
        return $data;
    }

    public function getProductosN($nom,$act){
        $sql="select *
        from productos
        where nombre_producto like '%".$nom."%' and 
        id_categoria in (select id 
        from slistaproductos 
        where codigoActividad=".$act.") 
        LIMIT 0, 10";
        $data=$this->selectAll($sql);
        return $data;
    }

    public function getPedidos($idPuntoVenta){
        $sql="select f.*, c.razon_social, c.documentoid, c.cliente_email  
        from facturas f
        inner join clientes c on c.id_cliente=f.id_cliente 
        where puntoventa=".$idPuntoVenta."
        order by f.id_factura desc";
        $data=$this->selectAll($sql);
        return $data;
    }

    public function insertFactura(int $id_cliente, int $numeroFactura, string $cuf, string $fechaEmision,int $codigoMetodoPago,float $montoTotal, float $montoTotalSujetoIva, float $descuentoAdicional, string $productos, string $codigoRecepcion, string $raiz, string $cufd,string $cuis, int $tipoEmision, int $estado,int $puntoventa)
    {
        $this->id_cliente = $id_cliente;
        $this->numeroFactura = $numeroFactura;
        $this->cuf = $cuf;
        $this->fechaEmision = $fechaEmision;
        $this->codigoMetodoPago = $codigoMetodoPago;
        $this->montoTotal = $montoTotal;
        $this->montoTotalSujetoIva = $montoTotalSujetoIva;
        $this->descuentoAdicional = $descuentoAdicional;
        $this->productos = $productos;
        $this->codigoRecepcion = $codigoRecepcion;
        $this->raiz = $raiz;
        $this->cufd = $cufd;
        $this->cuis = $cuis;
        $this->tipoEmision = $tipoEmision;
        $this->estado = $estado;
        $this->puntoventa = $puntoventa;
        $sql = "insert into facturas (id_cliente,numeroFactura,cuf,fechaEmision,codigoMetodoPago,montoTotal,montoTotalSujetoIva,descuentoAdicional,productos,codigoRecepcion,raiz,cufd,cuis,tipoEmision,factura_estado,puntoventa) values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
        $datos = array($this->id_cliente,$this->numeroFactura,$this->cuf,$this->fechaEmision,$this->codigoMetodoPago,$this->montoTotal,$this->montoTotalSujetoIva,$this->descuentoAdicional,$this->productos,$this->codigoRecepcion,$this->raiz,$this->cufd,$this->cuis,$this->tipoEmision,$this->estado,$this->puntoventa);
        $data=$this->save($sql,$datos);
        if($data == 1){
            $res = "ok";
        }else{
            $res = "error";
        }
        return $res;
    }

    public function getFactura($id_factura){
        $sql="select * 
        from facturas f 
        inner join clientes c on c.id_cliente=f.id_cliente 
        where f.id_factura='".$id_factura."'";
        $data = $this->select($sql);
        return $data;
    }

    public function getCufd($cufd){
        $sql="select *
        from cufd f 
        where codigo='".$cufd."'";
        $data = $this->select($sql);
        return $data;
    }
    public function getUltimo(){
        $sql= "SELECT * FROM facturas ORDER BY id_factura DESC LIMIT 1";
        $data = $this->select($sql);
        return $data;
    }
    public function getUniMedida($codigoMedida){
        $sql="select *
        from stipounidadesmedidas
        where codigo='".$codigoMedida."'";
        $data = $this->select($sql);
        return $data;
    }

    public function getFacturaCuf($cuf){
        $sql="select * 
        from facturas f 
        inner join clientes c on c.id_cliente=f.id_cliente 
        where f.cuf='".$cuf."'";
        $data = $this->select($sql);
        return $data;
    }

    public function calculaDigitoMod11(string $cadena) {
        if (!false) {
            $numDig = 1;
        }
        for ($n = 1; $n <= $numDig; $n++) {
            $suma = 0;
            $mult = 2;
            for ($i = strlen($cadena) - 1; $i >= 0; $i--) {
                $suma += ($mult * intval(substr($cadena, $i, 1)));
                if (++$mult > 9) {
                    $mult = 2;
                }
            }
            if (false) {
                $dig = ((($suma * 10) % 11) % 10);
            } else {
                $dig = $suma % 11;
            }
            if ($dig == 10) {
                $cadena .= "1";
            }
            if ($dig == 11) {
                $cadena .= "0";
            }
            if ($dig < 10) {
                $cadena .= strval($dig);
            }
        }
        return substr($cadena, strlen($cadena) - $numDig, strlen($cadena));
    }

    public function Base16(string $pString) {
        $vValor = gmp_init($pString);
        return gmp_strval($vValor, 16);
    }
    
    public function Base10($pString) {
        $vValor = gmp_init($pString, 16);
        return gmp_strval($vValor);
    }

    function baseConvert($numstring, $frombase, $tobase){
 
        $chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        $tostring = substr($chars, 0, $tobase);
    
        $length = strlen($numstring);
        $result = '';
        for ($i = 0; $i < $length; $i++)
        {
            $number[$i] = strpos($chars, $numstring[$i]);
        }
        do
        {
            $divide = 0;
            $newlen = 0;
            for ($i = 0; $i < $length; $i++)
            {
                $divide = $divide * $frombase + $number[$i];
                if ($divide >= $tobase)
                {
                    $number[$newlen++] = (int)($divide / $tobase);
                    $divide = $divide % $tobase;
                } elseif ($newlen > 0)
                {
                    $number[$newlen++] = 0;
                }
            }
            $length = $newlen;
            $result = $tostring[$divide] . $result;
        } while ($newlen != 0);
        return $result;
    }



    

    public function anularFactura($cuf){
        $sql="update facturas
        set factura_estado = 0 , anulacion=1 where cuf=?";
        $datos= array($cuf);
        $data=$this->save($sql,$datos);
        if($data==1){
            $res="ok";
        }else{
            $res=$data;
        }
        return $res;
    }

    public function revertirAnularFactura($cuf){
        $sql="update facturas
        set factura_estado = 1  where cuf=?";
        $datos= array($cuf);
        $data=$this->save($sql,$datos);
        if($data==1){
            $res="ok";
        }else{
            $res=$data;
        }
        return $res;
    }

    
}
?>