/**
  * 儲存結算結果
  * @param array $empSettleAry - array('02010007'=>array)
  * @param array $empSettle - array('02010007'=>'姓名')
  * @param string $daymonth
  * @return boolean
  * @throws @var:$empitem@mtd:getErrors
  */
 private function saveSettleItems($empSettleAry)
 {
     $model = TbmEmpItem::model();
     $transaction = $model->dbConnection->beginTransaction();
     $valid = TRUE;
     $errorMsg = '';
     try {
         $sql = '';
         $result = 0;
         // 因為逐筆新增太耗資源, 直接一次全部寫入. 300個員工. 也不過 300 X 20 = 6000筆
         $sqlStart = "INSERT INTO `tbm_emp_item` (`id`, `daymonth`, `empno`, `empname`, `itemno`, `value`, `eachmonth`, `memo`, \n                            `opt1`, `opt2`, `opt3`, `cemp`, `uemp`, `ctime`, `utime`, `ip`) VALUES ";
         $sql = $sqlStart;
         $i = 0;
         foreach ($empSettleAry as $empitem) {
             $this->createData($empitem);
             if ($valid) {
                 $sql = $sql . "(DEFAULT, '{$empitem->daymonth}', '{$empitem->empno}', '{$empitem->empname}', '{$empitem->itemno}', ";
                 $sql = $sql . "'{$empitem->value}', '{$empitem->eachmonth}', '{$empitem->memo}', '{$empitem->opt1}', '{$empitem->opt2}', ";
                 $sql = $sql . "'{$empitem->opt3}', '{$empitem->cemp}', '{$empitem->uemp}', '{$empitem->ctime}', '{$empitem->utime}', '{$empitem->ip}'),";
             } else {
                 $valid = FALSE;
                 $errorMsg = $errorMsg . "驗證失敗: {$empitem->empname}, {$empitem->itemno} 差勤結算失敗 !" . CVarDumper::dumpAsString($empitem->getErrors()) . "<br>";
                 break;
             }
             if ($i++ > 5000) {
                 $sql = substr_replace($sql, ";", -1);
                 $result = Yii::app()->db->createCommand($sql)->execute();
                 $sql = $sqlStart;
                 $i = 0;
             }
         }
         // 最後一將最後一個,號改成;號
         $sql = substr_replace($sql, ";", -1);
         $result = Yii::app()->db->createCommand($sql)->execute();
         if (!$valid or $result < 1) {
             $valid = FALSE;
         }
         if ($valid) {
             $transaction->commit();
         } else {
             $errorMsg = " 差勤結算失敗 !<br>" . $errorMsg;
             $transaction->rollback();
         }
     } catch (Exception $e) {
         $transaction->rollback();
         throw $e;
     }
     return array($valid, $errorMsg);
 }
 /**
  * 新增支出
  * @param type $perform
  */
 private function createOutputData($array, $perform)
 {
     //支出金額初始值
     $outputTotal = 0;
     // 取得LOG的類別及細項
     $ary = $this->getLogItem();
     $logItemArray = $ary[0];
     // 細項
     $logTypeArray = $ary[1];
     // 類別
     $logMainArray = $ary[2];
     // 主項
     $logSubArray = $ary[3];
     // 次項
     // 錯誤訊息
     $errMsg = '';
     $model = TbmEmpItem::model();
     $transaction = $model->dbConnection->beginTransaction();
     try {
         // 處理刪除
         $checkDelete = TRUE;
         // 驗證
         $valid = TRUE;
         // 刪除與取消刪除優先處理
         if (isset($_POST['TbpOutputLog'])) {
             foreach ($_POST['TbpOutputLog'] as $j => $TbpOutputLog) {
                 if (isset($_POST['TbpOutputLog'][$j])) {
                     $array[$j] = new TbpOutputLog();
                     $array[$j]->attributes = $TbpOutputLog;
                     $array[$j]->pdate = $perform->pdate;
                     $array[$j]->storecode = $perform->storecode;
                     $array[$j]->storename = $perform->storename;
                     // 幫itemID都查詢好main跟sub
                     if ($array[$j]->itemid != '') {
                         $array[$j]->itemname = $logItemArray[$array[$j]->itemid];
                         //得到細項名稱
                         $array[$j]->type = $logTypeArray[$array[$j]->itemid];
                         //得到細項型態
                         $array[$j]->mainid = $logMainArray[$array[$j]->itemid];
                         //得到主項ID
                         $array[$j]->subid = $logSubArray[$array[$j]->itemid];
                         //得到次項ID
                     }
                     if ($TbpOutputLog['id'] != '') {
                         $array[$j]->id = $TbpOutputLog['id'];
                         //當按了支出明細的刪除
                         if (isset($_POST[$j . 'delete'])) {
                             // Yii::app()->user->setFlash('success', '1');
                             $array[$j] = TbpOutputLog::model()->findByPk($TbpOutputLog['id']);
                             $array[$j]->opt1 = 0;
                             $this->updateData($array[$j]);
                             $valid = $array[$j]->save() && $valid;
                             $checkDelete = FALSE;
                         } elseif (isset($_POST[$j . 'cancel_del'])) {
                             //當按了支出明細的取消刪除
                             $array[$j] = TbpOutputLog::model()->findByPk($TbpOutputLog['id']);
                             $array[$j]->opt1 = 1;
                             $this->updateData($array[$j]);
                             $valid = $array[$j]->save() && $valid;
                             $checkDelete = FALSE;
                         }
                         if (!$valid) {
                             $errMsg = $errMsg . '第' . ($j + 2) . '筆' . CVarDumper::dumpAsString($array[$j]->getErrors() . '<br>');
                         }
                     }
                     // if($TbpOutputLog['id'] != '') {
                 }
                 // if (isset($_POST['TbpOutputLog'][$j])) {
             }
             //foreach ($_POST['TbpOutputLog'] as $j=>$TbpOutputLog)
         }
         if ($checkDelete && isset($_POST['send'])) {
             // 先針對所有的資料,做一次加總,看看總和對不對
             foreach ($array as $log) {
                 // 以 price、itemid 值判斷金額相加
                 if ($log->itemid != '' && $log->price > 0) {
                     $outputTotal = $outputTotal + $log->price;
                     //支出金額相加
                 }
             }
             // 檢查總計是否正確
             if ($perform->output > 0) {
                 if ($perform->output == $outputTotal) {
                     Yii::app()->user->setFlash('success', '支出金額: ' . $perform->output . ' 與零用金明細金額: ' . $outputTotal . ' 吻合!');
                 } else {
                     Yii::app()->user->setFlash('error', '支出金額: ' . $perform->output . ' 與零用金明細金額: ' . $outputTotal . ' 比對不吻合,重新輸入!!');
                     $valid = false;
                 }
             }
             if ($valid) {
                 // 先針對所有的資料,做一次加總,看看總和對不對
                 foreach ($array as $k => $log) {
                     // 判斷資料是否已存在
                     if ($array[$k]->id != '') {
                         $tbpLog = TbpOutputLog::model()->findByPk($array[$k]->id);
                         if (isset($tbpLog)) {
                             /* 不加下面這個 下面$array[$i]->save(FALSE)資料庫驗證會錯誤 */
                             $theSame = $array[$k]->compare($tbpLog);
                             $array[$k]->isNewRecord = FALSE;
                             //他是舊的,如果是true Yii會認為是新的create
                             if (!$theSame) {
                                 $this->updateData($array[$k]);
                             }
                         }
                     } else {
                         // if($TbpOutputLog['id'] != '')
                         $this->createData($array[$k]);
                     }
                     // 以 price、itemid 值判斷
                     if ($array[$k]->itemid != '' && $array[$k]->price > 0) {
                         $valid = $array[$k]->validate() && $valid;
                         if (!$valid) {
                             $errMsg = $errMsg . '第' . ($k + 2) . '筆' . CVarDumper::dumpAsString($array[$k]->getErrors() . '<br>');
                         }
                     }
                 }
                 if ($valid) {
                     for ($i = 0; $i < count($array); $i++) {
                         if (isset($array[$i]) && $array[$i]->price > 0 && $array[$i]->itemid != '') {
                             $array[$i]->save(FALSE);
                         }
                     }
                 }
             }
             if ($errMsg != '') {
                 Yii::app()->user->setFlash('error', $errMsg);
             }
         }
         if ($valid) {
             $transaction->commit();
             //                Yii::app()->user->setFlash('success', "成功!");
         } else {
             $transaction->rollback();
             //                Yii::app()->user->setFlash('error', $errMsg ."失敗!");
         }
     } catch (Exception $e) {
         $transaction->rollback();
         throw $e;
     }
     return $array;
 }