function init() { //устанавливаем обработчик события после закрытия документа frontol.addEventListener("closeDocument", "afterCloseDocument", false); } //Функция должна возвращать true, если товар относится к классификатору 1 function IsWareGroup1(Ware) { for (Ware.classifier.index = 1; Ware.classifier.index <= Ware.classifier.count; Ware.classifier.index++) { if (Ware.classifier.code == 1) return true; } return false; } //Функция должна возвращать true, если товар относится к классификатору 2 function IsWareGroup2(Ware) { for (Ware.classifier.index = 1; Ware.classifier.index <= Ware.classifier.count; Ware.classifier.index++) { if (Ware.classifier.code == 2) return true; } return false; } //Функция должна возвращать true, если товар относится к классификатору 3 function IsWareGroup3(Ware) { for (Ware.classifier.index = 1; Ware.classifier.index <=Ware.classifier.count; Ware.classifier.index++) { if (Ware.classifier.code == 3) return true; } return false; } //Функция должна возвращать true, если на товар не начисляются бонусы function IsWareBlock(Ware) { for (Ware.classifier.index = 1; Ware.classifier.index <= Ware.classifier.count; Ware.classifier.index++) { if (Ware.classifier.code == 4) return true; } return false; } //Вспомогательная функция для преобразования даты в строку function DateToString(Date) { return Date.getDate() + ‘.’ + (Date.getMonth() + 1) + ‘.’ + Date.getYear(); } //Вспомогательная функция для преобразования строки в дату function StringToDate(Str) { return new Date(2000 + parseInt(Str.substring(6,8), 10), parseInt(Str.substring(3,5), 10) – 1, parseInt(Str.substring(0,2), 10)); } //Расчитывает бонусы для документа Document на дату Date, записывая их в BonusInfo function calcBonus(Document, BonusInfo, Date) { BASESUM = 10; //Минимальная сумма, на которую начисляется бонус BALL1 = 2; //Количество баллов, начисляемых за товары, относящиеся к классификатору 1, за каждые BASESUM рублей BALL2 = 5; //Количество баллов, начисляемых за товары, относящиеся к классификатору 2, за каждые BASESUM рублей BALL3 = 10; //Количество баллов, начисляемых за товары, относящиеся к классификатору 3, за каждые BASESUM рублей //Константы, задающие границы бонусов для товаров без групп BASESUM0_1 = 700; BASESUM0_2 = 1500; BASESUM0_3 = 3000; BALL0_0 = 1; //Количество баллов за товары без группы за каждые BASESUM, если сумма меньше BASESUM0_1 BALL0_1 = 3; //Количество баллов за товары без группы за каждые BASESUM, если сумма больше BASESUM0_1, но меньше BASESUM0_2 BALL0_2 = 5; //Количество баллов за товары без группы за каждые BASESUM, если сумма больше BASESUM0_2, но меньше BASESUM0_3 BALL0_3 = 7; //Количество баллов за товары без группы за каждые BASESUM, если сумма больше BASESUM0_3 WEEKDAY3 = 4; //День недели, в который начисляются бонусы на товары третьей группы: 0 – воскресенье, 1 – понедельник, 2 – вторник и т.д. //Расчитываем суммы товаров по группам sum0 = 0; //сумма товаров, которые не попадают ни в одну группу sum1 = 0; //сумма товаров из первой группы sum2 = 0; //сумма товаров из второй группы sum3 = 0; //сумма товаров из третьей группы for (Document.position.index = 1; Document.position.index <= Document.position.count; Document.position.index++) { if(Document.position.ware != null) { if (IsWareBlock(Document.position.ware)) { continue; } if (IsWareGroup3(Document.position.ware)) { if (Date.getDay() == WEEKDAY3) { sum3 += Document.position.sum; continue; } } if (IsWareGroup2(Document.position.ware)) { sum2 += Document.position.sum; continue; } if (IsWareGroup1(Document.position.ware)) { sum1 += Document.position.sum; continue; } } sum0 += Document.position.sum; } //Рассчитываем величину бонусов, по суммам if (sum0 >= BASESUM0_3) { BonusInfo.ball0 = BALL0_3 * Math.floor(sum0 / BASESUM); } else if (sum0 >= BASESUM0_2) { BonusInfo.ball0 = BALL0_2 * Math.floor(sum0 / BASESUM); } else if (sum0 >= BASESUM0_1) { BonusInfo.ball0 = BALL0_1 * Math.floor(sum0 / BASESUM); }else { BonusInfo.ball0 = BALL0_0 * Math.floor(sum0 / BASESUM); } BonusInfo.ball1 = BALL1 * Math.floor(sum1 / BASESUM); BonusInfo.ball2 = BALL2 * Math.floor(sum2 / BASESUM); BonusInfo.ball3 = BALL3 * Math.floor(sum3 / BASESUM); BonusInfo.ball = BonusInfo.ball0 + BonusInfo.ball1 + BonusInfo.ball2 + BonusInfo.ball3; } //Отменяем все бонусы function cancelBonus() { for (frontol.currentDocument.bonus.index = frontol.currentDocument.bonus.count; frontol.currentDocument.bonus.index >= 1; frontol.currentDocument.bonus.index--) frontol.currentDocument.cancelBonus(frontol.currentDocument.bonus.index); } function afterCloseDocument() { DAYCOUNT = 14; //Количество дней, через которое начинает действовать бонус COUNTERTYPECODE = 1; //Код вида счетчика, на который нужно начислять бонус //Проверяем, что документ продажи или возврата if ((frontol.currentDocument.type.operation != 0) && (frontol.currentDocument.type.operation != 1) && (frontol.currentDocument.type.operation != 2)) return; cancelBonus(); //Ищем счетчик, на который нужно начислить бонус CounterCode = 0; for (frontol.currentDocument.counter.index = 1; frontol.currentDocument.counter.index <= frontol.currentDocument.counter.count; frontol.currentDocument.counter.index++) if(frontol.currentDocument.counter.type.code == COUNTERTYPECODE) { CounterCode = frontol.currentDocument.counter.code; break; } if (CounterCode == 0) return; var BonusInfo = {}; D = new Date(); if (frontol.currentDocument.type.operation == 0) { //Начисляем бонусы на документ продажи calcBonus(frontol.currentDocument, BonusInfo, D); D.setDate(D.getDate() + DAYCOUNT); frontol.currentDocument.accrualBonus(BonusInfo.ball, COUNTERTYPECODE, CounterCode, DateToString(D)) //Записываем данные для последующей печати в слипе frontol.currentDocument.userValues.set("ball0", BonusInfo.ball0); frontol.currentDocument.userValues.set("ball1", BonusInfo.ball1); frontol.currentDocument.userValues.set("ball2", BonusInfo.ball2); frontol.currentDocument.userValues.set("ball3", BonusInfo.ball3); frontol.currentDocument.userValues.set("DAYCOUNT", DAYCOUNT); } else { if (frontol.currentDocument.documentForRefund == null) return; //Расчитываем количество бонусов для документа остатка CloseDate = StringToDate(frontol.currentDocument.documentForRefund.dateClose); calcBonus(frontol.currentDocument.documentForRefund, BonusInfo, CloseDate); CloseDate.setDate(CloseDate.getDate() + DAYCOUNT); //Количество возвращаемых бонусов = Количество бонусов, которые еще не вернули, минус бонусы, которые начисляются на документ остатка Sum = 0; for(frontol.currentDocument.documentForRefund.bonus.index = 1; frontol.currentDocument.documentForRefund.bonus.index <= frontol.currentDocument.documentForRefund.bonus.count; frontol.currentDocument.documentForRefund.bonus.index++) Sum += frontol.currentDocument.documentForRefund.bonus.sum; Sum = Sum – BonusInfo.ball; //Возвращаем бонусы if (D > CloseDate) frontol.currentDocument.refundBonus(Sum, COUNTERTYPECODE, CounterCode, DateToString(D)); else frontol.currentDocument.refundBonus(Sum, COUNTERTYPECODE, CounterCode, DateToString(CloseDate)); } return BonusInfo.ball; }