Работа со счетами

Счет можно создать с указанием данных о плательщике (адрес, телефон, имя) или без. В первом случае житель увидит счет в мобильном приложении и оттуда же сможет оплатить. Во втором - счет можно будет оплатить только по ссылке. Также счет можно напрямую привязать к пользователю. Это удобно делать, например, из мини-приложения. В этом случае житель так же увидит счет в мобильном приложении.

Анонимный счет

Минимальный набор полей, который в принципе необходим для создания счета, создает анонимный счет. Такой счет не виден в мобильном приложении и может быть оплачен только по ссылке.
  • dv
  • sender
  • organization организация, которая создает счет
  • toPay Общая сумма счета
  • rows Позиции, включенные в счет (услуги/товары). Это массив объектов вида:
json
{ "name": "Услуга 1", "count": 1, "toPay": "100", "isMin": false }
Поле isMin означает, что toPay - это минимальная цена (цена от). Ставится в false после окончательного согласования цены.
  • paymentType Тип оплаты. Возможные варианты: online и cash. Это поле носит скорее информационный характер. Всегда можно сформировать ссылку на оплату и при этом оплатить наличными.
  • status
Это статус счета. Возможные значения: draft, published, paid, canceled. Черновик невозможно оплатить и нельзя увидеть в мобильном приложении. Опубликованный счет нельзя редактировать, как и уже оплаченный.
graphql
mutation createInvoice { obj: createInvoice( data: { dv: 1, sender: { dv: 1, fingerprint: "playground" }, organization: {connect: {id: "e40b5367-49a8-4340-9eed-802538331326"}}, toPay: "100", rows: [{name: "Услуга 1", count: 1, toPay: "100", isMin: false}], paymentType: "online", status: "draft" } ) { id number status organization { id name } property { id address } unitName unitType toPay rows { name toPay count isMin currencyCode sku } createdAt updatedAt createdBy { id } updatedBy { id } deletedAt publishedAt paidAt } }

Счет для жителя

Чтобы счет был виден в мобильном приложении, нужно указать адрес плательщика. Это поля property, unitType и unitName. При наличии, можно указать имя и телефон жителя в полях clientName и clientPhone. Тогда к счету будет привязан контакт жителя (поле contact в ответе сервера). Если такой контакт уже добавлен, то привяжется он. Если такого контакта еще нет, то он будет создан и привязан к счету.
graphql
mutation createInvoice { obj: createInvoice( data: { dv: 1, sender: {dv: 1, fingerprint: "docs-demo"}, organization: {connect: {id: "e40b5367-49a8-4340-9eed-802538331326"}}, property: {connect: {id: "809bff2d-b1ff-485e-b2e9-33b4c5974d3b"}}, unitName: "3", unitType: flat, clientPhone: "+79999999997", clientName: "Пушкин", toPay: "200", rows: [{name: "тестовая строка", count: 1, toPay: "200", isMin: false}], paymentType: online, status: draft} ) { id number status contact { id name phone property { id address } unitType unitName } organization { id name } property { id address } unitName unitType toPay rows { name toPay count isMin currencyCode sku } createdAt updatedAt createdBy { id } updatedBy { id } deletedAt publishedAt paidAt } }

Счет от b2c мини-приложения

Счет может быть выставлен жителю с помощью мини-приложения. Запрос на создание счета отправляется от бэкенда мини приложения. Для этого мини-приложение должно быть авторизовано под сервисным пользователем (см. раздел аутентификация).
Сервисный пользователь мини-приложения будет иметь доступ к выставлению, редактированию и чтению счетов от имени организации (поле organization) после того как организация подключит мини-приложение (b2b часть).
Организация, указанная при создании счета в поле organization, будет видеть счет в разделе "Маркетплейс". Чтобы житель получил пуш-уведомление и увидел новый счет у себя в мобильном приложении, необходимо указать следующие поля:
  • client Идентификатор пользователя
  • property Дом, в котором зарегистрировался житель
  • unitType Тип помещение жителя
  • unitName Наименование помещения (номер квартиры)
graphql
mutation createInvoice { obj: createInvoice( data: { dv: 1, sender: {dv: 1, fingerprint: "docs-demo"}, organization: {connect: {id: "73b069e4-d807-4946-8725-88781e5d14ac"}}, property: {connect: {id: "2c398c8d-da20-4b4f-b8c8-a19df803e21d"}}, client: {connect: {id: "cf609bd7-5bb8-498d-865d-943f96bf11fc"}}, unitType: flat, unitName: "13", rows: [{name: "тестовая строка 3", count: 1, toPay: "203", isMin: false}], paymentType: online, status: published } ) { id number status organization { id name } toPay rows { name toPay count isMin currencyCode sku } createdAt updatedAt createdBy { id } updatedBy { id } deletedAt publishedAt paidAt } }

Редактирование счета

Для редактирование счета используется стандартный метод обновления объекта.
Пример изменения списка услуг:
graphql
mutation updateInvoice { obj: updateInvoice( id: "34b5c321-c086-4540-bca8-18f23580be7d" data: { dv: 1, sender: {dv: 1, fingerprint: "playground"}, rows: [{name: "Другая услуга", count: 1, toPay: "100", isMin: false}] } ) { id number status organization { id name } property { id address } unitName unitType toPay rows { name toPay count isMin currencyCode sku } createdAt updatedAt createdBy { id } updatedBy { id } deletedAt publishedAt paidAt } }

Публикация счета

После публикации счет можно увидеть в мобильном приложении и оплатить. Если в счете есть позиции с неявной ценой (isMin=true), то такой счет невозможно опубликовать. Публикация - это редактирование счета, изменяется поле status на значение published.

Ссылка на оплату

Шаблон ссылки на оплату выглядит вот так:
https://condo.d.doma.ai/payment-link?su={successUrl}&fu={failureUrl}&i={invoiceId}
ПолеОписаниеТип/форматПример
successUrlАдрес, на который будет перенаправлен пользователь при успешной оплатеstring, url encodedhttps%3A%2F%2Fcondo.d.doma.ai%2Fsuccess
failureUrlАдрес, на который будет перенаправлен пользователь, если оплата не удаласьstring, url encodedhttps%3A%2F%2Fcondo.d.doma.ai%2Ffailure
invoiceIdИдентификатор счетаstring, UUID14d5f5c9-de39-4d02-9116-6a2e501e54e1
При переходе по ссылке будут созданы сущности эквайринга и пользователь будет перенаправлен на страницу ввода банковской карты. После оплаты пользователь будет перенаправлен на страницу результата (успех/ошибка)