source: branches/camp/camp-2_13-tax/data/class/helper/SC_Helper_TaxRule.php @ 22702

Revision 22702, 12.3 KB checked in by AMUAMU, 8 years ago (diff)

税設定選択ルーチンを修正

Line 
1<?php
2/*
3 * This file is part of EC-CUBE
4 *
5 * Copyright(c) 2000-2013 LOCKON CO.,LTD. All Rights Reserved.
6 *
7 * http://www.lockon.co.jp/
8 *
9 * This program is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU General Public License
11 * as published by the Free Software Foundation; either version 2
12 * of the License, or (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
22 */
23
24/**
25 * 税規約を管理するヘルパークラス.
26 *
27 * @package Helper
28 * @author AMUAMU
29 * @version $Id:$
30 */
31class SC_Helper_TaxRule
32{
33
34    /**
35     * 設定情報に基づいて税金付与した金額を返す
36     *
37     * @param integer $price 計算対象の金額
38     * @return integer 税金付与した金額
39     */
40    function sfCalcIncTax($price, $product_id = 0, $product_class_id = 0, $pref_id =0, $country_id = 0)
41    {
42        return $price + SC_Helper_TaxRule_Ex::sfTax($price, $product_id, $product_class_id, $pref_id, $country_id);
43    }
44
45    /**
46     * 設定情報に基づいて税金の金額を返す
47     *
48     * @param integer $price 計算対象の金額
49     * @return integer 税金した金額
50     */
51    function sfTax($price, $product_id = 0, $product_class_id = 0, $pref_id =0, $country_id = 0)
52    {
53        $arrTaxRule = SC_Helper_TaxRule_Ex::getTaxRule($product_id, $product_class_id, $pref_id, $country_id);
54        return SC_Helper_TaxRule_Ex::calcTax($price, $arrTaxRule['tax_rate'], $arrTaxRule['tax_rule'], $arrTaxRule['tax_adjust']);
55    }
56
57    /**
58     * 設定情報IDに基づいて税金付与した金額を返す
59     * (受注データのようにルールが決まっている場合用)
60     *
61     * @param integer $price 計算対象の金額
62     * @return integer 税金付与した金額
63     */
64    function calcIncTaxFromRuleId($price, $tax_rule_id = 0)
65    {
66        return $price + SC_Helper_TaxRule_Ex::calcTaxFromRuleId($price, $tax_rule_id);
67    }
68
69    /**
70     * 設定情報IDに基づいて税金の金額を返す
71     * (受注データのようにルールが決まっている場合用)
72     *
73     * @param integer $price 計算対象の金額
74     * @return integer 税金した金額
75     */
76    function calcTaxFromRuleId($price, $tax_rule_id = 0)
77    {
78        $arrTaxRule = SC_Helper_TaxRule_Ex::getTaxRuleData($tax_rule_id);
79        return SC_Helper_TaxRule_Ex::calcTax($price, $arrTaxRule['tax_rate'], $arrTaxRule['tax_rule'], $arrTaxRule['tax_adjust']);
80    }
81
82    /**
83     * 税金額を計算する
84     *
85     * @param integer $price 計算対象の金額
86     * @param integer $tax 税率(%単位)
87     *     XXX integer のみか不明
88     * @param integer $tax_rule 端数処理
89     * @return integer 税金額
90     */
91    function calcTax ($price, $tax, $calc_rule, $tax_adjust = 0)
92    {
93        $real_tax = $tax / 100;
94        $ret = $price * $real_tax;
95        switch ($calc_rule) {
96            // 四捨五入
97            case 1:
98                $ret = round($ret);
99                break;
100            // 切り捨て
101            case 2:
102                $ret = floor($ret);
103                break;
104            // 切り上げ
105            case 3:
106                $ret = ceil($ret);
107                break;
108            // デフォルト:切り上げ
109            default:
110                $ret = ceil($ret);
111                break;
112        }
113        return $ret + $tax_adjust;
114    }
115
116
117    /**
118     * 現在有効な税金設定情報を返す
119     *
120     * @param integer $price 計算対象の金額
121     * @return array 税設定情報
122     */
123    function getTaxRule ($product_id = 0, $product_class_id = 0, $pref_id = 0, $country_id = 0)
124    {
125        // 初期化
126        $product_id = $product_id > 0 ? $product_id : 0;
127        $product_class_id = $product_class_id > 0 ? $product_class_id : 0;
128        $pref_id = $pref_id > 0 ? $pref_id : 0;
129        $country_id = $country_id > 0 ? $country_id : 0;
130
131        $objCustomer = new SC_Customer_Ex();
132        if ($objCustomer->isLoginSuccess(true)) {
133            if ($country_id == 0) {
134                $objCustomer->getValue('country_id');
135            }
136            if ($pref_id == 0) {
137                $objCustomer->getValue('pref');
138            }
139        }
140
141        // リクエストの配列化
142        $arrRequest = array('product_id' => $product_id,
143                        'product_class_id' => $product_class_id,
144                        'pref_id' => $pref_id,
145                        'country_id' => $country_id);
146
147        // 地域設定を優先するが、システムパラメーターなどに設定を持っていくか
148        // 後に書いてあるほど優先される、詳細後述MEMO参照
149        $arrPriorityKeys = array('product_id', 'product_class_id', 'pref_id', 'country_id');    // TODO: パラメーター設定に持っていく
150        $cache_key = "$product_id,$product_class_id,$pref_id,$country_id";
151
152        // 複数回呼出があるのでキャッシュ化
153        static $data_c = array();
154
155        if (empty($data_c[$cache_key])) {
156            $arrRet = array();
157
158            // 条件に基づいて税の設定情報を取得
159            $objQuery =& SC_Query_Ex::getSingletonInstance();
160            $table = 'dtb_tax_rule';
161            $cols = '*, CASE WHEN apply_date IS NULL THEN 1 ELSE 0 END as nullorder';
162            $where = '((product_id = 0 OR product_id = ?)'
163                        . ' OR (product_class_id = 0 OR product_class_id = ?))'
164                        . ' AND (pref_id = 0 OR pref_id = ?)'
165                        . ' AND (country_id = 0 OR country_id = ?)'
166                        . ' AND (apply_date < CURRENT_TIMESTAMP OR apply_date IS NULL)'
167                        . ' AND del_flg = 0';
168
169            $arrVal = array($product_id, $product_class_id, $pref_id, $country_id);
170            $order = 'nullorder ASC, apply_date DESC';
171            $objQuery->setOrder($order);
172            $arrData = $objQuery->select($cols, $table, $where, $arrVal);
173            // 優先度付け
174            // MEMO: 税の設定は相反する設定を格納可能だが、その中で優先度を付けるため
175            //       キーの優先度により、利用する税設定を判断する
176            //       優先度が同等の場合、適用日付で判断する
177
178            // XXXX: ビット演算で優先順位を判断という雑な事してます。すいません
179            foreach ($arrData as $data_key => $data) {
180                $res = 0;
181                foreach ($arrPriorityKeys as $key_no => $key) {
182                    if ($arrRequest[$key] != 0 && $data[$key] == $arrRequest[$key]) {
183                        // 配列の数値添字を重みとして利用する
184                        $res += 1 << ($key_no + 1);
185                    }
186                }
187                $arrData[$data_key]['rank'] = $res;
188            }
189
190            // 優先順位が高いものを返却値として確定
191            // 適用日降順に並んでいるので、単に優先順位比較のみで格納判断可能
192            foreach ($arrData as $data) {
193                if (!isset($arrRet['rank']) || $arrRet['rank'] < $data['rank']) {
194                    // 優先度が高い場合, または空の場合
195                    $arrRet = $data;
196                }
197            }
198            $data_c[$cache_key] = $arrRet;
199        }
200
201        GC_Utils_Ex::gfPrintLog('tax_key=' . $cache_key . ' result_tax=' . print_r($data_c[$cache_key],true));
202        return $data_c[$cache_key];
203    }
204
205    /**
206     * 税金設定情報を登録する(商品管理用)
207     *
208     * @param decimal $tax_rate 消費税率
209     * @param integer $product_id 商品ID
210     * @param integer $product_class_id 商品規格ID
211     * @param decimal $tax_adjust 消費税加算額
212     * @param integer $pref_id 県ID
213     * @param integer $country_id 国ID
214     * @return void
215     */
216    function setTaxRuleForProduct($tax_rate, $product_id = 0, $product_class_id = 0, $tax_adjust=0, $pref_id = 0, $country_id = 0)
217    {
218        // 基本設定を取得
219        $arrRet = SC_Helper_taxRule_Ex::getTaxRule();
220        // 基本設定の消費税率と一緒であれば設定しない
221        if( $arrRet['tax_rate'] != $tax_rate ) {
222            // 課税規則は基本設定のものを使用
223            $calc_rule = $arrRet['calc_rule'];
224            // 税情報を設定
225            SC_Helper_TaxRule_Ex::setTaxRule($calc_rule, $tax_rate, $apply_date, $tax_rule_id=NULL, $tax_adjust=0, $product_id, $product_class_id, $pref_id, $country_id);
226
227        }
228    }
229
230    /**
231     * 税金設定情報を登録する(仮)リファクタする(memo:規格設定後に商品編集を行うと消費税が0になるのを対応が必要)
232     *
233     * @param
234     * @return
235     */
236    function setTaxRule($calc_rule, $tax_rate, $apply_date, $tax_rule_id=NULL, $tax_adjust=0, $product_id = 0, $product_class_id = 0, $pref_id = 0, $country_id = 0)
237    {
238        $table = 'dtb_tax_rule';
239        $arrValues = array();
240        $arrValues['calc_rule'] = $calc_rule;
241        $arrValues['tax_rate'] = $tax_rate;
242        $arrValues['tax_adjust'] = $tax_adjust;
243        $arrValues['apply_date'] = $apply_date;
244        $arrValues['member_id'] = $_SESSION['member_id'];
245        $arrValues['update_date'] = 'CURRENT_TIMESTAMP';
246
247        // 新規か更新か?
248        $objQuery =& SC_Query_Ex::getSingletonInstance();
249        if($tax_rule_id == NULL && $product_id != 0 && $product_class_id != 0){
250            $where = 'product_id = ? AND product_class_id= ? AND pref_id = ? AND country_id = ?';
251            $arrVal = array($product_id, $product_class_id, $pref_id, $country_id);
252            $arrCheck = $objQuery->getRow('*', 'dtb_tax_rule', $where, $arrVal);
253            $tax_rule_id = $arrCheck['tax_rule_id'];
254        }
255
256        if($tax_rule_id == NULL) {
257            // 税情報を新規
258            // INSERTの実行
259            $arrValues['tax_rule_id'] = $objQuery->nextVal('dtb_tax_rule_tax_rule_id');
260            $arrValues['country_id'] = $country_id;
261            $arrValues['pref_id'] = $pref_id;
262            $arrValues['product_id'] = $product_id;
263            $arrValues['product_class_id'] = $product_class_id;
264            $arrValues['create_date'] = 'CURRENT_TIMESTAMP';
265
266            $objQuery->insert($table, $arrValues);
267        } else {
268            // 税情報を更新
269            $where = 'tax_rule_id = ?';
270            $objQuery->update($table, $arrValues, $where, array($tax_rule_id));
271        }
272    }
273
274
275    function getTaxRuleList($has_deleted = false)
276    {
277        $objQuery =& SC_Query_Ex::getSingletonInstance();
278        $col = 'tax_rule_id, tax_rate, calc_rule, apply_date';
279        $where = '';
280        if (!$has_deleted) {
281            $where .= 'del_flg = 0';
282        }
283        $table = 'dtb_tax_rule';
284        $objQuery->setOrder('tax_rule_id DESC');
285        $arrRet = $objQuery->select($col, $table, $where);
286        return $arrRet;
287
288    }
289
290    function getTaxRuleData($tax_rule_id, $has_deleted = false)
291    {
292        $objQuery =& SC_Query_Ex::getSingletonInstance();
293        $where = 'tax_rule_id = ?';
294        if (!$has_deleted) {
295            $where .= ' AND del_flg = 0';
296        }
297        return $objQuery->getRow('*', 'dtb_tax_rule', $where, array($tax_rule_id));
298    }
299
300
301
302    function getTaxRuleByTime($apply_date, $has_deleted = false)
303    {
304        $objQuery =& SC_Query_Ex::getSingletonInstance();
305        $where = 'apply_date = ?';
306        if (!$has_deleted) {
307            $where .= ' AND del_flg = 0';
308        }
309        $arrRet = $objQuery->select('*', 'dtb_tax_rule', $where, array($apply_date));
310        return $arrRet[0];
311    }
312
313    /**
314     * 税規約の削除.
315     *
316     * @param integer $tax_rule_id 税規約ID
317     * @return void
318     */
319    function deleteTaxRuleData($tax_rule_id)
320    {
321        $objQuery =& SC_Query_Ex::getSingletonInstance();
322
323        $sqlval = array();
324        $sqlval['del_flg']     = 1;
325        $sqlval['update_date'] = 'CURRENT_TIMESTAMP';
326        $where = 'tax_rule_id = ?';
327        $objQuery->update('dtb_tax_rule', $sqlval, $where, array($tax_rule_id));
328    }
329}
Note: See TracBrowser for help on using the repository browser.