мета-данные страницы
Это старая версия документа!
A_Payments
Проект «AnaliticDB»
Платежи - Платежи - первичные документы
Назначение
Нерепликационная таблица A_Payments из БД Срезы содержит изменеия сумм заказа и величину задолженности.
Поля таблицы
select ap.id , -- ВнНомер ap.date_imp, -- Дата импорта записи ap.doc_id , -- Документ платежный (docs.doc_id) ap.doc_date, -- Дата платежа ap.doc_num , -- № платежа ap.debet , -- Сумма платежа (Приход) ap.kredit , -- Сумма возврата (Расход) ap.sclad_id, -- Приемный пункт (Склад приемки) берется из dor.sclad_kredit_id -- docs_bank, docs_card, docs_bonus ap.kassa_id, -- Касса, -- docs_card, docs_kassa, docs_bonus ap.dor_id , -- Заказ (docs_order.id) ap.type_id , -- Тип платежа -- 1-прочее -- 2-платеж по заказу, -- 3-начисление бонуса, -- 4-поступление на депозит, -- 5-инкассация ap.case_id , -- Форма оплаты -- 1-docs_bonus, -- 2-docs_deposit, -- 3-docs_bank, -- 4-docs_card, -- 5-docs_kassa ap.doc_case_id -- В зависимости от формы оплаты id из таблицы docs_kassa, docs_card, docs_deposit, docs_bonus, docs_bank from a_Payments ap -- Платежи
Формирование таблицы
Последовательно добавляются в таблицу a_Payments платежи из таблиц: docs_bonus, docs_deposit, docs_bank, docs_card, docs_kassa
docs_bonus
Платежи разделяются по типам платежа type_id:
- 2-платеж по заказу,
- 3-начисление бонуса,
- 1-прочее
select d.doc_id as doc_id, d.doc_date as doc_date, d.doc_num as doc_num, coalesce(dop.doc_type,d.doc_type) as doc_type_id, coalesce(d.debet,0) as debet, coalesce(d.kredit,0) as kredit, d.firm_id as firm_id, d.contragent_id as contr_id, dor.sclad_kredit_id as sclad_id, null as kassa_id, dop.doc_order_id as dor_id, case when (z.bonus_id is not null) then 2 when (z.bonus_id is null) and (z.parent_bonus_id is null) then 3 else 1 end as type_id, 1 as case_id, z.id as doc_case_id from docs d left join docs_bonus z on z.doc_id=d.doc_id left join doc_order_pays dop on dop.doc_id=d.doc_id left join docs_order dor on dor.id=dop.doc_order_id where (d.doc_date>=:p1) and (d.doc_date<=:p2) and (z.id is not null) and (((z.bonus_id is not null) and (dop.id is not null) and (dop.doc_bonus_id is not null) and (dor.id is not null)) or ((z.bonus_id is null) and (z.parent_bonus_id is null)))
Платежи бонусами по заказу берутся из дочерних документов (z.bonus_id is not null) при этом исключаются родительские записи.
Начисление бонусов берется из родительской записи и соответственно дата начисления совпадает с датой родителького документа.
Фактически при начислении бонусов либо создаются дочерние записи, либо нет. Причем в одной базе возможны оба варианта. Поэтому нужно постоянно проверять наличие дочерних записей. Иначе при суммирований по DOCS будут удваиваться суммы начислений при суммировании всех записей, если создаются дочерние записи, или теряться суммы начислений при симмировании только дочерних, если дочерние записи отсутствуют. Если суммировать начисления бонусов по родительским записям, то при наличии дочерних записей возникает проблема импорта из времени начисления. Пусть начисления выполнялись 02.02.2019 100р и 02.03.2019 200р. При импорте данных за фераль будет получена сумма 100р, а в марте начисление 200р будет потеряно, так как документа в марте о начислении не будет.
docs_deposit
В таблице docs_deposit отмечаются только оплаты заказов с депозита (type_id=2).
Поступление средств на депозит выполняется через таблицы docs_bank, docs_card, docs_kassa.
select d.doc_id as doc_id, d.doc_date as doc_date, d.doc_num as doc_num, coalesce(dop.doc_type,d.doc_type) as doc_type_id, coalesce(d.debet,0) as debet, coalesce(d.kredit,0) as kredit, d.firm_id as firm_id, d.contragent_id as contr_id, dor.sclad_kredit_id as sclad_id, null as kassa_id, dop.doc_order_id as dor_id, 2 as type_id, 2 as case_id, z.id as doc_case_id from docs d left join docs_deposit z on z.doc_id=d.doc_id left join doc_order_pays dop on dop.doc_id=d.doc_id left join docs_order dor on dor.id=dop.doc_order_id where (d.doc_date>=:p1) and (d.doc_date<=:p2) and (z.id is not null) and (dop.id is not null) and (dop.doc_deposit_id is not null) and (dor.id is not null)
docs_bank
Платежи разделяются по типам платежа type_id:
- 2-платеж по заказу,
- 4-поступление на депозит,
- 1-прочее
select d.doc_id as doc_id, d.doc_date as doc_date, d.doc_num as doc_num, coalesce(dop.doc_type,d.doc_type) as doc_type_id, coalesce(d.debet,0) as debet, coalesce(d.kredit,0) as kredit, d.firm_id as firm_id, d.contragent_id as contr_id, dor.sclad_kredit_id as sclad_id, null as kassa_id, dop.doc_order_id as dor_id, case when (dop.id is not null) then 2 when (dop.id is null) and (z.is_deposit=1) then 4 else 1 end as type_id, 3 as case_id, z.id as doc_case_id from docs d left join docs_bank z on z.doc_id=d.doc_id left join doc_order_pays dop on dop.doc_id=d.doc_id left join docs_order dor on dor.id=dop.doc_order_id where (d.doc_date>=:p1) and (d.doc_date<=:p2) and (z.id is not null) and not ((dop.id is not null) and (dop.doc_bank_id is null))
В результате аварий могут появится «порченые» записи типа:
из таблицы docs есть ссылка на таблицу doc_order_pays (dop.id is not null), но нет ссылки из нее на таблицу docs (dop.doc_bank_id is null)
Условие для исключения «порченых» записей:
not ((dop.id is not null) and (dop.doc_bank_id is null))\\
docs_card
Платежи разделяются по типам платежа type_id:
- 2-платеж по заказу,
- 4-поступление на депозит,
- 1-прочее
select d.doc_id as doc_id, d.doc_date as doc_date, d.doc_num as doc_num, coalesce(dop.doc_type,d.doc_type) as doc_type_id, coalesce(d.debet,0) as debet, coalesce(d.kredit,0) as kredit, d.firm_id as firm_id, d.contragent_id as contr_id, dor.sclad_kredit_id as sclad_id, null as kassa_id, dop.doc_order_id as dor_id, case when (dop.id is not null) then 2 when (dop.id is null) and (z.is_deposit=1) then 4 else 1 end as type_id, 4 as case_id, z.id as doc_case_id from docs d left join docs_card z on z.doc_id=d.doc_id left join doc_order_pays dop on dop.doc_id=d.doc_id left join docs_order dor on dor.id=dop.doc_order_id where (d.doc_date>=:p1) and (d.doc_date<=:p2) and (z.id is not null) and not ((dop.id is not null) and (dop.doc_card_id is null))
Условие для исключения «порченых» записей:
not ((dop.id is not null) and (dop.doc_card_id is null))
docs_kassa
Платежи разделяются по типам платежа type_id:
- 2-платеж по заказу,
- 4-поступление на депозит,
- 5-инкассация
- 1-прочее
select d.doc_id as doc_id, d.doc_date as doc_date, d.doc_num as doc_num, coalesce(dop.doc_type,d.doc_type) as doc_type_id, coalesce(d.debet,0) as debet, coalesce(d.kredit,0) as kredit, d.firm_id as firm_id, d.contragent_id as contr_id, dor.sclad_kredit_id as sclad_id, z.kassa_id as kassa_id, dop.doc_order_id as dor_id, case when (dop.id is not null) and (dop.doc_kassa_id is not null) then 2 when (dop.id is null) and (z.is_deposit=1) then 3 when (dop.id is null) and (d.doc_type=30) then 4 else 1 end as type_id, 5 as case_id, z.id as doc_case_id, dop.id, dop.doc_bonus_id , dop.doc_deposit_id , dop.doc_bank_id , dop.doc_card_id , dop.doc_kassa_id , z.is_deposit from docs d left join docs_kassa z on z.doc_id=d.doc_id left join doc_order_pays dop on dop.doc_id=d.doc_id left join docs_order dor on dor.id=dop.doc_order_id where (d.doc_date>=:p1) and (d.doc_date<=:p2) and (z.id is not null) and not ((dop.id is not null) and (dop.doc_kassa_id is null))
Условие для исключения «порченых» записей:
not ((dop.id is not null) and (dop.doc_card_id is null))
Это может порождать ошибки в случае кассовых перемещений не связанных с инкассацией.