<?php
Doo::loadCore ( 'db/DooModel' );
/**
 * 发票审批相关信息及其操作业务逻辑
 * @author CP.
 * @version 1.0
 * @namespace invoice
 * @package invoiceModel
 */
class invoiceReceivables extends DooModel {
	private $INVOICEKEY = "APPROVAL";
	public $irid;
	public $bindStatus;
	public $iid;
	public $receivablesPrice;
	public $receivablesSerial;
	public $receivablesMessage;
	public $receivablesBank;
	public $receivablesDate;
	public $receivablesCategory;
	public $receivablesStaff;
	public $inputStaff;
	public $source;
	public $date;
	public $confirmTime;
	public $bindDate;
	public $_table = 'CLD_invoiceReceivables';
	public $_primarykey = 'irid';
	public $_fields = array (
			'irid',
			'bindStatus',
			'iid',
			'receivablesPrice',
			'receivablesSerial',
			'receivablesMessage',
			'receivablesBank',
			'receivablesDate',
			'receivablesCategory',
			'receivablesStaff',
			'inputStaff',
			'source',
			'date',
			'confirmTime',
			'bindDate' 
	);
	/**
	 * 获取最新几条收款包括最新的一条操作日志
	 * @param number $limit
	 * @return unknown
	 */
	public function getInvoiceReceivablesByNew($limit = 4) {
		$list = $this->find ( array (
				'desc' => 'irid',
				'limit' => $limit,
				'asArray' => TRUE 
		) );
		Doo::loadModel ( 'invoiceROLog' );
		$invoiceROLog = new invoiceROLog ();
		foreach ( $list as $key => $value ) {
			$list [$key] ['invoiceROLog'] = $invoiceROLog->getInvoiceROLogByIrid ( $value ['irid'], 'desc' );
		}
		return $list;
	}
	public function getInvoiceReceivablesByClaim($cid = 0, $sid = 0) {
		if (empty ( $sid )) {
			$list ['csClaim'] = $this->find ( array (
					'where' => "receivablesCategory='public' and receivablesStaff='public'  and bindStatus=0",
					'desc' => 'irid',
					'asArray' => TRUE 
			) );
			foreach ( $list ['csClaim'] as $key => $value ) {
				$list ['csClaim'] [$key] ['iidKey'] = $this->authcode ( $value ['irid'], '' );
				// $list ['csClaim'] [$key] ['iidKeyUrl'] = $XDeode->encode ( $value ['iid'] );
			}
			
			$list ['sClaim'] = $this->find ( array (
					'where' => "receivablesCategory!='public' and receivablesStaff='public' and receivablesCategory like '" . $cid . ":%' and bindStatus=0",
					'desc' => 'irid',
					'asArray' => TRUE 
			) );
			foreach ( $list ['sClaim'] as $key => $value ) {
				$list ['sClaim'] [$key] ['iidKey'] = $this->authcode ( $value ['irid'], '' );
			}
			
			$list ['arClaim'] = $this->find ( array (
					'where' => "receivablesCategory!='public' and receivablesStaff!='public' and receivablesCategory like '" . $cid . ":%' and receivablesStaff  like '" . $sid . "-%' and bindStatus=0",
					'desc' => 'irid',
					'asArray' => TRUE 
			) );
			foreach ( $list ['arClaim'] as $key => $value ) {
				$staff = explode ( "-", $value ['receivablesStaff'] );
				$list ['arClaim'] [$key] ['sid'] = $staff [0];
				$list ['arClaim'] [$key] ['username'] = $staff [1];
			}
		}
		if (! empty ( $cid ) && ! empty ( $sid )) {
			
			$list ['myClaim'] = $this->find ( array (
					'where' => " receivablesStaff like '" . $sid . "-%' and receivablesCategory like '" . $cid . ":%' and bindStatus=0",
					'desc' => 'irid',
					'asArray' => TRUE 
			) );
			foreach ( $list ['myClaim'] as $key => $value ) {
				$list ['myClaim'] [$key] ['iidKey'] = $this->authcode ( $value ['irid'], '' );
				$staff = explode ( "-", $value ['receivablesStaff'] );
				$list ['myClaim'] [$key] ['sid'] = $staff [0];
				$list ['myClaim'] [$key] ['username'] = $staff [1];
			}
			
			$list ['bindClaim'] = $this->find ( array (
					'where' => " bindStatus=1 and receivablesStaff  like '" . $sid . "-%' ",
					'desc' => 'irid',
					'limit' => 3,
					'asArray' => TRUE 
			) );
			Doo::loadModel ( 'invoice' );
			$invoice = new invoice ();
			Doo::loadClass ( 'XDeode' );
			$XDeode = new XDeode ( 5 );
			foreach ( $list ['bindClaim'] as $key => $value ) {
				$id = $invoice->getInvoiceByIid ( $value ['iid'] );
				$id ['iidKeyUrl'] = $XDeode->encode ( $id ['iid'] );
				$list ['bindClaim'] [$key] ['invoice'] = $id;
				$list ['bindClaim'] [$key] ['iridKeyUrl'] = $XDeode->encode ( $value ['irid'] );
			}
		}
		
		return $list;
	}
	
