Обновить dags/OSV.py
This commit is contained in:
parent
77976033f3
commit
c127df2687
256
dags/OSV.py
256
dags/OSV.py
|
|
@ -2,7 +2,7 @@ import requests
|
||||||
import json
|
import json
|
||||||
import pandas as pd
|
import pandas as pd
|
||||||
import numpy as np
|
import numpy as np
|
||||||
from datetime import datetime
|
from datetime import datetime, timedelta
|
||||||
from requests.auth import HTTPBasicAuth
|
from requests.auth import HTTPBasicAuth
|
||||||
from sqlalchemy import create_engine
|
from sqlalchemy import create_engine
|
||||||
from airflow import DAG
|
from airflow import DAG
|
||||||
|
|
@ -32,117 +32,163 @@ def get_db_engine():
|
||||||
)
|
)
|
||||||
|
|
||||||
def read_data_1C(**kwargs):
|
def read_data_1C(**kwargs):
|
||||||
params = {"СписокСчетов": ["66","66.01","66.02", "66.03","66.04","66.21","66.22","66.23","66.24", "67","67.01","67.02", "67.03","67.04","67.21","67.22","67.23","67.24"]}
|
|
||||||
query = """ВЫБРАТЬ
|
|
||||||
ОстаткиОбороты.Счет,
|
|
||||||
ОстаткиОбороты.Субконто1,
|
|
||||||
ОстаткиОбороты.Субконто2,
|
|
||||||
ОстаткиОбороты.Организация,
|
|
||||||
ОстаткиОбороты.Субконто2.Номер КАК НомерДоговора,
|
|
||||||
ОстаткиОбороты.Субконто2.Дата КАК ДатаДоговора,
|
|
||||||
ОстаткиОбороты.Субконто2.СрокДействия КАК СрокДействияДоговора,
|
|
||||||
ОстаткиОбороты.Субконто1.Инн КАК ИннКонтрагента,
|
|
||||||
ОстаткиОбороты.Организация.Инн КАК ИннКлиента,
|
|
||||||
ОстаткиОбороты.СуммаОборот,
|
|
||||||
ОстаткиОбороты.СуммаОборотДт,
|
|
||||||
ОстаткиОбороты.СуммаОборотКт,
|
|
||||||
ОстаткиОбороты.СуммаКонечныйОстаток,
|
|
||||||
ОстаткиОбороты.СуммаКонечныйОстатокДт,
|
|
||||||
ОстаткиОбороты.СуммаКонечныйОстатокКт,
|
|
||||||
ОстаткиОбороты.СуммаКонечныйРазвернутыйОстатокДт,
|
|
||||||
ОстаткиОбороты.СуммаКонечныйРазвернутыйОстатокКт,
|
|
||||||
UUID(ОстаткиОбороты.Субконто2.Ссылка) КАК ИдентификаторДоговора,
|
|
||||||
UUID(ОстаткиОбороты.Субконто1.Ссылка) КАК ИдентификаторКонтрагента,
|
|
||||||
UUID(ОстаткиОбороты.Организация.Ссылка) КАК ИдентификаторКлиента
|
|
||||||
ИЗ
|
|
||||||
РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты КАК ОстаткиОбороты
|
|
||||||
ГДЕ
|
|
||||||
ОстаткиОбороты.Счет.Код В (&СписокСчетов)
|
|
||||||
"""
|
"""
|
||||||
|
Создает DataFrame с ежедневным календарем и останавливается на дате T-2
|
||||||
|
|
||||||
|
Параметры:
|
||||||
|
start_year (int): начальный год (по умолчанию 2019)
|
||||||
|
end_year (int): конечный год (по умолчанию 2025)
|
||||||
|
|
||||||
|
Возвращает:
|
||||||
|
pandas.DataFrame: DataFrame с колонками Год, Месяц, День
|
||||||
|
"""
|
||||||
|
start_year = 2019
|
||||||
|
# Вычисляем дату T-2 (текущая дата минус 2 дня)
|
||||||
|
t_minus_2 = datetime.now() - timedelta(days=2)
|
||||||
|
t_minus_2 = t_minus_2.replace(hour=0, minute=0, second=0, microsecond=0)
|
||||||
|
|
||||||
auth = HTTPBasicAuth('obmen', 'bOR2W7w4')
|
print(f"Текущая дата: {datetime.now().strftime('%Y-%m-%d')}")
|
||||||
response = requests.post(
|
print(f"Дата T-2: {t_minus_2.strftime('%Y-%m-%d')}")
|
||||||
# http://адрес сервера/название БД/hs/services/query?ProcessPostedRequest
|
# Создаем диапазон дат от начала до T-2
|
||||||
|
start_date = f'{start_year}-01-01'
|
||||||
|
|
||||||
|
date_range = pd.date_range(start=start_date, end=t_minus_2, freq='D')
|
||||||
|
|
||||||
|
# Создаем пустой список для хранения данных
|
||||||
|
calendar_data = []
|
||||||
|
params = {"СписокСчетов": ["66","66.01","66.02", "66.03","66.04","66.21","66.22","66.23","66.24", "67","67.01","67.02", "67.03","67.04","67.21","67.22","67.23","67.24"]}
|
||||||
|
# Проходим циклом по каждому дню
|
||||||
|
print("\nПрохождение по дням календаря:")
|
||||||
|
for i, date in enumerate(date_range):
|
||||||
|
query = f"""ВЫБРАТЬ
|
||||||
|
ОстаткиОбороты.Счет,
|
||||||
|
ОстаткиОбороты.Субконто1,
|
||||||
|
ОстаткиОбороты.Субконто2,
|
||||||
|
ОстаткиОбороты.Организация,
|
||||||
|
ОстаткиОбороты.Субконто2.Номер КАК НомерДоговора,
|
||||||
|
ОстаткиОбороты.Субконто2.Дата КАК ДатаДоговора,
|
||||||
|
ОстаткиОбороты.Субконто2.СрокДействия КАК СрокДействияДоговора,
|
||||||
|
ОстаткиОбороты.Субконто1.Инн КАК ИннКонтрагента,
|
||||||
|
ОстаткиОбороты.Организация.Инн КАК ИннКлиента,
|
||||||
|
ОстаткиОбороты.СуммаОборот,
|
||||||
|
ОстаткиОбороты.СуммаОборотДт,
|
||||||
|
ОстаткиОбороты.СуммаОборотКт,
|
||||||
|
ОстаткиОбороты.СуммаКонечныйОстаток,
|
||||||
|
ОстаткиОбороты.СуммаКонечныйОстатокДт,
|
||||||
|
ОстаткиОбороты.СуммаКонечныйОстатокКт,
|
||||||
|
ОстаткиОбороты.СуммаКонечныйРазвернутыйОстатокДт,
|
||||||
|
ОстаткиОбороты.СуммаКонечныйРазвернутыйОстатокКт,
|
||||||
|
UUID(ОстаткиОбороты.Субконто2.Ссылка) КАК ИдентификаторДоговора,
|
||||||
|
UUID(ОстаткиОбороты.Субконто1.Ссылка) КАК ИдентификаторКонтрагента,
|
||||||
|
UUID(ОстаткиОбороты.Организация.Ссылка) КАК ИдентификаторКлиента,
|
||||||
|
ОстаткиОбороты.Период КАК ДатаОтчета
|
||||||
|
ИЗ
|
||||||
|
РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты( ДАТАВРЕМЯ({date.year},{date.month},{date.day}), ДАТАВРЕМЯ({date.year},{date.month},{date.day}), Регистратор, , Счет.Код в (&СписокСчетов), , ) КАК ОстаткиОбороты
|
||||||
|
"""
|
||||||
|
|
||||||
url=r'http://192.168.1.75/chupd/hs/services/query?ProcessPostedRequest',
|
auth = HTTPBasicAuth('obmen', 'bOR2W7w4')
|
||||||
json={"query":query, "params": params},
|
response = requests.post(
|
||||||
auth=auth,
|
# http://адрес сервера/название БД/hs/services/query?ProcessPostedRequest
|
||||||
verify=False
|
|
||||||
)
|
|
||||||
|
|
||||||
data_from_1c = response.json()
|
url=r'http://192.168.1.75/chupd/hs/services/query?ProcessPostedRequest',
|
||||||
df = pd.DataFrame(data_from_1c['data'])
|
json={"query":query, "params": params},
|
||||||
engine = get_db_engine()
|
auth=auth,
|
||||||
table_name = 'oborotno_salbdovaya_vedomostb'
|
verify=False
|
||||||
|
)
|
||||||
|
|
||||||
field_mapping = {
|
data_from_1c = response.json()
|
||||||
# Основные поля
|
df = pd.DataFrame(data_from_1c['data'])
|
||||||
'Счет': 'schet',
|
engine = get_db_engine()
|
||||||
'Субконто1': 'subkonto1',
|
table_name = 'oborotno_salbdovaya_vedomostb'
|
||||||
'Субконто2': 'subkonto2',
|
|
||||||
'Организация': 'organizaciya',
|
|
||||||
'НомерДоговора': 'nomer',
|
|
||||||
'ДатаДоговора': 'date_begin',
|
|
||||||
'СрокДействияДоговора': 'date_end',
|
|
||||||
'ИннКонтрагента': 'inn_subkonto1',
|
|
||||||
'ИннКлиента': 'inn_organizaciya',
|
|
||||||
|
|
||||||
# Суммовые остатки и обороты
|
|
||||||
'СуммаОборот': 'summa_oborot',
|
|
||||||
'СуммаОборотДт': 'summa_oborot_dt',
|
|
||||||
'СуммаОборотКт': 'summa_oborot_kt',
|
|
||||||
'СуммаКонечныйОстаток': 'summa_konechnyy_ostatok',
|
|
||||||
'СуммаКонечныйОстатокДт': 'summa_konechnyy_ostatok_dt',
|
|
||||||
'СуммаКонечныйОстатокКт': 'summa_konechnyy_ostatok_kt',
|
|
||||||
'СуммаКонечныйРазвернутыйОстатокДт': 'summa_konechnyy_razvernutyy_ostatok_dt',
|
|
||||||
'СуммаКонечныйРазвернутыйОстатокКт': 'summa_konechnyy_razvernutyy_ostatok_kt',
|
|
||||||
|
|
||||||
#ID
|
field_mapping = {
|
||||||
'ИдентификаторДоговора': 'uid_subkonto2',
|
# Основные поля
|
||||||
'ИдентификаторКонтрагента': 'uid_subkonto1',
|
'Счет': 'schet',
|
||||||
'ИдентификаторКлиента': 'uid_organizaciya'
|
'Субконто1': 'subkonto1',
|
||||||
}
|
'Субконто2': 'subkonto2',
|
||||||
|
'Организация': 'organizaciya',
|
||||||
|
'НомерДоговора': 'nomer',
|
||||||
|
'ДатаДоговора': 'date_begin',
|
||||||
|
'СрокДействияДоговора': 'date_end',
|
||||||
|
'ИннКонтрагента': 'inn_subkonto1',
|
||||||
|
'ИннКлиента': 'inn_organizaciya',
|
||||||
|
|
||||||
|
# Суммовые остатки и обороты
|
||||||
|
'СуммаОборот': 'summa_oborot',
|
||||||
|
'СуммаОборотДт': 'summa_oborot_dt',
|
||||||
|
'СуммаОборотКт': 'summa_oborot_kt',
|
||||||
|
'СуммаКонечныйОстаток': 'summa_konechnyy_ostatok',
|
||||||
|
'СуммаКонечныйОстатокДт': 'summa_konechnyy_ostatok_dt',
|
||||||
|
'СуммаКонечныйОстатокКт': 'summa_konechnyy_ostatok_kt',
|
||||||
|
'СуммаКонечныйРазвернутыйОстатокДт': 'summa_konechnyy_razvernutyy_ostatok_dt',
|
||||||
|
'СуммаКонечныйРазвернутыйОстатокКт': 'summa_konechnyy_razvernutyy_ostatok_kt',
|
||||||
|
|
||||||
df = df.rename(columns=field_mapping)
|
#ID
|
||||||
with engine.begin() as conn:
|
'ИдентификаторДоговора': 'uid_subkonto2',
|
||||||
if not df.empty:
|
'ИдентификаторКонтрагента': 'uid_subkonto1',
|
||||||
conn.execute(f"CREATE TEMP TABLE temp_{table_name} AS SELECT * FROM public.{table_name} WHERE 1 = 0")
|
'ИдентификаторКлиента': 'uid_organizaciya'
|
||||||
df.to_sql(
|
|
||||||
f'temp_{table_name}',
|
#DATE
|
||||||
con=conn,
|
'ДатаОтчета': 'get_date'
|
||||||
if_exists='append',
|
}
|
||||||
index=False,
|
|
||||||
method='multi'
|
df = df.rename(columns=field_mapping)
|
||||||
)
|
with engine.begin() as conn:
|
||||||
conn.execute(f"DELETE FROM public.{table_name} where get_date = CURRENT_DATE::date::timestamp")
|
if not df.empty:
|
||||||
conn.execute(f"""
|
conn.execute(f"CREATE TEMP TABLE temp_{table_name} AS SELECT * FROM public.{table_name} WHERE 1 = 0")
|
||||||
INSERT INTO public.{table_name}
|
df.to_sql(
|
||||||
SELECT
|
f'temp_{table_name}',
|
||||||
schet
|
con=conn,
|
||||||
, subkonto1
|
if_exists='append',
|
||||||
, subkonto2
|
index=False,
|
||||||
, organizaciya
|
method='multi'
|
||||||
, case when nomer = '' then null else nomer end nomer
|
)
|
||||||
, case when TO_DATE(date_begin, 'DD.MM.YYYY') = '0001-01-01' then null else date_begin end date_begin
|
# conn.execute(f"DELETE FROM public.{table_name} where get_date = (SELECT DISTINCT get_date FROM temp_{table_name})")
|
||||||
, case when TO_DATE(date_end, 'DD.MM.YYYY') = '0001-01-01' then null else date_end end date_end
|
conn.execute(f"""
|
||||||
, inn_subkonto1 as inn_subkonto1
|
INSERT INTO public.{table_name}
|
||||||
, inn_organizaciya as inn_organizaciya
|
SELECT
|
||||||
, summa_oborot
|
schet
|
||||||
, summa_oborot_dt
|
, subkonto1
|
||||||
, summa_oborot_kt
|
, subkonto2
|
||||||
, summa_konechnyy_ostatok
|
, organizaciya
|
||||||
, summa_konechnyy_ostatok_dt
|
, case when nomer = '' then null else nomer end nomer
|
||||||
, summa_konechnyy_ostatok_kt
|
, case when TO_DATE(date_begin, 'DD.MM.YYYY') = '0001-01-01' then null else date_begin end date_begin
|
||||||
, summa_konechnyy_razvernutyy_ostatok_dt
|
, case when TO_DATE(date_end, 'DD.MM.YYYY') = '0001-01-01' then null else date_end end date_end
|
||||||
, summa_konechnyy_razvernutyy_ostatok_kt
|
, inn_subkonto1 as inn_subkonto1
|
||||||
, uid_subkonto2
|
, inn_organizaciya as inn_organizaciya
|
||||||
, uid_subkonto1
|
, summa_oborot
|
||||||
, uid_organizaciya
|
, summa_oborot_dt
|
||||||
, CURRENT_DATE::date::timestamp
|
, summa_oborot_kt
|
||||||
FROM temp_{table_name}
|
, summa_konechnyy_ostatok
|
||||||
--ON CONFLICT (schet, uid_subkonto2, uid_subkonto1, uid_organizaciya)
|
, summa_konechnyy_ostatok_dt
|
||||||
"""
|
, summa_konechnyy_ostatok_kt
|
||||||
)
|
, summa_konechnyy_razvernutyy_ostatok_dt
|
||||||
|
, summa_konechnyy_razvernutyy_ostatok_kt
|
||||||
|
, uid_subkonto2
|
||||||
|
, uid_subkonto1
|
||||||
|
, uid_organizaciya
|
||||||
|
, CURRENT_DATE::date::timestamp
|
||||||
|
FROM temp_{table_name}
|
||||||
|
ON CONFLICT (schet, uid_subkonto2, uid_subkonto1, uid_organizaciya, get_date)
|
||||||
|
DO UPDATE SET
|
||||||
|
subkonto1 = EXCLUDED.subkonto1,
|
||||||
|
subkonto2 = EXCLUDED.subkonto2,
|
||||||
|
organizaciya = EXCLUDED.organizaciya,
|
||||||
|
nomer = EXCLUDED.nomer,
|
||||||
|
date_begin = EXCLUDED.date_begin,
|
||||||
|
date_end = EXCLUDED.date_end,
|
||||||
|
inn_subkonto1 = EXCLUDED.inn_subkonto1,
|
||||||
|
inn_organizaciya = EXCLUDED.inn_organizaciya,
|
||||||
|
summa_oborot = EXCLUDED.summa_oborot,
|
||||||
|
summa_oborot_dt = EXCLUDED.summa_oborot_dt,
|
||||||
|
summa_oborot_kt = EXCLUDED.summa_oborot_kt,
|
||||||
|
summa_konechnyy_ostatok = EXCLUDED.summa_konechnyy_ostatok,
|
||||||
|
summa_konechnyy_ostatok_dt = EXCLUDED.summa_konechnyy_ostatok_dt,
|
||||||
|
summa_konechnyy_ostatok_kt = EXCLUDED.summa_konechnyy_ostatok_kt,
|
||||||
|
summa_konechnyy_razvernutyy_ostatok_dt = EXCLUDED.summa_konechnyy_razvernutyy_ostatok_dt,
|
||||||
|
summa_konechnyy_razvernutyy_ostatok_kt = EXCLUDED.summa_konechnyy_razvernutyy_ostatok_kt
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
|
||||||
with DAG(
|
with DAG(
|
||||||
dag_id='data_download_from_1C_source',
|
dag_id='data_download_from_1C_source',
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue