id:"pro-torty", title:"PRO Торты", summary:"Для тех, кто хочет продавать торты дороже и увереннее работать с заказами.", image:"", accent:"pink", offerType:"discount", priceOld:18000, priceNew:12240, discountType:"promo", payLink:"https://example.com/zenclass/pro-torty", promoCode:"ALINA32", bonuses:["Шаблоны расчета себестоимости", "Разбор частых ошибок"], lifetimeAccess:true, seats:{enabled:true,start:24,ratePerHour:.7,min:2,startAt:"2026-06-22T00:00:00+03:00"}, detail:{mode:"modal",ref:"#detail-pro-torty"} }, { id:"bundle-start", title:"Пакет «Сладкий старт»", summary:"Набор курсов для тех, кто хочет закрыть сразу несколько пробелов.", image:"", accent:"blue", offerType:"discount_plus_gift", priceOld:26000, priceNew:17680, discountType:"preset", payLink:"https://example.com/zenclass/bundle-start", promoCode:null, bundleItems:["Это База 2.0", "Капитан Кукис"], bonuses:["Общий план обучения", "Дополнительный мини-урок"], lifetimeAccess:false, seats:{enabled:false}, detail:{mode:"none"} } ], wheel:{ enabled:true, oncePerUser:true, storageKey:"aps_sale_2026_wheel", prizes:[ {id:"w1",label:"+5% к скидке",kind:"promo",promoCode:"SPIN5",weight:1}, {id:"w2",label:"Набор шаблонов в подарок",kind:"bonus",note:"Выдается вручную после оплаты",weight:1}, {id:"w3",label:"Дополнительный урок-разбор",kind:"bonus",note:"Напишите менеджеру после оплаты",weight:1}, {id:"w4",label:"Чек-лист кондитера",kind:"bonus",note:"Ссылка придет в Telegram",weight:1} ] }, advent:{ startDate:"2026-06-11", endDate:"2026-06-21", days:[ {date:"2026-06-11",title:"День 1",reward:"Мини-урок: как выбрать начинку под сезон",link:"https://t.me/example"}, {date:"2026-06-12",title:"День 2",reward:"Чек-лист закупок для домашней кухни",link:"https://t.me/example"}, {date:"2026-06-13",title:"День 3",reward:"Шаблон расчета себестоимости",link:"https://t.me/example"}, {date:"2026-06-14",title:"День 4",reward:"Разбор частых ошибок в креме",link:"https://t.me/example"}, {date:"2026-06-15",title:"День 5",reward:"Мини-рецепт стабильной начинки",link:"https://t.me/example"}, {date:"2026-06-16",title:"День 6",reward:"Памятка по хранению и перевозке",link:"https://t.me/example"}, {date:"2026-06-17",title:"День 7",reward:"Идеи для летней витрины",link:"https://t.me/example"}, {date:"2026-06-18",title:"День 8",reward:"Шаблон ответа клиенту",link:"https://t.me/example"}, {date:"2026-06-19",title:"День 9",reward:"Мини-урок по декору",link:"https://t.me/example"}, {date:"2026-06-20",title:"День 10",reward:"План подготовки к распродаже",link:"https://t.me/example"}, {date:"2026-06-21",title:"День 11",reward:"Завтра старт распродажи. Проверьте бот и выберите курс заранее.",link:"https://t.me/example"} ] } }; function mergeConfig(base, patch){ if(!patch || typeof patch !== "object") return base; Object.keys(patch).forEach(function(key){ if(Array.isArray(patch[key])) base[key] = patch[key]; else if(patch[key] && typeof patch[key] === "object"){ base[key] = mergeConfig(base[key] && typeof base[key] === "object" ? base[key] : {}, patch[key]); }else if(patch[key] !== undefined){ base[key] = patch[key]; } }); return base; } window.SALE_CONFIG = mergeConfig(defaultConfig, existingConfig); function pad(value){return String(value).padStart(2,"0");} function apsNow(){ var queryNow = ""; try{queryNow = new URLSearchParams(window.location.search).get("aps_now") || "";}catch(e){} return queryNow || window.APS_TEST_NOW ? new Date(queryNow || window.APS_TEST_NOW) : new Date(); } function moscowParts(date){ var formatter = new Intl.DateTimeFormat("ru-RU", { timeZone:"Europe/Moscow", year:"numeric", month:"2-digit", day:"2-digit", hour:"2-digit", minute:"2-digit", second:"2-digit", hour12:false }); var parts = formatter.formatToParts(date).reduce(function(acc, part){ acc[part.type] = part.value; return acc; }, {}); return parts; } function moscowDateString(date){ var p = moscowParts(date); return p.year + "-" + p.month + "-" + p.day; } function isoAtMoscowMidnight(dateString){ return dateString + "T00:00:00+03:00"; } function addDays(dateString, days){ var bits = dateString.split("-").map(Number); var parsed = new Date(Date.UTC(bits[0], bits[1] - 1, bits[2] + days)); return parsed.getUTCFullYear() + "-" + pad(parsed.getUTCMonth() + 1) + "-" + pad(parsed.getUTCDate()); } function compareDateStrings(left, right){ if(left === right) return 0; return left > right ? 1 : -1; } function apsSaleDayIndex(){ var config = window.SALE_CONFIG; var now = apsNow(); if(now < new Date(config.sale.startAt)) return -1; if(now > new Date(config.sale.endAt)) return "ended"; var today = moscowDateString(now); var calendar = config.calendar || []; var exactIndex = calendar.findIndex(function(day){return day.date === today;}); if(exactIndex >= 0) return exactIndex; for(var i = calendar.length - 1; i >= 0; i -= 1){ if(compareDateStrings(today, calendar[i].date) >= 0) return i; } return -1; } function apsPhase(){ var config = window.SALE_CONFIG; var now = apsNow(); var today = moscowDateString(now); if(config.advent && compareDateStrings(today, config.advent.startDate) >= 0 && compareDateStrings(today, config.advent.endDate) <= 0) return "advent"; if(now >= new Date(config.sale.startAt) && now <= new Date(config.sale.endAt)) return "sale"; if(now > new Date(config.sale.endAt)) return "ended"; return "before"; } function nearestCountdownTarget(){ var config = window.SALE_CONFIG; var now = apsNow(); if(now < new Date(config.sale.startAt)){ return {date:new Date(config.sale.startAt),label:"до старта распродажи"}; } if(now > new Date(config.sale.endAt)){ return {date:null,label:"распродажа завершена"}; } var today = moscowDateString(now); var currentIndex = apsSaleDayIndex(); var isLastDay = currentIndex === "ended" || currentIndex >= (config.calendar || []).length - 1; if(isLastDay){ return {date:new Date(config.sale.endAt),label:"до конца распродажи"}; } return {date:new Date(isoAtMoscowMidnight(addDays(today, 1))),label:"до снижения скидки"}; } function formatMoney(value){ if(value === null || value === undefined || value === "") return ""; return new Intl.NumberFormat("ru-RU").format(Number(value)) + " ₽"; } function showToast(message){ var toast = document.querySelector(".aps-toast"); if(!toast){ toast = document.createElement("div"); toast.className = "aps-toast"; document.body.appendChild(toast); } toast.textContent = message; toast.classList.add("is-visible"); window.clearTimeout(showToast.timer); showToast.timer = window.setTimeout(function(){toast.classList.remove("is-visible");}, 1800); } function copyText(value){ if(!value) return Promise.resolve(false); if(navigator.clipboard && navigator.clipboard.writeText){ return navigator.clipboard.writeText(value).then(function(){return true;}).catch(function(){return fallbackCopy(value);}); } return Promise.resolve(fallbackCopy(value)); } function fallbackCopy(value){ var input = document.createElement("textarea"); input.value = value; input.setAttribute("readonly", ""); input.style.position = "fixed"; input.style.top = "-1000px"; document.body.appendChild(input); input.select(); var ok = false; try{ok = document.execCommand("copy");}catch(e){ok = false;} input.remove(); return ok; } window.APS = { now:apsNow, phase:apsPhase, saleDayIndex:apsSaleDayIndex, moscowDateString:moscowDateString, nearestCountdownTarget:nearestCountdownTarget, formatMoney:formatMoney, showToast:showToast, copyText:copyText, isoAtMoscowMidnight:isoAtMoscowMidnight }; })();
Во время распродажи можно получить промокод или дополнительный бонус к покупке.