carget
Version:
optimization js code for carget website
399 lines (382 loc) • 11.9 kB
JavaScript
const myPDF = async () => {
const image1 = await loadImageAsDataURL(data5[0].img)
const image2 = await loadImageAsDataURL(data5[1].img)
const image3 = await loadImageAsDataURL(data5[2].img)
const image4 = await loadImageAsDataURL(data5[3].img)
const data = [
{ label: 'МОДЕЛЬ:', value: carState.model[0] },
{ label: 'КОМПЛЕКТАЦИЯ:', value: carState.model[1] },
{ label: 'ГОД ВЫПУСКА:', value: new Date().getFullYear() },
{ label: 'ЦВЕТ КУЗОВА:', value: carState.options.color[1] },
{
label: 'ДИСКИ:',
value: `${carState.options.wheels[2][indexDisk].color}`,
},
{ label: 'ЦВЕТ САЛОНА:', value: carState.options.interiorColor[1] },
]
const totalCarPrice = roundNumberToNChars(
sumCarPrices(carState, myPriceModels),
4
)
const data2 = [
saleAll && saleAll !== 0
? {
label: 'СУММАРНАЯ СКИДКА:',
value: `${saleAll} руб.`,
}
: '',
{
label:
saleAll && saleAll !== 0
? 'ИТОГОВАЯ СТОИМОСТЬ\nс учетом скидки:'
: 'ИТОГОВАЯ СТОИМОСТЬ',
value: `${numberWithSpaces(totalCarPrice)} руб.`,
},
{
label: 'СТОИМОСТЬ Б/Н БЕЗ НДС:',
value: `${numberWithSpaces(
calculateWithPercentage(totalCarPrice, carState.marga) + 40000
)} руб.`,
},
{
label: 'СТОИМОСТЬ Б/Н С НДС 20%:',
value: `${numberWithSpaces(
calculateWithPercentage(totalCarPrice, carState.marga) + 40000
)} руб.`,
},
{ label: 'СРОК ПОСТАВКИ:', value: '45-60 ДНЕЙ' },
]
// Ваш массив данных
const runningBoards = carState.options.runningBoards[0]
// Вывод доп опций
const filteredLabels = runningBoards.filter((label) => label.show)
const optionsText = filteredLabels.map((label) => label.title).join(', ')
// Получаем списки с классами accordion-ul-items-complect и accordion-ul-items-description
const complectList = modelElements[
carState.model[1]
].model[0].querySelectorAll('.accordion-ul-items-complect li')
const descriptionList = modelElements[
carState.model[1]
].model[0].querySelectorAll('.accordion-ul-items-description li')
// Функция для извлечения текста из элементов списка и создания массива данных
function extractTextFromList(list) {
return Array.from(list).map((item) => {
const text = item.innerHTML.trim()
const cleanedText = text
.replace(/<[^>]*>/g, '') // Удаляем все HTML-теги и их содержимое
.replace(/\n+/g, ' ') // Заменяем все переносы строк на пробелы
.replace(/\s+/g, ' ') // Заменяем последовательности пробелов на одиночные пробелы
return cleanedText.trim() // Удаляем пробелы в начале и конце строки
})
}
// Извлекаем текст из списков
const complectData = extractTextFromList(complectList)
const descriptionData = extractTextFromList(descriptionList)
const tableBodycomplectData = complectData.map((item) => [
{
text: item,
alignment: 'left',
fontSize: 10,
margin: [0, 0, 0, 8],
},
])
const tableBodydescriptionData = descriptionData.map((item) => [
{
text: item,
alignment: 'left',
fontSize: 10,
margin: [0, 0, 0, 8],
},
])
const tableBody = data.map(({ label, value }) => [
{
text: label,
alignment: 'left',
border: [0, 0, 0, 0],
fontSize: 10,
margin: [2, 4, 2, 4],
},
{
text: value,
alignment: 'left',
border: [0, 0, 0, 0],
margin: [-16, 4, 2, 4],
fontSize: 10,
bold: true,
},
])
const tableBody2 = data2.map(({ label, value }) => [
{
text: label,
alignment: 'left',
border: [0, 0, 0, 0],
fontSize: 10,
margin: [0, 0, -64, 0],
},
{
text: value,
alignment: 'left',
border: [0, 0, 0, 0],
fontSize: 10,
bold: true,
margin: [40, 0, 0, 0],
},
])
var pdfContent = {
defaultFileName: `${carState.model[0]} ${carState.model[1]}.pdf`,
pageOrientation: 'portrait',
pageSize: {
width: 600,
height: 1000,
},
pageMargins: [32, 64, 32, 64],
info: {
title: `${carState.model[0]} ${carState.model[1]}`,
author: 'CARGET',
keywords: ['CARGET', `${carState.model[0]} ${carState.model[1]}`],
},
header: {
columns: [
{
image: await loadImageAsDataURL(arrayImagesForPDF[0]),
width: 196,
height: 40,
margin: [16, 16, 0, 0],
},
{
text: 'CARGET.SU\nГ. МОСКВА, УЛ. КУЛАКОВА Д.20 К1, ОФ.213\nООО «ВОСТОКИМПОРТ»',
alignment: 'right',
margin: [0, 16, 16, 0],
height: 40,
fontSize: 10,
},
],
},
footer: {
columns: [
{ text: 'CARGET.SU', alignment: 'left' },
{ text: 'ООО «ВОСТОКИМПОРТ»', alignment: 'center' },
{ text: '+7 996 410-01-87', alignment: 'right' },
],
margin: [16, 16, 16, 16],
},
content: [
{
canvas: [
{
type: 'rect',
x: -16,
y: 0,
w: 563, // Ширина прямоугольника (можете настроить под ваш макет)
h: 0.5, // Высота прямоугольника (толщина линии)
color: '#000000', // Цвет черной полосы
},
],
},
{
text: 'КОММЕРЧЕСКОЕ ПРЕДЛОЖЕНИЕ',
fontSize: 22,
alignment: 'center',
margin: [32, 32, 32, 8],
bold: true,
},
{
text: `${carState.model[0]} ${carState.model[1]}`,
fontSize: 18,
margin: [0, 0, 0, 8],
alignment: 'center',
bold: true,
},
{
text: 'Предлагаем Вам рассмотреть возможность приобретения данного автомобиля.\nС комплектацией, стоимостью и условиями Вы можете ознакомиться ниже',
fontSize: 10,
margin: [0, 8, 0, 32],
alignment: 'left',
},
// КАРТОЧКИ - ЧЕК
{
columns: [
{
margin: [0, 0, 0, 0],
table: {
widths: [120, 120],
body: tableBody,
},
},
{
margin: [0, 0, 0, 0],
table: {
widths: ['*', '*'],
marginTop: -100,
body: [
[
{
text: 'ДОП. ОПЦИИ:',
alignment: 'left',
border: [0, 0, 0, 0],
fontSize: 9,
margin: [4, 4, 0, 4],
},
{
border: [0, 0, 0, 0],
text: '',
},
],
[
{
text: '',
alignment: 'left',
border: [0, 0, 0, 0],
fontSize: 9,
margin: [4, 4, 4, 4],
},
{
fontSize: 10,
border: [0, 0, 0, 0],
stack:
optionsText !== ''
? [{ text: optionsText, border: [0, 0, 0, 0] }]
: [{ text: 'Нет', border: [0, 0, 0, 0] }],
margin: [-130, 0, 4, 4],
},
],
...tableBody2,
[
{
text: '',
border: [0, 0, 0, 0],
margin: [0, 26, 0, 0],
},
{
text: '*Стоимость растаможенного автомобиля по ставкам ЕАЭС под ключ в Москве, включающая все возможные затраты.',
border: [0, 0, 0, 0],
fontSize: 8,
margin: [-132, 16, 16, 0],
},
],
],
},
},
],
},
// ФОТО АВТО И САЛОНА
{
image: await loadImageAsDataURLWithLogging(arrayImagesForPDF[1]),
width: 400,
margin: [0, 32, 0, 0],
alignment: 'center',
},
{
image: await loadImageAsDataURLWithLogging(arrayImagesForPDF[2]),
width: 340,
margin: [0, 16, 0, 0],
alignment: 'center',
pageBreak: 'after',
},
{
text: `КОМПЛЕКТАЦИЯ - ${carState.model[0]} ${carState.model[1]}`,
margin: [0, 32, 0, 16],
fontSize: 16,
bold: true,
},
{ ul: tableBodycomplectData, margin: [0, 0, 0, 16] },
{ ul: tableBodydescriptionData, margin: [0, 0, 0, 16] },
{
text: 'ПОЧЕМУ СТОИТ ВЫБРАТЬ CARGET?',
margin: [0, 32, 0, 16],
fontSize: 16,
bold: true,
},
{ ul: tableBody4 },
{
margin: [0, 32, 0, 32],
canvas: [
{
type: 'rect',
x: -16,
y: 0,
w: 563, // Ширина прямоугольника (можете настроить под ваш макет)
h: 0.5, // Высота прямоугольника (толщина линии)
color: '#000000', // Цвет черной полосы
},
],
},
{
text: 'ПО ВСЕМ ИНТЕРЕСУЮЩИМ ВОПРОСАМ\nБУДЕМ РАДЫ ВАМ ОТВЕТИТЬ:',
margin: [0, 0, 0, 16],
fontSize: 16,
bold: true,
},
{
columns: [
[
{
image: image1,
width: 24,
height: 24,
margin: [0, 0, 0, 16],
},
{
text: data5[0].contact,
alignment: 'left',
fontSize: 12,
margin: [32, -36, 0, 16],
},
],
[
{
image: image2,
width: 24,
height: 24,
margin: [0, 0, 0, 16],
},
{
text: data5[1].contact,
alignment: 'left',
fontSize: 12,
margin: [32, -36, 0, 16],
},
],
[
{
image: image3,
width: 24,
height: 24,
margin: [0, 0, 0, 16],
},
{
text: data5[2].contact,
alignment: 'left',
fontSize: 12,
margin: [32, -36, 0, 16],
},
],
[
{
image: image4,
width: 24,
height: 24,
margin: [0, 0, 0, 16],
},
{
text: data5[3].contact,
alignment: 'left',
fontSize: 12,
margin: [32, -36, 0, 16],
},
],
],
},
],
styles: {
header: {
fontSize: 14,
color: '#222222',
bold: false,
},
},
}
// Создайте PDF
pdfDoc = pdfMake.createPdf(pdfContent)
}
export { myPDF }