Призма с руководством

Привет, друзья!

В этой серии из 2 статей я хочу поделиться с вами своими заметками о Prisma.

Prisma — это современное (продвинутое) объектно-реляционное отображение (Object-Relational Mapping, ORM) для Node.js и TypeScript. Проще говоря, Prisma — это инструмент, позволяющий работать с реляционными (PostgreSQL, MySQL, SQL Server, SQLite) и нереляционной (MongoDB) базами данных с помощью JavaScript или TypeScript без использования SQL (хотя такая возможность имеется).

Содержание этой части

  • Инициализация проекта
  • CLI
  • Схема
    • Типы данных
    • Атрибуты
    • Функции атрибутов
    • Отношения
  • Клиент
    • Запросы
    • findUnique
    • findFirst
    • findMany
    • create
    • update
    • upsert
    • delete
    • createMany
    • updateMany
    • deleteMany
    • count
    • aggregate
    • groupBy

Вторая часть.

Если вам это интересно, прошу под кат.

Инициализация проекта

Создаем директорию, переходим в нее и инициализируем Node.js-проект:

mkdir prisma-test
cd prisma-test

yarn init -yp
# or
npm init -y

Устанавливаем Prisma в качестве зависимости для разработки:

yarn add -D prisma

# or
npm i -D prisma

Инициализируем проект Prisma:

npx prisma init

Это приводит к генерации файлов prisma/schema.prisma и .env.

В файле .env содержится переменная DATABASE_URL, значением которой является путь к (адрес) БД. Файл schema.prisma мы рассмотрим позже.

CLI

Интерфейс командной строки (Command line interface, CLI) Prisma предоставляет следующие основные возможности (команды):

  • init — создает шаблон Prisma-проекта:
    • --datasource-provider — провайдер для работы с БД: sqlite, postgresql, mysql, sqlserver или mongodb (перезаписывает datasource из schema.prisma);
    • --url — адрес БД (перезаписывает DATABASE_URL)
npx prisma init --datasource-provider mysql --url mysql://user:password@localhost:3306/mydb
  • generate — генерирует клиента Prisma на основе схемы (schema.prisma). Клиент Prisma предоставляет программный интерфейс приложения (Application Programming Interface, API) для работы с моделями и типы для TypeScript
npx prisma generate
  • db pull — генерирует модели на основе существующей схемы БД
npx prisma db pull
  • db push — синхронизирует состояние схемы Prisma с БД без выполнения миграций. БД создается при отсутствии. Используется для прототипировании БД и в локальной разработке. Также может быть полезной в случае ограниченного доступа к БД, например, при использовании БД, предоставляемой облачными провайдерами, такими как ElephantSQL или Heroku
npx prisma db push
  • seed — выполняет скрипт для наполнения БД начальными (фиктивными) данными. Путь к соответствующему файлу определяется в package.json
"prisma": {
  "seed": "node prisma/seed.js"
}
npx prisma seed
  • migrate
    • dev — выполняет миграцию для разработки:
    • --name — название миграции
npx prisma migrate dev --name init

Это приводит к созданию БД при ее отсутствии, генерации файла prisma/migrations/migration_name.sql, выполнению инструкции из этого файла (синхронизации БД со схемой) и генерации (регенерации) клиента (prisma generate).

Данная команда должна выполняться после каждого изменения схемы.

  • reset — удаляет и заново создает БД или выполняет «мягкий сброс», удаляя все данные, таблицы, индексы и другие артефакты
npx prisma migrate reset
  • deploy — выполняет производственную миграцию
npx prisma migrate deploy
  • studio — позволяет просматривать и управлять данными, хранящимися в БД, в интерактивном режиме:
    • --browser, -b — название браузера (по умолчанию используется дефолтный браузер);
    • --port, -p — номер порта (по умолчанию — 5555)
npx prisma studio

# без автоматического открытия вкладки браузера
npx prisma studio -b none

Подробнее о CLI можно почитать здесь.

Схема

В файле schema.prisma мы видим такие строки:

generator client {
  provider = "prisma-client-js"
}

datasource db {
  provider = "postgresql"
  url      = env("DATABASE_URL")
}
  • datasource — источник данных:
    • provider — название провайдера для доступа к БД: sqlite, postgresql, mysql, sqlserver или mongodb (по умолчанию — postgresql);
    • url — адрес БД (по умолчанию — значение переменной DATABASE_URL);
    • shadowDatabaseUrl — адрес «теневой» БД (для БД, предоставляемых облачными провайдерами): используется для миграций для разработки (prisma migrate dev);
  • generator — генератор клиента на основе схемы:
    • provider — провайдер генератора (единственным доступным на сегодняшний день провайдером является prisma-client-js);
    • binaryTargets — определяет операционную систему для клиента Prisma. Значением по умолчанию является native, но иногда это приходится указывать явно, например, при использовании клиента в Docker-контейнере (в этом случае также приходится явно выполнять prisma generate)
generator client {
  provider      = "prisma-client-js"
  binaryTargets = ["native"]
}

