Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Возможно стоит сделать сущность «счёт» в значении invoice (а уже в счёте куча invoice_items со своими свойствами типа цены, ставки НДС, закрытия позиции актами/фактурами и т.д, в этих же invoice_items учитывать скидки, items завязывать на services).
Пополнение баланса — счёт с соотв. отметкой. При этом естественно оплаты учитывать отдельно (у примеру, половина пришла в одной банковской транзакции, половина в другой или вообще налом/взаимозачётом)
Перевод средств между договорами — счёт с соотв. отметкой с двух сторон.
Любая коррекция баланса — только через txn и отметкой о новом балансе и сумме.
Соответственно к транзакции и вяжется что это за транзакция (к примеру, отмена прошлой транзакции)
Обороты можно считать из транзакций (предусмотреть отметку включать в обороты или нет)
и вот какое у меня сложилось ощущение: схема перегружена.
Да, счет это счет, а платеж это платеж. Совершенно согласен. По счёту может быть и пять и десять платежей.
Я исхожу из того, что бизнес-взаимодействие идёт от счёта (или у вас ситуация не такая?).
Мне кажется, что по хорошему биллинг вообще не должен ничего знать про бухучёт.
Как правильно заметили ниже, реализацию «российской специфики» проще делать как «интеграцию с 1с».
И очень завязанной на российский бухучет, а не на бизнес смысл. Если система будет использоваться только в России, то все ок, однако если в будущем планируется выход в другие страны, то тогда все будет очень печально.
И еще, для различных отчетов и аналитики можно не создавать специальные таблицы (типа bill.saldo), для этого прекрасно подходят materialized views.
Забудьте про явное соответствие объект(сущность) — таблица. Все их нужно хранить в одном месте генерируя представление для БД.
Вообще АСР — это абстракции, абстракции и еще раз абстракции. И много-много DSL.
Посмотрите хотя бы на 1С, не к ночи она будет помянута.
Затем что все меняется быстрее, чем пишется код.
Сколько АСР я написал тут не имеет никакого значения.
Ну раз много что смотрели, то и сделали бы анализ. Вот такой подход, вот другой, вот критерии. Потом на основе анализа уже синтез под конкретное ТЗ, которое тоже надо выстрадать. Тогда я понимаю, будет статья. А пока маловато будет, маловато.
Но я бы таки за основу брал двойную запись.
Она дает значительную гибкость.
Проводка она не даром двойная. Это дает очень большую гибкость.
Наличие баланса позволяет легко проверить/восстановить целостность.
Целостность движения денег дает множество дополнительных управленческих отчетов.
Делаем из этого биллинга биллинг торговли. Слишком большие изменения выходят. Склады, закупочные цены…
Делаем биллинг ресторана. С себестоимостями и т.п., ведь надо и калькуляции и склад…
Нам ведь нужно управлять скидками? А значит нужна себестоимость. Хоть какая.
ABC-отчет нужен?
План счетов может быть абсолютно любой, а субсчета прекрасно привязываются к «договорам».
А если нам нужно делать еще один налог. Типа налог с продаж. Похож на НДС, но помимо НДС и с другой логикой?
универсальные ИД документов двигающих биллинг (например GUID + тип документа, и уже у каждого документа своя отдельная таблица, которую мы выбираем по типу документа, полученному по GUID).
1 — основа бухгалтерии это двойная запись. Любая проводка (экзотику оставим за скобками) состоит из трех основных полей: номер счета который дебетуем, номер счета который кредетуем и сумма. Т.е. у нас ВСЕГДА меняется два счета на одну сумму.
2 — термины «дебет и кредит» не являются синонимами слов «приход и расход». В половине случаев они меняются местами.
3 — счета не бывают «кредитовыми» и «дебетовыми». Так нельзя говорить потому что и пассивные и активные счета дебетуются и кредитуются. Так что у нас есть два вида счетов — Активные и Пассивные. Разницу в комментарии не описать, поэтому пока пропущу. Что важно — сумма активных счетов всегда равна сумме пассивных счетов. Это называется баланс. (Также баланс это список сумм на счетах которые мы тут считаем, и собственно эта самая цифра которая равна).
3 — счета не бывают «кредитовыми» и «дебетовыми». Так нельзя говорить потому что и пассивные и активные счета дебетуются и кредитуются. Так что у нас есть два вида счетов — Активные и Пассивные. Разницу в комментарии не описать, поэтому пока пропущу. Что важно — сумма активных счетов всегда равна сумме пассивных счетов. Это называется баланс. (Также баланс это список сумм на счетах которые мы тут считаем, и собственно эта самая цифра которая равна).
4 — Дебет у нас увеличивает активный счет, и уменьшает пассивный, кредит же наоборот уменьшает активный и увеличивает пассивный. Такая слегка запутывающая схема придумана для того, чтобы у нас сохранялся баланс и при этом у нас наша универсальная операция работала бы как при операциях между активным и пассивным счетом, так и между двумя активными или двумя пассивными…
5 — список наших счетов с их свойствами (актив/пассив) называется «план счетов»
6 — данная схема удобна не только для бухгалтерии где планы счетов регламентированны, но и для управленческого учета, где ты делаешь что хочешь, под свои задачи. Это важно. 1С-бухгалтерия это именно бухгалтерия…
Первой операцией у нас будет квитанция от вебмани о поступлении денег в пользу клиента «Иван».
Мы создаем документ «пополнение», со всеми реквизитами, и параллельно делаем следующие проводки:
Дебет активного счета «Средства на вебмани», Кредит пассивного «Доходы будущих периодов», субсчет «Счет клиента Иван», сумма == 100руб.
Следующим документом мы покупаем у ДЦ «Розочка» ресселерский акк, у которого рессурсов хватит на два таких клиента. Оплачиваем вебмани.
Проводки:
Дебит активного «Оплаченные хостинги», субсчет «ДЦ Розочка, ресселинг А», Кредит активного «Средства вебмани», сумма 50 руб.
Ну и третий документ — покупка клиентом хостинга на месяц и списание за него денег (Клиенту стоит 50руб). Проводки такие:
Дебит пассивного «Доходы будущих периодов», субсчет «Счет клиента Иван», Кредит активного «Оплаченные хостинги», субсчет «ДЦ Розочка, ресселинг А», сумма 25 руб.
Дебит пассивного «Доходы будущих периодов», субсчет «Счет клиента Иван», кредит пассивного «Нераспределенная прибыль», сумма 25руб.
Такая схема дает больше возможностей, при этом проще.
У нас всего три сущности было: Счет, Проводка и Документ.
Да, Документы бывают разных типов, но уже бизнеслогика, а скелет можно разместить в абстрактном классе.
1 — вы используете бухгалтерские термины там, где им не место, и таким образом, что это искажает смысл. Пишите уж «приход-расход», или что-то другое. Дебет и Кредит созданы именно для того, чтобы отразить это явление, когда у пассивных счетов это одно, а у активных другое… Плюс обычно под дебетом подразумевают НОМЕР дебетуемого счета. В общем тому кто понимает, оно немного неудобно, и запутывает. Тому же, кто не знает таких слов, так и подавно оно непонятно.
2 — Ваша схема при всех ее преимуществах заточена под довольно узкую сферу. Слишком ограниченная реализация.
Вы очень хорошо прописали многие классические ошибки. Например объяснили почему нужно сторнировать (корректирующая проводка в вашей терминологии), а не удалять, почему лучше делать ввод остатков, а не фиктивные платежи…
Но данное решение это частный случай, с планом счетов состоящим из одного внебалансового активного счета (хотя правильнее было его делать пассивным, но тут без особой разницы)…
Вы ошибочно разделяете биллинг и бухгатлерию, не оставив места управленческому учету. Тут есть несколько факторов:
стандартные, готовые управленческие решения нам могут не подходить, а поскольку в отличии от бухгалтерии этот вопрос не регламентирован государством, то мы можем иметь любые пожелания… писать с нуля? Отдельно? Третьей системой? Т.е. мы пишем биллинг, пишем отдельно от него управленческий учет, который дублирует биллинг, и частично бухгалтерию. Потом делаем синхронизацию этих трех систем… ну допустим.
Теперь вопрос — платежная система будет информацию отправлять и в биллинг и в упр.учет? Нет, в одно… а в какое? Очевидно что в биллинг, ведь иначе зачем он нам вообще? Ведь все данные биллинга в управленческом уже есть… из биллинга информация идет в управленческий учет, потом из него идет в бухгалтерию? Или сначала в бухгалтерию? Или и в бухгалтерию и в управленческий из биллинга? И во всех трех у нас будет своя цифра по счетам. Где-то не успели синхронизировать, где-то сбой… Рано или поздно с ростом сложности задач будет принято решение выкинуть эту урезанную прослойку под названием «биллинг» и перенести ее в управленческий учет.
Мне кажется (кажется это значит что могу ошибаться), что Вы плохо понимаете бухучет, и поэтому считаете, что его принципы используются только в бухгалтерии… Может вам будет проще, если я буду называть управленческий учет «черной бухгалтерией»? Хотя черный и отдает некоей незаконностью, что не всегда так, но может так понятнее будет.
Непонимание бухучета это проблема не бухучета или того кто не понимает, а того что нет адекватных материалов. может есть какие-то популярные статьи или учебники (наверняка есть), но в основном пишут просто сухие факты, от которых нифига не понятно. Я разобрался с бухучетом только когда потратил два часа на написание заметки в стиле «давайте изобретем бухучет», разбираясь зачем сделано так, а не иначе… Читая сухую информацию из справочника или википедии мы обычно пытаемся спроецировать ее на наше обычное понимание, и получается каша.
Для всего этого нужен управленческий учет.
Это как раз таки должна быть отдельная система с возможностью простого подключения источников данных.
большиство бухгалтеров что с этим работают к сожалению воспринимают схему как «это дано нам свыше»
А смысл делать его отдельно? Всё что есть в биллинге у нас дублируется в управленческом учете.
Единственный смысл, если биллинг и управ.учет делается на разных технологиях. Типа биллинг смотрит в Интернет, а внутренняя часть работает в виде компилируемого приложения а не в интранете…
Ага это вы про BI.
Честно говоря, со скидкой нифига не понял.
Она действует на весь лицевой счет, а не на конкретную услугу?
Или как?
И что, на каждое начисление создается еще и позиция в discount дабы отрозить скидку на это начисление?
Не проще ли эту информацию сразу в начислениях хранить?
Какую литературу можно почитать по архитектуре АСР?
ИМХО, Смысл АСР (биллинга) в том, чтобы посчитать, сколько стоит услуга для клиента в разрезе различных параметров: скидки, акции, бонусы, выходные/праздники, и т.д. от менеджеров, если есть необходимость, себестоимость услуги, либо её стоимость от сторонних поставщиков. Соответственно, в АСР должна быть система учета данных услуг с тарифными планами и прочим.
У Вас же представлена только та часть, что отвечает за фин. документы, дело полезное, но для полноценной АСР маловато будет.
Абонентская плата за услугу, по конкретному тарифному плану, с изменением статуса абонента при уходе баланса в минус, и просьбе абонента о доверительном платеже (допустим, 15 рублей), включает абонента на 10 дней до реальной оплаты АП. Сколько таблиц нужно добавить в Вашу схему, по Вашему мнению?
Если я правильно понимаю, то в нормальной структуре это одна таблица (и то, если ничего похожего еще нет)
Изменение статуса мне не очень понятно зачем, но это отдельное поле у клиента.
А почему собственно деньги «ненастоящие»?
Вполне себе настоящие. Просто клиент их у нас «одолжил».
Собственно чтобы не городить специфичные механизмы «активации пользователя», «особых статусов» и прочего проще считать их как отдельный вид пополнения. А дальше включается обычный механизм продления услуг и т.п.
доверительный платеж может быть на любую сумму в пределах 10% от суммы которую клиент уже успел нам заплатить за прошлые периоды.
При этом возвращать клиенту нужно будет на 10% больше.
Гасится долг либо при следующем пополнении счета, либо если пополнения не было, то через 15 дней после платежа, сумма вычитается со счета клиента, делая его отрицательным.
Повторный доверительный платеж без погашения прошлых невозможен.
Типовая схема биллинга