1const urlStart = { 2 b24: 'https://www.bitrix24.ru/apps/app/ugpromedia.estateobjects/?p=1253570', 3 amo: 'https://atrealt.ru/amocrm/#howinstall', 4 atrealt: 'https://app.atrealt.com/install/new' 5} 6const pricingData = { 7 atrealt: [ 8 { 9 name: 'ÐгенÑ', 10 basePrice: 1490, 11 users: 1, 12 featured: false, 13 features: [ 14 'ТолÑко 1 полÑзоваÑелÑ', 15 'Ðо 20 обÑекÑов недвижимоÑÑи', 16 '10 Ðб Ñайлового Ñ ÑанилиÑа', 17 'Ðобавление и ÑедакÑиÑование обÑекÑов', 18 'ÐвÑовÑгÑÑзка XML - один обÑий Ñид', 19 'ÐополниÑелÑнÑе полÑ', 20 'РазовÑй импоÑÑ', 21 'ÐодбоÑки и веб-пÑезенÑаÑии', 22 'ÐобилÑное пÑиложение Android' 23 ] 24 }, 25 { 26 name: 'ÐазовÑй', 27 basePrice: 3990, 28 users: 5, 29 featured: false, 30 features: [ 31 'Ðобавление и ÑедакÑиÑование обÑекÑов', 32 'Ðобавление ÑоÑÑÑдников', 33 'Роли пÑав доÑÑÑпа', 34 'Ðедение клиенÑов и воÑонки Ñделок', 35 'ÐадаÑи и календаÑÑ', 36 'ÐвÑовÑгÑÑзка XML - один обÑий Ñид', 37 'ÐополниÑелÑнÑе полÑ', 38 'РазовÑй импоÑÑ', 39 'ÐодбоÑки и веб-пÑезенÑаÑии', 40 'ÐеÑколÑко Ñаблонов пÑезенÑаÑий в PDF', 41 'ÐÑблиÑование обÑекÑов', 42 'ÐнÑÑÑеннÑÑ Ð¿ÑемодеÑаÑиÑ', 43 ] 44 }, 45 { 46 name: 'СÑандаÑÑнÑй', 47 basePrice: 10990, 48 users: 15, 49 featured: true, 50 features: [ 51 'Ðобавление и ÑедакÑиÑование обÑекÑов', 52 'Ðобавление ÑоÑÑÑдников', 53 'Роли пÑав доÑÑÑпа', 54 'Ðедение клиенÑов и воÑонки Ñделок', 55 'ÐадаÑи и календаÑÑ', 56 'ÐвÑовÑгÑÑзка XML - обÑий Ñид', 57 'ÐвÑовÑгÑÑзка XML по ÑÐ¸Ð¿Ñ Ð½ÐµÐ´Ð²Ð¸Ð¶Ð¸Ð¼Ð¾ÑÑи', 58 'ÐвÑоподбоÑки в заÑÐ²ÐºÐ°Ñ ', 59 'ÐополниÑелÑнÑе полÑ', 60 'РазовÑй импоÑÑ', 61 'ÐодбоÑки и веб-пÑезенÑаÑии', 62 'ÐеÑколÑко Ñаблонов пÑезенÑаÑий в PDF', 63 'ÐÑблиÑование обÑекÑов', 64 'ÐнÑÑÑеннÑÑ Ð¿ÑемодеÑаÑиÑ', 65 'Ðинамика Ñен в комплекÑÐ°Ñ ', 66 'СÑадии ÑÑÑоиÑелÑÑÑва в комплекÑÐ°Ñ ', 67 'ÐÑлÑÑиобÑÑÐ²Ð»ÐµÐ½Ð¸Ñ Ð² коммеÑÑии', 68 'API', 69 'Свой домен в подбоÑÐºÐ°Ñ Ð¸ веб-пÑезенÑаÑиÑÑ Ð¾Ð±ÑекÑов', 70 ] 71 }, 72 { 73 name: 'ÐÑоÑеÑÑионалÑнÑй', 74 basePrice: 16990, 75 users: 50, 76 featured: false, 77 features: [ 78 'Ðобавление и ÑедакÑиÑование обÑекÑов', 79 'Ðобавление ÑоÑÑÑдников', 80 'Роли пÑав доÑÑÑпа', 81 'Ðедение клиенÑов и воÑонки Ñделок', 82 'ÐадаÑи и календаÑÑ', 83 'ÐвÑовÑгÑÑзка XML - обÑий Ñид', 84 'ÐвÑовÑгÑÑзка XML по ÑÐ¸Ð¿Ñ Ð½ÐµÐ´Ð²Ð¸Ð¶Ð¸Ð¼Ð¾ÑÑи', 85 'ÐвÑоподбоÑки в заÑÐ²ÐºÐ°Ñ ', 86 'ÐополниÑелÑнÑе полÑ', 87 'РазовÑй импоÑÑ', 88 'ÐвÑомаÑиÑеÑкий пеÑиодиÑеÑкий импоÑÑ', 89 'ÐодбоÑки и веб-пÑезенÑаÑии', 90 'ÐеÑколÑко Ñаблонов пÑезенÑаÑий в PDF', 91 'ÐÑблиÑование обÑекÑов', 92 'ÐнÑÑÑеннÑÑ Ð¿ÑемодеÑаÑиÑ', 93 'Ðинамика Ñен в комплекÑÐ°Ñ ', 94 'СÑадии ÑÑÑоиÑелÑÑÑва в комплекÑÐ°Ñ ', 95 'ÐÑлÑÑиобÑÑÐ²Ð»ÐµÐ½Ð¸Ñ Ð² коммеÑÑии', 96 'API', 97 'Свой домен в подбоÑÐºÐ°Ñ Ð¸ веб-пÑезенÑаÑиÑ
97Ñ Ð¾Ð±ÑекÑов', 98 'ÐонÑÑ "ÐаÑÑÐµÑ 2 Ñегиона"' 99 ] 100 } 101 ], 102 b24: [ 103 { 104 name: 'ÐеÑплаÑнÑй', 105 basePrice: 0, 106 users: 1, 107 featured: false, 108 features: [ 109 'ТолÑко 1 полÑзоваÑелÑ', 110 'Ðо 20 обÑекÑов недвижимоÑÑи', 111 '500 ÐÐ Ñайлового Ñ ÑанилиÑа', 112 'Ðобавление и ÑедакÑиÑование обÑекÑов', 113 'ÐÐ°Ð·Ð¾Ð²Ð°Ñ Ð¸Ð½ÑегÑаÑÐ¸Ñ Ñ ÐиÑÑикÑ24', 114 'ÐÑивÑзка обÑекÑов к конÑакÑÑ / Ñделке', 115 'ÐвÑовÑгÑÑзка XML - один обÑий Ñид', 116 'Ðеб-пÑезенÑаÑии', 117 'ÐобилÑное пÑиложение Android' 118 ] 119 }, 120 { 121 name: 'ÐодпиÑка "ÐÑо"', 122 basePrice: 690, 123 users: 'Ðез огÑаниÑений', 124 featured: false, 125 features: [ 126 '<span><b>ÐеогÑаниÑенное</b> колиÑеÑÑво полÑзоваÑелей</span>', 127 '<span><b>ÐеогÑаниÑенное</b> колиÑеÑÑво обÑекÑов</span>', 128 '<span><b>ÐеогÑаниÑенное</b> Ñайловое Ñ ÑанилиÑе</span>', 129 'Ð Ð¾Ð±Ð¾Ñ Ð°Ð²ÑомаÑизаÑии на ÑÑадиÑÑ Ñделки', 130 'ÐвÑовÑгÑÑзка XML по вÑем Ñипам недвижимоÑÑи', 131 'СопоÑÑавление полей Ñделки Ñ Ð¿Ð°ÑамеÑÑами обÑекÑа', 132 'ÐÑÑоÑÐ¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ в обÑекÑе', 133 'ÐополниÑелÑнÑе полÑ', 134 'ÐаÑÑÑойка ÑилÑÑÑа', 135 'ÐÑезенÑаÑии в PDF', 136 'ÐÑблиÑование обÑекÑов', 137 'ÐнÑÑÑеннÑÑ Ð¿ÑемодеÑаÑиÑ', 138 'Создание подбоÑок', 139 'ÐÑлÑÑиобÑÑÐ²Ð»ÐµÐ½Ð¸Ñ Ð² коммеÑÑии', 140 'Ðинамика Ñен и ÑÑадии ÑÑÑоиÑелÑÑÑва комплекÑа', 141 'ÐмпоÑÑ Ð±Ð°Ð·Ñ Ð¾Ð±ÑекÑов', 142 'ÐÑÑÑÑноÑÑÑ Ð¸Ð· ÐвиÑо и Циан', 143 'ÐаÑÑовÑе опеÑаÑии Ñ Ð¾Ð±ÑекÑами', 144 'Роли доÑÑÑпа по ÑоÑÑÑдникам', 145 'Свой домен Ð´Ð»Ñ Ð¿Ð¾Ð´Ð±Ð¾Ñок (Ð¾Ñ 6 меÑ.)', 146 'API', 147 'ÐобилÑное пÑиложение Android', 148 'ÐÑиоÑиÑеÑÐ½Ð°Ñ Ð¿Ð¾Ð´Ð´ÐµÑжка', 149 ] 150 } 151 ], 152 amo: [ 153 { 154 name: 'ÐодпиÑка "ÐÑо"', 155 basePrice: 690, 156 users: 'Ðез огÑаниÑений', 157 featured: false, 158 features: [ 159 'ÐвÑомаÑизаÑÐ¸Ñ Ð½Ð° ÑÑаÑÑÑÐ°Ñ Ñделки', 160 'ÐвÑовÑгÑÑзка XML', 161 'СопоÑÑавление полей Ñделки Ñ Ð¿Ð°ÑамеÑÑами обÑекÑа', 162 'ÐÑÑоÑÐ¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ в обÑекÑе', 163 'ÐополниÑелÑнÑе полÑ', 164 'ÐаÑÑÑойка ÑилÑÑÑа', 165 'ÐÑезенÑаÑии в PDF', 166 'ÐÑблиÑование обÑекÑов', 167 'ÐнÑÑÑеннÑÑ Ð¿ÑемодеÑаÑиÑ', 168 'Создание подбоÑок', 169 'ÐÑлÑÑиобÑÑÐ²Ð»ÐµÐ½Ð¸Ñ Ð² коммеÑÑии', 170 'Ðинамика Ñен и ÑÑадии ÑÑÑоиÑелÑÑÑва комплекÑа', 171 'ÐмпоÑÑ Ð±Ð°Ð·Ñ Ð¾Ð±ÑекÑов', 172 'ÐÑÑÑÑноÑÑÑ Ð¸Ð· ÐвиÑо и Циан', 173 'ÐаÑÑовÑе опеÑаÑии Ñ Ð¾Ð±ÑекÑами', 174 'Роли доÑÑÑпа по ÑоÑÑÑдникам', 175 'Свой домен Ð´Ð»Ñ Ð¿Ð¾Ð´Ð±Ð¾Ñок (Ð¾Ñ 6 меÑ.)', 176 'API', 177 'ÐобилÑное пÑиложение Android', 178 'ÐÑиоÑиÑеÑÐ½Ð°Ñ Ð¿Ð¾Ð´Ð´ÐµÑжка', 179 ] 180 } 181 ] 182}; 183 184let currentPeriod = 1; 185let currentCRM = 'atrealt'; 186 187function calculatePrice(basePrice, months) { 188 if (basePrice === 0) return 0; 189 190 let multiplier = 1; 191 let discount = 0; 192 193 if (months === 6) { 194 multiplier = 0.9; // 10% discount 195 discount = 10; 196 } else if (months === 12) { 197 multiplier = 0.8; // 20% discount 198 discount = 20; 199 } 200 201 const totalPrice = Math.round(basePrice * months * multiplier); 202 const monthlyPrice = Math.round(basePrice * multiplier); 203 204 return { 205 total: totalPrice, 206 monthly: monthlyPrice, 207 originalMonthly: basePrice, 208 discount: discount 209 }; 210} 211 212function formatPrice(price) {
213 return price.toLocaleString('ru-RU'); 214} 215 216function renderCards() { 217 const container = document.getElementById('pricingCards'); 218 const plans = pricingData[currentCRM]; 219 220 container.innerHTML = ''; 221 222 plans.forEach((plan, index) => { 223 const priceInfo = calculatePrice(plan.basePrice, currentPeriod); 224 const isFree = plan.basePrice === 0; 225 226 let priceHTML = ''; 227 if (isFree) { 228 priceHTML = ` 229 <div class="current-price">ÐеÑплаÑно</div> 230 <div class="price-period">${currentCRM === 'b24' ? '<div class="fs-7 text-gray mt-2">Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñкой на "ÐиÑÑикÑ24 ÐаÑкеÑплейÑ"</div>':'навÑегда'}</div> 231 `; 232 } else { 233 if (priceInfo.discount > 0) { 234 priceHTML = ` 235 <div class="original-price">${formatPrice(priceInfo.originalMonthly)} â½/меÑ</div> 236 <span class="discount-tag">â${priceInfo.discount}%</span> 237 <div class="current-price">${formatPrice(priceInfo.monthly)} â½<span class="price-period">/меÑ</span></div> 238 <div class="fs-7 text-gray mt-2"> 239 ${currentPeriod > 1 ? `ÐÑего ${formatPrice(priceInfo.total)} ⽠за ${currentPeriod} меÑ` : ''} 240 </div> 241 <div class="fs-7 text-gray mt-2">${typeof plan.users === 'number' ? plan.users > 1 ? 'Ñена за '+plan.users+' полÑзоваÑелей':'Ñена за 1 полÑзоваÑелÑ' : 'Ñена за 1 полÑзоваÑелÑ'}</div> 242 `; 243 } else { 244 priceHTML = ` 245 <div class="current-price">${formatPrice(plan.basePrice)} â½<span class="price-period">/меÑ</span></div><div class="fs-7 text-gray mt-2">${typeof plan.users === 'number' ? plan.users > 1 ? 'Ñена за '+plan.users+' полÑзоваÑелей':'Ñена за 1 полÑзоваÑелÑ' : 'Ñена за 1 полÑзоваÑелÑ'}</div> 246 `; 247 } 248 } 249 250 const featuresHTML = plan.features.map(feature => 251 `<li><span class="feature-icon available"><i class="bi bi-check-lg"></i></span> ${feature}</li>` 252 ).join(''); 253 254 const featuredBadge = plan.featured ? '<div class="popular-badge">ÐопÑлÑÑнÑй</div>' : ''; 255 256 const cardHTML = ` 257 <div class="col-lg-${currentCRM === 'atrealt' ? '3' : '4'} col-md-6 ${plan.featured ? 'featured-wrapper' : ''}"> 258 <div class="price-card ${plan.featured ? 'featured' : ''} fade-in" style="animation-delay: ${index * 0.1}s"> 259 ${featuredBadge} 260 <h3 class="plan-name">${plan.name}</h3> 261 <div class="plan-users"> 262 <i class="bi bi-people"></i> <b>${plan.users}</b> ${typeof plan.users === 'number' ? plan.users > 1 ? 'полÑзоваÑелей':'полÑзоваÑелÑ' : ''} 263 </div> 264 <div class="price-container"> 265 ${priceHTML} 266 </div> 267 <a href="${urlStart[currentCRM]}" class="btn btn-primary btn-select" target="_blank"> 268 ${isFree ? 'ÐаÑаÑÑ Ð±ÐµÑплаÑно' : 'ÐопÑобоваÑÑ'} 269 </a> 270 <ul class="features-list mt-4"> 271 ${featuresHTML} 272 </ul> 273 </div> 274 </div> 275 `; 276 container.innerHTML += cardHTML; 277 }); 278} 279 280function switchCRM(crmType, element) { 281 currentCRM = crmType; 282 document.querySelectorAll('.crm-card').forEach(card => { 283 card.classList.remove('active'); 284 }); 285 element.classList.add('active'); 286 renderCards(); 287} 288 289function setPeriod(months, element) { 290 currentPeriod = months; 291 document.querySelectorAll('.period-btn').forEach(btn => { 292 btn.classList.remove('active'); 293 }); 294 element.classList.add('active'); 295 296 renderCards(); 297} 298renderCards();
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.