Convert   A
last analyzed

Complexity

Total Complexity 29

Size/Duplication

Total Lines 362
Duplicated Lines 34.25 %

Coupling/Cohesion

Components 1
Dependencies 1

Importance

Changes 0
Metric Value
wmc 29
lcom 1
cbo 1
dl 124
loc 362
rs 10
c 0
b 0
f 0

7 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 10 2
C jalaliToGregorian() 0 59 9
B jalaliToHijri() 0 74 6
A from() 8 8 1
A to() 8 8 1
B hijriToJalali() 54 54 5
B hijriToGregorian() 54 54 5

How to fix   Duplicated Code   

Duplicated Code

Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.

Common duplication problems, and corresponding solutions are:

1
<?php namespace OpenCafe\Tools;
2
3
/************************************************************
4
 * Convert Calendars types together
5
 ************************************************************
6
 *
7
 * @since Oct 27, 2015
8
 *
9
 *\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
10
 */
11
class Convert
12
{
13
14
    /**
15
   * @var integer
16
   */
17
    protected $year;
18
19
    /**
20
   * @var integer
21
   */
22
    protected $month;
23
24
    /**
25
   * @var $day
26
   */
27
    protected $day;
28
29
    /**
30
   * @var DateTime
31
   */
32
    public $date_time;
33
34
    /**
35
   * @var array
36
   */
37
    protected $config;
38
39
    /**
40
   * @var integer
41
   */
42
    protected $leap;
43
44
    /**
45
   * @var integer
46
   */
47
    protected $temp_day;
48
49
    /**
50
   * @var DateTime
51
   */
52
    protected $date;
53
54
    /**
55
   * @var array
56
   */
57
    protected $calendar_file;
58
59
    /************************************************************
60
    * Convert class constructor
61
    ************************************************************
62
    *
63
    * @since Oct 27, 2015
64
    *
65
    *\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
66
    */
67
    public function __construct($date_time = null)
68
    {
69
70
        if ($date_time !== null) {
71
            $this->date_time = $date_time;
72
        }
73
74
        $this->config = include __DIR__.'/Config.php';
75
76
    }
77
78 View Code Duplication
    public function from($calendar)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
79
    {
80
81
        $this->calendar_file = include __DIR__.'/CalendarSettings/' . ucfirst($calendar) . '.php';
82
83
        return $this->calendar_file[ 'convert_from' ]( $this->date_time );
84
85
    }
86
87
    /************************************************************
88
    * Convert to specific calendar
89
    ************************************************************
90
    *
91
    * @since Oct 26, 2015
92
    *
93
    *\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
94
    */
95 View Code Duplication
    public function to($calendar)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
96
    {
97
98
        $this->calendar_file = include __DIR__.'/CalendarSettings/' . ucfirst($calendar) . '.php';
99
100
        return $this->calendar_file[ 'convert_to' ]( $this->date_time );
101
102
    }
103
104
    /**
105
   *convert jalali year to gregorian year
106
 *
107
   * @since  Oct, 16 2015
108
   * @return object
109
   */
110
    public function jalaliToGregorian($date_time)
111
    {
112
113
          $this->config = include __DIR__.'/Jalali.php';
114
115
          $this->date_time = $date_time;
116
117
          $this->year = $this->date_time->format('Y');
118
119
          $this->month = $this->date_time->format('m');
120
121
          $this->day = $this->date_time->format('d');
122
123
          $days_of_year = 0;
124
125
        foreach ($this->config[ 'month_days_number' ] as $month => $value) {
126
            if ($this->month > $month) {
127
                $days_of_year += $value;
128
            }
129
        }
130
131
          $days_of_year += $this->day;
132
133
          $days_of_leap_years =  intval(( ( $this->year - 1 ) / 4 ));
134
135
          $days_of_jalali_years = ( ( ( $this->year - 1 ) * 365 ) + $days_of_year + $days_of_leap_years );
136
137
          $days_of_gregorain_years = $days_of_jalali_years + 226899;
138
139
        if ($this->month < 10) {
140
            $days_of_gregorain_years = $days_of_gregorain_years - intval(( ( $this->year + 621 ) / 4 ));
141
        } elseif (( ( 10 == $this->month ) && ( $this->day > 10 ) ) || ( $this->month > 10 )) {
142
            $days_of_gregorain_years = $days_of_gregorain_years - intval(( ( $this->year + 622 ) / 4 ));
143
        }
144
145
            $gregorian_month = ( $days_of_gregorain_years % 365 );
146
147
            $gregorian_year = intval($days_of_gregorain_years / 365) + 1;
148
149
            $this->config = include __DIR__.'/Gregorian.php';
150
151
        foreach ($this->config[ 'month_days_number' ] as $month => $value) {
152
            if ($gregorian_month < $value) {
153
                break;
154
            }
155
156
            $gregorian_month -= $value;
157
        }
158
159
          $gregorian_day = $gregorian_month;
160
161
          $gregorian_month = $month;
0 ignored issues
show
Bug introduced by
The variable $month does not seem to be defined for all execution paths leading up to this point.

If you define a variable conditionally, it can happen that it is not defined for all execution paths.

Let’s take a look at an example:

function myFunction($a) {
    switch ($a) {
        case 'foo':
            $x = 1;
            break;

        case 'bar':
            $x = 2;
            break;
    }

    // $x is potentially undefined here.
    echo $x;
}

In the above example, the variable $x is defined if you pass “foo” or “bar” as argument for $a. However, since the switch statement has no default case statement, if you pass any other value, the variable $x would be undefined.

Available Fixes

  1. Check for existence of the variable explicitly:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        if (isset($x)) { // Make sure it's always set.
            echo $x;
        }
    }
    
  2. Define a default value for the variable:

    function myFunction($a) {
        $x = ''; // Set a default which gets overridden for certain paths.
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        echo $x;
    }
    
  3. Add a value for the missing path:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
    
            // We add support for the missing case.
            default:
                $x = '';
                break;
        }
    
        echo $x;
    }
    
