// Обработчик событий формы
$('#FormPanels').click(function(){
// Вешаем обработку нажатия кнопки Создать ПТУ или Создать РТУ
if(event.target.type=='submit') // Документ, созданный сейчас ([NOW]) текущим пользователем (uid)
if($(event.target).hasClass('createDoc')) // Движение - черновик, К выгрузке, указать Приход (t1003=1) для ПТУ
post('_m_new/299?up=1&t2891=1&t401=1&t336='+uid+'&t301=[NOW]'+($(event.target).hasClass('ptu')?'&t1003=1':''));
else if($(event.target).hasClass('payment')) // Платеж - черновик, указать знак (приход/расход) и тип (касса/рс)
post('_m_new/414?up=1&t27011=1&t427='+uid+'&t426=[NOW]'+($(event.target).hasClass('cash')?'':'&t2574=1')+($(event.target).hasClass('pay')?'&t2576=1':''));
});
// Шаблоны HTML и переменные
var timer, nds=[], lastK, docDate, clientID, contractID, items=[], addNDS, isCommited, isPTU, isWire, calcStoreSaldo=0, pageTP=1 // страница ТЧ
// Поле ввода НДС
,ndsTemplate='
'
// Поле ввода номенклатуры в ТЧ
,itemTemplate=''
+'
'
// Кнопки перемещения и удаления позиции
,moveNDel=''
+''
// Строка предупреждения
,warning=' warning'
// Кнопка Провести
,confirmBtn='Провести'
// Кнопка Провести в красное сальдо
,confirmRedBtn='Провести в отрицательный остаток'
// Кнопка Распровести
,unConfirmBtn='Распровести'
// Тип документа: ПТУ или РТУ и пагинация ТЧ
,pagesNName='
isPTU
'
// Листалка назад
,leafBack=''
+''
// Текущая страница
,currentPage='
';
// Поле для ввода числовых значений ТЧ
function numInput(rid,i,val){
return isCommited ? readOnly(val,'float-right') : '';
}
// Поле только для чтения - проведенный документ не редактируется
function readOnly(val,align){
return '
'+val+'
';
}
// Ячейка таблицы
function cellTP(val){
return '
'+val+'
';
}
// Убрать стрелки у элементов ввода для чисел
var numStyle = document.createElement('style');
numStyle.innerText = 'input::-webkit-outer-spin-button, input::-webkit-inner-spin-button {-webkit-appearance:none; margin:0} input[type=number] { -moz-appearance:textfield }';
document.head.appendChild(numStyle);
// Хуки на стандартных формах Интеграла
switch(action){
// Редактирование объекта
case 'edit_obj':
$('input').attr('autocomplete','off'); // Отключить автозаполнение, чтобы не мешалось
// Скрыть кнопку Отменить
$('#cancel').hide();
// Показать Отменить, скрыть Провести, если были изменения в поле или выпадающем списке
$('#form select, #form input').change(function(){$('#cancel').show(); $('#confirmBtn').hide()});
$('#cancel').attr("href", '/'+db+'/'+action+'/'+id); // При нажатии Отменить - обновить страницу с сервера, потеряв изменения
document.title=typeName;
// Редактирование объекта Движение
if(type=='299'){
var posCount, filter='', order='', desc='', goods=[];
isPTU=byId('t1003').checked; // Тип - поступление или реализация определяется галкой Приход
// Сделать табличную часть во весь контейнер и отобразить пустую таблицу
byId('external_row').classList.add('col-12');
byId('external_row').innerHTML=pagesNName.replace('isPTU', isPTU ? 'Поступление товаров и услуг' : 'Реализация товаров и услуг') + tablePart;
// При нажатии кнопки Добавить договор - открыть справочник Договоры
$('#p339').attr('onclick', '').unbind('click').attr('href', '/'+db+'/object/286').attr("target", '286');
// Достать справочник НДС
intApi('GET','object/354?JSON','ndsList');
// Показать детали документа
intApi('GET','report/1200?JSON&FR_ID='+id,'docDetails');
if(byId('t339').value>0) // Для заполнения ТЧ нужно указать договор
getPage(pageTP);
// Скрыть закладки и вывести вместо них название документа
$('#tabs').remove();
$('#t1003, #t303').parent().hide(); // Скрыть признак Приход и ссылку на позиции
// Скрыть единственный склад
hideSingle('t384');
// Применить фильтр ТЧ при нажатии Enter
$('#filter').keyup(function(){ if(event.keyCode==13) searchTP() });
// При сохранении измененой галки НДС пересчитать НДС позиций
$('#form').submit(function(){
savebtn.disabled=true;
if(byId('t3869').checked!=addNDS){
event.returnValue=false;
event.preventDefault();
intApi('POST','report/6302?JSON&confirmed=1&FR_ID='+id,'saveNDS');
}
});
// После сохранения вернуться сюда же
byId('form').action+='?next_act=edit_obj/[id]';
}
// Редактирование объекта Платеж
else if(type=='414'){
isPTU=!(byId('t2576').checked); // Тип - приход или расход определяется галкой Расход
isWire=byId('t2574').checked; // Приход наличными в кассу или безнал на РС
isCommited=!(byId('t27011').checked); // Документ проведен, если нет галки Черновик
// Скрыть закладки и вывести вместо них название документа
byId('tabs').innerHTML=isPTU?'Приход — ':'Расход — ';
if(isWire){ // Безнал?
byId('tabs').innerHTML+='Расчетный счет';
$('#t416').parent().parent().hide(); // Скрыть ненужный список
hideSingle('t417'); // Скрыть единственный Р/С
}
else{
byId('tabs').innerHTML+='Касса';
$('#t417').parent().parent().hide();
hideSingle('t416');
}
$('#t2576, #t2574, #t27011').parent().hide(); // Скрыть галки Расход, Р/С и Черновик
if(isCommited){
$('#delete_btn, #savebtn, #t414, #t418').prop('disabled', true); // Деактивировать кнопки и сумму
$('#form select').prop('disabled', true); // Деактивировать выпадающие списки
$('#p415, #p22006').remove();
byId('buttons').innerHTML=unConfirmBtn; // Добавить кнопку Распровести
if($("#t415 option:selected").text().indexOf('/ По договору')!==false)
$('#t22006').parent().parent().hide(); // Спрятать список документов
}
else{
// Посмотреть неоплаченные доки этого договора
$('#t415').change(function(){
if($("#t415 option:selected").text().indexOf('/ По договору')===-1)
intApi('GET','report/22025?JSON&DocID='+id+'&FR_ContractID='+this.value+'&FR_isPTU='+(isPTU?'!%':'%'),'notPaidDocs');
else{
$('#t22006').val(''); // Очистить ссылку на документ, если он был выбран
$('#t22006').parent().parent().hide(); // Спрятать список документов
}
});
$('#t415').trigger('change');
if(byId('t418').value>0)
if(isWire||isPTU) // Безнал или приход
byId('buttons').innerHTML=confirmBtn; // Добавить кнопку Провести
else if(byId('t416').value>0) // Проверить остаток Кассы для РКО
intApi('GET','report/27870?JSON&FR_ID='+byId('t416').value+'&Date='+byId('t414').value.replace(/[\-\.\/]/g,''),'checkCash');
else
byId('extras').innerHTML=warning.replace('warning','Выберите кассу');
}
byId('form').action+='?next_act=edit_obj/[id]';
}
break;
}
// Если в списке выбрано единственное значение, то скрыть его
function hideSingle(i){
if(byId(i).value!='') // Если значение выбрано
if(byId(i).innerHTML.split(''+h;
$('#t22006').parent().parent().show();
break;
// Проверить наличие на складе нужного количества товара - пришел отчет по остаткам
case 'checkStore':
for(i in data[0])
if(+data[1][i]>+data[2][i]) // Если количество в РТУ больше остатка - вывести предупреждение
h+=warning.replace('warning',data[3][i]+': '+(+data[1][i])+', склад: '+data[2][i]+', не хватает '+(data[1][i]-data[2][i]));
if(h=='') // Количества на складе хватает
byId('buttons').innerHTML=confirmBtn; // Добавить кнопку Провести для РТУ
else // количества недостаточно
byId('buttons').innerHTML=''; //confirmRedBtn; // Добавить кнопку Провести в красное для РТУ
byId('extras').innerHTML=h; // Вывести незаполненные позиции, если есть
break;
// Проверить остаток Кассы и показать кнопку Провести
case 'checkCash':
if(+data[0][0]>+byId('t418').value) // В Кассе достаточная сумма
byId('buttons').innerHTML=confirmBtn; // Добавить кнопку Провести
else{ // в Кассе недостаточно денег
byId('buttons').innerHTML=confirmRedBtn; // Добавить кнопку Провести в красное и вывести сообщение
byId('extras').innerHTML=warning.replace('warning','Касса '+(+data[0][0])+', не хватает '+(+byId('t418').value-data[0][0]));
}
break;
}
}
obj.send(vars); // отправили запрос и теперь будем ждать ответ, а пока - выходим
}
// Проверка возможности проведения документа
function checkDoc(){
if(byId('t339').value=='') // Заполнен ли договор?
byId('extras').innerHTML=warning.replace('warning','Для заполнения ТЧ нужно указать договор');
else if(byId('t384').value=='') // Заполнен ли склад?
byId('extras').innerHTML=warning.replace('warning','Нужно указать склад');
else if(byId('t3357').value>0){ // Есть ли сумма?
if(isPTU)
byId('buttons').innerHTML=confirmBtn; // Добавить кнопку Провести для ПТУ
else
checkStore(); // Проверить наличие на складе для реализации
return;
}
// Не показывать кнопку провести, если проверки не удались
byId('buttons').innerHTML='';
}
// Валидация правок в строке Номенклатуры
function validateLine(el,id,i){
// Восстановить НДС и обратить отрицательные значения
if(i=='ndsNm')
el.value=items[id].ndsNm;
else if(i=='ndsAm'&&items[id].ndsID=='')
el.value='';
else if(i=='ndsAm'&&nds[items[id].ndsID].rate=='')
el.value='';
else
el.value=myRound(el.value<0?-el.value:+el.value);
switch(i){ // Что поменял пользователь? Пересчитать всё остальное
case 'sum': // Сумма
byId(id+'_price').value=myRound(byId(id+'_sum').value/byId(id+'_qty').value);
// Здесь и далее нет break!
case 'qty': // Количество
case 'price': // Цена
// Пересчитать Сумму, если задана не она
if(i!='sum')
byId(id+'_sum').value=myRound(byId(id+'_qty').value*byId(id+'_price').value);
// Если номенклатура без цены - сохранить для неё эту цену в базе и в ТЧ
if(!(items[id].price>0))
intApi('POST','_m_save/'+items[id].itemID+'?JSON&t353='+(items[id].price=byId(id+'_price').value));
case 'ndsNm': // НДС - пересчитать
if(items[id].ndsID>0){ // Заполнена ли ссылка на НДС?
if(nds[items[id].ndsID].rate=='') // НДС нет
byId(id+'_ndsAm').value='';
else if(addNDS) // НДС сверху
byId(id+'_ndsAm').value=myRound(byId(id+'_sum').value*nds[items[id].ndsID].rate);
else
byId(id+'_ndsAm').value=myRound(byId(id+'_sum').value/(1+parseFloat(nds[items[id].ndsID].rate))*nds[items[id].ndsID].rate);
}
case 'ndsAm': // Сумма с НДС
if(items[id].ndsID>0){ // Заполнена ли ссылка на НДС?
if(addNDS&&nds[items[id].ndsID].rate!='') // НДС сверху и он задан
byId(id+'_total').value=items[id].total==''?byId(id+'_sum').value:myRound(parseFloat(byId(id+'_sum').value)+parseFloat(byId(id+'_ndsAm').value));
else // НДС включен или его нет
byId(id+'_total').value=byId(id+'_sum').value;
}
else
byId(id+'_total').value=byId(id+'_sum').value;
}
// Подправить ТЧ и итоги согласно правкам пользователя
var s=0
,item={qty:byId(id+'_qty').value-(items[id].qty||0)
,sum:byId(id+'_sum').value-(items[id].sum||0)
,nds:(parseFloat(byId(id+'_ndsAm').value)>0?parseFloat(byId(id+'_ndsAm').value):0)-(parseFloat(items[id].ndsAm)>0?parseFloat(items[id].ndsAm):0)
,total:byId(id+'_total').value-(items[id].total||0)};
for(var i in item) // Считаем сумму изменений
s+=Math.abs(item[i]);
if(s>0){ // Если что-то поменялось - пересчитать итоги
byId('303').innerHTML=myRound(parseFloat(byId('303').innerHTML||0)+item.qty); // Количество единиц
byId('3571').innerHTML=byId('t413').value=myRound(parseFloat(byId('3571').innerHTML||0)+item.sum); // Сумма
byId('829').innerHTML=byId('t3355').value=myRound(parseFloat(byId('829').innerHTML||0)+item.nds); // НДС
byId('3572').innerHTML=byId('t3357').value=myRound(parseFloat(byId('3572').innerHTML||0)+item.total); // Сумма с НДС
// Сохранить правки позиции в массиве полей ввода и в базе
byId(id).style='border: 2px solid green'; // Пока выполняется сохранение, подкрасить ряд зелененьким
intApi('POST','_m_save/'+id+'?JSON&t330='+items[id].itemID // Номенклатура (если изменилась)
+'&t303='+(items[id].qty=byId(id+'_qty').value) // Количество единиц
+'&t332='+(items[id].price=byId(id+'_price').value) // Цена
+'&t3571='+(items[id].sum=byId(id+'_sum').value) // Сумма
+'&t3653='+items[id].ndsID // ID Ставки НДС
+'&t829='+(items[id].ndsAm=byId(id+'_ndsAm').value) // Сумма НДС
+'&t3572='+(items[id].total=byId(id+'_total').value) // Сумма с НДС
,'updateDoc','',id);
}
}
// Вызвать нужную страницу ТЧ, применив сортировку, если есть
function getPage(p){
intApi('GET','object/303?JSON&F_U='+id+'&pg='+p+(order==''?'':'&order_val='+order)+desc+filter,'docItems');
// Запросить итоговые суммы ТЧ
if(pageTP==1)
intApi('GET','report/3473?JSON&FR_ID='+id+filter.replace(/&F_/g,'&FR_'),'docTotals');
}
// Собрать фильтр ТЧ
function searchTP(){
filter='';
$('.filter').each(function(){ // Перебираем поля ввода фильтра по классу filter
if(this.value!='')
if(this.value.substr(0,1)!='!'&&this.getAttribute("name").substr(0,2)=='F_') // Не число и без признака NOT - "!"
filter+='&'+this.getAttribute("name")+'='+this.value+'%25';
else
filter+='&'+this.getAttribute("name")+'='+this.value;
});
getPage(pageTP=1);
}
// Сортировка ТЧ по выбранному полю в заголовке таблицы
function sortTP(o){
if(order!=o){ // Кликнули новое поле?
order=o; // Сохранить его
desc=''; // и установить сортировку по возрастанию
}
else if(desc=='') // Если поле кликнуто повторно - обратить направление сортировки
desc='&desc=0'; // сортировка по убыванию
else
desc=''; // сортировка по возрастанию
getPage(pageTP=1);
}
// Сохранить изменения сумм документа
function updateDoc(){
intApi('POST','_m_set/'+id+'?JSON&t413='+byId('t413').value+'&t3355='+byId('t3355').value+'&t3357='+byId('t3357').value);
checkDoc();
}
// Поиск Номенклатур по заданному фильтру
function seek(el,id){
if(lastK!=el.value||el.value==''){
window.clearTimeout(timer); // Включить задержку, чтобы дать пользователю набрать текст поиска
lastK=el.value;
if(id!=':id:') // Идёт редактирование существующей строки
if(items[id].item==el.value) // и там что-то уже есть сохраненное - показать всё, не накладывая фильтр
lastK='';
// Запустить поиск через 250мс после последнего нажатия клавиши в поле поиска
timer=setTimeout(function(){intApi('GET','report/3540?JSON&FR_item=%25'+lastK+'%25','dd','',el.id)},250);
}
}
// Отработать выбор Номенклатуры
function selectItem(id,itemId){
intApi('GET','report/389?JSON&FR_ID='+itemId+'&FR_CAID='+clientID,'selectItem','',{el:id,id:itemId});
}
// Заполнить выпадающий список НДС
function ndsList(id){
if(byId('ddnds'+id).innerHTML=='') // если список ещё пуст
for(i in nds)
byId('ddnds'+id).innerHTML+='
';
}
// Отработать выбор ставки НДС
function setNDS(id,i){
byId('nds'+id).value=items[id].ndsNm=nds[i].name; // Название ставки НДС
// Если номенклатура без указания ставки НДС - сохранить для неё эту ставку
if(!(items[id].ndsID>0))
intApi('POST','_m_save/'+items[id].itemID+'?JSON&t360='+i);
items[id].ndsID=i; // ID Ставки НДС
validateLine(byId('nds'+id),id,'ndsNm'); // Пересчитать суммы
}
function checkStore(){
intApi('GET','report/2235?JSON&FR_ID='+id,'checkStore');
}
// Вызов запроса Проводка Движения
function confirm(){
byId('confirmBtn').disabled=true;
if(type==299) // В зависимости от типа документа - проводка движения
intApi('POST','report/22116?JSON&confirmed=1&FR_ID='+id,'confirm');
else // или платежа (для РС и кассы разные запросы)
intApi('POST','report/'+(isWire?27148:26984)+'?JSON&confirmed=1&FR_ID='+id,'confirm');
}
// Округление по безумному жабоскриптовому феншую
function myRound(v){
return (Math.round((v + Number.EPSILON) * 100) / 100).toFixed(2);
}
// Дата и время
function myDateTime(d){
return d.getDate()+'.'+(d.getMonth()+1)+'.'+d.getFullYear()+' '+d.getHours()+':'+d.getMinutes()+':'+d.getSeconds();
}
// Пересчитать итоги документа
function updateTotals(sign,item){
byId('330').innerHTML=parseInt(byId('330').innerHTML||0)+sign; // Количество позиций
byId('303').innerHTML=myRound(parseFloat(byId('303').innerHTML||0)+sign*item.qty); // Количество единиц
byId('3571').innerHTML=byId('t413').value=myRound(parseFloat(byId('3571').innerHTML||0)+sign*item.sum); // Сумма
if(parseFloat(item.ndsAm)>0) // Сумма НДС
byId('829').innerHTML=byId('t3355').value=myRound(parseFloat(byId('829').innerHTML||0)+sign*item.ndsAm);
byId('3572').innerHTML=byId('t3357').value=myRound(parseFloat(byId('3572').innerHTML||0)+sign*item.total); // Сумма с НДС
updateDoc();
}