- Fixed #16160: Call to undefined function ezi18n()
[tinyz:tinyz.git] / kernel / shop / vatrules.php
1 <?php
2 //
3 // Created on: <17-Feb-2006 16:58:41 vs>
4 //
5 // ## BEGIN COPYRIGHT, LICENSE AND WARRANTY NOTICE ##
6 // SOFTWARE NAME: eZ Publish
7 // SOFTWARE RELEASE: 4.1.x
8 // COPYRIGHT NOTICE: Copyright (C) 1999-2010 eZ Systems AS
9 // SOFTWARE LICENSE: GNU General Public License v2.0
10 // NOTICE: >
11 //   This program is free software; you can redistribute it and/or
12 //   modify it under the terms of version 2.0  of the GNU General
13 //   Public License as published by the Free Software Foundation.
14 //
15 //   This program is distributed in the hope that it will be useful,
16 //   but WITHOUT ANY WARRANTY; without even the implied warranty of
17 //   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18 //   GNU General Public License for more details.
19 //
20 //   You should have received a copy of version 2.0 of the GNU General
21 //   Public License along with this program; if not, write to the Free
22 //   Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
23 //   MA 02110-1301, USA.
24 //
25 //
26 // ## END COPYRIGHT, LICENSE AND WARRANTY NOTICE ##
27 //
28
29 require_once( "kernel/common/template.php" );
30 /**
31  * Find errors in VAT charging rules.
32  *
33  * \return list of errors, or false if no errors found.
34  */
35 function findErrors( $vatRules )
36 {
37     $errors = false;
38
39     // 1. Check if default rule exists.
40     $defaultRuleExists = false;
41     foreach ( $vatRules as $rule )
42     {
43         if ( $rule->attribute( 'country' ) == '*' &&
44              !$rule->attribute( 'product_categories' ) )
45         {
46             $defaultRuleExists = true;
47             break;
48         }
49     }
50
51     if ( !$defaultRuleExists && count( $vatRules ) > 0 )
52         $errors[] = ezpI18n::translate( 'kernel/shop/vatrules', 'No default rule found. ' .
53                             'Please add rule having "Any" country and "Any" category.' );
54
55     // 2. Check for conflicting rules.
56     // Conflicting rules are those having the same country and equal or intersecting categories sets.
57     $vatRulesCount = count( $vatRules );
58     for ( $i=0; $i < $vatRulesCount; $i++ )
59     {
60         $iRule       = $vatRules[$i];
61         $iCountry    = $iRule->attribute( 'country_code' );
62         $iCategories = $iRule->attribute( 'product_categories_names' );
63
64         for ( $j=$i+1; $j < $vatRulesCount; $j++ )
65         {
66             $jRule       = $vatRules[$j];
67             $jCountry    = $jRule->attribute( 'country_code' );
68
69             if ( $iCountry != $jCountry )
70                 continue;
71
72             $jCategories = $jRule->attribute( 'product_categories_names' );
73
74             // Multiple default rules.
75             if ( !$iCategories && !$jCategories )
76             {
77                 if ( $iCountry == '*' )
78                 {
79                     $errorMessage = "Conflict: There are multiple default rules.";
80                     $errors[] = ezpI18n::translate( 'kernel/shop/vatrules', $errorMessage );
81                 }
82                 else
83                 {
84                     $errorMessage = "Conflict: There are multiple default rules for country '%1'.";
85                     $errors[] = ezpI18n::translate( 'kernel/shop/vatrules', $errorMessage, null, array( $iCountry ) );
86                 }
87             }
88             // Intersecting rules.
89             elseif ( $iCategories && $jCategories && $commonCategories = array_intersect( $iCategories, $jCategories ) )
90             {
91                 if ( $iCountry == '*' )
92                 {
93                     $errorMessage = "Conflict: The following categories for any country are mentioned in multiple rules: %2.";
94                     $errors[] = ezpI18n::translate( 'kernel/shop/vatrules', $errorMessage, null, array( $iCountry, join( ',', $commonCategories ) ) );
95                 }
96                 else
97                 {
98                     $errorMessage = "Conflict: The following categories for country '%1' are mentioned in multiple rules: %2.";
99                     $errors[] = ezpI18n::translate( 'kernel/shop/vatrules', $errorMessage, null, array( $iCountry, join( ',', $commonCategories ) ) );
100                 }
101             }
102         }
103     }
104
105     if ( is_array( $errors ) )
106     {
107         // Remove duplicated error messages.
108         $errors = array_unique( $errors );
109         sort( $errors );
110     }
111
112     return $errors;
113 }
114
115 /**
116  * Auxiliary function used to sort VAT rules.
117  *
118  * Rules are sorted by country and categories.
119  * Any specific categories list or country is considered less than '*' (Any).
120  */
121 function compareVatRules($a, $b)
122 {
123     // Compare countries.
124
125     $aCountry = $a->attribute( 'country' );
126     $bCountry = $b->attribute( 'country' );
127
128     if ( $aCountry != $bCountry )
129     {
130         if ( $aCountry == '*' )
131             return 1;
132         if ( $bCountry == '*' )
133             return -1;
134
135         return ( $aCountry < $bCountry ? -1 : 1 );
136     }
137
138     // Ok, countries are equal. Let's compare categories then.
139
140     if ( $a->attribute( 'product_categories' ) )
141         $aCategory = $a->attribute( 'product_categories_string' );
142     else
143         $aCategory = '*';
144
145     if ( $b->attribute( 'product_categories' ) )
146         $bCategory = $b->attribute( 'product_categories_string' );
147     else
148         $bCategory = '*';
149
150     if ( $aCategory != $bCategory )
151     {
152         if ( $aCategory == '*' )
153             return 1;
154         if ( $bCategory == '*' )
155             return -1;
156
157         return ( $aCategory < $bCategory ? -1 : 1 );
158     }
159
160     return 0;
161 }
162
163 $module = $Params['Module'];
164 $http   = eZHTTPTool::instance();
165 $tpl = templateInit();
166
167 if ( $http->hasPostVariable( "AddRuleButton" ) )
168 {
169     return $module->redirectTo( $module->functionURI( "editvatrule" ) );
170 }
171
172 if ( $http->hasPostVariable( "RemoveRuleButton" ) )
173 {
174     if ( !$http->hasPostVariable( "RuleIDList" ) )
175         $ruleIDList = array();
176     else
177         $ruleIDList = $http->postVariable( "RuleIDList" );
178
179     $db = eZDB::instance();
180     $db->begin();
181     foreach ( $ruleIDList as $ruleID )
182         eZVatRule::removeVatRule( $ruleID );
183     $db->commit();
184 }
185
186 if ( $http->hasPostVariable( "SaveCategoriesButton" ) )
187 {
188     $db = eZDB::instance();
189     $db->begin();
190     foreach ( $productCategories as $cat )
191     {
192         $id = $cat->attribute( 'id' );
193
194         if ( !$http->hasPostVariable( "category_name_" . $id ) )
195             continue;
196
197         $name = $http->postVariable( "category_name_" . $id );
198         $cat->setAttribute( 'name', $name );
199         $cat->store();
200     }
201     $db->commit();
202     return $module->redirectTo( $module->functionURI( "productcategories" ) );
203 }
204
205 $vatRules = eZVatRule::fetchList();
206 $errors = findErrors( $vatRules );
207 usort( $vatRules, 'compareVatRules' );
208
209 $tpl->setVariable( 'rules', $vatRules );
210 $tpl->setVariable( 'errors', $errors );
211
212 $path = array();
213 $path[] = array( 'text' => ezpI18n::translate( 'kernel/shop/vatrules', 'VAT rules' ),
214                  'url' => false );
215
216 $Result = array();
217 $Result['path'] = $path;
218 $Result['content'] = $tpl->fetch( "design:shop/vatrules.tpl" );
219
220 ?>