Dev #6

Merged
redrockjs merged 3 commits from dev into main 2025-12-14 10:20:01 +00:00
273 changed files with 4982 additions and 1985 deletions
Showing only changes of commit 37661bc04d - Show all commits

137
.github/workflows/main.yaml vendored Normal file
View File

@@ -0,0 +1,137 @@
name: Build and deploy
on:
push:
branches:
- 'main'
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Notify Telegram start building
uses: appleboy/telegram-action@master
with:
to: ${{ secrets.TELEGRAM_CHAT_ID }}
token: ${{ secrets.TELEGRAM_BOT_TOKEN }}
message: |
🚀 Запуск сборки!
Сервер: ${{ secrets.SERVER_NAME }}
Репозиторий: ${{ github.repository }}
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Login to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Build and push
uses: docker/build-push-action@v5
with:
push: true
tags: smallbuster/ocenka-web:latest
build-args: |
NEXT_PUBLIC_MAIL_USER=${{ secrets.NEXT_PUBLIC_MAIL_USER }}
NEXT_PUBLIC_MAIL_PASS=${{ secrets.NEXT_PUBLIC_MAIL_PASS }}
NEXT_PUBLIC_MAIL_FROM=${{ secrets.NEXT_PUBLIC_MAIL_FROM }}
NEXT_PUBLIC_MAIL_TO=${{ secrets.NEXT_PUBLIC_MAIL_TO }}
NEXT_PUBLIC_MAIL_SECURE_KEY=${{ secrets.NEXT_PUBLIC_MAIL_SECURE_KEY }}
- name: Notify Telegram about success
if: success()
uses: appleboy/telegram-action@master
with:
to: ${{ secrets.TELEGRAM_CHAT_ID }}
token: ${{ secrets.TELEGRAM_BOT_TOKEN }}
message: |
✅ Сборка успешно завершена!
Сервер: ${{ secrets.SERVER_NAME }}
Репозиторий: ${{ github.repository }}
Ветка: ${{ github.ref_name }}
Коммит: ${{ github.sha }}
- name: Notify Telegram about failure
if: failure()
uses: appleboy/telegram-action@master
with:
to: ${{ secrets.TELEGRAM_CHAT_ID }}
token: ${{ secrets.TELEGRAM_BOT_TOKEN }}
message: |
❌ Сборка проекта неудачна!
Сервер: ${{ secrets.SERVER_NAME }}
Репозиторий: ${{ github.repository }}
Ветка: ${{ github.ref_name }}
Коммит: ${{ github.sha }}
Подробности: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
deploy:
runs-on: self-hosted
needs: build
steps:
- name: Notify Telegram start deploy
uses: appleboy/telegram-action@master
with:
to: ${{ secrets.TELEGRAM_CHAT_ID }}
token: ${{ secrets.TELEGRAM_BOT_TOKEN }}
message: |
🐳 Запуск деплоя!
Сервер: ${{ secrets.SERVER_NAME }}
Репозиторий: ${{ github.repository }}
- name: Checkout repository
uses: actions/checkout@v4
- name: Login to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Set up Docker Compose
run: |
docker compose version
- name: Stop and remove existing containers
run: |
docker compose -f docker-compose.yaml down || true
- name: Pull Docker images
run: |
docker compose -f docker-compose.yaml pull
- name: Start containers
run: |
docker compose -f docker-compose.yaml up -d
- name: Notify Telegram about success
if: success()
uses: appleboy/telegram-action@master
with:
to: ${{ secrets.TELEGRAM_CHAT_ID }}
token: ${{ secrets.TELEGRAM_BOT_TOKEN }}
message: |
✅ Деплой успешно завершен!
Сервер: ${{ secrets.SERVER_NAME }}
Репозиторий: ${{ github.repository }}
Ветка: ${{ github.ref_name }}
Коммит: ${{ github.sha }}
- name: Notify Telegram about failure
if: failure()
uses: appleboy/telegram-action@master
with:
to: ${{ secrets.TELEGRAM_CHAT_ID }}
token: ${{ secrets.TELEGRAM_BOT_TOKEN }}
message: |
❌ Деплой не удался!
Сервер: ${{ secrets.SERVER_NAME }}
Репозиторий: ${{ github.repository }}
Ветка: ${{ github.ref_name }}
Коммит: ${{ github.sha }}
Подробности: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}

6
.idea/compiler.xml generated Normal file
View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="TypeScriptCompiler">
<option name="useServicePoweredTypesWasEnabledByExperiment" value="true" />
</component>
</project>

190
.idea/workspace.xml generated
View File

