<?php

/**
 * @desc 财务模块配置
 */
class Process_ImportDataProcess
{
    /**
     * @状态
     * @param string $lang
     * @return array
     */
    public static function status($lang = 'zh_CN')
    {
        $tmp = array(
            'zh_CN' => array(
                '0' => '未处理',
                '1' => '处理中',
                '2' => '已处理',
            ),
            'en_US' => array(
                '0' => '未处理',
                '1' => '处理中',
                '2' => '已处理',
            )
        );
        if ($lang == 'auto') {
            $lang = Ec::getLang();
        }
        return isset($tmp[$lang]) ? $tmp[$lang] : $tmp;
    }

    public static function readUploadFile($filePath, $sheet = 0)
    {
        $excelResult = Common_Upload::readEXCELAndType($filePath, $sheet);
        $result = array();
        $resultType=array();
        $fileData=$excelResult['value'];
        $type=$excelResult['type'];
        if (is_array($fileData)) {
            foreach ($fileData as $key => $value) {
                if ($key == 0) {
                    continue;
                }
                foreach ($value as $vKey => $vValue) {
                    if ($fileData[0][$vKey] == "")
                        continue;

                    $vValue = trim($vValue);
                    $result[$key][$fileData[0][$vKey]] = $vValue;
                    $resultType[$key][$fileData[0][$vKey]] = $type[$key][$vKey];
                }
            }
        } else {
            throw new Exception($fileData);
        }
        return array('value'=>$result,'type'=>$resultType);
    }

    public static function excelTime($date, $time = false)
    {
        if (is_numeric($date)) {
            //$jd = GregorianToJD(1, 1, 1970);
            //$gregorian = JDToGregorian($jd + intval($date) - 25569);
            //$date = explode('/', $gregorian);
            //$date_str = str_pad($date[2], 4, '0', STR_PAD_LEFT)
            //    . "-" . str_pad($date[0], 2, '0', STR_PAD_LEFT)
            //    . "-" . str_pad($date[1], 2, '0', STR_PAD_LEFT)
            //    . ($time ? " 00:00:00" : '');
            //return $date_str;
            
            $date_str = date('Y-m-d', intval(($date - 25569) * 3600 * 24));//格式化时间
            $date_str .= $time ? " 00:00:00" : '';
            return $date_str;
        }
        return $date;
    }


    public static function columnMap($code = '')
    {
        $code = strtolower($code);
        $mapArr['random'] = array(
            '日期' => 'date',
            '费用类型' => 'feeType',
            '金额' => 'amount',
            '币种' => 'currency_code'
        );
        //速达
        $mapArr['transpeed'] = array(
            '日期' => 'date',
            '单号' => 'code',
            '数量' => 'quantity',
            '计量单位' => 'unit',
            '费用类型' => 'feeType',
            '金额' => 'amount',
            '币种' => 'currency_code'
        );
        return $mapArr[$code];
    }



