Добрый день.
BILLmanager Advanced 5.165.1

— Первый вопрос:
Сейчас номер и дата договора подставляются в стандартный ejs-шаблон «Русский счёт» таким образом:
Код HTML:
<% for (var i = 0; i < payment.items.item.length; i++) { %>
				<tr class="item">
					<td><%= payment.items.item[i].locale_name %> на оплату по договору № <%= payment.contracts.contract.number %> от <%= payment.contracts.contract.signdate %></td>
					<td class="amount"><%= payment.items.item[i].amount %></td>
				</tr>
			<% } %>
Если у клиента один договор, то всё работает нормально.

Если есть несколько договоров, то вместо номера и даты подставляется undefined.

При этом, если добавить номер договора через шаблон Назначение авансового платежа — ISPWiki, то номер подставляется. Но это работает только для авансовых платежей. То есть это не поможет в случае, когда в платеже значится список услуг, а не авансовый платёж.

Что тут можно придумать?


Второй вопрос:
Изучение форума показало, что добавить в счёт сумму прописью нужно через ejs-функцию.

Кто-то может подсказать как это интегрировать в стандартный ejs-шаблон «Русский счёт»?

PHP код:
<% function numberToString(_numbertoUpper) {
    var 
toUpper toUpper || false;
    var 
_arr_numbers = new Array();
    
_arr_numbers[1] = new Array('''один''два''три''четыре''пять''шесть''семь''восемь''девять''десять''одиннадцать''двенадцать''тринадцать''четырнадцать''пятнадцать''шестнадцать''семнадцать''восемнадцать''девятнадцать');
    
_arr_numbers[2] = new Array('''''двадцать''тридцать''сорок''пятьдесят''шестьдесят''семьдесят''восемьдесят''девяносто');
    
_arr_numbers[3] = new Array('''сто''двести''триста''четыреста''пятьсот''шестьсот''семьсот''восемьсот''девятьсот');
    function 
number_parser(_num_desc) {
        var 
_string '';
        var 
_num_hundred '';
        if (
_num.length == 3) {
            
_num_hundred _num.substr(01);
            
_num _num.substr(13);
            
_string _arr_numbers[3][_num_hundred] + ' ';
        }
        if (
_num 20_string += _arr_numbers[1][parseFloat(_num)] + ' ';
        else {
            var 
_first_num _num.substr(01);
            var 
_second_num _num.substr(12);
            
_string += _arr_numbers[2][_first_num] + ' ' _arr_numbers[1][_second_num] + ' ';
        }          
        switch (
_desc){
            case 
0:
                if (
_num.length == && parseFloat(_num.substr(0,1)) == 1) {
                    
_string += 'рублей';
                    break;
                }
                var 
_last_num parseFloat(_num.substr(-1));
                if (
_last_num == 1_string += 'рубль';
                else if (
_last_num && _last_num 5_string += 'рубля';
                else 
_string += 'рублей';
                break;
            case 
1:
                
_num _num.replace(/^[0]{1,}$/g'0');
                if (
_num.length == && parseFloat(_num.substr(0,1)) == 1) {
                    
_string += 'тысяч ';
                    break;
                }
                var 
_last_num parseFloat(_num.substr(-1));
                if (
_last_num == 1_string += 'тысяча ';
                else if (
_last_num && _last_num 5_string += 'тысячи ';
                else if (
parseFloat(_num) > 0_string += 'тысяч ';
                
_string _string.replace('один ''одна ');
                
_string _string.replace('два ''две ');
                break;
            case 
2:
                
_num _num.replace(/^[0]{1,}$/g'0');
                if (
_num.length == && parseFloat(_num.substr(0,1)) == 1) {
                    
_string += 'миллионов ';
                    break;
                }
                var 
_last_num parseFloat(_num.substr(-1));
                if (
_last_num == 1_string += 'миллион ';
                else if (
_last_num && _last_num 5_string += 'миллиона ';
                else if (
parseFloat(_num) > 0_string += 'миллионов ';
                break;
            case 
3:
                
_num _num.replace(/^[0]{1,}$/g'0');
                if (
_num.length == && parseFloat(_num.substr(0,1)) == 1) {
                    
_string += 'миллиардов ';
                    break;
                }
                var 
_last_num parseFloat(_num.substr(-1));
                if (
_last_num == 1_string += 'миллиард ';
                else if (
_last_num && _last_num 5_string += 'миллиарда ';
                else if (
parseFloat(_num) > 0_string += 'миллиардов ';
                break;
        }
        return 
_string;
    }
    function 
decimals_parser(_num) {
        var 
_first_num _num.substr(01);
        var 
_second_num parseFloat(_num.substr(12));
        var 
_string ' ' _first_num _second_num;
        if (
_second_num == 1_string += ' копейка';
        else if (
_second_num && _second_num 5_string += ' копейки';
        else 
_string += ' копеек';
        return 
_string;
    }
    if (!
_number || _number == 0) return false;
    if (
typeof _number !== 'number') {
        
_number _number '';
        
_number _number.replace(',''.');
        
_number parseFloat(_number);
        if (
isNaN(_number)) return false;
    }
    
_number _number.toFixed(2);
    if(
_number.indexOf('.') != -1) {
        var 
_number_arr _number.split('.');
        var 
_number _number_arr[0];
        var 
_number_decimals _number_arr[1];
    }
    var 
_number_length _number.length;
    var 
_string '';
    var 
_num_parser '';
    var 
_count 0;
    for (var 
_p = (_number_length 1); _p >= 0_p--) {
        var 
_num_digit _number.substr(_p1);
        
_num_parser _num_digit +  _num_parser;
        if ((
_num_parser.length == || _p == 0) && !isNaN(parseFloat(_num_parser))) {
            
_string number_parser(_num_parser_count) + _string;
            
_num_parser '';
            
_count++;
        }
    }
    if (
_number_decimals_string += decimals_parser(_number_decimals);
    if (
toUpper === true || toUpper == 'upper') {
        
_string _string.substr(0,1).toUpperCase() + _string.substr(1);
    }
    return 
_string.replace(/[\s]{1,}/g' ');
};

Number.prototype.numberToString = function(toUpper) {
    return 
numberToString(thistoUpper);
};
String.prototype.numberToString = function(toUpper) {
    return 
numberToString(thistoUpper);
}; %>