<?php
Doo::loadCore ( 'db/DooModel' );
/**
 * 纸质发票相关信息及其操作业务逻辑
 * @author CP.
 * @version 1.0
 * @namespace invoice
 * @package invoiceModel
 */
class invoicePaper extends DooModel {
	
	/**
	 *
	 * @var integer $iid 发票ID
	 */
	public $ipid;
	public $invoiceType;
	public $invoiceCode;
	public $invoiceNo;
	public $iid;
	public $date;
	public $_table = 'CLD_invoicePaper';
	public $_primarykey = 'ipid';
	public $_fields = array (
			'ipid',
			'invoiceType',
			'invoiceCode',
			'invoiceNo',
			'iid',
			'date' 
	);
	function getInvoicePaper($limit = 0, $con = "", $desc = 'desc') {
		if (empty ( $limit ) || empty ( $con ))
			return array ();
		
		$field = 'a.invoiceType,a.invoiceCode,a.invoiceNo,a.iid,a.date as paperDate,a.ipid
				 ,b.invoiceSerial,b.invoiceTitle,b.invoiceCompany,b.invoicePrice,b.invoiceElement,b.date as invoiceDate,b.userName,b.categoryName,b.printTime';
		
		$sql = "select " . $field . " from " . $this->_table . " as a left join CLD_invoice as b on (a.iid=b.iid)  " . $con . "  ORDER BY a.invoiceNo " . $desc . ' limit ' . $limit;
		
		$query = Doo::db ()->query ( $sql );
		$list = $query->fetchAll ();
		
		Doo::loadClass ( 'XDeode' );
		$XDeode = new XDeode ( 5 );
		
		foreach ( $list as $key => $value ) {
			$list [$key] ['iidKey'] = $XDeode->encode ( $value ['iid'] );
			$list [$key] ['ipidKey'] = $XDeode->encode ( $value ['ipid'] );
		}
		return $list;
	}
	function getInvoicePaperCount() {
		$listCount = $this->count ( array (
				'asArray' => TRUE 
		) );
		return $listCount;
	}
	/**
	 *  根据发票类型获得未打印的发票号
	 * @param number $invoiceType
	 * @return unknown
	 */
	function getInvoicePaperByInvoiceType( $invoiceType = 0) {
		
		$list = $this->find ( array (
				'where' => 'iid=0 and invoiceType='.$invoiceType,
				'asArray' => TRUE 
		) );
		Doo::loadClass ( 'XDeode' );
		$XDeode = new XDeode ( 5 );
		foreach ( $list as $key => $value ) {
			$list [$key] ['ipidKey'] = $XDeode->encode ( $value ['ipid'] );
		}
		return $list;
	}
	
	/**
	 * 根据ID获得纸票号
	 * @param number $ipid
	 */
	function getInvoicePaperByIpid($ipid=0){
		$detail = $this->getOne ( array (
				'where' => 'iid=0 and ipid='.$ipid,
				'asArray' => TRUE
		) );
		Doo::loadClass ( 'XDeode' );
		$XDeode = new XDeode ( 5 );
		
		if (empty ( $detail ) )
			return array ();
		
		$detail ['ipidKey'] = $XDeode->encode ( $detail ['ipid'] );
		
		return $detail;
	}
	
	/**
	 * 根据参数字段更新相应字段（主键ID必须传）
	 * @param array $item 相关需要更新的字段信息
	 * @return number 返回发票ID
	 */
	public function setInvoicePaperByCondition($item = array()) {
		$lid = 0;
		if (is_array ( $item ) && ! empty ( $item )) {
			foreach ( $item as $key => $value ) {
				$this->$key = $value;
			}
			$lid = $this->update ();
		}
		return $lid;
	}
	
	/**
	 * 加密或解密指定字符串
	 *
	 * @param string $string 要加密或解密的字符串
	 * @param string $operation 当取值为'DECODE'时表示解密，否则为加密
	 * @param string $key 加解密的key
	 * @param $expiry 超时值
	 *
	 */
	function authcode($string, $operation = 'DECODE', $key = '', $expiry = 0) {
		$ckey_length = 4;
		if (! $key) {
			$key = $this->INVOICEKEY;
		}
		$key = md5 ( $key );
		$keya = md5 ( substr ( $key, 0, 16 ) );
		$keyb = md5 ( substr ( $key, 16, 16 ) );
		$keyc = $ckey_length ? ($operation == 'DECODE' ? substr ( $string, 0, $ckey_length ) : substr ( md5 ( microtime () ), - $ckey_length )) : '';
		
		$cryptkey = $keya . md5 ( $keya . $keyc );
		$key_length = strlen ( $cryptkey );
		
		$string = $operation == 'DECODE' ? base64_decode ( substr ( $string, $ckey_length ) ) : sprintf ( '%010d', $expiry ? $expiry + time () : 0 ) . substr ( md5 ( $string . $keyb ), 0, 16 ) . $string;
		$string_length = strlen ( $string );
		
		$result = '';
		$box = range ( 0, 255 );
		
		$rndkey = array ();
		for($i = 0; $i <= 255; $i ++) {
			$rndkey [$i] = ord ( $cryptkey [$i % $key_length] );
		}
		
		for($j = $i = 0; $i < 256; $i ++) {
			$j = ($j + $box [$i] + $rndkey [$i]) % 256;
			$tmp = $box [$i];
			$box [$i] = $box [$j];
			$box [$j] = $tmp;
		}
		
		for($a = $j = $i = 0; $i < $string_length; $i ++) {
			$a = ($a + 1) % 256;
			$j = ($j + $box [$a]) % 256;
			$tmp = $box [$a];
			$box [$a] = $box [$j];
			$box [$j] = $tmp;
			$result .= chr ( ord ( $string [$i] ) ^ ($box [($box [$a] + $box [$j]) % 256]) );
		}
		
		if ($operation == 'DECODE') {
			if ((substr ( $result, 0, 10 ) == 0 || substr ( $result, 0, 10 ) - time () > 0) && substr ( $result, 10, 16 ) == substr ( md5 ( substr ( $result, 26 ) . $keyb ), 0, 16 )) {
				return substr ( $result, 26 );
			} else {
				return '';
			}
		} else {
			return $keyc . str_replace ( '=', '', base64_encode ( $result ) );
		}
	}
}

?>