script.js 15.6 KB
$(document).ready(
    function ()
        {
            $('#fenix_garantii form').on(
                'submit.fenix',
                function (event)
                    {
                        var action = $(this).attr('action');
                        $.ajax(
                            {
                                method: 'POST',
                                url: action,
                                data: $( this ).serialize(),
                                context: $( this ),
                                beforeSend: function(xhr){
                                    $(this).find('.form-preloader').removeClass('d-none');
                                },
                                success: function ( data, textStatus, jqXHR )
                                    {
                                        var error_text = [];
                                        $(jqXHR.responseText).filter('.wp-die-message').each(
                                            function ()
                                                {
                                                    error_text.push($(this).text());
                                                }
                                        );
                                        if (error_text.length>0)
                                            $('#alertModalBody').html(error_text.join());
                                                else
                                            {
                                                var text_alert = '';
                                                switch($(this).attr('id'))
                                                    {
                                                        case 'form_consult': text_alert = '<p class="m-0">Ваше обращение принято на рассмотрение!</p>'; break;
                                                        default: text_alert = '<p class="m-0">Спасибо за отзыв!</p>'; break;
                                                    }
                                                $('#alertModalBody').html(text_alert);
                                                $(this).find('input[type="checkbox"]').prop('checked', false);
                                                $(this).find('input[type="text"]').val('');
                                                $(this).find('input[type="email"]').val('');
                                                $(this).find('textarea').val('');
                                            }
                                    },
                                error: function ( jqXHR, textStatus, errorThrown )   
                                    {
                                        var error_text = [];
                                        $(jqXHR.responseText).filter('.wp-die-message').each(
                                            function ()
                                                {
                                                    error_text.push($(this).text());
                                                }
                                        );
                                        
                                        $('#alertModalBody').html(
                                            '<p class="m-0">'+
                                                (
                                                    error_text.length==0?
                                                        'Ошибка отправки данных.':
                                                        error_text.join()
                                                )+
                                            '</p>'
                                        );
                                    },
                                complete: function( jqXHR, textStatus )
                                    {
                                        $('.captcha-refrash').trigger('click.fenix');
                                        $(this).find('.form-preloader').addClass('d-none');
                                    
                                        $(this).removeClass('was-validated');     
                                        $('#alertModal').modal('show');
                                    }
                            }
                        );
                        event.preventDefault();
                        return false;
                    }
            );

            // Получите все формы, к которым мы хотим применить пользовательские стили проверки Bootstrap
            var forms = document.querySelectorAll('.needs-validation')
            // Зацикливайтесь на них и предотвращайте отправку
            Array.prototype.slice.call(forms).forEach(
                function (form) 
                    {
                        form.addEventListener(
                            'submit', 
                            function (event) 
                                {
                                    if (!form.checkValidity()) 
                                        {
                                            event.preventDefault()
                                            event.stopPropagation()
                                        }
                            
                                    form.classList.add('was-validated')
                                }, 
                            false
                        );
                    }
            );

            //Маска ввода телефона
            $('input[name="phone"]').inputmask({"mask": "+7 (999) 999-99-99"});

            function fenix_check(el_input)
                {
                    if ($(el_input).length==0)
                        el_input = $('.fenix_calc input[type="number"][min][max]');
                    $(el_input).each(
                        function ()
                            {
                                var inp_val = $(this).val(); 
                                var inp_val_int = inp_val|0;
                                var inp_min = $(this).attr('min')|0;
                                var inp_max = $(this).attr('max')|0;
                                var inp_range = $(this).next('input[type="range"]');
                                var inp_range_val = $(inp_range).val();
                                if (inp_val_int<inp_min)
                                    inp_val_int=inp_min;
                                if (inp_val_int>inp_max)
                                    inp_val_int=inp_max;
                                if ((inp_val).toString() != (inp_val_int).toString())   
                                    $(this).val(inp_val_int);
                                if ((inp_range).toString() != (inp_val_int).toString())   
                                    $(inp_range).val(inp_val_int);
                            }
                    );
                    $('.fenix_calc .calc_btn').toggleClass('disabled', $('.fenix_calc input[type="number"][min][max]:invalid').length>0);
                }

            function fenix_calc (el_wrap)
                {
                    if (el_wrap.length>0)
                        {
                            fenix_check();
                            var el_table = el_wrap.find('.table_result');
                            var calc_credit = parseInt(el_wrap.find('input[name="calc_credit"]').val())|0;
                            var calc_inv = parseInt(el_wrap.find('input[name="calc_inv"]').val())|0;
                            var calc_s = parseInt(el_wrap.find('input[name="calc_s"]').val())|0;
                            var calc_period = parseInt(el_wrap.find('input[name="calc_period"]').val())|0;
                            var calc_discont = parseInt(el_wrap.find('input[name="calc_discont"]').val())|0;
                            
                            var inv_proj = 0;
                            var op_doh = [];
                            var op_ras = [];
                            var op_cpd = [];
                            var nvp = [];

                            var heads = [
                                'Год проекта', 
                                'Инвестиции в проект, тыс. руб.', 
                                'Операционные доходы, тыс. руб.', 
                                'Операционные расходы, тыс. руб.',
                                'Читсый денежный поток, тыс. руб.', 
                                'Ставка дисконтирования, %',
                                'NPV проекта',
                                'Индекс рентабельности инвестиций, PI'
                              //  'Внутренняя норма доходности, IRR'
                            ];
                            var rows = [];
                            for (var y=0; y<heads.length; y++)
                                {
                                    var cols = []; 
                                    for (var x=0; x<=calc_period; x++)
                                        {
                                            if (x==0)
                                                cols.push('<th scope="row" class="text-start">'+heads[y]+'</th>'); 
                                                    else 
                                                switch (y|0)
                                                    {
                                                        case 0:
                                                            cols.push('<td align="center" width="'+(50/calc_period).toFixed(2)+'%">'+(x|0)+'</td>');     
                                                        break;
                                                        case 1:
                                                            if (x==1)
                                                                {
                                                                    inv_proj = (calc_inv-calc_credit)/1000;
                                                                    cols.push('<td align="center">'+(inv_proj).toFixed(2)+'</td>');
                                                                }
                                                                    else
                                                                cols.push('<td align="center">0</td>');
                                                        break;
                                                        case 2:
                                                             //var op_doh_cur = ((calc_credit/100)|0) + (-2+x)*0.5*((calc_credit/1000)|0);
                                                            var op_doh_cur = 
                                                            0.06317*calc_s*5000*(0.02*x+1) + (calc_inv - calc_credit)/1000
                                                            /*0.8*(calc_credit-calc_inv)/1000 + 4.343*calc_s*5000*x/1000 */; 
                                                            op_doh.push(op_doh_cur);
                                                            cols.push('<td align="center">'+(op_doh_cur).toFixed(2)+'</td>');
                                                        break;
                                                        case 3:
                                                            var op_ras_cur = 0.82*op_doh[x-1];
                                                            op_ras.push(op_ras_cur);
                                                            cols.push('<td align="center">'+(op_ras_cur).toFixed(2)+'</td>');
                                                        break;
                                                        case 4:
                                                            var op_cdp_cur = op_doh[x-1]-op_ras[x-1];
                                                            if (x==1)
                                                                cols.push('<td align="center">'+(inv_proj).toFixed(2)+'</td>');
                                                                    else
                                                                cols.push('<td align="center">'+(op_cdp_cur).toFixed(2)+'</td>');
                                                            op_cpd.push(op_cdp_cur);      
                                                        break;
                                                        case 5:
                                                            cols.push('<td align="center">'+(calc_discont|0)+'</td>');
                                                        break;
                                                        case 6:
                                                            var current_nvp = op_cpd[x-1]/Math.pow(1 - calc_discont/100, x);
                                                            if (x==calc_period)
                                                                cols.push('<td align="center">'+(current_nvp).toFixed(2)+'</td>');
                                                                    else
                                                                cols.push('<td></td>');   
                                                            nvp.push(current_nvp);
                                                        break;
                                                        case 7:
                                                            if (x==calc_period)
                                                                {
                                                                    var current_pi = 1000*nvp[x-1]/Math.abs(calc_inv+calc_credit);
                                                                    cols.push('<td align="center">'+(current_pi).toFixed(2)+'</td>');
                                                                }
                                                                    else
                                                                cols.push('<td></td>');   
                                                        break;
                                                        default:
                                                            cols.push('<td></td>');     
                                                        break;
                                                    }
                                        }
                                    rows.push('<tr>'+cols.join('')+'</tr>');    
                                }    
                            el_table.html('<tbody>'+rows.join('')+'</tbody>');

                            $(el_wrap).find('.img-calc').remove();
                        }
                }        


            $(document).on(
                'click.fenix',
                '.fenix_calc .calc_btn',
                function ()
                    {
                        fenix_calc($(this).closest('.fenix_calc'));
                    }
            ).on(
                [
                    'change.fenix',
                    'blur.fenix'
                ].join(' '),
                '.fenix_calc input[type="number"][min][max]',
                function ()
                    {
                        fenix_check(this);
                    }
            ).on(
                'change.fenix',
                '.fenix_calc input[type="range"][min][max]',
                function ()
                    {
                        $(this).prev('input[type="number"][min][max]').val($(this).val());
                    }
            );
        }
);