datasource db {
  provider          = "postgresql"
  url               = env("DATABASE_URL")
  shadowDatabaseUrl = env("SHADOW_DATABASE_URL")
}

Для работы со схемой удобно пользоваться расширением Prisma для VSCode. Соответствующий раздел в файле settings.json должен выглядеть так:

"[prisma]": {
  "editor.defaultFormatter": "Prisma.prisma"
}

Определим в схеме модели для пользователя (User) и поста (Post):

model User {
  id         String   @id @default(uuid()) @db.Uuid
  email      String   @unique
  hash       String   @map("password_hash")
  first_name String?
  last_name  String?
  age        Int?
  role       Role     @default(USER)
  posts      Post[]
  created_at DateTime @default(now())
  updated_at DateTime @updatedAt

  @@map("users")
}

model Post {
  id         String   @id @default(uuid())
  title      String
  content    String
  published  Boolean
  author_id  String
  author     User     @relation(fields: [author_id], references: [id])
  created_at DateTime @default(now())
  updated_at DateTime @updatedAt

  @@map("posts")
}

enum Role {
  USER
  ADMIN
}

Вот что мы здесь видим:

  • id, email, hash etc. — названия полей (колонок таблицы);
  • @map привязывает поле схемы (hash) к указанной колонке таблицы (password_hash). @map не меняет название колонки в БД и поля в генерируемом клиенте. Для MongoDB использование @map для @id является обязательным: id String @default(auto()) @map("_id") @db.ObjectId;
  • String, Int, DateTime etc. — типы данных (см. ниже);
  • @db.Uuid — тип данных, специфичный для одной или нескольких БД (в данном случае PostgreSQL);
  • модификатор ? после названия типа означает, что данное поле является опциональным (необязательным, может иметь значение NULL);
  • модификатор [] после названия типа означает, что значением данного поля является список (массив). Такое поле не может быть опциональным;
  • префикс @ означает атрибут поля, а префикс @@ — атрибут блока (модели, таблицы). Некоторые атрибуты принимают параметры;
  • атрибут @id означает, что данное поле является первичным (основным) ключом таблицы (PRIMARY KEY) (идентификатор модели). Такое поле не может быть опциональным;
  • атрибут @default присваивает полю указанное значение по умолчанию (при отсутствии значения поля) (DEFAULT). Дефолтными могут быть статические значения (42, hi) или значения, генерируемые функциями autoincrement, dbgenerated, cuid, uuid и now (функции атрибутов; см. ниже);
  • атрибут @unique означает, что значение поля должно быть уникальным в пределах таблицы (UNIQUE). Таблица должна иметь хотя бы одно поле @id или @unique;
  • атрибут @relation указывает на существование отношений между таблицами. В данном случае между таблицами users и posts существуют отношения один-ко-многим (one-to-many, 1-n) — у одного пользователя может быть несколько постов (FOREIGN KEY / REFERENCES) (об отношениях мы поговорим отдельно);
  • атрибут @updatedAt обновляет поле текущими датой и временем при любой модификации записи;
  • у нас имеется перечисление (enum), значения которого используются в качестве значений поля role модели User (значением по умолчанию является USER);
  • атрибут @@map привязывает название модели к названию таблицы в БД. @@map не меняет название таблицы в БД и модели в генерируемом клиенте.

Типы данных

Допустимыми в названиях полей являются следующие символы: [A-Za-z][A-Za-z0-9_]*.

  • String — строка переменной длины (для PostgreSQL — это тип text);
  • Boolean — логическое значение: true или false (boolean);
  • Int — целое число (integer);
  • BigIntBigInt (integer);
  • Float — число с плавающей точкой (запятой) (double precision);
  • Decimal (decimal(65,30));
  • DateTime — дата и время в формате ISO 8601;
  • Json — объект в формате JSON (jsonb);
  • Bytes (bytea).

Атрибут @db позволяет использовать типы данных, специфичные для одной или нескольких БД.

Атрибуты

Кроме упомянутых выше, в схеме можно использовать следующие атрибуты:

  • @@id — определяет составной (composite) первичный ключ таблицы, например, @@id[title, author] (в данном случае соответствующее поле будет называться title_author — это можно изменить);
  • @@unique — определяет составное ограничение уникальности (unique constraint) для указанных полей (такие поля не могут быть опциональными), например, @@unique([title, author]);
  • @@index — определяет индекс в БД (INDEX), например, @@index([title, author]);
  • @ignore, @@ignore — используется для обозначения невалидных полей и моделей, соответственно.

Функции атрибутов

  • auto — представляет дефолтные значения, генерируемые БД (только для MongoDB);
  • autoincrement — генерирует последовательные целые числа (SERIAL в PostgreSQL, не поддерживается MongoDB);
  • cuid — генерирует глобальный уникальный идентификатор на основе спецификации cuid;
  • uuid — генерирует глобальный уникальный идентификатор на основе спецификации UUID;
  • now — возвращает текущую отметку времени (timestamp) (CURRENT_TIMESTAMP в PostgreSQL);
  • dbgenerated — представляет дефолтные значения, которые не могут быть выражены в схеме (например, random()).