Loading history...
162
163
          $this->date_time->setDate($gregorian_year, $gregorian_month, $gregorian_day);
164
165
166
         return $this->date_time;
167
168
    }
169
170
    /**
171
   *convert jalali year to hijri year
172
 *
173
   * @since  Oct, 17 2015
174
   * @return object
175
   */
176
    public function jalaliToHijri($date_time)
177
    {
178
179
        $this->date_time = $date_time;
180
181
        $this->year = $this->date_time->format('Y');
182
183
        $this->month = $this->date_time->format('n');
184
185
        $this->day = $this->date_time->format('d');
186
187
        $this->temp_day = 0 ;
188
189
        $this->config = include __DIR__.'/Jalali.php';
190
191
        for ($i = 1; $i < $this->month; $i++) {
192
            $this->temp_day += $this->config['month_days_number'][$i];
193
        }
194
195
         $this->temp_day += $this->day;
196
197
         $this->leap = new Leap($this->year);
0 ignored issues
show
Documentation Bug introduced by
It seems like new \OpenCafe\Tools\Leap($this->year) of type object<OpenCafe\Tools\Leap> is incompatible with the declared type integer of property $leap.

Our type inference engine has found an assignment to a property that is incompatible with the declared type of that property.

Either this assignment is in error or the assigned type should be added to the documentation/type hint for that property..

Loading history...
198
199
        if ($this->leap->get() && $this->month > 11) {
200
            $this->temp_day++;
201
        }
202
203
        $_year = ( ( ( ( ( $this->year - 1 ) * 365.2422 ) + $this->temp_day ) - 119) / 354.3670 ) + 1;
204
205
        $_year = explode('.', $_year);
206
207
        $this->year = $_year[0];
208
209
        $_month = $_year[1];
210
211
         $var_temp = '0.0';
212
213
        for ($i = strlen($_month); $i > 2; $i--) {
214
            $var_temp .= '0';
215
        }
216
217
         $var_temp .= '1';
218
219
        $_month = $_month * $var_temp ;
220
221
        $_month = ( $_month * 12 ) + 1;
222
223
        $_month = explode('.', $_month);
224
225
        $this->month = $_month[0];
226
227
        $_day = $_month[1];
228
229
        $var_temp = '0.0';
230
231
        for ($i = strlen($_day); $i > 2; $i--) {
232
            $var_temp .= '0' ;
233
        }
234
235
        $var_temp .= '1';
236
237
        $_day = $_day * $var_temp;
238
239
        $_day = ( $_day * 29.530 );
240
241
        $_day = explode('.', $_day);
242
243
        $this->day = $_day[0];
244
245
           $this->date_time->setDate($this->year, $this->month, $this->day);
246
247
           return $this->date_time;
248
249
    }
250
251
    /**
252
   *convert hijri year to jalali year
253
 *
254
   * @since  Oct, 17 2015
255
   * @return object
256
   */
257 View Code Duplication
    public function hijriToJalali($date_time)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