@@ -5,31 +5,105 @@
</component> </component>
<component name="ChangeListManager"> <component name="ChangeListManager">
<list default="true" id="2a96f817-9dc2-4f3c-893a-c4974c750774" name="Changes" comment=""> <list default="true" id="2a96f817-9dc2-4f3c-893a-c4974c750774" name="Changes" comment="">
<change afterPath="$PROJECT_DIR$/src/shared/lib/metaInfo/index.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/shared/lib/metaInfo/metaInfo.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/shared/lib/phoneBeautify/index.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" /> <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/package-lock.json" beforeDir="false" afterPath="$PROJECT_DIR$/package-lock.json" afterDir="false" /> <change beforePath="$PROJECT_DIR$/src/entities/base-menu/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/entities/base-menu/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/app/api/og/route.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/app/api/og/route.ts" afterDir="false" /> <change beforePath="$PROJECT_DIR$/src/entities/beauty-button/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/entities/beauty-button/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/app/contacts/page.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/app/contacts/page.tsx" afterDir="false" /> <change beforePath="$PROJECT_DIR$/src/entities/callback-form/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/entities/callback-form/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/app/cookies/page.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/app/cookies/page.tsx" afterDir="false" /> <change beforePath="$PROJECT_DIR$/src/entities/connect/style.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/entities/connect/style.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/app/experts/borodin-vitalij-petrovich/page.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/app/experts/borodin-vitalij-petrovich/page.tsx" afterDir="false" /> <change beforePath="$PROJECT_DIR$/src/entities/order-schema/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/entities/order-schema/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/app/experts/gjulmamedov-javar-firmamed-ogly/page.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/app/experts/gjulmamedov-javar-firmamed-ogly/page.tsx" afterDir="false" /> <change beforePath="$PROJECT_DIR$/src/entities/top-menu/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/entities/top-menu/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/app/experts/jancen-jana-nikolaevna/page.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/app/experts/jancen-jana-nikolaevna/page.tsx" afterDir="false" /> <change beforePath="$PROJECT_DIR$/src/feature/article/consultation/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/feature/article/consultation/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/app/experts/kaminskij-dmitrij-olegovich/page.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/app/experts/kaminskij-dmitrij-olegovich/page.tsx" afterDir="false" /> <change beforePath="$PROJECT_DIR$/src/feature/article/documents/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/feature/article/documents/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/app/experts/kolodij-aleksandr-sergeevich/page.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/app/experts/kolodij-aleksandr-sergeevich/page.tsx" afterDir="false" /> <change beforePath="$PROJECT_DIR$/src/feature/article/partners/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/feature/article/partners/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/app/experts/mikova-inna-georgievna/page.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/app/experts/mikova-inna-georgievna/page.tsx" afterDir="false" /> <change beforePath="$PROJECT_DIR$/src/feature/article/related-articles/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/feature/article/related-articles/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/app/experts/mitjaev-aleksej-aleksandrovich/page.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/app/experts/mitjaev-aleksej-aleksandrovich/page.tsx" afterDir="false" /> <change beforePath="$PROJECT_DIR$/src/feature/article/sidebar/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/feature/article/sidebar/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/app/experts/page.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/app/experts/page.tsx" afterDir="false" /> <change beforePath="$PROJECT_DIR$/src/feature/contacts/licence-slider/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/feature/contacts/licence-slider/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/app/experts/polinov-andrej-vladimirovich/page.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/app/experts/polinov-andrej-vladimirovich/page.tsx" afterDir="false" /> <change beforePath="$PROJECT_DIR$/src/feature/contacts/yandex-map/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/feature/contacts/yandex-map/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/app/experts/volkova-goncharova-tatjana-anatolevna/page.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/app/experts/volkova-goncharova-tatjana-anatolevna/page.tsx" afterDir="false" /> <change beforePath="$PROJECT_DIR$/src/views/contacts/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/contacts/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/app/page.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/app/page.tsx" afterDir="false" /> <change beforePath="$PROJECT_DIR$/src/views/expertise/autotech/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/expertise/autotech/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/app/privacy-policy/page.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/app/privacy-policy/page.tsx" afterDir="false" /> <change beforePath="$PROJECT_DIR$/src/views/expertise/buhgalter/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/expertise/buhgalter/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/app/user-agreement/page.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/app/user-agreement/page.tsx" afterDir="false" /> <change beforePath="$PROJECT_DIR$/src/views/expertise/category/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/expertise/category/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/shared/lib/clickOutside/useClickOutside.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/shared/lib/clickOutside/useClickOutside.tsx" afterDir="false" /> <change beforePath="$PROJECT_DIR$/src/views/expertise/computer/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/expertise/computer/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/shared/lib/index.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/shared/lib/index.ts" afterDir="false" /> <change beforePath="$PROJECT_DIR$/src/views/expertise/document/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/expertise/document/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/shared/lib/phoneBeautify/phoneBeautify.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/shared/lib/phoneBeautify/phoneBeautify.ts" afterDir="false" /> <change beforePath="$PROJECT_DIR$/src/views/expertise/finans/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/expertise/finans/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/widgets/consultation-modal/ui.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/widgets/consultation-modal/ui.tsx" afterDir="false" /> <change beforePath="$PROJECT_DIR$/src/views/expertise/kadastr/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/expertise/kadastr/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/views/expertise/pocherk/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/expertise/pocherk/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/views/expertise/pozhar/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/expertise/pozhar/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/views/expertise/recenzii/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/expertise/recenzii/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/views/expertise/stroit/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/expertise/stroit/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/views/expertise/tech-crim/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/expertise/tech-crim/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/views/expertise/tovar/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/expertise/tovar/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/views/expertise/trasologia/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/expertise/trasologia/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/views/expertise/zem-stroy/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/expertise/zem-stroy/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/views/experts/borodin/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/experts/borodin/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/views/experts/category/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/experts/category/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/views/experts/elchischev/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/experts/elchischev/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/views/experts/gulmamedov/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/experts/gulmamedov/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/views/experts/kaminskiy/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/experts/kaminskiy/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/views/experts/kolodiy/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/experts/kolodiy/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/views/experts/mikova/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/experts/mikova/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/views/experts/mityaev/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/experts/mityaev/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/views/experts/polinov/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/experts/polinov/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/views/experts/volkova-goncharova/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/experts/volkova-goncharova/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/views/experts/yancen/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/experts/yancen/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/views/home/call-us/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/home/call-us/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/views/jurist/banki/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/jurist/banki/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/views/jurist/bankrotstvo/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/jurist/bankrotstvo/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/views/jurist/category/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/jurist/category/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/views/jurist/dolgi/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/jurist/dolgi/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/views/jurist/dolzhnikam/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/jurist/dolzhnikam/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/views/jurist/predstavitelstvo/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/jurist/predstavitelstvo/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/views/jurist/sdelki/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/jurist/sdelki/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/views/jurist/spor-dtp/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/jurist/spor-dtp/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/views/jurist/spor-semejnye/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/jurist/spor-semejnye/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/views/jurist/spor-strahovye/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/jurist/spor-strahovye/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/views/jurist/spor-trudovye/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/jurist/spor-trudovye/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/views/jurist/spor-zemel-imush/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/jurist/spor-zemel-imush/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/views/ocenka/avtomobilja-dlja-suda/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/ocenka/avtomobilja-dlja-suda/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/views/ocenka/category/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/ocenka/category/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/views/ocenka/cennyh-bumag/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/ocenka/cennyh-bumag/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/views/ocenka/dlja-banka-vtb/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/ocenka/dlja-banka-vtb/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/views/ocenka/dlja-banka/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/ocenka/dlja-banka/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/views/ocenka/dlja-ipoteki/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/ocenka/dlja-ipoteki/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/views/ocenka/dlja-notariusa/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/ocenka/dlja-notariusa/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/views/ocenka/dlja-opeki/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/ocenka/dlja-opeki/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/views/ocenka/dlja-opredelenija-stoimosti-ushherba/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/ocenka/dlja-opredelenija-stoimosti-ushherba/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/views/ocenka/dlja-sberbanka/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/ocenka/dlja-sberbanka/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/views/ocenka/dlja-strahovanija/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/ocenka/dlja-strahovanija/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/views/ocenka/garazha/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/ocenka/garazha/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/views/ocenka/imushhestva-dlja-bankrotstva/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/ocenka/imushhestva-dlja-bankrotstva/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/views/ocenka/imushhestva-dlja-vnesenija-v-ustavnoj-kapital/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/ocenka/imushhestva-dlja-vnesenija-v-ustavnoj-kapital/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/views/ocenka/imushhestva-dlja-vstuplenija-v-nasledstvo/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/ocenka/imushhestva-dlja-vstuplenija-v-nasledstvo/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/views/ocenka/jekspertiza-i-recenzirovanie-otcheta-ob-ocenke/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/ocenka/jekspertiza-i-recenzirovanie-otcheta-ob-ocenke/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/views/ocenka/kvartiry/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/ocenka/kvartiry/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/views/ocenka/mashin-i-oborudovanija/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/ocenka/mashin-i-oborudovanija/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/views/ocenka/morskih-i-rechnyh-sudov/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/ocenka/morskih-i-rechnyh-sudov/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/views/ocenka/motociklov-i-mototehniki/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/ocenka/motociklov-i-mototehniki/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/views/ocenka/nedvizhimosti-dlja-suda/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/ocenka/nedvizhimosti-dlja-suda/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/views/ocenka/nedvizhimosti/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/ocenka/nedvizhimosti/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/views/ocenka/nematerialnyh-aktivov/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/ocenka/nematerialnyh-aktivov/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/views/ocenka/nezavershennogo-stroitelstva/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/ocenka/nezavershennogo-stroitelstva/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/views/ocenka/nezavisimaja/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/ocenka/nezavisimaja/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/views/ocenka/nezhilogo-pomeshhenija/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/ocenka/nezhilogo-pomeshhenija/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/views/ocenka/ocenka-imushhestva-pri-razvode/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/ocenka/ocenka-imushhestva-pri-razvode/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/views/ocenka/ofisa/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/ocenka/ofisa/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/views/ocenka/rynochnoj-stoimosti-avtomobilja/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/ocenka/rynochnoj-stoimosti-avtomobilja/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/views/ocenka/sooruzhenij/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/ocenka/sooruzhenij/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/views/ocenka/spectehniki/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/ocenka/spectehniki/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/views/ocenka/stoimosti-arendnoj-stavki/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/ocenka/stoimosti-arendnoj-stavki/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/views/ocenka/stoimosti-predprijatija-biznesa/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/ocenka/stoimosti-predprijatija-biznesa/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/views/ocenka/ushherba-nedvizhimosti/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/ocenka/ushherba-nedvizhimosti/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/views/ocenka/ushherba-ot-pozhara/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/ocenka/ushherba-ot-pozhara/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/views/ocenka/ushherba-ot-zaliva/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/ocenka/ushherba-ot-zaliva/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/views/ocenka/ushherba-v-dtp/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/ocenka/ushherba-v-dtp/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/views/ocenka/uts-utraty-tovarnoj-stoimosti-avtomobilja/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/ocenka/uts-utraty-tovarnoj-stoimosti-avtomobilja/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/views/ocenka/vozdushnyh-sudov-i-letatelnyh-apparatov/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/ocenka/vozdushnyh-sudov-i-letatelnyh-apparatov/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/views/ocenka/zdanija/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/ocenka/zdanija/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/views/ocenka/zemel/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/ocenka/zemel/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/views/ocenka/zemelnogo-uchastka/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/ocenka/zemelnogo-uchastka/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/views/ocenka/zhilogo-doma/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/ocenka/zhilogo-doma/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/widgets/breadcrumbs/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/widgets/breadcrumbs/styles.module.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/widgets/cookie-notice/styles.module.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/widgets/cookie-notice/styles.module.scss" afterDir="false" />
</list> </list>
<option name="SHOW_DIALOG" value="false" /> <option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" /> <option name="HIGHLIGHT_CONFLICTS" value="true" />
@@ -37,7 +111,7 @@
<option name="LAST_RESOLUTION" value="IGNORE" /> <option name="LAST_RESOLUTION" value="IGNORE" />
</component> </component>
<component name="DarkyenusTimeTracker"> <component name="DarkyenusTimeTracker">
<option name="totalTimeSeconds" value="226823" /> <option name="totalTimeSeconds" value="247180" />
<option name="gitIntegration" value="true" /> <option name="gitIntegration" value="true" />
<option name="naggedAbout" value="1" /> <option name="naggedAbout" value="1" />
</component> </component>
@@ -65,36 +139,39 @@
<option name="hideEmptyMiddlePackages" value="true" /> <option name="hideEmptyMiddlePackages" value="true" />
<option name="showLibraryContents" value="true" /> <option name="showLibraryContents" value="true" />
</component> </component>
<component name="PropertiesComponent"><![CDATA[{ <component name="PropertiesComponent">{
"keyToString": { &quot;keyToString&quot;: {
"ModuleVcsDetector.initialDetectionPerformed": "true", &quot;ASKED_SHARE_PROJECT_CONFIGURATION_FILES&quot;: &quot;true&quot;,
"RunOnceActivity.ShowReadmeOnStart": "true", &quot;ModuleVcsDetector.initialDetectionPerformed&quot;: &quot;true&quot;,
"RunOnceActivity.TerminalTabsStorage.copyFrom.TerminalArrangementManager.252": "true", &quot;RunOnceActivity.ShowReadmeOnStart&quot;: &quot;true&quot;,
"RunOnceActivity.git.unshallow": "true", &quot;RunOnceActivity.TerminalTabsStorage.copyFrom.TerminalArrangementManager.252&quot;: &quot;true&quot;,
"RunOnceActivity.typescript.service.memoryLimit.init": "true", &quot;RunOnceActivity.git.unshallow&quot;: &quot;true&quot;,
"com.intellij.ml.llm.matterhorn.ej.ui.settings.DefaultModelSelectionForGA.v1": "true", &quot;RunOnceActivity.typescript.service.memoryLimit.init&quot;: &quot;true&quot;,
"git-widget-placeholder": "dev", &quot;SHARE_PROJECT_CONFIGURATION_FILES&quot;: &quot;true&quot;,
"ignore.virus.scanning.warn.message": "true", &quot;com.intellij.ml.llm.matterhorn.ej.ui.settings.DefaultModelSelectionForGA.v1&quot;: &quot;true&quot;,
"javascript.preferred.runtime.type.id": "node", &quot;git-widget-placeholder&quot;: &quot;dev&quot;,
"js.debugger.nextJs.config.created.client": "true", &quot;ignore.virus.scanning.warn.message&quot;: &quot;true&quot;,
"js.debugger.nextJs.config.created.server": "true", &quot;javascript.preferred.runtime.type.id&quot;: &quot;node&quot;,
"junie.onboarding.icon.badge.shown": "true", &quot;js.debugger.nextJs.config.created.client&quot;: &quot;true&quot;,
"list.type.of.created.stylesheet": "SCSS", &quot;js.debugger.nextJs.config.created.server&quot;: &quot;true&quot;,
"node.js.detected.package.eslint": "true", &quot;junie.onboarding.icon.badge.shown&quot;: &quot;true&quot;,
"node.js.detected.package.tslint": "true", &quot;list.type.of.created.stylesheet&quot;: &quot;SCSS&quot;,
"node.js.selected.package.eslint": "(autodetect)", &quot;node.js.detected.package.eslint&quot;: &quot;true&quot;,
"node.js.selected.package.tslint": "(autodetect)", &quot;node.js.detected.package.tslint&quot;: &quot;true&quot;,
"nodejs_package_manager_path": "npm", &quot;node.js.selected.package.eslint&quot;: &quot;(autodetect)&quot;,
"npm.Next.js: server-side.executor": "Run", &quot;node.js.selected.package.tslint&quot;: &quot;(autodetect)&quot;,
"prettierjs.PrettierConfiguration.Package": "C:\\dev-projects\\ocenka-web\\node_modules\\prettier", &quot;nodejs_package_manager_path&quot;: &quot;npm&quot;,
"settings.editor.selected.configurable": "terminal", &quot;npm.Next.js: server-side.executor&quot;: &quot;Run&quot;,
"to.speed.mode.migration.done": "true", &quot;prettierjs.PrettierConfiguration.Package&quot;: &quot;C:\\dev-personal\\ocenka-web\\node_modules\\prettier&quot;,
"ts.external.directory.path": "C:\\dev-projects\\ocenka-web\\node_modules\\typescript\\lib", &quot;settings.editor.selected.configurable&quot;: &quot;terminal&quot;,
"vue.rearranger.settings.migration": "true" &quot;to.speed.mode.migration.done&quot;: &quot;true&quot;,
&quot;ts.external.directory.path&quot;: &quot;C:\\dev-personal\\ocenka-web\\node_modules\\typescript\\lib&quot;,
&quot;vue.rearranger.settings.migration&quot;: &quot;true&quot;
} }
}]]></component> }</component>
<component name="RecentsManager"> <component name="RecentsManager">
<key name="MoveFile.RECENT_KEYS"> <key name="MoveFile.RECENT_KEYS">
<recent name="C:\dev-personal\ocenka-web" />
<recent name="C:\dev-personal\ocenka-web\public\images" /> <recent name="C:\dev-personal\ocenka-web\public\images" />
<recent name="C:\dev-personal\ocenka-web\src\widgets" /> <recent name="C:\dev-personal\ocenka-web\src\widgets" />
<recent name="C:\dev-personal\ocenka-web\src\widgets\sidebar" /> <recent name="C:\dev-personal\ocenka-web\src\widgets\sidebar" />
@@ -139,9 +216,12 @@
<workItem from="1764825390464" duration="26961000" /> <workItem from="1764825390464" duration="26961000" />
<workItem from="1765196288370" duration="332000" /> <workItem from="1765196288370" duration="332000" />
<workItem from="1765196704782" duration="4455000" /> <workItem from="1765196704782" duration="4455000" />
<workItem from="1765279298291" duration="3352000" /> <workItem from="1765279298291" duration="3813000" />
<workItem from="1765365738711" duration="1288000" /> <workItem from="1765435962765" duration="4004000" />
<workItem from="1765367128544" duration="6366000" /> <workItem from="1765453944194" duration="1010000" />
<workItem from="1765455074110" duration="492000" />
<workItem from="1765455582502" duration="5006000" />
<workItem from="1765517372241" duration="14202000" />
</task> </task>
<servers /> <servers />
</component> </component>

View File

@@ -13,6 +13,19 @@ RUN npm install --frozen-lockfile
# Копируем все файлы проекта # Копируем все файлы проекта
COPY . . COPY . .
# Аргумент сборки для переменной окружения
ARG NEXT_PUBLIC_MAIL_USER
ARG NEXT_PUBLIC_MAIL_PASS
ARG NEXT_PUBLIC_MAIL_FROM
ARG NEXT_PUBLIC_MAIL_TO
ARG NEXT_PUBLIC_MAIL_SECURE_KEY
ENV NEXT_PUBLIC_MAIL_USER=$NEXT_PUBLIC_MAIL_USER \
NEXT_PUBLIC_MAIL_PASS=$NEXT_PUBLIC_MAIL_PASS \
NEXT_PUBLIC_MAIL_FROM=$NEXT_PUBLIC_MAIL_FROM \
NEXT_PUBLIC_MAIL_TO=$NEXT_PUBLIC_MAIL_TO \
NEXT_PUBLIC_MAIL_SECURE_KEY=$NEXT_PUBLIC_MAIL_SECURE_KEY
# Собираем приложение # Собираем приложение
RUN npm run build RUN npm run build
@@ -21,7 +34,12 @@ FROM node:22-alpine AS runner
WORKDIR /app WORKDIR /app
ENV NODE_ENV=production \ ENV NODE_ENV=production \
NEXT_TELEMETRY_DISABLED=1 NEXT_TELEMETRY_DISABLED=1 \
NEXT_PUBLIC_MAIL_USER=$NEXT_PUBLIC_MAIL_USER \
NEXT_PUBLIC_MAIL_PASS=$NEXT_PUBLIC_MAIL_PASS \
NEXT_PUBLIC_MAIL_FROM=$NEXT_PUBLIC_MAIL_FROM \
NEXT_PUBLIC_MAIL_TO=$NEXT_PUBLIC_MAIL_TO \
NEXT_PUBLIC_MAIL_SECURE_KEY=$NEXT_PUBLIC_MAIL_SECURE_KEY
# Включаем node пользователя # Включаем node пользователя
RUN addgroup -g 1001 -S nodejs RUN addgroup -g 1001 -S nodejs

141
package-lock.json generated
View File