Подробнее о схеме можно почитать здесь.

Отношения

Атрибут @relation указывает на существование отношений между моделями (таблицами). Он принимает следующие параметры:

  • name?: string — название отношения;
  • fields?: [field1, field2, ...fieldN] — список полей текущей модели (в нашем случае это [author_id] модели Post); обратите внимание: само поле определяется отдельно);
  • references: [field1, field2, ...fieldN] — список полей другой модели (стороны отношений) (в нашем случае это [id] модели User).

В приведенной выше схеме полями, указывающими на существование отношений между моделями User и Post, являются поля posts и author. Эти поля существуют только на уровне Prisma, в БД они не создаются. Скалярное поле author_id также существует только на уровне Prisma — это внешний ключ (FOREIGN KEY), соединяющий Post с User.

Как известно, существует 3 вида отношений:

  • один-к-одному (one-to-one, 1-1);
  • один-ко-многим (one-to-many, 1-n);
  • многие-ко-многим (many-to-many, m-n).

Атрибут @relation является обязательным только для отношений 1-1 и 1-n.

Предположим, что в нашей схеме имеются такие модели:

model User {
  id      Int      @id @default(autoincrement())
  posts   Post[]
  profile Profile?
}

model Profile {
  id     Int  @id @default(autoincrement())
  user   User @relation(fields: [userId], references: [id])
  userId Int
}

model Post {
  id         Int        @id @default(autoincrement())
  author     User       @relation(fields: [authorId], references: [id])
  authorId   Int
  categories Category[]
}

model Category {
  id    Int    @id @default(autoincrement())
  posts Post[]
}

Вот что мы здесь видим:

  • между моделями User и Profile существуют отношения 1-1 — у одного пользователя может быть только один профиль;
  • между моделями User и Post существуют отношения 1-n — у одного пользователя может быть несколько постов;
  • между моделями Post и Category существуют отношения m-n — один пост может принадлежать к нескольким категориям, в одну категорию может входить несколько постов.

Подробнее об отношениях можно почитать здесь.

Клиент

Импортируем и создаем экземпляр клиента Prisma:

import { PrismaClient } from '@prisma/client'

const prisma = new PrismaClient()

export default prisma

Иногда может потребоваться делать так:

const Prisma = require('prisma')

const prisma = new Prisma.PrismaClient()

module.exports = prisma

Запросы

findUnique

findUnique позволяет извлекать единичные записи по идентификатору или уникальному полю.

Сигнатура

findUnique({
  where: condition,
  select?: fields,
  include?: relations,
  rejectOnNotFound?: boolean
})

Модификатор ? означает, что поле является опциональным.

  • condition — условие для выборки;
  • fields — поля для выборки;
  • relations — отношения (связанные поля) для выборки;
  • rejectOnNotFound — если имеет значение true, при отсутствии записи выбрасывается исключение NotFoundError. Если имеет значение false, при отсутствии записи возвращается null.

Пример

async function getUserById(id) {
  try {
    const user = await prisma.user.findUnique({
      where: {
        id
      }
    })
    return user
  } catch(e) {
    onError(e)
  }
}

findFirst

findFirst возвращает первую запись, соответствующую заданному критерию.

Сигнатура