	/**
	 * 导入服务商数据
	 * @param array $params 导入参数
	 * @param array $file 上传数据
	 * @param number $sheet
	 * @throws Exception
	 * @return string|multitype:number string multitype:string  NULL
	 */
    public static function save($params, $file, $sheet = 0)
    {
        $return = array(
            'ask' => 0,
            'message' => 'Fail.'
        );
        if (!isset($params['m_code']) || $params['m_code'] == '') {
            $return['err'][] = '请选择模板类型';
            return $return;
        }

        $err = array();
        $db = Common_Common::getAdapter();
        $db->beginTransaction();
        try {
            $columnMap = self::columnMap($params['m_code']);
            // 列映射
            $filePath = $file['tmp_name'];
            if (empty($filePath)) {
                //throw new Exception('请选择excel文件(*.xls;*.xlsx)');
                $err[] = '请选择excel文件(*.xls;*.xlsx)';
            }
            $pathinfo = pathinfo($file['name']);

            if (!isset($pathinfo["extension"]) || !in_array($pathinfo["extension"], array(
                    'xls',
                    'xlsx'
                ))
            ) {
                //throw new Exception('请选择excel文件(*.xls;*.xlsx)');
                $err[] = '请选择excel文件(*.xls;*.xlsx)';
            }
            $importCodeArr = Process_BillConfig::importCode('auto');
            $import_data_row = array(
                'id_code' => $params['m_code'],
                'id_name' => $importCodeArr[$params['m_code']],
                'id_reference_no' => $params['reference_no'],
                'id_start_time' => $params['dateFor'],
                'id_end_time' => $params['dateTo'],
                'id_status' => '0',
                'payer_code' => $params['m_sp_code'],
                'sm_code' => $params['sm_code'],
                'id_note' => $params['note'],
                'id_creator_id' => Service_User::getUserId(),
                'id_finish_id' => '',
                'id_add_time' => date('Y-m-d H:i:s'),
                'id_finish_time' => '',
                'id_update_time' => date('Y-m-d H:i:s')
            );
            foreach ($import_data_row as $k => $v) {
                if (!isset($v)) {
                    $import_data_row[$k] = '';
                }
            }
            if (empty($import_data_row['id_code'])) {
                $err[] = '模板类型代码 必填';
            }
            if (empty($import_data_row['payer_code'])) {
                $err[] = '服务商代码 必填';
            }

            if (empty($import_data_row['id_reference_no'])) {
                $err[] = '参考号码 必填';
            }

            if (empty($import_data_row['id_start_time']) || empty($import_data_row['id_end_time'])) {
                $err[] = '业务时间 必填';
            }

            /*            
			if (empty($import_data_row['sm_code'])) {
				$err[] = '运输方式 必填';
			}
			if (empty($import_data_row['id_note'])) {
					$err[] = '备注 必填';
			}
			*/
            if (!empty($err)) {
                throw new Exception('内容必填');
            }
            $spRow=Service_ServiceProvider::getByField($import_data_row['payer_code'],'sp_code');

            if(empty($spRow)){
                throw new Exception('服务商代码：' . $import_data_row['payer_code'] . ' 不存在');
            }
            $iRow = Service_ImportData::getByField($import_data_row['id_reference_no'], 'id_reference_no');
            if (!empty($iRow)) {
                throw new Exception('参考号：' . $import_data_row['id_reference_no'] . ' 已存在');
            }

            $reAndType = self::readUploadFile($filePath, $sheet);
            $data=$reAndType['value'];
            $type=$reAndType['type'];
            if (empty($data)) {
                throw new Exception('No Data');
            }
            $id_id = Service_ImportData::add($import_data_row);
            $feeTypeArr = array();
            foreach ($data as $k => $v) {
                foreach ($v as $kk => $vv) {
                    //必须全部识别
                    if (!isset($columnMap[$kk])) {
                        throw new Exception($kk . ' 无法识别');
                    }
                    //日期类型转换
                    switch (strtolower($columnMap[$kk])) {
                        case 'date':
                            if($type[$k][$kk]['type']=='n'){
                             
                                     if(Common_Upload::checkCellType($type[$k][$kk]['fomart'])){
                                          throw new Exception('第'.($k+1).'行日期列格式不正确，正确格式如2015/10/10且单元格格式为文本格式');
                                     }
                                      
                             }
                             if(!preg_match('/^\d{4}\/{1}\d{1,2}\/{1}\d{1,2}$/',$vv)){
                                  throw new Exception('第'.($k+1).'行日期列格式不正确，正确格式如2015/10/10且单元格格式为文本格式');
                             }else{
                                 $dateArray=  explode('/', $vv);
                                 if(!checkdate($dateArray[1], $dateArray[2], $dateArray[0])){
                                      throw new Exception('第'.($k+1).'行非法日期');
                                 }
                             }
                            break;
                        case 'feeType':
                            if (!empty($vv) && !isset($feeTypeArr[$vv])) {
                                $ftArr = Service_FeeType::getByField($vv, 'ft_name_cn');
                                if (empty($ftArr)) {
                                    throw new Exception($vv . ' 无法识别');
                                }
                                $feeTypeArr[$vv] = 1;
                            }
                            break;
						//增加金额验证
                        case 'amount' :
                        	 if(!is_numeric($vv)){
                        	 	throw new Exception('第'.($k+1).'行，金额： '.$vv.' 不是数字');
                        	 }
                                 if($type[$k][$kk]['type']=='n'){
                                     if(Common_Upload::checkCellType($type[$k][$kk]['fomart'])){
                                         throw new Exception('第'.($k+1).'行，金额列是日期');
                                     }
                                 }
                    }
                    $detail = array(
                        'id_id' => $id_id,
                        'iddf_rowno' => $k,
                        'iddf_title' => $kk,
                        'iddf_code' => isset($columnMap[$kk]) ? $columnMap[$kk] : '',
                        'iddf_value' => $vv
                    );
                    Service_ImportDataDetailFormat::add($detail);
                }
            }
			$db->commit();
            $return['ask'] = 1;
            $return['message'] = 'Success';
        } catch (Exception $e) {
            $db->rollback();
            $return['message'] = $e->getMessage();
        }
        $return['err'] = $err;
        return $return;
    }
}