@@ -15,7 +15,7 @@
"libphonenumber-js": "^1.12.9", "libphonenumber-js": "^1.12.9",
"next": "^15.5.7", "next": "^15.5.7",
"nodemailer": "7.0.11", "nodemailer": "7.0.11",
"puppeteer": "^24.32.0", "puppeteer": "^24.32.1",
"react": "19.1.1", "react": "19.1.1",
"react-dom": "19.1.1", "react-dom": "19.1.1",
"react-hook-form": "^7.60.0", "react-hook-form": "^7.60.0",
@@ -31,7 +31,7 @@
"@types/react": "19.1.11", "@types/react": "19.1.11",
"@types/react-dom": "19.1.8", "@types/react-dom": "19.1.8",
"clsx": "^2.1.1", "clsx": "^2.1.1",
"eslint": "^9", "eslint": "^9.39.1",
"eslint-config-next": "15.5.2", "eslint-config-next": "15.5.2",
"husky": "^9.1.7", "husky": "^9.1.7",
"lint-staged": "^16.1.2", "lint-staged": "^16.1.2",
@@ -97,9 +97,9 @@
} }
}, },
"node_modules/@eslint-community/eslint-utils": { "node_modules/@eslint-community/eslint-utils": {
"version": "4.7.0", "version": "4.9.0",
"resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz",
"integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
@@ -139,13 +139,13 @@
} }
}, },
"node_modules/@eslint/config-array": { "node_modules/@eslint/config-array": {
"version": "0.20.1", "version": "0.21.1",
"resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.20.1.tgz", "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz",
"integrity": "sha512-OL0RJzC/CBzli0DrrR31qzj6d6i6Mm3HByuhflhl4LOBiWxN+3i6/t/ZQQNii4tjksXi8r2CRW1wMpWA2ULUEw==", "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==",
"dev": true, "dev": true,
"license": "Apache-2.0", "license": "Apache-2.0",
"dependencies": { "dependencies": {
"@eslint/object-schema": "^2.1.6", "@eslint/object-schema": "^2.1.7",
"debug": "^4.3.1", "debug": "^4.3.1",
"minimatch": "^3.1.2" "minimatch": "^3.1.2"
}, },
@@ -154,19 +154,22 @@
} }
}, },
"node_modules/@eslint/config-helpers": { "node_modules/@eslint/config-helpers": {
"version": "0.2.3", "version": "0.4.2",
"resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.3.tgz", "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz",
"integrity": "sha512-u180qk2Um1le4yf0ruXH3PYFeEZeYC3p/4wCTKrr2U1CmGdzGi3KtY0nuPDH48UJxlKCC5RDzbcbh4X0XlqgHg==", "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==",
"dev": true, "dev": true,
"license": "Apache-2.0", "license": "Apache-2.0",
"dependencies": {
"@eslint/core": "^0.17.0"
},
"engines": { "engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0" "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
} }
}, },
"node_modules/@eslint/core": { "node_modules/@eslint/core": {
"version": "0.14.0", "version": "0.17.0",
"resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.14.0.tgz", "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz",
"integrity": "sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==", "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==",
"dev": true, "dev": true,
"license": "Apache-2.0", "license": "Apache-2.0",
"dependencies": { "dependencies": {
@@ -201,9 +204,9 @@
} }
}, },
"node_modules/@eslint/js": { "node_modules/@eslint/js": {
"version": "9.29.0", "version": "9.39.1",
"resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.29.0.tgz", "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.1.tgz",
"integrity": "sha512-3PIF4cBw/y+1u2EazflInpV+lYsSG0aByVIQzAgb1m1MhHFSbqTyNqtBKHgWf/9Ykud+DhILS9EGkmekVhbKoQ==", "integrity": "sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"engines": { "engines": {
@@ -214,9 +217,9 @@
} }
}, },
"node_modules/@eslint/object-schema": { "node_modules/@eslint/object-schema": {
"version": "2.1.6", "version": "2.1.7",
"resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz",
"integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==",
"dev": true, "dev": true,
"license": "Apache-2.0", "license": "Apache-2.0",
"engines": { "engines": {
@@ -224,32 +227,19 @@
} }
}, },
"node_modules/@eslint/plugin-kit": { "node_modules/@eslint/plugin-kit": {
"version": "0.3.2", "version": "0.4.1",
"resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.2.tgz", "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz",
"integrity": "sha512-4SaFZCNfJqvk/kenHpI8xvN42DMaoycy4PzKc5otHxRswww1kAt82OlBuwRVLofCACCTZEcla2Ydxv8scMXaTg==", "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==",
"dev": true, "dev": true,
"license": "Apache-2.0", "license": "Apache-2.0",
"dependencies": { "dependencies": {
"@eslint/core": "^0.15.0", "@eslint/core": "^0.17.0",
"levn": "^0.4.1" "levn": "^0.4.1"
}, },
"engines": { "engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0" "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
} }
}, },
"node_modules/@eslint/plugin-kit/node_modules/@eslint/core": {
"version": "0.15.0",
"resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.0.tgz",
"integrity": "sha512-b7ePw78tEWWkpgZCDYkbqDOP8dmM6qe+AOC6iuJqlq1R/0ahMAeH3qynpnqKFGkMltrp44ohV4ubGyvLX28tzw==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
"@types/json-schema": "^7.0.15"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
}
},
"node_modules/@hookform/resolvers": { "node_modules/@hookform/resolvers": {
"version": "5.1.1", "version": "5.1.1",
"resolved": "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-5.1.1.tgz", "resolved": "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-5.1.1.tgz",
@@ -2035,20 +2025,6 @@
"node": ">= 0.4" "node": ">= 0.4"
} }
}, },
"node_modules/b4a": {
"version": "1.7.3",
"resolved": "https://registry.npmjs.org/b4a/-/b4a-1.7.3.tgz",
"integrity": "sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==",
"license": "Apache-2.0",
"peerDependencies": {
"react-native-b4a": "*"
},
"peerDependenciesMeta": {
"react-native-b4a": {
"optional": true
}
}
},
"node_modules/balanced-match": { "node_modules/balanced-match": {
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
@@ -3057,26 +3033,25 @@
} }
}, },
"node_modules/eslint": { "node_modules/eslint": {
"version": "9.29.0", "version": "9.39.1",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-9.29.0.tgz", "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.1.tgz",
"integrity": "sha512-GsGizj2Y1rCWDu6XoEekL3RLilp0voSePurjZIkxL3wlm5o5EC9VpgaP7lrCvjnkuLvzFBQWB3vWB3K5KQTveQ==", "integrity": "sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"peer": true, "peer": true,
"dependencies": { "dependencies": {
"@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/eslint-utils": "^4.8.0",
"@eslint-community/regexpp": "^4.12.1", "@eslint-community/regexpp": "^4.12.1",
"@eslint/config-array": "^0.20.1", "@eslint/config-array": "^0.21.1",
"@eslint/config-helpers": "^0.2.1", "@eslint/config-helpers": "^0.4.2",
"@eslint/core": "^0.14.0", "@eslint/core": "^0.17.0",
"@eslint/eslintrc": "^3.3.1", "@eslint/eslintrc": "^3.3.1",
"@eslint/js": "9.29.0", "@eslint/js": "9.39.1",
"@eslint/plugin-kit": "^0.3.1", "@eslint/plugin-kit": "^0.4.1",
"@humanfs/node": "^0.16.6", "@humanfs/node": "^0.16.6",
"@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/module-importer": "^1.0.1",
"@humanwhocodes/retry": "^0.4.2", "@humanwhocodes/retry": "^0.4.2",
"@types/estree": "^1.0.6", "@types/estree": "^1.0.6",
"@types/json-schema": "^7.0.15",
"ajv": "^6.12.4", "ajv": "^6.12.4",
"chalk": "^4.0.0", "chalk": "^4.0.0",
"cross-spawn": "^7.0.6", "cross-spawn": "^7.0.6",
@@ -5607,9 +5582,9 @@
} }
}, },
"node_modules/puppeteer": { "node_modules/puppeteer": {
"version": "24.32.0", "version": "24.32.1",
"resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.32.0.tgz", "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.32.1.tgz",
"integrity": "sha512-exyxHPV5DSsigIhM/pzLcyzl5XU4Dp5lNP+APwIeStDxAdYqpMnJ1qN0QHXghjJx+cQJczby+ySH5rgv/5GQLw==", "integrity": "sha512-wa8vGswFjH1iCyG6bGGydIYssEBluXixbMibK4x2x6/lIAuR87gF+c+Jjzom2Wiw/dDOtuki89VBurRWrgYaUA==",
"hasInstallScript": true, "hasInstallScript": true,
"license": "Apache-2.0", "license": "Apache-2.0",
"dependencies": { "dependencies": {
@@ -5617,7 +5592,7 @@
"chromium-bidi": "11.0.0", "chromium-bidi": "11.0.0",
"cosmiconfig": "^9.0.0", "cosmiconfig": "^9.0.0",
"devtools-protocol": "0.0.1534754", "devtools-protocol": "0.0.1534754",
"puppeteer-core": "24.32.0", "puppeteer-core": "24.32.1",
"typed-query-selector": "^2.12.0" "typed-query-selector": "^2.12.0"
}, },
"bin": { "bin": {
@@ -5628,9 +5603,9 @@
} }
}, },
"node_modules/puppeteer-core": { "node_modules/puppeteer-core": {
"version": "24.32.0", "version": "24.32.1",
"resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.32.0.tgz", "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.32.1.tgz",
"integrity": "sha512-MqzLLeJjqjtHK9J44+KE3kjtXXhFpPvg+AvXl/oy/jB8MeeNH66/4MNotOTqGZ6MPaxWi51YJ1ASga6OIff6xw==", "integrity": "sha512-GdWTOgy3RqaW6Etgx93ydlVJ4FBJ6TmhMksG5W7v4uawKAzLHNj33k4kBQ1SFZ9NvoXNjhdQuIQ+uik2kWnarA==",
"license": "Apache-2.0", "license": "Apache-2.0",
"dependencies": { "dependencies": {
"@puppeteer/browsers": "2.11.0", "@puppeteer/browsers": "2.11.0",
@@ -6609,6 +6584,20 @@
"streamx": "^2.15.0" "streamx": "^2.15.0"
} }
}, },
"node_modules/tar-stream/node_modules/b4a": {
"version": "1.7.3",
"resolved": "https://registry.npmjs.org/b4a/-/b4a-1.7.3.tgz",
"integrity": "sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==",
"license": "Apache-2.0",
"peerDependencies": {
"react-native-b4a": "*"
},
"peerDependenciesMeta": {
"react-native-b4a": {
"optional": true
}
}
},
"node_modules/text-decoder": { "node_modules/text-decoder": {
"version": "1.2.3", "version": "1.2.3",
"resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz",
@@ -6618,6 +6607,20 @@
"b4a": "^1.6.4" "b4a": "^1.6.4"
} }
}, },
"node_modules/text-decoder/node_modules/b4a": {
"version": "1.7.3",
"resolved": "https://registry.npmjs.org/b4a/-/b4a-1.7.3.tgz",
"integrity": "sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==",
"license": "Apache-2.0",
"peerDependencies": {
"react-native-b4a": "*"
},
"peerDependenciesMeta": {
"react-native-b4a": {
"optional": true
}
}
},
"node_modules/tinyglobby": { "node_modules/tinyglobby": {
"version": "0.2.14", "version": "0.2.14",
"resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz",

View File

@@ -18,7 +18,7 @@
"libphonenumber-js": "^1.12.9", "libphonenumber-js": "^1.12.9",
"next": "^15.5.7", "next": "^15.5.7",
"nodemailer": "7.0.11", "nodemailer": "7.0.11",
"puppeteer": "^24.32.0", "puppeteer": "^24.32.1",
"react": "19.1.1", "react": "19.1.1",
"react-dom": "19.1.1", "react-dom": "19.1.1",
"react-hook-form": "^7.60.0", "react-hook-form": "^7.60.0",
@@ -34,7 +34,7 @@
"@types/react": "19.1.11", "@types/react": "19.1.11",
"@types/react-dom": "19.1.8", "@types/react-dom": "19.1.8",
"clsx": "^2.1.1", "clsx": "^2.1.1",
"eslint": "^9", "eslint": "^9.39.1",
"eslint-config-next": "15.5.2", "eslint-config-next": "15.5.2",
"husky": "^9.1.7", "husky": "^9.1.7",
"lint-staged": "^16.1.2", "lint-staged": "^16.1.2",

4
public/BingSiteAuth.xml Normal file
View File

@@ -0,0 +1,4 @@
<?xml version="1.0"?>
<users>
<user>4B63A47B97DDCABE6EE4E276394ED761</user>
</users>

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 155 KiB

View File

@@ -0,0 +1 @@
google-site-verification: google33cf6327f5b28464.html

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

View File

@@ -0,0 +1,6 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type="text/javascript" src="https://gc.kis.v2.scr.kaspersky-labs.com/FD126C42-EBFA-4E12-B309-BB3FDD723AC1/main.js?attr=WdycdvKErtA4OOMLLZj8TMinCk1INjI5LK_lPoQnj-hjo5rsBSpPa0D7Wb_k5J9AqmjXAmygADVNH55GSqwL27FejKdWrMD-jMeFraCEU92uBeFOKeoEYdHddLviDW0s" charset="UTF-8"></script></head>
<body>Verification: df77543931ea96af</body>
</html>

555
public/yml_ditraso.yml Normal file
View File

@@ -0,0 +1,555 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<yml_catalog date="2020-01-08 13:54">
<shop>
<name>ООО "ДИ ТРАСО"</name>
<company>ООО "ДИ ТРАСО"</company>
<url>ocenka-sochi.ru</url>
<platform>WordPress</platform>
<version>5</version>
<email>spo-71@ya.ru</email>
<currencies>
<currency id="RUR" rate="1" />
</currencies>
<categories>
<category id="1">Экспертиза</category>
<category id="2">Юриспруденция</category>
<category id="3">Оценка</category>
</categories>
<delivery-options>
<option cost="1" days="1" />
</delivery-options>
<cpa>1</cpa>
<offers>
<offer id="1">
<url>https://ocenka-sochi.ru/ekspertiza/avtoekspertiza/</url>
<price>2500</price>
<currencyId>RUR</currencyId>
<categoryId>1</categoryId>
<picture>https://ocenka-sochi.ru/wp-content/uploads/2019/06/%D0%94%D0%98-%D0%A2%D0%A0%D0%90%D0%A1%D0%9E-logo.png</picture>
<name>Автотехническая экспертиза</name>
<description>Автотехническая экспертиза</description>
<param name="Произвольный параметр">Экспертиза</param>
</offer>
<offer id="2">
<url>https://ocenka-sochi.ru/ekspertiza/buhgalterskaya/</url>
<price>1000</price>
<currencyId>RUR</currencyId>
<categoryId>1</categoryId>
<picture>https://ocenka-sochi.ru/wp-content/uploads/2019/06/%D0%94%D0%98-%D0%A2%D0%A0%D0%90%D0%A1%D0%9E-logo.png</picture>
<name>Бухгалтерская экспертиза</name>
<description>Бухгалтерская экспертиза</description>
<param name="Произвольный параметр">Экспертиза</param>
</offer>
<offer id="3">
<url>https://ocenka-sochi.ru/ekspertiza/kadastrovaya/</url>
<price>10000</price>
<currencyId>RUR</currencyId>
<categoryId>1</categoryId>
<picture>https://ocenka-sochi.ru/wp-content/uploads/2019/06/%D0%94%D0%98-%D0%A2%D0%A0%D0%90%D0%A1%D0%9E-logo.png</picture>
<name>Кадастровая экспертиза</name>
<description>Кадастровая экспертиза</description>
<param name="Произвольный параметр">Экспертиза</param>
</offer>
<offer id="4">
<url>https://ocenka-sochi.ru/ekspertiza/kompyuterno-tekhnicheskaya/</url>
<price>1000</price>
<currencyId>RUR</currencyId>
<categoryId>1</categoryId>
<picture>https://ocenka-sochi.ru/wp-content/uploads/2019/06/%D0%94%D0%98-%D0%A2%D0%A0%D0%90%D0%A1%D0%9E-logo.png</picture>
<name>Компьютерно-техническая экспертиза</name>
<description>Компьютерно-техническая экспертиза</description>
<param name="Произвольный параметр">Экспертиза</param>
</offer>
<offer id="5">
<url>https://ocenka-sochi.ru/ekspertiza/kompyuterno-tekhnicheskaya/ekspertiza-bytovoj-tekhniki/</url>
<price>1000</price>
<currencyId>RUR</currencyId>
<categoryId>1</categoryId>
<picture>https://ocenka-sochi.ru/wp-content/uploads/2019/06/%D0%94%D0%98-%D0%A2%D0%A0%D0%90%D0%A1%D0%9E-logo.png</picture>
<name>Экспертиза бытовой техники</name>
<description>Экспертиза бытовой техники</description>
<param name="Произвольный параметр">Экспертиза</param>
</offer>
<offer id="6">
<url>https://ocenka-sochi.ru/ekspertiza/kompyuterno-tekhnicheskaya/fototekhnicheskaya-ekspertiza/</url>
<price>1000</price>
<currencyId>RUR</currencyId>
<categoryId>1</categoryId>
<picture>https://ocenka-sochi.ru/wp-content/uploads/2019/06/%D0%94%D0%98-%D0%A2%D0%A0%D0%90%D0%A1%D0%9E-logo.png</picture>
<name>Фототехническая экспертиза </name>
<description>Фототехническая экспертиза </description>
<param name="Произвольный параметр">Экспертиза</param>
</offer>
<offer id="7">
<url>https://ocenka-sochi.ru/ekspertiza/kompyuterno-tekhnicheskaya/informacionno-kompyuternaya-ekspertiza/</url>
<price>1000</price>
<currencyId>RUR</currencyId>
<categoryId>1</categoryId>
<picture>https://ocenka-sochi.ru/wp-content/uploads/2019/06/%D0%94%D0%98-%D0%A2%D0%A0%D0%90%D0%A1%D0%9E-logo.png</picture>
<name>Информационно-компьютерная экспертиза </name>
<description>Информационно-компьютерная экспертиза </description>
<param name="Произвольный параметр">Экспертиза</param>
</offer>
<offer id="8">
<url>https://ocenka-sochi.ru/ekspertiza/stroitelnaya/</url>
<price>15000</price>
<currencyId>RUR</currencyId>
<categoryId>1</categoryId>
<picture>https://ocenka-sochi.ru/wp-content/uploads/2019/06/%D0%94%D0%98-%D0%A2%D0%A0%D0%90%D0%A1%D0%9E-logo.png</picture>
<name>Строительно-техническая экспертиза</name>
<description>Строительно-техническая экспертиза</description>
<param name="Произвольный параметр">Экспертиза</param>
</offer>
<offer id="9">
<url>https://ocenka-sochi.ru/ekspertiza/stroitelnaya/ekspertiza-kachestva-remonta/</url>
<price>15000</price>
<currencyId>RUR</currencyId>
<categoryId>1</categoryId>
<picture>https://ocenka-sochi.ru/wp-content/uploads/2019/06/%D0%94%D0%98-%D0%A2%D0%A0%D0%90%D0%A1%D0%9E-logo.png</picture>
<name>Экспертиза качества ремонта</name>
<description>Экспертиза качества ремонта</description>
<param name="Произвольный параметр">Экспертиза</param>
</offer>
<offer id="10">
<url>https://ocenka-sochi.ru/ekspertiza/stroitelnaya/ekspertiza-razdeleniya-nedvizhimosti/</url>
<price>15000</price>
<currencyId>RUR</currencyId>
<categoryId>1</categoryId>
<picture>https://ocenka-sochi.ru/wp-content/uploads/2019/06/%D0%94%D0%98-%D0%A2%D0%A0%D0%90%D0%A1%D0%9E-logo.png</picture>
<name>Экспертиза разделения недвижимости</name>
<description>Экспертиза разделения недвижимости</description>
<param name="Произвольный параметр">Экспертиза</param>
</offer>
<offer id="11">
<url>https://ocenka-sochi.ru/ekspertiza/stroitelnaya/ekspertiza-stroitelnyh-proektov/</url>
<price>25000</price>
<currencyId>RUR</currencyId>
<categoryId>1</categoryId>
<picture>https://ocenka-sochi.ru/wp-content/uploads/2019/06/%D0%94%D0%98-%D0%A2%D0%A0%D0%90%D0%A1%D0%9E-logo.png</picture>
<name>Экспертиза строительных проектов</name>
<description>Экспертиза строительных проектов</description>
<param name="Произвольный параметр">Экспертиза</param>
</offer>
<offer id="12">
<url>https://ocenka-sochi.ru/ekspertiza/stroitelnaya/ekspertiza-ushcherba-posle-zaliva-ili-pozhara/</url>
<price>15000</price>
<currencyId>RUR</currencyId>
<categoryId>1</categoryId>
<picture>https://ocenka-sochi.ru/wp-content/uploads/2019/06/%D0%94%D0%98-%D0%A2%D0%A0%D0%90%D0%A1%D0%9E-logo.png</picture>
<name>Экспертиза ущерба после залива или пожара</name>
<description>Экспертиза ущерба после залива или пожара</description>
<param name="Произвольный параметр">Экспертиза</param>
</offer>
<offer id="13">
<url>https://ocenka-sochi.ru/ekspertiza/stroitelnaya/issledovanie-razrusheniya-stroitelnyh-obektov/</url>
<price>20000</price>
<currencyId>RUR</currencyId>
<categoryId>1</categoryId>
<picture>https://ocenka-sochi.ru/wp-content/uploads/2019/06/%D0%94%D0%98-%D0%A2%D0%A0%D0%90%D0%A1%D0%9E-logo.png</picture>
<name>Исследование разрушения строительных объектов </name>
<description>Исследование разрушения строительных объектов </description>
<param name="Произвольный параметр">Экспертиза</param>
</offer>
<offer id="14">
<url>https://ocenka-sochi.ru/ekspertiza/stroitelnaya/tekhnicheskoe-obsledovanie-zdanij-i-sooruzhenij/</url>
<price>15000</price>
<currencyId>RUR</currencyId>
<categoryId>1</categoryId>
<picture>https://ocenka-sochi.ru/wp-content/uploads/2019/06/%D0%94%D0%98-%D0%A2%D0%A0%D0%90%D0%A1%D0%9E-logo.png</picture>
<name>Техническое обследование зданий и сооружений</name>
<description>Техническое обследование зданий и сооружений</description>
<param name="Произвольный параметр">Экспертиза</param>
</offer>
<offer id="15">
<url>https://ocenka-sochi.ru/ekspertiza/tehniko-kriminalisticheskaya/</url>
<price>16000</price>
<currencyId>RUR</currencyId>
<categoryId>1</categoryId>
<picture>https://ocenka-sochi.ru/wp-content/uploads/2019/06/%D0%94%D0%98-%D0%A2%D0%A0%D0%90%D0%A1%D0%9E-logo.png</picture>
<name>Технико-криминалистическая экспертиза</name>
<description>Технико-криминалистическая экспертиза</description>
<param name="Произвольный параметр">Экспертиза</param>
</offer>
<offer id="16">
<url>https://ocenka-sochi.ru/ekspertiza/tehniko-kriminalisticheskaya/pocherkovedcheskaya-ekspertiza/</url>
<price>20000</price>
<currencyId>RUR</currencyId>
<categoryId>1</categoryId>
<picture>https://ocenka-sochi.ru/wp-content/uploads/2019/06/%D0%94%D0%98-%D0%A2%D0%A0%D0%90%D0%A1%D0%9E-logo.png</picture>
<name>Почерковедческая экспертиза</name>
<description>Почерковедческая экспертиза</description>
<param name="Произвольный параметр">Экспертиза</param>
</offer>
<offer id="17">
<url>https://ocenka-sochi.ru/ekspertiza/tehniko-kriminalisticheskaya/portretnaya-ekspertiza/</url>
<price>16000</price>
<currencyId>RUR</currencyId>
<categoryId>1</categoryId>
<picture>https://ocenka-sochi.ru/wp-content/uploads/2019/06/%D0%94%D0%98-%D0%A2%D0%A0%D0%90%D0%A1%D0%9E-logo.png</picture>
<name>Портретная экспертиза </name>
<description>Портретная экспертиза </description>
<param name="Произвольный параметр">Экспертиза</param>
</offer>
<offer id="18">
<url>https://ocenka-sochi.ru/ekspertiza/tehniko-kriminalisticheskaya/tekhnicheskaya-ekspertiza-dokumentov/</url>
<price>16000</price>
<currencyId>RUR</currencyId>
<categoryId>1</categoryId>
<picture>https://ocenka-sochi.ru/wp-content/uploads/2019/06/%D0%94%D0%98-%D0%A2%D0%A0%D0%90%D0%A1%D0%9E-logo.png</picture>
<name>Техническая экспертиза документов </name>
<description>Техническая экспертиза документов </description>
<param name="Произвольный параметр">Экспертиза</param>
</offer>
<offer id="19">
<url>https://ocenka-sochi.ru/ekspertiza/tovarovedcheskaya/</url>
<price>1000</price>
<currencyId>RUR</currencyId>
<categoryId>1</categoryId>
<picture>https://ocenka-sochi.ru/wp-content/uploads/2019/06/%D0%94%D0%98-%D0%A2%D0%A0%D0%90%D0%A1%D0%9E-logo.png</picture>
<name>Товароведческая экспертиза </name>
<description>Товароведческая экспертиза </description>
<param name="Произвольный параметр">Экспертиза</param>
</offer>
<offer id="20">
<url>https://ocenka-sochi.ru/ekspertiza/tovarovedcheskaya/ekspertiza-neprodovolstvennyh-tovarov/</url>
<price>1000</price>
<currencyId>RUR</currencyId>
<categoryId>1</categoryId>
<picture>https://ocenka-sochi.ru/wp-content/uploads/2019/06/%D0%94%D0%98-%D0%A2%D0%A0%D0%90%D0%A1%D0%9E-logo.png</picture>
<name>Экспертиза непродовольственных товаров</name>
<description>Экспертиза непродовольственных товаров</description>
<param name="Произвольный параметр">Экспертиза</param>
</offer>
<offer id="21">
<url>https://ocenka-sochi.ru/ekspertiza/tovarovedcheskaya/ekspertiza-prodovolstvennyh-tovarov/</url>
<price>1000</price>
<currencyId>RUR</currencyId>
<categoryId>1</categoryId>
<picture>https://ocenka-sochi.ru/wp-content/uploads/2019/06/%D0%94%D0%98-%D0%A2%D0%A0%D0%90%D0%A1%D0%9E-logo.png</picture>
<name>Экспертиза продовольственных товаров</name>
<description>Экспертиза продовольственных товаров</description>
<param name="Произвольный параметр">Экспертиза</param>
</offer>
<offer id="22">
<url>https://ocenka-sochi.ru/ekspertiza/trasologicheskaya/</url>
<price>8000</price>
<currencyId>RUR</currencyId>
<categoryId>1</categoryId>
<picture>https://ocenka-sochi.ru/wp-content/uploads/2019/06/%D0%94%D0%98-%D0%A2%D0%A0%D0%90%D0%A1%D0%9E-logo.png</picture>
<name>Трасологическая экспертиза</name>
<description>Трасологическая экспертиза</description>
<param name="Произвольный параметр">Экспертиза</param>
</offer>
<offer id="23">
<url>https://ocenka-sochi.ru/jurist/bankrotstvo-fizicheskih-lic/</url>
<price>1000</price>
<currencyId>RUR</currencyId>
<categoryId>2</categoryId>
<picture>https://ocenka-sochi.ru/wp-content/uploads/2019/06/%D0%94%D0%98-%D0%A2%D0%A0%D0%90%D0%A1%D0%9E-logo.png</picture>
<name>Банкротство физических лиц</name>
<description>Банкротство физических лиц</description>
<param name="Произвольный параметр">Юриспруденция</param>
</offer>
<offer id="24">
<url>https://ocenka-sochi.ru/jurist/pomosh-dolzhnikam/</url>
<price>1000</price>
<currencyId>RUR</currencyId>
<categoryId>2</categoryId>
<picture>https://ocenka-sochi.ru/wp-content/uploads/2019/06/%D0%94%D0%98-%D0%A2%D0%A0%D0%90%D0%A1%D0%9E-logo.png</picture>
<name>Помощь должникам </name>
<description>Помощь должникам </description>
<param name="Произвольный параметр">Юриспруденция</param>
</offer>
<offer id="25">
<url>https://ocenka-sochi.ru/jurist/predstavitelstvo-v-sude/</url>
<price>1000</price>
<currencyId>RUR</currencyId>
<categoryId>2</categoryId>
<picture>https://ocenka-sochi.ru/wp-content/uploads/2019/06/%D0%94%D0%98-%D0%A2%D0%A0%D0%90%D0%A1%D0%9E-logo.png</picture>
<name>Представительство в суде</name>
<description>Представительство в суде</description>
<param name="Произвольный параметр">Юриспруденция</param>
</offer>
<offer id="26">
<url>https://ocenka-sochi.ru/jurist/semejnye-i-nasledstvennye-spory/</url>
<price>1000</price>
<currencyId>RUR</currencyId>
<categoryId>2</categoryId>
<picture>https://ocenka-sochi.ru/wp-content/uploads/2019/06/%D0%94%D0%98-%D0%A2%D0%A0%D0%90%D0%A1%D0%9E-logo.png</picture>
<name>Семейные и наследственные споры </name>
<description>Семейные и наследственные споры </description>
<param name="Произвольный параметр">Юриспруденция</param>
</offer>
<offer id="27">
<url>https://ocenka-sochi.ru/jurist/soprovozhdenie-sdelok-sostavlenie-dogovorov-konsultaciya/</url>
<price>1000</price>
<currencyId>RUR</currencyId>
<categoryId>2</categoryId>
<picture>https://ocenka-sochi.ru/wp-content/uploads/2019/06/%D0%94%D0%98-%D0%A2%D0%A0%D0%90%D0%A1%D0%9E-logo.png</picture>
<name>Сопровождение сделок и составление договоров</name>
<description>Сопровождение сделок и составление договоров</description>
<param name="Произвольный параметр">Юриспруденция</param>
</offer>
<offer id="28">
<url>https://ocenka-sochi.ru/jurist/spory-po-dtp/</url>
<price>1000</price>
<currencyId>RUR</currencyId>
<categoryId>2</categoryId>
<picture>https://ocenka-sochi.ru/wp-content/uploads/2019/06/%D0%94%D0%98-%D0%A2%D0%A0%D0%90%D0%A1%D0%9E-logo.png</picture>
<name>Споры по ДТП</name>
<description>Споры по ДТП</description>
<param name="Произвольный параметр">Юриспруденция</param>
</offer>
<offer id="29">
<url>https://ocenka-sochi.ru/jurist/spory-s-zastroishikami/</url>
<price>1000</price>
<currencyId>RUR</currencyId>
<categoryId>2</categoryId>
<picture>https://ocenka-sochi.ru/wp-content/uploads/2019/06/%D0%94%D0%98-%D0%A2%D0%A0%D0%90%D0%A1%D0%9E-logo.png</picture>
<name>Споры с застройщиком</name>
<description>Споры с застройщиком</description>
<param name="Произвольный параметр">Юриспруденция</param>
</offer>
<offer id="30">
<url>https://ocenka-sochi.ru/jurist/strahovye-spory/</url>
<price>1000</price>
<currencyId>RUR</currencyId>
<categoryId>2</categoryId>
<picture>https://ocenka-sochi.ru/wp-content/uploads/2019/06/%D0%94%D0%98-%D0%A2%D0%A0%D0%90%D0%A1%D0%9E-logo.png</picture>
<name>Страховые споры</name>
<description>Страховые споры</description>
<param name="Произвольный параметр">Юриспруденция</param>
</offer>
<offer id="31">
<url>https://ocenka-sochi.ru/jurist/trudovye-spory/</url>
<price>1000</price>
<currencyId>RUR</currencyId>
<categoryId>2</categoryId>
<picture>https://ocenka-sochi.ru/wp-content/uploads/2019/06/%D0%94%D0%98-%D0%A2%D0%A0%D0%90%D0%A1%D0%9E-logo.png</picture>
<name>Трудовые споры</name>
<description>Трудовые споры</description>
<param name="Произвольный параметр">Юриспруденция</param>
</offer>
<offer id="32">
<url>https://ocenka-sochi.ru/jurist/vozvrat-strahovki-i-komissij-bankov/</url>
<price>1000</price>
<currencyId>RUR</currencyId>
<categoryId>2</categoryId>
<picture>https://ocenka-sochi.ru/wp-content/uploads/2019/06/%D0%94%D0%98-%D0%A2%D0%A0%D0%90%D0%A1%D0%9E-logo.png</picture>
<name>Возврат страховки и комиссий банков</name>
<description>Возврат страховки и комиссий банков</description>
<param name="Произвольный параметр">Юриспруденция</param>
</offer>
<offer id="33">
<url>https://ocenka-sochi.ru/jurist/vzyskanie-dolgov-s-juridicheskih-lic/</url>
<price>1000</price>
<currencyId>RUR</currencyId>
<categoryId>2</categoryId>
<picture>https://ocenka-sochi.ru/wp-content/uploads/2019/06/%D0%94%D0%98-%D0%A2%D0%A0%D0%90%D0%A1%D0%9E-logo.png</picture>
<name>Взыскание долгов с юридических лиц </name>
<description>Взыскание долгов с юридических лиц </description>
<param name="Произвольный параметр">Юриспруденция</param>
</offer>
<offer id="34">
<url>https://ocenka-sochi.ru/jurist/zemelnye-i-imushhestvennye-spory/</url>
<price>1000</price>
<currencyId>RUR</currencyId>
<categoryId>2</categoryId>
<picture>https://ocenka-sochi.ru/wp-content/uploads/2019/06/%D0%94%D0%98-%D0%A2%D0%A0%D0%90%D0%A1%D0%9E-logo.png</picture>
<name>Земельные и имущественные споры </name>
<description>Земельные и имущественные споры </description>
<param name="Произвольный параметр">Юриспруденция</param>
</offer>
<offer id="35">
<url>https://ocenka-sochi.ru/ocenka/aktivy-predpriyatiya</url>
<price>1000</price>
<currencyId>RUR</currencyId>
<categoryId>3</categoryId>
<picture>https://ocenka-sochi.ru/wp-content/uploads/2019/06/%D0%94%D0%98-%D0%A2%D0%A0%D0%90%D0%A1%D0%9E-logo.png</picture>
<name>Оценка активов предприятия </name>
<description>Оценка активов предприятия </description>
<param name="Произвольный параметр">Оценка</param>
</offer>
<offer id="36">
<url>https://ocenka-sochi.ru/ocenka/arendnoy-platy/</url>
<price>8000</price>
<currencyId>RUR</currencyId>
<categoryId>3</categoryId>
<picture>https://ocenka-sochi.ru/wp-content/uploads/2019/06/%D0%94%D0%98-%D0%A2%D0%A0%D0%90%D0%A1%D0%9E-logo.png</picture>
<name>Оценка арендной платы </name>
<description>Оценка арендной платы </description>
<param name="Произвольный параметр">Оценка</param>
</offer>
<offer id="37">
<url>https://ocenka-sochi.ru/ocenka/avtomobilya/</url>
<price>2000</price>
<currencyId>RUR</currencyId>
<categoryId>3</categoryId>
<picture>https://ocenka-sochi.ru/wp-content/uploads/2019/06/%D0%94%D0%98-%D0%A2%D0%A0%D0%90%D0%A1%D0%9E-logo.png</picture>
<name>Оценка автомобиля</name>
<description>Оценка автомобиля</description>
<param name="Произвольный параметр">Оценка</param>
</offer>
<offer id="38">
<url>https://ocenka-sochi.ru/ocenka/biznesa/</url>
<price>8000</price>
<currencyId>RUR</currencyId>
<categoryId>3</categoryId>
<picture>https://ocenka-sochi.ru/wp-content/uploads/2019/06/%D0%94%D0%98-%D0%A2%D0%A0%D0%90%D0%A1%D0%9E-logo.png</picture>
<name>Оценка бизнеса</name>
<description>Оценка бизнеса</description>
<param name="Произвольный параметр">Оценка</param>
</offer>
<offer id="39">
<url>https://ocenka-sochi.ru/ocenka/dlya-notariusa/</url>
<price>1500</price>
<currencyId>RUR</currencyId>
<categoryId>3</categoryId>
<picture>https://ocenka-sochi.ru/wp-content/uploads/2019/06/%D0%94%D0%98-%D0%A2%D0%A0%D0%90%D0%A1%D0%9E-logo.png</picture>
<name>Оценка для нотариуса</name>
<description>Оценка для нотариуса</description>
<param name="Произвольный параметр">Оценка</param>
</offer>
<offer id="40">
<url>https://ocenka-sochi.ru/ocenka/dlya-vstupleniya-v-nasledstvo/</url>
<price>1500</price>
<currencyId>RUR</currencyId>
<categoryId>3</categoryId>
<picture>https://ocenka-sochi.ru/wp-content/uploads/2019/06/%D0%94%D0%98-%D0%A2%D0%A0%D0%90%D0%A1%D0%9E-logo.png</picture>
<name>Оценка для вступления в наследство</name>
<description>Оценка для вступления в наследство</description>
<param name="Произвольный параметр">Оценка</param>
</offer>
<offer id="41">
<url>https://ocenka-sochi.ru/ocenka/dlya-zaloga/</url>
<price>4000</price>
<currencyId>RUR</currencyId>
<categoryId>3</categoryId>
<picture>https://ocenka-sochi.ru/wp-content/uploads/2019/06/%D0%94%D0%98-%D0%A2%D0%A0%D0%90%D0%A1%D0%9E-logo.png</picture>
<name>Оценка для залога</name>
<description>Оценка для залога</description>
<param name="Произвольный параметр">Оценка</param>
</offer>
<offer id="42">
<url>https://ocenka-sochi.ru/ocenka/imushchestva-posle-razvoda/</url>
<price>2000</price>
<currencyId>RUR</currencyId>
<categoryId>3</categoryId>
<picture>https://ocenka-sochi.ru/wp-content/uploads/2019/06/%D0%94%D0%98-%D0%A2%D0%A0%D0%90%D0%A1%D0%9E-logo.png</picture>
<name>Оценка имущества после развода</name>
<description>Оценка имущества после развода</description>
<param name="Произвольный параметр">Оценка</param>
</offer>
<offer id="43">
<url>https://ocenka-sochi.ru/ocenka/intellektualnoy-sobstvennosti/</url>
<price>16500</price>
<currencyId>RUR</currencyId>
<categoryId>3</categoryId>
<picture>https://ocenka-sochi.ru/wp-content/uploads/2019/06/%D0%94%D0%98-%D0%A2%D0%A0%D0%90%D0%A1%D0%9E-logo.png</picture>
<name>Оценка интеллектуальной собственности</name>
<description>Оценка интеллектуальной собственности</description>
<param name="Произвольный параметр">Оценка</param>
</offer>
<offer id="44">
<url>https://ocenka-sochi.ru/ocenka/nedvizhimosti/</url>
<price>2000</price>
<currencyId>RUR</currencyId>
<categoryId>3</categoryId>
<picture>https://ocenka-sochi.ru/wp-content/uploads/2019/06/%D0%94%D0%98-%D0%A2%D0%A0%D0%90%D0%A1%D0%9E-logo.png</picture>
<name>Оценка недвижимости</name>
<description>Оценка недвижимости</description>
<param name="Произвольный параметр">Оценка</param>
</offer>
<offer id="45">
<url>https://ocenka-sochi.ru/ocenka/nedvizhimosti/dlya-ipoteki-sberbanka/</url>
<price>3500</price>
<currencyId>RUR</currencyId>
<categoryId>3</categoryId>
<picture>https://ocenka-sochi.ru/wp-content/uploads/2019/06/%D0%94%D0%98-%D0%A2%D0%A0%D0%90%D0%A1%D0%9E-logo.png</picture>
<name>Оценка для ипотеки сбербанка</name>
<description>Оценка для ипотеки сбербанка</description>
<param name="Произвольный параметр">Оценка</param>
</offer>
<offer id="46">
<url>https://ocenka-sochi.ru/ocenka/nedvizhimosti/kvartiry/</url>
<price>3800</price>
<currencyId>RUR</currencyId>
<categoryId>3</categoryId>
<picture>https://ocenka-sochi.ru/wp-content/uploads/2019/06/%D0%94%D0%98-%D0%A2%D0%A0%D0%90%D0%A1%D0%9E-logo.png</picture>
<name>Оценка квартиры</name>
<description>Оценка квартиры</description>
<param name="Произвольный параметр">Оценка</param>
</offer>
<offer id="47">
<url>https://ocenka-sochi.ru/ocenka/nedvizhimosti/sklada/</url>
<price>6000</price>
<currencyId>RUR</currencyId>
<categoryId>3</categoryId>
<picture>https://ocenka-sochi.ru/wp-content/uploads/2019/06/%D0%94%D0%98-%D0%A2%D0%A0%D0%90%D0%A1%D0%9E-logo.png</picture>
<name>Оценка склада</name>
<description>Оценка склада</description>
<param name="Произвольный параметр">Оценка</param>
</offer>
<offer id="48">
<url>https://ocenka-sochi.ru/ocenka/nedvizhimosti/zemli/</url>
<price>5000</price>
<currencyId>RUR</currencyId>
<categoryId>3</categoryId>
<picture>https://ocenka-sochi.ru/wp-content/uploads/2019/06/%D0%94%D0%98-%D0%A2%D0%A0%D0%90%D0%A1%D0%9E-logo.png</picture>
<name>Оценка земли</name>
<description>Оценка земли</description>
<param name="Произвольный параметр">Оценка</param>
</offer>
<offer id="49">
<url>https://ocenka-sochi.ru/ocenka/nedvizhimosti/zhilogo-doma/</url>
<price>5000</price>
<currencyId>RUR</currencyId>
<categoryId>3</categoryId>
<picture>https://ocenka-sochi.ru/wp-content/uploads/2019/06/%D0%94%D0%98-%D0%A2%D0%A0%D0%90%D0%A1%D0%9E-logo.png</picture>
<name>Оценка жилого дома</name>
<description>Оценка жилого дома</description>
<param name="Произвольный параметр">Оценка</param>
</offer>
<offer id="50">
<url>https://ocenka-sochi.ru/ocenka/sudna/</url>
<price>2000</price>
<currencyId>RUR</currencyId>
<categoryId>3</categoryId>
<picture>https://ocenka-sochi.ru/wp-content/uploads/2019/06/%D0%94%D0%98-%D0%A2%D0%A0%D0%90%D0%A1%D0%9E-logo.png</picture>
<name>Оценка судна</name>
<description>Оценка судна</description>
<param name="Произвольный параметр">Оценка</param>
</offer>
<offer id="51">
<url>https://ocenka-sochi.ru/ocenka/transport/</url>
<price>2000</price>
<currencyId>RUR</currencyId>
<categoryId>3</categoryId>
<picture>https://ocenka-sochi.ru/wp-content/uploads/2019/06/%D0%94%D0%98-%D0%A2%D0%A0%D0%90%D0%A1%D0%9E-logo.png</picture>
<name>Оценка транспорта</name>
<description>Оценка транспорта</description>
<param name="Произвольный параметр">Оценка</param>
</offer>
<offer id="52">
<url>https://ocenka-sochi.ru/ocenka/ushcherba-posle-pozhara/</url>
<price>5000</price>
<currencyId>RUR</currencyId>
<categoryId>3</categoryId>
<picture>https://ocenka-sochi.ru/wp-content/uploads/2019/06/%D0%94%D0%98-%D0%A2%D0%A0%D0%90%D0%A1%D0%9E-logo.png</picture>
<name> Оценка ущерба после пожара </name>
<description> Оценка ущерба после пожара </description>
<param name="Произвольный параметр">Оценка</param>
</offer>
<offer id="53">
<url>https://ocenka-sochi.ru/ocenka/ushcherba-posle-zaliva/</url>
<price>2500</price>
<currencyId>RUR</currencyId>
<categoryId>3</categoryId>
<picture>https://ocenka-sochi.ru/wp-content/uploads/2019/06/%D0%94%D0%98-%D0%A2%D0%A0%D0%90%D0%A1%D0%9E-logo.png</picture>
<name> Оценка ущерба после залива</name>
<description> Оценка ущерба после залива</description>
<param name="Произвольный параметр">Оценка</param>
</offer>
</offers>
</shop>
</yml_catalog>

View File

@@ -1,19 +1,32 @@
import { headers } from 'next/headers';
import { Contacts } from '@/views'; import { Contacts } from '@/views';
import type { Metadata } from 'next'; import type { Metadata } from 'next';
import { metaInfo } from '@shared/lib'; import { metaInfo, phoneBeautify } from '@shared/lib';
import { TMetainfo } from '@shared/types/metainfo';
import { CONTACTS } from '@shared/const/contacts';
const metainfo = { const metainfo: TMetainfo = {
title: 'Контакты', title: 'Адрес и телефон офиса',
description: description: `Услуги оценки имущества и проведение судебных экспертиз Тел.: ${phoneBeautify(CONTACTS.PHONE)}. Предварительный анализ - бесплатно!`,
'Услуги независимой оценки и судебной экспертизы в Сочи и Краснодаре.', companyName: CONTACTS.COMPANY_FULL,
companyName: 'Компания ДИТРАСО', phone: phoneBeautify(CONTACTS.PHONE),
phone: '+7 (900) 241-34-34', ogImageUrl: '/images/opengraph/main.png',
url: 'https://ocenka-sochi.ru',
ogImageTitle: 'Оценка и экспертиза',
ogImageDescription: 'Независимая оценка и судебная экспертиза',
}; };
export const metadata: Metadata = metaInfo(metainfo); export async function generateMetadata(): Promise<Metadata> {
const h = await headers();
const referer = h.get('referer') ?? '';
const host = h.get('host') ?? '';
const proto = h.get('x-forwarded-proto') ?? '';
const path = referer ? new URL(referer).pathname : '';
const metainfoExtended = Object.assign({}, metainfo, {
host: `${proto}://${host}`,
path: path,
});
return metaInfo(metainfoExtended);
}
export default function Page() { export default function Page() {
return <Contacts />; return <Contacts />;

View File

@@ -1,19 +1,32 @@
import { Cookie } from '@/views'; import { Cookie } from '@/views';
import type { Metadata } from 'next'; import type { Metadata } from 'next';
import { metaInfo } from '@shared/lib'; import { metaInfo, phoneBeautify } from '@shared/lib';
import { headers } from 'next/headers';
import { TMetainfo } from '@shared/types/metainfo';
import { CONTACTS } from '@shared/const/contacts';
const metainfo = { const metainfo: TMetainfo = {
title: 'Независимая оценка и судебная экспертиза', title: 'Соглашение об использовании систем аналитики',
description: description: `Услуги оценки имущества и проведение судебных экспертиз Тел.: ${phoneBeautify(CONTACTS.PHONE)}. Предварительный анализ - бесплатно!`,
'Услуги независимой оценки и судебной экспертизы в Сочи и Краснодаре.', companyName: CONTACTS.COMPANY_FULL,
companyName: 'Компания ДИТРАСО', phone: phoneBeautify(CONTACTS.PHONE),
phone: '+7 (900) 241-34-34', ogImageUrl: '/images/opengraph/main.png',
url: 'https://ocenka-sochi.ru',
ogImageTitle: 'Оценка и экспертиза',
ogImageDescription: 'Независимая оценка и судебная экспертиза',
}; };
export const metadata: Metadata = metaInfo(metainfo); export async function generateMetadata(): Promise<Metadata> {
const h = await headers();
const referer = h.get('referer') ?? '';
const host = h.get('host') ?? '';
const proto = h.get('x-forwarded-proto') ?? '';
const path = referer ? new URL(referer).pathname : '';
const metainfoExtended = Object.assign({}, metainfo, {
host: `${proto}://${host}`,
path: path,
});
return metaInfo(metainfoExtended);
}
export default function Page() { export default function Page() {
return <Cookie />; return <Cookie />;

View File

@@ -1,12 +1,33 @@
import { AutoTech } from '@/views'; import { AutoTech } from '@/views';
import type { Metadata } from 'next'; import type { Metadata } from 'next';
import { headers } from 'next/headers';
import { metaInfo, phoneBeautify } from '@shared/lib';
import { TMetainfo } from '@shared/types/metainfo';
import { CONTACTS } from '@shared/const/contacts';
export const metadata: Metadata = { const metainfo: TMetainfo = {
title: 'Автотехническая экспертиза | Компания ДИТРАСО', title: 'Автотехническая экспертиза',
description: description: `Проведение автотехнической экспертизы. Лицензированные эксперты. Экспертиза принимается судом. Тел.: ${phoneBeautify(CONTACTS.PHONE)}. Предварительный анализ - бесплатно!`,
'Услуги независимой оценки и судебной экспертизы в Сочи и Краснодаре. Тел. +7 (900) 241-34-34', companyName: CONTACTS.COMPANY_FULL,
phone: phoneBeautify(CONTACTS.PHONE),
ogImageUrl: '/images/opengraph/expertise/auto.png',
}; };
export async function generateMetadata(): Promise<Metadata> {
const h = await headers();
const referer = h.get('referer') ?? '';
const host = h.get('host') ?? '';
const proto = h.get('x-forwarded-proto') ?? '';
const path = referer ? new URL(referer).pathname : '';
const metainfoExtended = Object.assign({}, metainfo, {
host: `${proto}://${host}`,
path: path,
});
return metaInfo(metainfoExtended);
}
export default function Page() { export default function Page() {
return <AutoTech />; return <AutoTech />;
} }

View File

@@ -1,12 +1,33 @@
import { Buhgalter } from '@/views'; import { Buhgalter } from '@/views';
import type { Metadata } from 'next'; import type { Metadata } from 'next';
import { headers } from 'next/headers';
import { metaInfo, phoneBeautify } from '@shared/lib';
import { TMetainfo } from '@shared/types/metainfo';
import { CONTACTS } from '@shared/const/contacts';
export const metadata: Metadata = { const metainfo: TMetainfo = {
title: 'Бухгалтерская экспертиза | Компания ДИТРАСО', title: 'Бухгалтерская экспертиза',
description: description: `Проведение бухгалтерской экспертизы. Лицензированные эксперты. Экспертиза принимается судом. Тел.: ${phoneBeautify(CONTACTS.PHONE)}. Предварительный анализ - бесплатно!`,
'Услуги независимой оценки и судебной экспертизы в Сочи и Краснодаре. Тел. +7 (900) 241-34-34', companyName: CONTACTS.COMPANY_FULL,
phone: phoneBeautify(CONTACTS.PHONE),
ogImageUrl: '/images/opengraph/expertise/buh.png',
}; };
export async function generateMetadata(): Promise<Metadata> {
const h = await headers();
const referer = h.get('referer') ?? '';
const host = h.get('host') ?? '';
const proto = h.get('x-forwarded-proto') ?? '';
const path = referer ? new URL(referer).pathname : '';
const metainfoExtended = Object.assign({}, metainfo, {
host: `${proto}://${host}`,
path: path,
});
return metaInfo(metainfoExtended);
}
export default function Page() { export default function Page() {
return <Buhgalter />; return <Buhgalter />;
} }

View File

@@ -1,12 +1,33 @@
import { Document } from '@/views'; import { Document } from '@/views';
import type { Metadata } from 'next'; import type { Metadata } from 'next';
import { headers } from 'next/headers';
import { metaInfo, phoneBeautify } from '@shared/lib';
import { TMetainfo } from '@shared/types/metainfo';
import { CONTACTS } from '@shared/const/contacts';
export const metadata: Metadata = { const metainfo: TMetainfo = {
title: 'Экспертиза документов | Компания ДИТРАСО', title: 'Экспертиза документов',
description: description: `Экспертиза документов. Лицензированные эксперты. Экспертиза принимается судом. Тел.: ${phoneBeautify(CONTACTS.PHONE)}. Предварительный анализ - бесплатно!`,
'Услуги независимой оценки и судебной экспертизы в Сочи и Краснодаре. Тел. +7 (900) 241-34-34', companyName: CONTACTS.COMPANY_FULL,
phone: phoneBeautify(CONTACTS.PHONE),
ogImageUrl: '/images/opengraph/expertise/buh.png',
}; };
export async function generateMetadata(): Promise<Metadata> {
const h = await headers();
const referer = h.get('referer') ?? '';
const host = h.get('host') ?? '';
const proto = h.get('x-forwarded-proto') ?? '';
const path = referer ? new URL(referer).pathname : '';
const metainfoExtended = Object.assign({}, metainfo, {
host: `${proto}://${host}`,
path: path,
});
return metaInfo(metainfoExtended);
}
export default function Page() { export default function Page() {
return <Document />; return <Document />;
} }

View File

@@ -1,12 +1,33 @@
import { Finans } from '@/views'; import { Finans } from '@/views';
import type { Metadata } from 'next'; import type { Metadata } from 'next';
import { headers } from 'next/headers';
import { metaInfo, phoneBeautify } from '@shared/lib';
import { TMetainfo } from '@shared/types/metainfo';
import { CONTACTS } from '@shared/const/contacts';
export const metadata: Metadata = { const metainfo: TMetainfo = {
title: 'Финансово-экономическая экспертиза | Компания ДИТРАСО', title: 'Финансово-экономическая экспертиза',
description: description: `Проведение финансово-экономической экспертизы. Лицензированные эксперты. Экспертиза принимается судом. Тел.: ${phoneBeautify(CONTACTS.PHONE)}. Предварительный анализ - бесплатно!`,
'Услуги независимой оценки и судебной экспертизы в Сочи и Краснодаре. Тел. +7 (900) 241-34-34', companyName: CONTACTS.COMPANY_FULL,
phone: phoneBeautify(CONTACTS.PHONE),
ogImageUrl: '/images/opengraph/expertise/finance.png',
}; };
export async function generateMetadata(): Promise<Metadata> {
const h = await headers();
const referer = h.get('referer') ?? '';
const host = h.get('host') ?? '';
const proto = h.get('x-forwarded-proto') ?? '';
const path = referer ? new URL(referer).pathname : '';
const metainfoExtended = Object.assign({}, metainfo, {
host: `${proto}://${host}`,
path: path,
});
return metaInfo(metainfoExtended);
}
export default function Page() { export default function Page() {
return <Finans />; return <Finans />;
} }

View File

@@ -1,12 +1,33 @@
import { Kadastr } from '@/views'; import { Kadastr } from '@/views';
import type { Metadata } from 'next'; import type { Metadata } from 'next';
import { headers } from 'next/headers';
import { metaInfo, phoneBeautify } from '@shared/lib';
import { TMetainfo } from '@shared/types/metainfo';
import { CONTACTS } from '@shared/const/contacts';
export const metadata: Metadata = { const metainfo: TMetainfo = {
title: 'Кадастровая экспертиза | Компания ДИТРАСО', title: 'Кадастровая экспертиза',
description: description: `Проведение кадастровой экспертизы. Лицензированные эксперты. Экспертиза принимается судом. Тел.: ${phoneBeautify(CONTACTS.PHONE)}. Предварительный анализ - бесплатно!`,
'Услуги независимой оценки и судебной экспертизы в Сочи и Краснодаре. Тел. +7 (900) 241-34-34', companyName: CONTACTS.COMPANY_FULL,
phone: phoneBeautify(CONTACTS.PHONE),
ogImageUrl: '/images/opengraph/expertise/kadastr.png',
}; };
export async function generateMetadata(): Promise<Metadata> {
const h = await headers();
const referer = h.get('referer') ?? '';
const host = h.get('host') ?? '';
const proto = h.get('x-forwarded-proto') ?? '';
const path = referer ? new URL(referer).pathname : '';
const metainfoExtended = Object.assign({}, metainfo, {
host: `${proto}://${host}`,
path: path,
});
return metaInfo(metainfoExtended);
}
export default function Page() { export default function Page() {
return <Kadastr />; return <Kadastr />;
} }

View File

@@ -1,12 +1,33 @@
import { Computer } from '@/views'; import { Computer } from '@/views';
import type { Metadata } from 'next'; import type { Metadata } from 'next';
import { headers } from 'next/headers';
import { metaInfo, phoneBeautify } from '@shared/lib';
import { TMetainfo } from '@shared/types/metainfo';
import { CONTACTS } from '@shared/const/contacts';
export const metadata: Metadata = { const metainfo: TMetainfo = {
title: 'Компьютерно-техническая экспертиза | Компания ДИТРАСО', title: 'Компьютерно-техническая экспертиза',
description: description: `Проведение компьютерно-технической экспертизы. Лицензированные эксперты. Экспертиза принимается судом. Тел.: ${phoneBeautify(CONTACTS.PHONE)}. Предварительный анализ - бесплатно!`,
'Услуги независимой оценки и судебной экспертизы в Сочи и Краснодаре. Тел. +7 (900) 241-34-34', companyName: CONTACTS.COMPANY_FULL,
phone: phoneBeautify(CONTACTS.PHONE),
ogImageUrl: '/images/opengraph/expertise/computer.png',
}; };
export async function generateMetadata(): Promise<Metadata> {
const h = await headers();
const referer = h.get('referer') ?? '';
const host = h.get('host') ?? '';
const proto = h.get('x-forwarded-proto') ?? '';
const path = referer ? new URL(referer).pathname : '';
const metainfoExtended = Object.assign({}, metainfo, {
host: `${proto}://${host}`,
path: path,
});
return metaInfo(metainfoExtended);
}
export default function Page() { export default function Page() {
return <Computer />; return <Computer />;
} }

View File

@@ -1,12 +1,33 @@
import { ExpertiseCategory } from '@/views'; import { ExpertiseCategory } from '@/views';
import type { Metadata } from 'next'; import type { Metadata } from 'next';
import { headers } from 'next/headers';
import { metaInfo, phoneBeautify } from '@shared/lib';
import { TMetainfo } from '@shared/types/metainfo';
import { CONTACTS } from '@shared/const/contacts';
export const metadata: Metadata = { const metainfo: TMetainfo = {
title: 'Проведение экспертиз | Компания ДИТРАСО', title: 'Проведение судебных экспертиз',
description: description: `Услуги оценки имущества и проведение судебных экспертиз Тел.: ${phoneBeautify(CONTACTS.PHONE)}. Предварительный анализ - бесплатно!`,
'Услуги независимой оценки и судебной экспертизы в Сочи и Краснодаре. Тел. +7 (900) 241-34-34', companyName: CONTACTS.COMPANY_FULL,
phone: phoneBeautify(CONTACTS.PHONE),
ogImageUrl: '/images/opengraph/main.png',
}; };
export async function generateMetadata(): Promise<Metadata> {
const h = await headers();
const referer = h.get('referer') ?? '';
const host = h.get('host') ?? '';
const proto = h.get('x-forwarded-proto') ?? '';
const path = referer ? new URL(referer).pathname : '';
const metainfoExtended = Object.assign({}, metainfo, {
host: `${proto}://${host}`,
path: path,
});
return metaInfo(metainfoExtended);
}
export default function ExpertizaPage() { export default function ExpertizaPage() {
return <ExpertiseCategory />; return <ExpertiseCategory />;
} }

View File

@@ -1,12 +1,33 @@
import { Pocherk } from '@/views'; import { Pocherk } from '@/views';
import type { Metadata } from 'next'; import type { Metadata } from 'next';
import { headers } from 'next/headers';
import { metaInfo, phoneBeautify } from '@shared/lib';
import { TMetainfo } from '@shared/types/metainfo';
import { CONTACTS } from '@shared/const/contacts';
export const metadata: Metadata = { const metainfo: TMetainfo = {
title: 'Почерковедческая экспертиза | Компания ДИТРАСО', title: 'Почерковедческая экспертиза',
description: description: `Проведение почерковедческой экспертизы. Лицензированные эксперты. Экспертиза принимается судом. Тел.: ${phoneBeautify(CONTACTS.PHONE)}. Предварительный анализ - бесплатно!`,
'Услуги независимой оценки и судебной экспертизы в Сочи и Краснодаре. Тел. +7 (900) 241-34-34', companyName: CONTACTS.COMPANY_FULL,
phone: phoneBeautify(CONTACTS.PHONE),
ogImageUrl: '/images/opengraph/expertise/pocherk.png',
}; };
export async function generateMetadata(): Promise<Metadata> {
const h = await headers();
const referer = h.get('referer') ?? '';
const host = h.get('host') ?? '';
const proto = h.get('x-forwarded-proto') ?? '';
const path = referer ? new URL(referer).pathname : '';
const metainfoExtended = Object.assign({}, metainfo, {
host: `${proto}://${host}`,
path: path,
});
return metaInfo(metainfoExtended);
}
export default function Page() { export default function Page() {
return <Pocherk />; return <Pocherk />;
} }

View File

@@ -1,12 +1,33 @@
import { Pozhar } from '@/views'; import { Pozhar } from '@/views';
import type { Metadata } from 'next'; import type { Metadata } from 'next';
import { headers } from 'next/headers';
import { metaInfo, phoneBeautify } from '@shared/lib';
import { TMetainfo } from '@shared/types/metainfo';
import { CONTACTS } from '@shared/const/contacts';
export const metadata: Metadata = { const metainfo: TMetainfo = {
title: 'Пожарно-техническая экспертиза | Компания ДИТРАСО', title: 'Пожарно-техническая экспертиза',
description: description: `Проведение пожарно-технической экспертизы. Лицензированные эксперты. Экспертиза принимается судом. Тел.: ${phoneBeautify(CONTACTS.PHONE)}. Предварительный анализ - бесплатно!`,
'Услуги независимой оценки и судебной экспертизы в Сочи и Краснодаре. Тел. +7 (900) 241-34-34', companyName: CONTACTS.COMPANY_FULL,
phone: phoneBeautify(CONTACTS.PHONE),
ogImageUrl: '/images/opengraph/expertise/pojar.png',
}; };
export async function generateMetadata(): Promise<Metadata> {
const h = await headers();
const referer = h.get('referer') ?? '';
const host = h.get('host') ?? '';
const proto = h.get('x-forwarded-proto') ?? '';
const path = referer ? new URL(referer).pathname : '';
const metainfoExtended = Object.assign({}, metainfo, {
host: `${proto}://${host}`,
path: path,
});
return metaInfo(metainfoExtended);
}
export default function Page() { export default function Page() {
return <Pozhar />; return <Pozhar />;
} }

View File

@@ -1,12 +1,33 @@
import { Recenzii } from '@/views'; import { Recenzii } from '@/views';
import type { Metadata } from 'next'; import type { Metadata } from 'next';
import { headers } from 'next/headers';
import { metaInfo, phoneBeautify } from '@shared/lib';
import { TMetainfo } from '@shared/types/metainfo';
import { CONTACTS } from '@shared/const/contacts';
export const metadata: Metadata = { const metainfo: TMetainfo = {
title: 'Строительно-техническая экспертиза | Компания ДИТРАСО', title: 'Рецензирование экспертизы',
description: description: `Рецензирование экспертизы. Лицензированные эксперты. Экспертиза принимается судом. Тел.: ${phoneBeautify(CONTACTS.PHONE)}. Предварительный анализ - бесплатно!`,
'Услуги независимой оценки и судебной экспертизы в Сочи и Краснодаре. Тел. +7 (900) 241-34-34', companyName: CONTACTS.COMPANY_FULL,
phone: phoneBeautify(CONTACTS.PHONE),
ogImageUrl: '/images/opengraph/expertise/recenzia.png',
}; };
export async function generateMetadata(): Promise<Metadata> {
const h = await headers();
const referer = h.get('referer') ?? '';
const host = h.get('host') ?? '';
const proto = h.get('x-forwarded-proto') ?? '';
const path = referer ? new URL(referer).pathname : '';
const metainfoExtended = Object.assign({}, metainfo, {
host: `${proto}://${host}`,
path: path,
});
return metaInfo(metainfoExtended);
}
export default function Page() { export default function Page() {
return <Recenzii />; return <Recenzii />;
} }

View File

@@ -1,12 +1,33 @@
import { Stroit } from '@/views'; import { Stroit } from '@/views';
import type { Metadata } from 'next'; import type { Metadata } from 'next';
import { headers } from 'next/headers';
import { metaInfo, phoneBeautify } from '@shared/lib';
import { TMetainfo } from '@shared/types/metainfo';
import { CONTACTS } from '@shared/const/contacts';
export const metadata: Metadata = { const metainfo: TMetainfo = {
title: 'Рецензирование экспертизы | Компания ДИТРАСО', title: 'Строительно-техническая экспертиза',
description: description: `Проведение строительно-технической экспертизы. Лицензированные эксперты. Экспертиза принимается судом. Тел.: ${phoneBeautify(CONTACTS.PHONE)}. Предварительный анализ - бесплатно!`,
'Услуги независимой оценки и судебной экспертизы в Сочи и Краснодаре. Тел. +7 (900) 241-34-34', companyName: CONTACTS.COMPANY_FULL,
phone: phoneBeautify(CONTACTS.PHONE),
ogImageUrl: '/images/opengraph/expertise/stroika.png',
}; };
export async function generateMetadata(): Promise<Metadata> {
const h = await headers();
const referer = h.get('referer') ?? '';
const host = h.get('host') ?? '';
const proto = h.get('x-forwarded-proto') ?? '';
const path = referer ? new URL(referer).pathname : '';
const metainfoExtended = Object.assign({}, metainfo, {
host: `${proto}://${host}`,
path: path,
});
return metaInfo(metainfoExtended);
}
export default function Page() { export default function Page() {
return <Stroit />; return <Stroit />;
} }

View File

@@ -1,12 +1,33 @@
import { TechCrim } from '@/views'; import { TechCrim } from '@/views';
import type { Metadata } from 'next'; import type { Metadata } from 'next';
import { headers } from 'next/headers';
import { metaInfo, phoneBeautify } from '@shared/lib';
import { TMetainfo } from '@shared/types/metainfo';
import { CONTACTS } from '@shared/const/contacts';
export const metadata: Metadata = { const metainfo: TMetainfo = {
title: 'Технико-криминалистическая экспертиза | Компания ДИТРАСО', title: 'Технико-криминалистическая экспертиза',
description: description: `Проведение технико-криминалистической экспертизы. Лицензированные эксперты. Экспертиза принимается судом. Тел.: ${phoneBeautify(CONTACTS.PHONE)}. Предварительный анализ - бесплатно!`,
'Услуги независимой оценки и судебной экспертизы в Сочи и Краснодаре. Тел. +7 (900) 241-34-34', companyName: CONTACTS.COMPANY_FULL,
phone: phoneBeautify(CONTACTS.PHONE),
ogImageUrl: '/images/opengraph/expertise/crime.png',
}; };
export async function generateMetadata(): Promise<Metadata> {
const h = await headers();
const referer = h.get('referer') ?? '';
const host = h.get('host') ?? '';
const proto = h.get('x-forwarded-proto') ?? '';
const path = referer ? new URL(referer).pathname : '';
const metainfoExtended = Object.assign({}, metainfo, {
host: `${proto}://${host}`,
path: path,
});
return metaInfo(metainfoExtended);
}
export default function Page() { export default function Page() {
return <TechCrim />; return <TechCrim />;
} }

View File

@@ -1,12 +1,33 @@
import { Tovar } from '@/views'; import { Tovar } from '@/views';
import type { Metadata } from 'next'; import type { Metadata } from 'next';
import { headers } from 'next/headers';
import { metaInfo, phoneBeautify } from '@shared/lib';
import { TMetainfo } from '@shared/types/metainfo';
import { CONTACTS } from '@shared/const/contacts';
export const metadata: Metadata = { const metainfo: TMetainfo = {
title: 'Товароведческая экспертиза | Компания ДИТРАСО', title: 'Товароведческая экспертиза',
description: description: `Проведение товароведческой экспертизы. Лицензированные эксперты. Экспертиза принимается судом. Тел.: ${phoneBeautify(CONTACTS.PHONE)}. Предварительный анализ - бесплатно!`,
'Услуги независимой оценки и судебной экспертизы в Сочи и Краснодаре. Тел. +7 (900) 241-34-34', companyName: CONTACTS.COMPANY_FULL,
phone: phoneBeautify(CONTACTS.PHONE),
ogImageUrl: '/images/opengraph/expertise/tovar.png',
}; };
export async function generateMetadata(): Promise<Metadata> {
const h = await headers();
const referer = h.get('referer') ?? '';
const host = h.get('host') ?? '';
const proto = h.get('x-forwarded-proto') ?? '';
const path = referer ? new URL(referer).pathname : '';
const metainfoExtended = Object.assign({}, metainfo, {
host: `${proto}://${host}`,
path: path,
});
return metaInfo(metainfoExtended);
}
export default function Page() { export default function Page() {
return <Tovar />; return <Tovar />;
} }

View File

@@ -1,12 +1,33 @@
import { Trasologia } from '@/views'; import { Trasologia } from '@/views';
import type { Metadata } from 'next'; import type { Metadata } from 'next';
import { headers } from 'next/headers';
import { metaInfo, phoneBeautify } from '@shared/lib';
import { TMetainfo } from '@shared/types/metainfo';
import { CONTACTS } from '@shared/const/contacts';
export const metadata: Metadata = { const metainfo: TMetainfo = {
title: 'Трасологическая экспертиза | Компания ДИТРАСО', title: 'Трасологическая экспертиза',
description: description: `Проведение трасологической экспертизы. Лицензированные эксперты. Экспертиза принимается судом. Тел.: ${phoneBeautify(CONTACTS.PHONE)}. Предварительный анализ - бесплатно!`,
'Услуги независимой оценки и судебной экспертизы в Сочи и Краснодаре. Тел. +7 (900) 241-34-34', companyName: CONTACTS.COMPANY_FULL,
phone: phoneBeautify(CONTACTS.PHONE),
ogImageUrl: '/images/opengraph/expertise/trasologia.png',
}; };
export async function generateMetadata(): Promise<Metadata> {
const h = await headers();
const referer = h.get('referer') ?? '';
const host = h.get('host') ?? '';
const proto = h.get('x-forwarded-proto') ?? '';
const path = referer ? new URL(referer).pathname : '';
const metainfoExtended = Object.assign({}, metainfo, {
host: `${proto}://${host}`,
path: path,
});
return metaInfo(metainfoExtended);
}
export default function Page() { export default function Page() {
return <Trasologia />; return <Trasologia />;
} }

View File

@@ -1,12 +1,33 @@
import { ZemStroy } from '@/views'; import { ZemStroy } from '@/views';
import type { Metadata } from 'next'; import type { Metadata } from 'next';
import { headers } from 'next/headers';
import { metaInfo, phoneBeautify } from '@shared/lib';
import { TMetainfo } from '@shared/types/metainfo';
import { CONTACTS } from '@shared/const/contacts';
export const metadata: Metadata = { const metainfo: TMetainfo = {
title: 'Земле-устроительная экспертиза | Компания ДИТРАСО', title: 'Землеустроительная экспертиза',
description: description: `Проведение землеустроительной экспертизы. Лицензированные эксперты. Экспертиза принимается судом. Тел.: ${phoneBeautify(CONTACTS.PHONE)}. Предварительный анализ - бесплатно!`,
'Услуги независимой оценки и судебной экспертизы в Сочи и Краснодаре. Тел. +7 (900) 241-34-34', companyName: CONTACTS.COMPANY_FULL,
phone: phoneBeautify(CONTACTS.PHONE),
ogImageUrl: '/images/opengraph/expertise/zemlya.png',
}; };
export async function generateMetadata(): Promise<Metadata> {
const h = await headers();
const referer = h.get('referer') ?? '';
const host = h.get('host') ?? '';
const proto = h.get('x-forwarded-proto') ?? '';
const path = referer ? new URL(referer).pathname : '';
const metainfoExtended = Object.assign({}, metainfo, {
host: `${proto}://${host}`,
path: path,
});
return metaInfo(metainfoExtended);
}
export default function Page() { export default function Page() {
return <ZemStroy />; return <ZemStroy />;
} }

View File

@@ -1,19 +1,32 @@
import { ExpertBorodin } from '@/views'; import { ExpertBorodin } from '@/views';
import type { Metadata } from 'next'; import type { Metadata } from 'next';
import { metaInfo } from '@shared/lib'; import { metaInfo, phoneBeautify } from '@shared/lib';
import { headers } from 'next/headers';
import { TMetainfo } from '@shared/types/metainfo';
import { CONTACTS } from '@shared/const/contacts';
const metainfo = { const metainfo: TMetainfo = {
title: 'Эксперт - Бородин Виталий Петрович', title: 'Эксперт - Бородин Виталий Петрович',
description: description: `Оценщики и судебные эксперты в Сочи, ${CONTACTS.COMPANY_FULL}. Сертифицированы РОО. Консультация - бесплатно! Тел.: ${phoneBeautify(CONTACTS.PHONE)}.`,
'Услуги независимой оценки и судебной экспертизы в Сочи и Краснодаре.', companyName: CONTACTS.COMPANY_FULL,
companyName: 'Компания ДИТРАСО', phone: phoneBeautify(CONTACTS.PHONE),
phone: '+7 (900) 241-34-34', ogImageUrl: '/images/opengraph/main.png',
url: 'https://ocenka-sochi.ru',
ogImageTitle: 'Оценка и экспертиза',
ogImageDescription: 'Независимая оценка и судебная экспертиза',
}; };
export const metadata: Metadata = metaInfo(metainfo); export async function generateMetadata(): Promise<Metadata> {
const h = await headers();
const referer = h.get('referer') ?? '';
const host = h.get('host') ?? '';
const proto = h.get('x-forwarded-proto') ?? '';
const path = referer ? new URL(referer).pathname : '';
const metainfoExtended = Object.assign({}, metainfo, {
host: `${proto}://${host}`,
path: path,
});
return metaInfo(metainfoExtended);
}
export default function Page() { export default function Page() {
return <ExpertBorodin />; return <ExpertBorodin />;

View File

@@ -1,19 +1,32 @@
import { ExpertGulmamedov } from '@/views'; import { ExpertGulmamedov } from '@/views';
import type { Metadata } from 'next'; import type { Metadata } from 'next';
import { metaInfo } from '@shared/lib'; import { metaInfo, phoneBeautify } from '@shared/lib';
import { headers } from 'next/headers';
import { TMetainfo } from '@shared/types/metainfo';
import { CONTACTS } from '@shared/const/contacts';
const metainfo = { const metainfo: TMetainfo = {
title: 'Эксперт - Гюльмамедов Явар Фирмамед-оглы', title: 'Эксперт - Гюльмамедов Явар Фирмамед-оглы',
description: description: `Оценщики и судебные эксперты в Сочи, ${CONTACTS.COMPANY_FULL}. Сертифицированы РОО. Консультация - бесплатно! Тел.: ${phoneBeautify(CONTACTS.PHONE)}.`,
'Услуги независимой оценки и судебной экспертизы в Сочи и Краснодаре.', companyName: CONTACTS.COMPANY_FULL,
companyName: 'Компания ДИТРАСО', phone: phoneBeautify(CONTACTS.PHONE),
phone: '+7 (900) 241-34-34', ogImageUrl: '/images/opengraph/main.png',
url: 'https://ocenka-sochi.ru',
ogImageTitle: 'Оценка и экспертиза',
ogImageDescription: 'Независимая оценка и судебная экспертиза',
}; };
export const metadata: Metadata = metaInfo(metainfo); export async function generateMetadata(): Promise<Metadata> {
const h = await headers();
const referer = h.get('referer') ?? '';
const host = h.get('host') ?? '';
const proto = h.get('x-forwarded-proto') ?? '';
const path = referer ? new URL(referer).pathname : '';
const metainfoExtended = Object.assign({}, metainfo, {
host: `${proto}://${host}`,
path: path,
});
return metaInfo(metainfoExtended);
}
export default function Page() { export default function Page() {
return <ExpertGulmamedov />; return <ExpertGulmamedov />;

Some files were not shown because too many files have changed in this diff Show More