	/**
	 * 根据发票ID和绑定状态获得收款数据，绑定状态为ALL获取所有状态数据
	 * @param string $iid 发票ID
	 * @param string $bindStatus
	 * @return mixed
	 */
	public function getInvoiceReceivablesByIid($iid = "", $bindStatus = "All") {
		Doo::loadClass ( 'XDeode' );
		$XDeode = new XDeode ( 5 );
		$iid = $this->authcode ( $iid );
		$list = array ();
		if (! empty ( $iid ) && is_numeric ( $iid )) {
			
			$sql = '';
			if ($bindStatus == 1)
				$sql = " and bindStatus=1";
			elseif ($bindStatus === 0)
				$sql = " and bindStatus=0";
			$list = $this->find ( array (
					'where' => " iid=" . $iid . $sql,
					'asArray' => TRUE 
			) );
		}
		
		foreach ( $list as $key => $value ) {
			$list [$key] ['iidKey'] = $this->authcode ( $value ['irid'], '' );
			$staff = explode ( "-", $value ['receivablesStaff'] );
			$list [$key] ['sid'] = $staff [0];
			$list [$key] ['username'] = $staff [1];
			$list [$key] ['iridKey'] = $XDeode->encode ( $value ['irid'] );
		}
		return $list;
	}
	public function getInvoiceReceivablesInIridString($iridString = "") {
		$list = array ();
		if (! empty ( $iridString ))
			$list = $this->find ( array (
					'where' => " irid in ( " . $iridString . " )",
					'asArray' => TRUE 
			) );
		
		$price = 0;
		$serial = 0;
		Doo::loadClass ( 'XDeode' );
		$XDeode = new XDeode ( 5 );
		foreach ( $list as $key => $value ) {
			$price += $value ['receivablesPrice'];
			$list [$key] ['iridKeyK'] = $XDeode->encode ( $value ['irid'] );
		}
		if (! empty ( $list ))
			$list [0] ['sumPrice'] = $price;
		return $list;
	}
	/**
	 * 根据收款ID获取一条相关数据
	 * @param string $irid
	 * @param string $con 附加获取收款条件 可以为空
	 * @return unknown[]|mixed[]|string[]
	 */
	public function getInvoiceReceivablesByIrid($irid = "", $con = "") {
		Doo::loadClass ( 'XDeode' );
		$XDeode = new XDeode ( 5 );
		if (!is_numeric($irid))
			$irid = $this->authcode ( $irid );
		$detail = array ();
		if (! empty ( $irid ) && is_numeric ( $irid ))
			$detail = $this->getOne ( array (
					'where' => " irid=" . $irid . $con,
					'asArray' => TRUE 
			) );
		
		if (empty($detail))
			return $detail;
		$detail ['cid'] = '';
		$detail ['title'] = '';
		if ($detail ['receivablesCategory'] != "PUBLIC") {
			$category = explode ( ":", $detail ['receivablesCategory'] );
			$detail ['cid'] = $category [0];
			$detail ['title'] = $category [1];
		}
		
		$detail ['sid'] = '';
		$detail ['username'] = '';
		if ($detail ['receivablesStaff'] != "PUBLIC") {
			$staff = explode ( "-", $detail ['receivablesStaff'] );
			$detail ['sid'] = $staff [0];
			$detail ['username'] = $staff [1];
		}
		
		$detail ['iridKey'] = $XDeode->encode ( $detail ['irid'] );
		$detail ['iridEn'] = $this->authcode ( $detail ['irid'], '' );
		return $detail;
	}
	public function getInvoiceReceivablesByIrsid($irid = "", $sid = "") {
		Doo::loadClass ( 'XDeode' );
		$XDeode = new XDeode ( 5 );
		$irid = $XDeode->decode ( $irid );
		$detail = array ();
		if (! empty ( $irid ) && is_numeric ( $irid )) {
			$detail = $this->getOne ( array (
					'where' => " irid=" . $irid . " and receivablesStaff like '" . $sid . "_%'",
					'asArray' => TRUE 
			) );
			
			$detail ['sid'] = '';
			$detail ['username'] = '';
			if (! empty ( $detail ['receivablesStaff'] )) {
				$staff = explode ( "-", $detail ['receivablesStaff'] );
				$detail ['sid'] = $staff [0];
				$detail ['username'] = $staff [1];
			}
			$detail ['iridKey'] = $XDeode->encode ( $detail ['irid'] );
			$detail ['iridEn'] = $this->authcode ( $detail ['irid'], '' );
		}
		return $detail;
	}
	