findFirst({
  where?: condition,
  select?: fields,
  include?: relations,
  rejectOnNotFound?: boolean,
  distinct?: field,
  orderBy?: order,
  cursor?: position,
  skip?: number,
  take?: number
})
  • distinct — фильтрация по определенному полю;
  • orderBy — сортировка по определенному полю и в определенном порядке;
  • cursor — позиция начала списка (как правило, id или другое уникальное значение);
  • skip — количество пропускаемых записей;
  • take — количество возвращаемых записей (в данном случае может иметь значение 1 или -1: во втором случае возвращается последняя запись.

Пример

async function getLastPostByAuthorId(author_id) {
  try {
    const post = await prisma.post.findFirst({
      where: {
        author_id
      },
      orderBy: {
        created_at: 'asc'
      },
      take: -1
    })
    return post
  } catch(e) {
    onError(e)
  }
}

findMany

findMany возвращает все записи, соответствующие заданному критерию.

Сигнатура

findMany({
  where?: condition,
  select?: fields,
  include?: relations,
  rejectOnNotFound?: boolean,
  distinct?: field,
  orderBy?: order,
  cursor?: position,
  skip?: number,
  take?: number
})

Пример

async function getAllPostsByAuthorId(author_id) {
  try {
    const posts = await prisma.post.findMany({
      where: {
        author_id
      },
      orderBy: {
        updated_at: 'desc'
      }
    })
    return posts
  } catch(e) {
    onError(e)
  }
}

create

create создает новую запись.

Сигнатура

create({
  data: _data,
  select?: fields,
  include?: relations
})
  • _data — данные создаваемой записи.

Пример

async function createUserWithProfile(data) {
  const { email, password, firstName, lastName, age } = data
  try {
    const hash = await argon2.hash(password)
    const user = await prisma.user.create({
      data: {
        email,
        hash,
        profile: {
          create: {
            first_name: firstName,
            last_name: lastName,
            age
          }
        }
      },
      select: {
        email: true
      },
      include: {
        profile: true
      }
    })
    return user
  } catch(e) {
    onError(e)
  }
}

update

update обновляет существующую запись.

Сигнатура

update({
  data: _data,
  where: condition,
  select?: fields,
  include?: relations
})

Пример

async function updateUserById(id, changes) {
  const { email, age } = changes
  try {
    const user = await prisma.user.update({
      where: {
        id
      },
      data: {
        email,
        profile: {
          update: {
            age
          }
        }
      },
      select: {
        email: true
      },
      include: {
        profile: true
      }
    })
    return user
  } catch(e) {
    onError(e)
  }
}

upsert

upsert обновляет существующую или создает новую запись.

Сигнатура

upsert({
  create: _data,
  update: _data,
  where: condition,
  select?: fields,
  include?: relations
})

Пример

async function updateOrCreateUser(data) {
  const { userName, email, password } = data
  try {
    const hash = await argon2.hash(password)
    const user = await prisma.user.create({
      where: { user_name: userName },
      update: {
        email,
        hash
      },
      create: {
        email,
        hash,
        user_name: userName
      },
      select: { user_name: true, email: true }
    })
    return user
  } catch(e) {
    onError(e)
  }
}

delete

delete удаляет существующую запись по идентификатору или уникальному полю.

Сигнатура

delete({
  where: condition,
  select?: fields,
  include?: relations
})

Пример

async function removeUserById(id) {
  try {
    await prisma.user.delete({
      where: {
        id
      }
    })
  } catch(e) {
    onError(e)
  }
}

createMany

createMany создает несколько записей с помощью одной транзакции (о транзакциях мы поговорим отдельно).

Пример

createMany({
  data: _data[],
  skipDuplicates?: boolean
})
  • _data[] — данные для создаваемых записей в виде массива;
  • skipDuplicates — при значении true создаются только уникальные записи.

Пример

// предположим, что `users` - это массив объектов
async function createUsers(users) {
  try {
    const users = await prisma.user.createMany({
      data: users
    })
    return users
  } catch(e) {
    onError(e)
  }
}

updateMany

updateMany обновляет несколько существующих записей за один раз и возвращает количество (sic) обновленных записей.

Сигнатура

updateMany({
  data: _data[],
  where?: condition
})

Пример

async function updateProductsByCategory(category, newDiscount) {
  try {
    const count = await prisma.product.updateMany({
      where: {
        category
      },
      data: {
        discount: newDiscount
      }
    })
    return count
  } catch(e) {
    onError(e)
  }
}

deleteMany

deleteMany удаляет несколько записей с помощью одной транзакции и возвращает количество удаленных записей.

Сигнатура

deleteMany({
  where?: condition
})

Пример

async function removeAllPostsByUserId(author_id) {
  try {
    const count = await prisma.post.deleteMany({
      where: {
        author_id
      }
    })
    return count
  } catch(e) {
    onError(e)
  }
}

count

count возвращает количество записей, соответствующих заданному критерию.

Сигнатура

count({
  where?: condition,
  select?: fields,
  cursor?: position,
  orderBy?: order,
  skip?: number,
  take?: number
})

Пример

async function countUsersWithPublishedPosts() {
  try {
    const count = await prisma.user.count({
      where: {
        post: {
          some: {
            published: true
          }
        }
      }
    })
    return count
  } catch(e) {
    onError(e)
  }
}

aggregate

aggregate выполняет агрегирование полей.

Сигнатура

aggregate({
  where?: condition,
  select?: fields,
  cursor?: position,
  orderBy?: order,
  skip?: number,
  take?: number,

  _count: count,
  _avg: avg,
  _sum: sum,
  _min: min,
  _max: max
})
  • _count — возвращает количество совпадающих записей или не null-полей;
  • _avg — возвращает среднее значение определенного поля;
  • _sum — возвращает сумму значений определенного поля;
  • _min — возвращает наименьшее значение определенного поля;
  • _max — возвращает наибольшее значение определенного поля.

Пример

async function getAllUsersCountAndMinMaxProfileViews() {
  try {
    const result = await prisma.user.aggregate({
      _count: {
        _all: true
      },
      _max: {
        profileViews: true
      },
      _min: {
        profileViews: true
      }
    })
    return result
  } catch(e) {
    onError(e)
  }
}

groupBy

groupBy выполняет группировку полей.

Сигнатура

groupBy({
  by?: by,
  having?: having,

  where?: condition,
  orderBy?: order,
  skip?: number,
  take?: number,

  _count: count,
  _avg: avg,
  _sum: sum,
  _min: min,
  _max: max
})
  • by — определяет поле или комбинацию полей для группировки записей;
  • having — позволяет фильтровать группы по агрегируемому значению.

Пример

В следующем примере мы выполняем группировку по country / city, где среднее значение profileViews превышает 100, и возвращаем общее количество (_sum) profileViews для каждой группы. Запрос также возвращает количество всех (_all) записей в каждой группе и все записи с не null значениями поля city в каждой группе:

async function getUsers() {
  try {
    const result = await prisma.user.groupBy({
      by: ['country', 'city'],
      _count: {
        _all: true,
        city: true
      },
      _sum: {
        profileViews: true
      },
      orderBy: {
        country: 'desc'
      },
      having: {
        profileViews: {
          _avg: {
            gt: 100
          }
        }
      }
    })
    return result
  } catch(e) {
    onError(e)
  }
}

Пожалуй, это все, о чем я хотел рассказать вам в первой части.

Благодарю за внимание и happy coding!


  1. Каталог
  2. GSM сигнализация

  3. GSM-сигнализация с автономным питанием

  4. Датчики для автономной GSM сигнализации

  5. Призма-С

Призма-С Радиоканальный комбинированный оповещатель (свет + сирена) для EXPRESS GSM вер.2.

1 год гарантии

  • Производитель: Сибирский Арсенал
  • Код товара: 406-348

Сибирский Арсенал Призма-С

1082 просмотра

2780.00 ₽

Рекомендованная цена

2 490 ₽

Спецпредложение до 28.09.2023


Ограничение заказа:

Для данного товара действуют ограничения: Общая сумма заказа должна быть более 3 т.р.


Наличие:

Наличие и срок поставки уточняйте у менеджеров


  • Описание
  • Доставка
  • Документация
  • Отзывы
  • Тех. консультация

Радиоканальный комбинированный оповещатель (свет + сирена) для EXPRESS GSM вер.2.

Оповещатель комбинированный радиоканальный «Призма-С» (сирена) предназначен для тревожного оповещения в виде световых и звуковых сигналов.«Призма-С» работает с сигнализаторами «Express GSM» вар.2, «Photo Express GSM», «Photo Express SOLO», c серией приборов «Express Power» и др.«Призма-С» активируется при получении тревожного сигнала от сигнализатора, в котором она прописана и начинает подавать световую индикацию и издавать громкий звук. Выключится сирена автоматически через 1 минуту или как только сигнализатор будет снят с охраны.

Основные особенности Призма-С:

  • Малогабаритный пластиковый корпус
  • Беспроводное подключение
  • Длительная автономная работа от батареи питания
  • Мощная сирена и хорошая видимость светового сигнала в условиях засветки.

Технические характеристики:

Тип батареи питания

литиевая батарея CR123A 3.0 В

Уровень звукового давления (1±0.05), м

85…95 дБ

Время работы батареи питания

12 месяцев

Диапазон рабочих температур

от -10 до 50 °C

Габаритные размеры

92х142х44 мм

Вес

0.1 кг

* Срок доставки указан для товара в наличии на складе в Москве

Отзывы:

Ваш отзыв может быть первым!

С этим товаром часто покупают:

Свето-звуковой радиоканальный оповещатель «Призма-С» (беспроводная сирена) предназначен для тревожного оповещения в виде световых и звуковых сигналов.

«Призма-С» работает с сигнализаторами «Express GSM» версия2, «Express GSM mini», «Photo Express GSM», «Photo Express SOLO», c серией приборов «Express Power» и др.

«Призма-С» активируется при получении тревожного сигнала от сигнализатора, в котором она прописана и начинает подавать световую индикацию и издавать громкий звук. Выключится сирена автоматически через 1 минуту или как только сигнализатор будет снят с охраны.

  • Малогабаритный пластиковый корпус
  • Беспроводное подключение
  • Длительная автономная работа от батареи питания
  • Мощная сирена и хорошая видимость светового сигнала в условиях засветки.
Тип батареи питания литиевая батарея CR123A 3,0 В
Уровень звукового давления, не менее 85 дБ
Степень защиты, не менее IP41
Диапазон рабочих температур от -10 до 50 °C
Габаритные размеры, не более 142х92х44 мм
Масса, не более 0,2 кг

Кабинет руководителя «ПРИЗМА ДИРЕКТ»

  • Характеристики
  • Базовый комплект
  • Примеры планировок

Серия мебели

Призма Директ

Каркасы тумб и шкафов

32 мм

Направляющие ящиков

Роликовые

Кромка рабочих поверхностей

ABC 2 мм

Все характеристики

1
Стол руководителя 180/1metL вертик панель ДСП

79 280 ₽

2
Тумба приставная 207L

37 140 ₽

3
Шкаф закрытый для одежды 228/1од

39 140 ₽

4
Шкаф стеклянный для документов 224

92 100 ₽

5
Шкаф для документов с открытыми полками 231/1

28 130 ₽

Самовывоз: 25 сентября

Доставка и сборка

Перейти к прайс-листу
Онлайн-показ

Преимущества модели

Регулировка столов по высоте

Плита ЛДСП 25 мм

Программа «Склад»

Примеры планировок

Прайс-лист серии «ПРИЗМА ДИРЕКТ»

Описание

  • Описание
  • Характеристики
  • Дизайн-проект
  • Госзаказчикам

Четкие формы, прямые линии, фурнитура, выполненная в едином цвете с металлическим каркасом, подчеркивают стильный лаконичный дизайн кабинета руководителя PRIZMA DIRECT. Особая фактура покрытия с имитацией под натуральное дерево придадут вашему кабинету индивидуальность.

ПРЕИМУЩЕСТВА СЕРИИ PRIZMA DIRECT:

  • единый стиль с серией PRIZMA для персонала;
  • эксклюзивный металлический каркас;
  • интерьер в стиле минимализм.

Материалы: 

  • рабочие поверхности – 32 мм ЛДСП;
  • кромка рабочих поверхностей – 2 мм ABS;
  • каркасы столов – металлические опоры прямоугольного сечения 70х20 в цвете «алюминий»;
  • каркасы приставных тумб – 32 мм ЛДСП, фасад – 18 мм;
  • топы приставных тумб – 32 мм ЛДСП;
  • ручки – пластик цвета «алюминий»;
  • направляющие ящиков – роликовые;
  • соединительная фурнитура – 3-х компонентная эксцентриковая стяжка.

Столы

Столешницы рабочих и конференц-столов изготовлены из 32 мм ЛДСП в основном цвете с двухсторонним антибликовым фактурным покрытием и кромкой 2 мм ABS. Оригинальные металлические регулируемые по высоте опоры столов прямоугольного сечения, 70х20 мм, изготовлены в цвете «алюминий». Рамочная и угловая опоры столов соединены между собой с помощью траверса, изготовленного из металла 40х20 мм. Передние панели рабочих столов изготовлены из 0,6 мм перфорированного металла в цвете «алюминий» и крепятся к каркасу при помощи угловых металлических кронштейнов. Ручки пластиковые, цвета «алюминий». 
В производстве всех элементов используется высококачественная ЛДСП производства Италии.

Тумбы

Топы приставных тумб изготовлены из 32 мм ЛДСП в основном цвете с двухсторонним антибликовым фактурным покрытием и кромкой 2 мм ABS. Каркасы тумб изготовлены из 32 мм ЛДСП в основном цвете с кромкой 2 мм ABS. Фасады тумб изготовлены из 18 мм ЛДСП в основном цвете. Опоры стационарных тумб регулируются по высоте с учетом неровностей пола. Ящики установлены на металлические направляющие полного выдвижения с нейлоновыми роликами, обеспечивающими плавный бесшумный ход. Мобильные тумбы имеют центральный замок для одновременного закрывания всех ящиков и установлены на роликовые опоры. Ключ имеет возможность складываться. Ручки пластиковые, цвета «алюминий». В производстве всех элементов используется высококачественная ЛДСП производства Италии.

Упаковка и сборка

Для соединения деталей используется особо прочная 3-х компонентная стяжка с эксцентриком. Вся мебель, кроме тумб, поставляется в разобранном виде, упакованная в гофрокартон и защитную термоусадочную пленку. Тумбы поставляются в собранном виде, упакованные в гофрокартон и защитную термоусадочную пленку.

Серия мебели

Призма Директ

Каркасы тумб и шкафов

32 мм

Направляющие ящиков

Роликовые

Кромка рабочих поверхностей

ABC 2 мм

Тон мебели

Светлый/темный

Как мы создаем ваш дизайн-проект

  1. Комплектуем. Подбираем офисную мебель (кабинеты для руководителей и оперативную мебель для персонала), металлическую мебель (шкафы, стеллажи, картотеки, сейфы), а так же мебель для баров и ресторанов.
  2. Проектируем. После беседы и уточнения всех деталей с клиентом, разрабатываем цветные, реалистичные 3D-визуализации и презентуем их Вам для внесения правок и дополнений.
  3. Присылаем готовый бесплатный дизайн-проект. В течение нескольких часов Вы получаете расстановку мебели в вашем офисе.

Мы имеем большой опыт и готовы реализовать проекты любой сложности, выполняем доставку и сборку мебели, обеспечиваем гарантию на свою работу. Кроме этого, условия сотрудничества максимально просты и прозрачны. Если есть вопросы или нужна квалифицированная помощь, то стоит обратиться к нашему сотруднику. 

Наши работы вы можете найти на нашем сайте в разделе ПОРТФОЛИО

Остались вопросы? Напишите нам!

Мы на связи онлайн
с 9:00 до 18:00

Цель Контекс — экономия вашего времени и средств

Для достижения этих целей наши специалисты:

  • помогут вам с выбором офисной мебели в соответствии с Вашими потребностями и бюджетом;
  • проведут все необходимые замеры;
  • разработают дизайн-проект расстановки мебели и оборудования;
  • подготовят техническое задание (полное соответствие 44-ФЗ и 223-ФЗ);
  • предоставят 3 коммерческих предложения от компаний партнёров.

Контекс имеет возможность выполнять весь комплекс работ по поставке мебели и оборудования:

  • разработка дизайн-проекта расстановки мебели и оборудования;
  • производство офисной мебели и кресел;
  • производство нестандартной мебели;
  • поставка мягкой мебели и металлической мебели производственно-технического назначения;
  • доставка и сборка мебели на объекте «под ключ».

Посмотреть видео

1 мин 02 сек

Качество мебели Futura

Качество изготовления тумб

Все тумбы поставляются в собранном виде упакованные в гофрокартон и защитную термоусадочную пленку.

Чтобы избежать ошибок при сборке мебели вручную на месте, наши профессионалы собирают офисные тумбы (самое сложное изделие в сборке из всего комплекта офисной мебели) на фабрике, на современном деревообрабатывающем центре. 

В процессе сборки все детали в местах соединения после крепления их крепежными элементами дополнительно проклеиваются, что гарантирует надежность соединения, точность установки выдвижных ящиков, а также их плавный ход в процессе эксплуатации потребителями.

Качество изготовления шкафов

Для соединения деталей используется особо прочная 3-х компонентная стяжка с эксцентриком. Вся мебель, кроме тумб, поставляется в разобранном виде, упакованная в гофрокартон и защитную термоусадочную пленку.

В шкафах и столах используются регулируемые по высоте опоры (до 2,5 см).

Задние стенки шкафов изготовлены из двухстороннего ЛДСП толщиной 8 мм, что придаёт дополнительную жесткость шкафам. Жесткость необходима, чтобы в процессе эксплуатации распашные двери не провисали и не бились друг об друга.

Все стеклянные двери изготовлены из каленого, противоударного, травмобезопасного стекла. На фасадах шкафов крепятся специальные «пыльники» (уплотнители).

Уникальный складной ключ выполнен в одном цвете с ручками изделия.

На стационарных полках шкафов крепится специальная прорезиненная кромка, которая смягчает удар дверей о полки и делает процесс закрывания дверей шкафов бесшумным.

Сертификат ISO 9001:2000 и ГОСТы

При изготовлении применяются только экологически чистые материалы и комплектующие (класс эмиссии Е1 – уровень выделения фенола и формальдегида не превышает 0,01 мг/м3). Вся мебель сертифицирована органами ГОССТАНДАРТА (ГОСТ 16371-93; ГОСТ 19917-93), а в мае 2008 производство получило сертификат ISO 9001:2000 в системе TUV.

Гарантия

В течение 3-лет с момента продажи компания «Контекс» готова выполнить гарантийные обязательства перед своими клиентами в кратчайшие сроки, при этом срок службы мебели равен не менее 8-15 лет. На отдельные виды продукции гарантия достигает 15 лет.

Ниже перечислены основные особенности мебели для офиса FUTURA

  • Все торцовые части мебельных деталей отделываются только кромками ПВХ (от 0,6 мм до 3 мм).
  • Используется высококачественная импортная фурнитура.
  • В шкафах всех серий используется травмобезопасное тонированное или так называемое «сатиновое» стекло 5 мм.
  • Задние стенки шкафов выполнены из двухстороннего ЛДСП толщиной 8 мм.
  • На фасадах шкафов крепятся специальные «пыльники» (уплотнители).
  • На стационарных полках шкафов крепится специальная прорезиненная кромка, которая смягчает удар дверей о полки и делает процесс закрывания дверей шкафов бесшумным.
  • В столах, шкафах используются регулируемые по высоте опоры (до 2,5 см).
  • Во всех сериях (кроме «Practic», «Economic») в тумбах устанавливается центральный замок, ящики тумб выполнены на основе мета-боксов, для устойчивости тумб два колеса из четырех комплектуются специальными фиксаторами.
  • Шкафы во всех сериях можно изготавливать под единым топом (верхней крышкой).

Дно выдвижных ящиков в тумбах изготовлено из ЛДСП, вставленного в паз каркаса ящика, скреплено скобами и проклеено для того, чтобы в процессе эксплуатации оно не выпадало.


Дно выдвижных ящиков в тумбах изготовлено из ЛДСП, вставленного в паз каркаса ящика, скреплено скобами и проклеено для того, чтобы в процессе эксплуатации оно не выпадало.

Качество ящика другого производителя.


Качество ящика другого производителя.

 В шкафах всех серий используется травмобезопасное тонированное или так называемое "сатиновое" стекло 5 мм


В шкафах всех серий используется травмобезопасное тонированное или так называемое «сатиновое» стекло 5 мм

Шкаф другого производителя с дверцами из обычного стекла


Шкаф другого производителя с дверцами из обычного стекла

Задние стенки шкафов выполнены из двухстороннего ЛДСП толщиной 8 мм, что придаёт дополнительную жесткость шкафам.


Задние стенки шкафов выполнены из двухстороннего ЛДСП толщиной 8 мм, что придаёт дополнительную жесткость шкафам.

Задняя стенка шкафа альтернативного производителя


Задняя стенка шкафа альтернативного производителя

В тумбах устанавливается центральный замок.


В тумбах устанавливается центральный замок.

Во всех элементах серии используется складной ключ. Данная функция позволяет сохранить целостность ключа и замка во время эксплуатации.


Во всех элементах серии используется складной ключ. Данная функция позволяет сохранить целостность ключа и замка во время эксплуатации.

Все торцовые части мебельных деталей отделываются только кромками ПВХ (от 0,6 мм до 3 мм)


Все торцовые части мебельных деталей отделываются только кромками ПВХ (от 0,6 мм до 3 мм)

На фасадах шкафов крепятся специальные "пыльники" (уплотнители). А На стационарных полках шкафов крепится специальная прорезиненная кромка, которая смягчает удар дверей о полки и делает процесс закрывания дверей шкафов бесшумным.


На фасадах шкафов крепятся специальные «пыльники» (уплотнители). А На стационарных полках шкафов крепится специальная прорезиненная кромка, которая смягчает удар дверей о полки и делает процесс закрывания дверей шкафов бесшумным.

В столах, шкафах используются регулируемые по высоте опоры (до 2,5 см), что дает возможность регулировать высоту мебели, в зависимости от неровностей пола.


В столах, шкафах используются регулируемые по высоте опоры (до 2,5 см), что дает возможность регулировать высоту мебели, в зависимости от неровностей пола.

Мебель FUTURA собирается из итальянских комплектующих по макетам итальянских дизайнеров и отвечает всем требованиям современной и модной офисной мебели.


Мебель FUTURA собирается из итальянских комплектующих по макетам итальянских дизайнеров и отвечает всем требованиям современной и модной офисной мебели.

О компании «Futura»

«Futura» — ведущий производитель качественной мебельной продукции и успешно работает на российском рынке уже более 25 лет. Предлагает большой ассортимент товара по выгодным ценам и готовы удовлетворить все Ваши желания.

Производственные мощности мебельной корпорации расположились на независимой экономической территории в Калининградской области. Общая площадь производства занимает более 4,5 тысяч квадратных метров.

Реализуемая фабрикой мебель производится из итальянской фурнитуры на современных деревообрабатывающих центрах HOMAG и четко соответствует знаменитым своим безупречным качеством итальянским аналогам, но имеет более привлекательную цену.

Система цифрового видеоконтроля кассовых операций «ПРИЗМА» (Set Prisma) – это система комплексного видеоконтроля торгового предприятия. В поле ее действия – все зоны, где магазину может быть причинен ущерб. Система помогает выявить дисциплинарные нарушения и злоупотребления кассиров и других сотрудников магазина, обнаруживает противоправные действия покупателей, служит наглядным основанием для разрешения конфликтов между торговым предприятием и клиентом. Система контроля кассовых операций ПРИЗМА помогает уменьшить потери на расчетном узле, связанные с недобросовестностью или невнимательностью кассиров.

На физическом уровне стыковка с системой видеоконтроля предполагает подключение к единой локальной сети как объекта-источника событий (касса), так и компьютера с серверной частью системы «ПРИЗМА». Логическая стыковка предполагает восприятие серверной частью системы «ПРИЗМА» данных, отправленных объектом-источником событий, обработку этих данных и сохранение их в базе данных для последующего использования.

Конфигурирование модуля

Для подключения модуля «Призма» необходимо в директории /linuxcash/cash/conf/plugins создать файл с расширением .xml, в котором требуется указать идентификатор модуля, размещение плагина и прочие параметры. Например, /linuxcash/cash/conf/plugins/prisma.xml.

Чтобы проверить приходят ли сообщения на порт, необходимо в консоли выполнить команду:

Параметры модуля

Наименование Тип данных Возможные значения Описание
id строковый

Prisma

Уникальное наименование модуля

host

строковый Имя хоста или сетевой адрес сервера

port

целочисленный Целое положительное число Порт сервера
<objects>
    <object id="Prisma" plugin="/linuxcash/cash/plugins/libPrisma.so">

       <property name="host">
           <value>127.0.0.1</value>
       </property>

       <property name="port">
          <value>2000</value>
       </property>

    </object>
</objects>

Поддерживаемые события

Общий перечень событий, фиксируемых системой «ПРИЗМА», составляет несколько сотен. Кассовое решение Artix передает только следующие события:

  1. Блокировка кассы
  2. Регистрация пользователя
  3. Открытие чека
  4. Загрытие чека
  5. Добавление товара
  6. Сторнирование товара
  7. Переход в режим подытог
  8. Добавление оплаты
  9. Сторно оплаты
  10. Сдача
  11. Применение скидки
  12. X-отчет ФР
  13. Программный X-отчет
  14. Z-отчет
  15. Отмена привилегированной операции
  16. Просмотр суммы в денежном ящике
  17. Печать копии чека
  18. Не найден товар по штрих-коду

Понравилась статья? Поделить с друзьями:
  • Руководство по эксплуатации геоскан 201
  • Протаргол спрей инструкция по применению цена отзывы
  • Босс роял виагра инструкция по применению отзывы от мужчин
  • Как писать инструкцию по русскому языку 8 класс
  • Кресло гамак подвесное своими руками пошаговая инструкция из ткани