мета-данные страницы
  •  

Это старая версия документа!


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:

  1. 2-платеж по заказу,
  2. 3-начисление бонуса,
  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р будет потеряно, так как документа в марте о начислении не будет.

У Контраста нет начислений с несколькими дочерними записями, так что сумму будут получены правильные

Доработать вычисление бонусов !!!!!!!!!!!!!!!!!!!!!!!!! U_CORR_BAD_SUM_BONUS CALC_CLIENT_BONUS_REST

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:

  1. 2-платеж по заказу,
  2. 4-поступление на депозит,
  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 (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:

  1. 2-платеж по заказу,
  2. 4-поступление на депозит,
  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 (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:

  1. 2-платеж по заказу,
  2. 4-поступление на депозит,
  3. 5-инкассация
  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, 
  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))

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

Использование таблицы

Дополнительная информация