Completed
Push — master ( bd124e...96e65a )
by Daniel
02:10
created

Salariu::setFormOutput()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 73
Code Lines 67

Duplication

Lines 0
Ratio 0 %

Importance

Changes 9
Bugs 0 Features 0
Metric Value
c 9
b 0
f 0
dl 0
loc 73
rs 9.0675
cc 1
eloc 67
nc 1
nop 2

How to fix   Long Method   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
3
/**
4
 *
5
 * The MIT License (MIT)
6
 *
7
 * Copyright (c) 2016 Daniel Popiniuc
8
 *
9
 * Permission is hereby granted, free of charge, to any person obtaining a copy
10
 * of this software and associated documentation files (the "Software"), to deal
11
 * in the Software without restriction, including without limitation the rights
12
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
13
 * copies of the Software, and to permit persons to whom the Software is
14
 * furnished to do so, subject to the following conditions:
15
 *
16
 * The above copyright notice and this permission notice shall be included in all
17
 * copies or substantial portions of the Software.
18
 *
19
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24
 *  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
25
 * SOFTWARE.
26
 *
27
 */
28
29
namespace danielgp\salariu;
30
31
class Salariu
32
{
33
34
    use \danielgp\bank_holidays\Romanian,
35
        \danielgp\salariu\InputValidation,
36
        \danielgp\salariu\FormattingSalariu,
37
        \danielgp\salariu\Bonuses,
38
        \danielgp\salariu\ForeignCurrency,
39
        \danielgp\salariu\Taxation;
40
41
    public function __construct()
42
    {
43
        $configPath        = 'Salariu' . DIRECTORY_SEPARATOR . 'config';
44
        $interfaceElements = $this->readTypeFromJsonFileUniversal($configPath, 'interfaceElements');
45
        $this->appFlags    = [
46
            'FI'   => $interfaceElements['Form Input'],
47
            'TCAS' => $interfaceElements['Table Cell Applied Style'],
48
            'TCSD' => $interfaceElements['Table Cell Style Definitions'],
49
        ];
50
        $this->initializeSprGlbAndSession();
51
        $this->handleLocalizationSalariu($interfaceElements['Application']);
52
        echo $this->setHeaderHtml();
53
        $ymValues          = $this->buildYMvalues();
54
        $this->processFormInputDefaults($this->tCmnSuperGlobals, $interfaceElements['Values Filter Rules'], $ymValues);
55
        echo $this->setFormInput($ymValues);
56
        $this->setExchangeRateValues($interfaceElements['Application'], $interfaceElements['Relevant Currencies']);
57
        echo $this->setFormOutput($configPath, $interfaceElements['Short Labels']);
58
        echo $this->setFooterHtml($interfaceElements['Application']);
59
    }
60
61
    private function getIncomeTaxValue($inDate, $lngBase, $vBA, $aryDeductions, $arySettings)
62
    {
63
        $rest = $lngBase - array_sum($aryDeductions);
64
        if ($inDate >= mktime(0, 0, 0, 7, 1, 2010)) {
65
            $rest += round($vBA, -4);
66
            if ($inDate >= mktime(0, 0, 0, 10, 1, 2010)) {
67
                $rest += round($this->tCmnSuperGlobals->request->get('gbns') * pow(10, 4), -4);
68
            }
69
        }
70
        $rest += $this->tCmnSuperGlobals->request->get('afet') * pow(10, 4);
71
        return $this->setIncomeTax($inDate, $rest, $arySettings['Income Tax']);
72
    }
73
74
    private function getOvertimes($aryStngs)
75
    {
76
        $pcToBoolean = [0 => true, 1 => false];
77
        $pcBoolean   = $pcToBoolean[$this->tCmnSuperGlobals->request->get('pc')];
78
        $ymVal       = $this->tCmnSuperGlobals->request->get('ym');
79
        $snVal       = $this->tCmnSuperGlobals->request->get('sn');
80
        $mnth        = $this->setMonthlyAverageWorkingHours($ymVal, $aryStngs, $pcBoolean);
81
        return [
82
            'os175' => ceil($this->tCmnSuperGlobals->request->get('os175') * 1.75 * $snVal / $mnth),
83
            'os200' => ceil($this->tCmnSuperGlobals->request->get('os200') * 2 * $snVal / $mnth),
84
        ];
85
    }
86
87
    private function getValues($lngBase, $aStngs, $shLabels)
88
    {
89
        $inDate             = $this->tCmnSuperGlobals->request->get('ym');
90
        $this->getWorkingDays();
91
        $aReturn            = $this->getValuesPrimary($inDate, $lngBase, $aStngs, $shLabels);
92
        $pdV                = [
93
            ($lngBase + $aReturn['ba']),
94
            $this->tCmnSuperGlobals->request->get('pi'),
95
        ];
96
        $aReturn['pd']      = $this->setPersonalDeduction($inDate, $pdV[0], $pdV[1], $aStngs['Personal Deduction']);
97
        $aryDeductions      = [
98
            $this->txLvl['cas'],
99
            $this->txLvl['snt'],
100
            $this->txLvl['smj'],
101
            $aReturn['pd'],
102
        ];
103
        $aReturn['impozit'] = $this->getIncomeTaxValue($inDate, $lngBase, $aReturn['ba'], $aryDeductions, $aStngs);
104
        return $aReturn;
105
    }
106
107
    private function getValuesPrimary($inDate, $lngBase, $aStngs, $shLbl)
108
    {
109
        $this->setHealthFundTax($inDate, $lngBase, $aStngs[$shLbl['HFP']], $aStngs[$shLbl['HFUL']]);
110
        $this->setHealthTax($inDate, $lngBase, $aStngs[$shLbl['HTP']]);
111
        $nMealDays        = $this->tCmnSuperGlobals->request->get('nDays');
112
        $unemploymentBase = $lngBase;
113
        if ($this->tCmnSuperGlobals->request->get('ym') < mktime(0, 0, 0, 1, 1, 2008)) {
114
            $unemploymentBase = $this->tCmnSuperGlobals->request->get('sn');
115
        }
116
        $this->setUnemploymentTax($inDate, $unemploymentBase);
117
        return [
118
            'b1'   => $this->setFoodTicketsValue($inDate, $aStngs[$shLbl['MTV']]),
119
            'ba'   => $this->setFoodTicketsValue($inDate, $aStngs[$shLbl['MTV']]) * $nMealDays,
120
            'gbns' => $this->tCmnSuperGlobals->request->get('gbns') * pow(10, 4),
121
            'zile' => $this->tCmnSuperGlobals->request->get('wkDays'),
122
        ];
123
    }
124
125
    private function getWorkingDays()
126
    {
127
        $components = [
128
            new \DateTime(date('Y/m/d', $this->tCmnSuperGlobals->request->get('ym'))),
129
            $this->tCmnSuperGlobals->request->get('pc'),
130
        ];
131
        $this->tCmnSuperGlobals->request->set('wkDays', $this->setWorkingDaysInMonth($components[0], $components[1]));
132
        $vDays      = $this->tCmnSuperGlobals->request->get('wkDays') - $this->tCmnSuperGlobals->request->get('zfb');
133
        $this->tCmnSuperGlobals->request->set('nDays', max($vDays, 0));
134
    }
135
136
    private function setFormInput($ymValues)
137
    {
138
        $sReturn     = $this->setFormInputElements($ymValues);
139
        $btn         = $this->setStringIntoShortTag('input', [
140
            'type'  => 'submit',
141
            'id'    => 'submit',
142
            'value' => $this->tApp->gettext('i18n_Form_Button_Recalculate')
143
        ]);
144
        $sReturn[]   = $this->setFormRow($this->setLabel('fd'), $btn, 1) . '</tbody>';
145
        $frm         = $this->setStringIntoTag($this->setStringIntoTag(implode('', $sReturn), 'table'), 'form', [
146
            'method' => 'get',
147
            'action' => $this->tCmnSuperGlobals->getScriptName()
148
        ]);
149
        $aryFieldSet = [
150
            $this->setStringIntoTag($this->tApp->gettext('i18n_FieldsetLabel_Inputs'), 'legend'),
151
            $frm
152
        ];
153
        return $this->setStringIntoTag(implode('', $aryFieldSet), 'fieldset', ['style' => 'float: left;']);
154
    }
155
156
    private function setFormInputElements($ymValues)
157
    {
158
        $sReturn   = [];
159
        $sReturn[] = '<thead><tr><th>' . $this->tApp->gettext('i18n_Form_Label_InputElements')
160
            . '</th><th>' . $this->tApp->gettext('i18n_Form_Label_InputValues') . '</th></tr></thead><tbody>';
161
        $sReturn[] = $this->setFormRow($this->setLabel('ym'), $this->setFormInputSelectYM($ymValues), 1);
162
        $sReturn[] = $this->setFormRow($this->setLabel('sn'), $this->setFormInputText('sn', 10, 'RON'), 1);
163
        $sReturn[] = $this->setFormRow($this->setLabel('sc'), $this->setFormInputText('sc', 7, '%'), 1);
164
        $sReturn[] = $this->setFormRow($this->setLabel('pb'), $this->setFormInputText('pb', 10, 'RON'), 1);
165
        $sReturn[] = $this->setFormRow($this->setLabel('pn'), $this->setFormInputText('pn', 10, 'RON'), 1);
166
        $sReturn[] = $this->setFormRow($this->setLabel('os175'), $this->setFormInputText('os175', 2, 'ore'), 1);
167
        $sReturn[] = $this->setFormRow($this->setLabel('os200'), $this->setFormInputText('os200', 2, 'ore'), 1);
168
        $sReturn[] = $this->setFormRow($this->setLabel('pi'), $this->setFormInputSelectPI(), 1);
169
        $sReturn[] = $this->setFormRow($this->setLabel('pc'), $this->setFormInputSelectPC(), 1);
170
        $sReturn[] = $this->setFormRow($this->setLabel('szamnt'), $this->setFormInputText('szamnt', 10, 'RON'), 1);
171
        $sReturn[] = $this->setFormRow($this->setLabel('zfb'), $this->setFormInputText('zfb', 2, 'zile'), 1);
172
        $sReturn[] = $this->setFormRow($this->setLabel('gbns'), $this->setFormInputText('gbns', 10, 'RON'), 1);
173
        $sReturn[] = $this->setFormRow($this->setLabel('afet'), $this->setFormInputText('afet', 10, 'RON'), 1);
174
        return $sReturn;
175
    }
176
177
    private function setFormInputText($inName, $inSize, $inAfterLabel)
178
    {
179
        $inputParameters = [
180
            'type'      => 'text',
181
            'name'      => $inName,
182
            'value'     => $this->tCmnSuperGlobals->request->get($inName),
183
            'size'      => $inSize,
184
            'maxlength' => $inSize,
185
        ];
186
        return $this->setStringIntoShortTag('input', $inputParameters) . ' ' . $inAfterLabel;
187
    }
188
189
    private function setFormOutput($configPath, $shLabels)
190
    {
191
        $aryStngs    = $this->readTypeFromJsonFileUniversal($configPath, 'valuesToCompute');
192
        $sReturn     = [];
193
        $sReturn[]   = $this->setFormOutputHeader();
194
        $ovTimeVal   = $this->getOvertimes($aryStngs['Monthly Average Working Hours']);
195
        $additions   = $this->tCmnSuperGlobals->request->get('pb') + $ovTimeVal['os175'] + $ovTimeVal['os200'];
196
        $bComponents = [
197
            'sc' => $this->tCmnSuperGlobals->request->get('sc'),
198
            'sn' => $this->tCmnSuperGlobals->request->get('sn'),
199
        ];
200
        $brut        = ($bComponents['sn'] * (1 + $bComponents['sc'] / 100) + $additions) * pow(10, 4);
201
        $xDate       = '<span style="font-size:smaller;">' . date('d.m.Y', $this->currencyDetails['CXD']) . '</span>';
202
        $sReturn[]   = $this->setFormRowTwoLabels($this->setLabel('xrate@Date'), $xDate, 10000000);
203
        $snValue     = $this->tCmnSuperGlobals->request->get('sn') * 10000;
204
        $sReturn[]   = $this->setFormRowTwoLabels($this->setLabel('sn'), '&nbsp;', $snValue);
205
        $scValue     = $this->tCmnSuperGlobals->request->get('sc');
206
        $prima       = $this->tCmnSuperGlobals->request->get('sn') * $scValue * 100;
207
        $sReturn[]   = $this->setFormRowTwoLabels($this->setLabel('sc'), $scValue . '%', $prima);
208
        $pbValue     = $this->tCmnSuperGlobals->request->get('pb') * 10000;
209
        $sReturn[]   = $this->setFormRowTwoLabels($this->setLabel('pb'), '&nbsp;', $pbValue);
210
        $ovTime      = [
211
            11   => $ovTimeVal['os175'] * pow(10, 4),
212
            22   => $ovTimeVal['os200'] * pow(10, 4),
213
            'o1' => $this->tCmnSuperGlobals->request->get('os175'),
214
            'o2' => $this->tCmnSuperGlobals->request->get('os200'),
215
        ];
216
        $sReturn[]   = $this->setFormRowTwoLabels($this->setLabel('ovAmount1'), ''
217
            . '<span style="font-size:smaller;">' . $ovTime['o1'] . 'h&nbsp;x&nbsp;175%</span>', $ovTime[11]);
218
        $sReturn[]   = $this->setFormRowTwoLabels($this->setLabel('ovAmount2'), ''
219
            . '<span style="font-size:smaller;">' . $ovTime['o2'] . 'h&nbsp;x&nbsp;200%</span>', $ovTime[22]);
220
        $sReturn[]   = $this->setFormRowTwoLabels($this->setLabel('sb'), '&nbsp;', $brut);
221
        $brut        += $this->tCmnSuperGlobals->request->get('afet') * pow(10, 4);
222
        $amnt      = $this->getValues($brut, $aryStngs, $shLabels);
223
        $casValue    = $this->txLvl['cas'];
224
        $sReturn[]   = $this->setFormRowTwoLabels($this->setLabel('cas'), $this->txLvl['casP'] . '%', $casValue);
225
        $smjValue    = $this->txLvl['smj'];
226
        $sReturn[]   = $this->setFormRowTwoLabels($this->setLabel('somaj'), $this->txLvl['smjP']
227
            . '%', $this->txLvl['smj']);
228
        $sntValue    = $this->txLvl['snt'];
229
        $sReturn[]   = $this->setFormRowTwoLabels($this->setLabel('sanatate'), $this->txLvl['sntP'] . '%', $sntValue);
230
        $sReturn[]   = $this->setFormRowTwoLabels($this->setLabel('pd'), '&nbsp;', $amnt['pd']);
231
        $sReturn[]   = $this->setFormRowTwoLabels($this->setLabel('impozit'), $this->txLvl['inTaxP']
232
            . '%', $amnt['impozit']);
233
        $pnValue     = $this->tCmnSuperGlobals->request->get('pn') * 10000;
234
        $sReturn[]   = $this->setFormRowTwoLabels($this->setLabel('pn'), '&nbsp;', $pnValue);
235
        $retineri    = $casValue + $smjValue + $sntValue + $amnt['impozit'];
236
        $net         = $brut - $retineri + $this->tCmnSuperGlobals->request->get('pn') * 10000;
237
        $sReturn[]   = $this->setFormRowTwoLabels($this->setLabel('ns'), '&nbsp;', $net);
238
        $szamntValue = $this->tCmnSuperGlobals->request->get('szamnt') * 10000;
239
        $sReturn[]   = $this->setFormRowTwoLabels($this->setLabel('szamnt'), '&nbsp;', $szamntValue);
240
        $nsc         = $net - $this->tCmnSuperGlobals->request->get('szamnt') * 10000;
241
        $sReturn[]   = $this->setFormRowTwoLabels($this->setLabel('nsc'), '&nbsp;', $nsc);
242
        $fBonus      = [
243
            'main'   => $this->setLabel('gb'),
244
            'value'  => $this->tApp->gettext('i18n_Form_Label_FoodBonusesChoiceValue'),
245
            'mtDays' => $this->tCmnSuperGlobals->request->get('nDays') . '&nbsp;/&nbsp;' . $amnt['zile']
246
        ];
247
        $fBonusTxt   = sprintf($fBonus['main'], $fBonus['value']);
248
        $sReturn[]   = $this->setFormRowTwoLabels($fBonusTxt, $fBonus['mtDays'], $amnt['ba']);
249
        $sReturn[]   = $this->setFormRowTwoLabels($this->setLabel('gbns'), '&nbsp;', $amnt['gbns']);
250
        $total       = ($net + $amnt['ba'] + $amnt['gbns'] - $this->tCmnSuperGlobals->request->get('szamnt') * 10000);
251
        $sReturn[]   = $this->setFormRowTwoLabels($this->setLabel('total'), '&nbsp;', $total);
252
        $sReturn[]   = '</tbody>';
253
        setlocale(LC_TIME, explode('_', $this->tCmnSession->get('lang'))[0]);
254
        $crtMonth    = strftime('%B', $this->tCmnSuperGlobals->request->get('ym'));
255
        $legentText  = sprintf($this->tApp->gettext('i18n_FieldsetLabel_Results')
256
            . '', $crtMonth, date('Y', $this->tCmnSuperGlobals->request->get('ym')));
257
        $legend      = $this->setStringIntoTag($legentText, 'legend');
258
        return $this->setStringIntoTag($legend . $this->setStringIntoTag(implode('', $sReturn), 'table'), 'fieldset', [
259
                'style' => 'float: left;'
260
        ]);
261
    }
262
263
    private function setFormOutputHeader()
264
    {
265
        $sReturn   = [];
266
        $sReturn[] = '<thead><tr><th>' . $this->tApp->gettext('i18n_Form_Label_ResultedElements') . '</th>';
267
        $sReturn[] = '<th><i class="fa fa-map-signs floatRight" style="font-size:2em;">&nbsp;</i></th>';
268
        foreach ($this->currencyDetails['CX'] as $value) {
269
            $sReturn[] = '<th style="text-align:center;"><span class="flag-icon flag-icon-' . $value['country']
270
                . '" style="font-size:2em;" title="'
271
                . $this->tApp->gettext('i18n_CountryName_' . strtoupper($value['country'])) . '">&nbsp;</span></th>';
272
        }
273
        return implode('', $sReturn) . '</tr></thead></tbody>';
274
    }
275
276
    private function setFormRow($text, $value, $type = 'amount')
277
    {
278
        $defaultCellStyle = $this->setFormatRow($text, $value);
279
        switch ($type) {
280
            case 'amount':
281
                $value2show = $this->setFormRowAmount(($value / pow(10, 4)), $defaultCellStyle);
282
                break;
283
            case 'value':
284
                $value2show = $this->setStringIntoTag($value, 'td', array_merge($defaultCellStyle, [
285
                    'colspan' => count($this->currencyDetails['CX'])
286
                ]));
287
                break;
288
            default:
289
                $value2show = $this->setStringIntoTag($value, 'td');
290
                break;
291
        }
292
        return $this->setStringIntoTag($this->setStringIntoTag($text, 'td', $defaultCellStyle) . $value2show, 'tr');
293
    }
294
295
    private function setFormRowAmount($value, $defaultCellStyle)
296
    {
297
        $cellValue                 = [];
298
        $defaultCellStyle['style'] .= 'text-align:right;';
299
        foreach ($this->currencyDetails['CX'] as $key2 => $value2) {
300
            $fmt         = new \NumberFormatter($value2['locale'], \NumberFormatter::CURRENCY);
301
            $fmt->setAttribute(\NumberFormatter::FRACTION_DIGITS, $value2['decimals']);
302
            $finalValue  = $fmt->formatCurrency($value / $this->currencyDetails['CXV'][$key2], $key2);
303
            $cellValue[] = $this->setStringIntoTag($finalValue, 'td', $defaultCellStyle);
304
        }
305
        return implode('', $cellValue);
306
    }
307
308
    private function setFormRowTwoLabels($text1, $text2, $value)
309
    {
310
        return str_replace(':</td>', ':</td><td class="labelS" style="text-align:right;">'
311
            . $text2 . '</td>', $this->setFormRow($text1, $value, 'amount'));
312
    }
313
}
314