	/**
	 * 添加一个收款
	 * @param array $item 收款相关数据
	 * @return number 返回收款ID
	 */
	public function addInvoiceReceivables($item = array()) {
		$lid = 0;
		if (is_array ( $item ) && ! empty ( $item )) {
			foreach ( $item as $key => $value ) {
				$this->$key = $value;
			}
			$lid = $this->insert ();
		}
		return $lid;
	}
	
	/**
	 * 根据参数字段更新相应字段（主键ID必须传）
	 * @param array $item 相关需要更新的字段信息
	 * @return number 返回发票ID
	 */
	public function setInvoiceReceivablesByCondition($item = array()) {
		$lid = 0;
		if (is_array ( $item ) && ! empty ( $item )) {
			foreach ( $item as $key => $value ) {
				$this->$key = $value;
			}
			$lid = $this->update ();
		}
		return $lid;
	}
	
	/**
	 * 根据irid 获取一组收款数据
	 * @param string $irid
	 * @return unknown
	 */
	public function getInvoiceReceivablesInIrid($irid = '') {
		if (empty ( $irid ))
			return array ();
		
		$list = $this->find ( array (
				'where' => " irid in(" . $irid . ")",
				'asArray' => TRUE 
		) );
		foreach ( $list as $key => $value ) {
		}
		return $list;
	}
	function getReceivablesByUntreadStatusPage($limit = 0, $con = "", $desc = 'desc') {
		if (empty ( $limit ))
			return array ();
		
		$list = $this->find ( array (
				'where' => $con, // " bindStatus=1 and receivablesStaff like '" . $sid . "_%' ".$con,
				'limit' => $limit,
				$desc => 'irid',
				'asArray' => TRUE 
		) );
		Doo::loadClass ( 'XDeode' );
		$XDeode = new XDeode ( 5 );
		Doo::loadModel ( 'invoice' );
		$invoice = new invoice ();
		Doo::loadModel ( 'invoiceROLog' );
		$invoiceROLog = new invoiceROLog ();
		
		foreach ( $list as $key => $value ) {
			$list [$key] ['iridKeyK'] = $XDeode->encode ( $value ['irid'] );
			$list [$key] ['iridKey'] = $this->authcode ( $value ['irid'], '' );
			if (isset ( $value ['iid'] ) && ! empty ( $value ['iid'] )) {
				
				$list [$key] ['iidKeyK'] = $XDeode->encode ( $value ['iid'] );
				$list [$key] ['irList'] = $invoice->getInvoiceByIid ( $value ['iid'] );
			} else {
				$list [$key] ['iidKeyK'] = '';
				$list [$key] ['irList'] = array (
						'invoiceSerial' => '' 
				);
			}
			$list [$key] ['irolg'] = $invoiceROLog->getInvoiceROLogByIrid ( $value ['irid'], 'desc' );
			// $list [$key] ['sumPrice'] = 0;
			// if (! empty ( $list [$key] ['irList'] ))
			// $list [$key] ['sumPrice'] = $list [$key] ['irList'] [0] ['sumPrice'];
			// $list [$key] ['operationLog'] = $invoiceOperationLog->getInvoiceOperationLogByIid ( $value ['iid'], 'desc' );
		}
		
		return $list;
	}
	function delInvoiceReceivablesByIrid($irid = 0) {
		if (!empty($irid)&&is_numeric($irid))
			$this->delete(array('where'=>'irid='.$irid));
	}
	
	/**
	 * 加密或解密指定字符串
	 *
	 * @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 ) );
		}
	}
}

?>