258
    {
259
260
          $this->date_time = $date_time;
261
262
          $this->year = $this->date_time->format('Y');
263
264
          $this->month = $this->date_time->format('m');
265
266
          $this->day = $this->date_time->format('d');
267
268
          $days_of_year = 0;
269
270
          $this->config = include __DIR__.'/Hijri.php';
271
272
        foreach ($this->config[ 'month_days_number' ] as $month => $value) {
273
            if ($this->month > $month) {
274
                $days_of_year += $value;
275
            }
276
        }
277
278
          $days_of_year += $this->day;
279
280
          $days_of_leap_years =  intval(( ( $this->year - 1 ) / 3 ));
281
282
          $days_of_hijri_years = ( ( ( $this->year - 1 ) * 354 ) + $days_of_year + $days_of_leap_years );
283
284
          $days_of_jalali_years = $days_of_hijri_years + 179;
285
286
          $days_of_jalali_years = $days_of_jalali_years - intval(( ( $this->year - 43 ) / 4 ));
287
288
          $jalali_month = ( $days_of_jalali_years % 365 );
289
290
          $jalali_year = intval($days_of_jalali_years / 365) + 1;
291
292
          $this->config = include __DIR__.'/Jalali.php';
293
294
        foreach ($this->config[ 'month_days_number' ] as $month => $value) {
295
            if ($jalali_month < $value) {
296
                break;
297
            }
298
299
              $jalali_month -= $value;
300
        }
301
302
          $jalali_day = $jalali_month;
303
304
          $jalali_month = $month;
0 ignored issues
show
Bug introduced by
The variable $month does not seem to be defined for all execution paths leading up to this point.

If you define a variable conditionally, it can happen that it is not defined for all execution paths.

Let’s take a look at an example:

function myFunction($a) {
    switch ($a) {
        case 'foo':
            $x = 1;
            break;

        case 'bar':
            $x = 2;
            break;
    }

    // $x is potentially undefined here.
    echo $x;
}

In the above example, the variable $x is defined if you pass “foo” or “bar” as argument for $a. However, since the switch statement has no default case statement, if you pass any other value, the variable $x would be undefined.

Available Fixes

  1. Check for existence of the variable explicitly:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        if (isset($x)) { // Make sure it's always set.
            echo $x;
        }
    }
    
  2. Define a default value for the variable:

    function myFunction($a) {
        $x = ''; // Set a default which gets overridden for certain paths.
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        echo $x;
    }
    
  3. Add a value for the missing path:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
    
            // We add support for the missing case.
            default:
                $x = '';
                break;
        }
    
        echo $x;
    }
    
Loading history...
305
306
          $this->date_time->setDate($jalali_year, $jalali_month, $jalali_day);
307
308
         return $this->date_time;
309
310
    }
311
312
    /**
313
    * convert hijri year to gregorian year
314
   *
315
    * @since  Oct, 17 2015
316
    * @return object
317
    */
318 View Code Duplication
    public function hijriToGregorian($date_time)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
319
    {
320
321
        $this->date_time = $date_time;
322
323
        $this->year = $this->date_time->format('Y');
324
325
        $this->month = $this->date_time->format('m');
326
327
        $this->day = $this->date_time->format('d');
328
329
        $days_of_year = 0;
330
331
        $this->config = include __DIR__.'/Hijri.php';
332
333
        foreach ($this->config[ 'month_days_number' ] as $month => $value) {
334
            if ($this->month > $month) {
335
                $days_of_year += $value;
336
            }
337
        }
338
339
        $days_of_year += $this->day;
340
341
        $days_of_leap_years =  intval(( ( $this->year - 1 ) / 3 ));
342
343
        $days_of_hijri_years = ( ( ( $this->year - 1 ) * 354 ) + $days_of_year + $days_of_leap_years );
344
345
        $days_of_gregorain_years = $days_of_hijri_years + 227078;
346
347
        $days_of_gregorain_years = $days_of_gregorain_years - intval(( ( $this->year + 578 ) / 4 ));
348
349
        $gregorian_month = ( $days_of_gregorain_years % 365 );
350
351
        $gregorian_year = intval($days_of_gregorain_years / 365) + 1;
352
353
        $this->config = include __DIR__.'/Gregorian.php';
354
355
        foreach ($this->config[ 'month_days_number' ] as $month => $value) {
356
            if ($gregorian_month < $value) {
357
                break;
358
            }
359
360
            $gregorian_month -= $value;
361
        }
362
363
        $gregorian_day = $gregorian_month;
364
365
        $gregorian_month = $month;
0 ignored issues
show
Bug introduced by
The variable $month does not seem to be defined for all execution paths leading up to this point.

If you define a variable conditionally, it can happen that it is not defined for all execution paths.

Let’s take a look at an example:

function myFunction($a) {
    switch ($a) {
        case 'foo':
            $x = 1;
            break;

        case 'bar':
            $x = 2;
            break;
    }

    // $x is potentially undefined here.
    echo $x;
}

In the above example, the variable $x is defined if you pass “foo” or “bar” as argument for $a. However, since the switch statement has no default case statement, if you pass any other value, the variable $x would be undefined.

Available Fixes

  1. Check for existence of the variable explicitly:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        if (isset($x)) { // Make sure it's always set.
            echo $x;
        }
    }
    
  2. Define a default value for the variable:

    function myFunction($a) {
        $x = ''; // Set a default which gets overridden for certain paths.
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        echo $x;
    }
    
  3. Add a value for the missing path:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
    
            // We add support for the missing case.
            default:
                $x = '';
                break;
        }
    
        echo $x;
    }
    
Loading history...
366
367
        $this->date_time->setDate($gregorian_year, $gregorian_month, $gregorian_day);
368
369
         return $this->date_time;
370
371
    }
372
}
373