952 lines
46 KiB
Python
952 lines
46 KiB
Python
import decimal
|
||
import time
|
||
import numpy as np
|
||
import pyodbc
|
||
|
||
|
||
def sql_connect():
|
||
server = '192.168.35.207'
|
||
server = 'cloud.magok.ru'
|
||
database = 'mag_pbi'
|
||
username = 'goglev'
|
||
password = 'BOMoGbUZ1p'
|
||
connection_string = f'DRIVER={{ODBC Driver 17 for SQL Server}};SERVER={server};DATABASE={database};UID={username};PWD={password}'
|
||
|
||
conn = pyodbc.connect(connection_string)
|
||
print("successfully connected...")
|
||
print("#" * 20)
|
||
return conn
|
||
|
||
|
||
def get_totals(conn, counter, group):
|
||
sql_query = """
|
||
SELECT --TOP (1000)
|
||
id, -- 0
|
||
artic_id, -- 1
|
||
COALESCE([Количество], 0) AS [Количество], -- 2
|
||
COALESCE([ЗатратыМП], 0) AS ЗатратыМП, -- 3
|
||
COALESCE([Закупка], 0) AS [Закупка], -- 4
|
||
COALESCE([Доставка], 0) AS [Доставка], -- 5
|
||
COALESCE([НДС], 0) AS [НДС], -- 6
|
||
COALESCE([Производство], 0) AS [Производство], -- 7
|
||
COALESCE([Таможня], 0) AS [Таможня], -- 8
|
||
[Курс usd2] AS [Курс usd2], -- 9
|
||
[Период] AS [Период], -- 10
|
||
[Валюта документа] AS [Валюта документа], -- 11
|
||
[Вид операции] AS [Вид операции], -- 12
|
||
[Статья] AS [Статья], -- 13
|
||
COALESCE([ЗатратыСкладХранение], 0) AS [ЗатратыСкладХранение], -- 14
|
||
COALESCE([Приемка], 0) AS [Приемка], -- 15
|
||
COALESCE([АтсМаркировка], 0) AS [АтсМаркировка], -- 16
|
||
COALESCE([СборкаЗаказа], 0) AS [СборкаЗаказа], -- 17
|
||
COALESCE([Закупка, usd2], 0) AS [Закупка, usd2], -- 18
|
||
COALESCE([Доставка USD2+2], 0) AS [Доставка USD2+2], -- 19
|
||
COALESCE([НДС USD2+2], 0) AS [НДС USD2+2], -- 20
|
||
COALESCE([Таможня USD2+2], 0) AS [Таможня USD2+2], -- 21
|
||
COALESCE([Производство USD2+2], 0) AS [Производство USD2+2], -- 22
|
||
COALESCE([Доп расходы], 0) AS [Доп расходы], -- 23
|
||
COALESCE([Доп расходы USD2+2], 0) AS [Доп расходы USD2+2] -- 24
|
||
FROM
|
||
(
|
||
SELECT
|
||
id,
|
||
artic_id,
|
||
COALESCE([Количество], 0) AS [Количество],
|
||
[ЗатратыМП],
|
||
COALESCE([Закупка], 0) AS [Закупка],
|
||
COALESCE([Доставка], 0) AS [Доставка],
|
||
[НДС],
|
||
COALESCE([Производство], 0) AS [Производство],
|
||
COALESCE([Таможня], 0) AS [Таможня],
|
||
[Курс usd2],
|
||
[Период],
|
||
[Валюта документа],
|
||
[Вид операции],
|
||
[Статья],
|
||
[ЗатратыСкладХранение],
|
||
[Приемка],
|
||
[АтсМаркировка],
|
||
[СборкаЗаказа],
|
||
COALESCE([Закупка, usd2], 0) AS [Закупка, usd2],
|
||
COALESCE([Доставка USD2+2], 0) AS [Доставка USD2+2],
|
||
COALESCE([НДС USD2+2], 0) AS [НДС USD2+2],
|
||
COALESCE([Таможня USD2+2], 0) AS [Таможня USD2+2],
|
||
COALESCE([Производство USD2+2], 0) AS [Производство USD2+2],
|
||
COALESCE([Доп расходы], 0) AS [Доп расходы],
|
||
COALESCE([Доп расходы USD2+2], 0) AS [Доп расходы USD2+2]
|
||
|
||
FROM [mag_pbi].[pbiProd].[СебестоимостьОт2022]
|
||
WHERE
|
||
1=1
|
||
--and [artic_id] = 'c4bbfb4b-cf25-11ef-998c-b49691d57efd'
|
||
and [artic_id] IN (SELECT
|
||
[artic_id]
|
||
FROM [mag_pbi].[pbiProd].[GroupsOfNomenclature]
|
||
where """ + group + """ = """ + str(counter) + """)
|
||
and [Период] >= '2022'
|
||
|
||
|
||
UNION ALL
|
||
|
||
SELECT
|
||
id,
|
||
artic_id,
|
||
COALESCE([Количество], 0),
|
||
[ЗатратыМП],
|
||
COALESCE([Закупка], 0),
|
||
COALESCE([Доставка], 0),
|
||
[НДС],
|
||
COALESCE([Сборка], 0),
|
||
COALESCE([Таможня], 0),
|
||
0,
|
||
'2021',
|
||
NULL,
|
||
'Приход',
|
||
'Ввод остатков до 22',
|
||
0,
|
||
0,
|
||
0,
|
||
0,
|
||
0,
|
||
0,
|
||
0,
|
||
0,
|
||
0,
|
||
0,
|
||
0
|
||
FROM [mag_pbi].[pbiProd].[СебестоимостьИтогиДо2022]
|
||
where
|
||
1 = 1
|
||
--and [artic_id] = 'c4bbfb4b-cf25-11ef-998c-b49691d57efd'
|
||
and [artic_id] IN (SELECT
|
||
[artic_id]
|
||
FROM [mag_pbi].[pbiProd].[GroupsOfNomenclature]
|
||
where """ + group + """ = """ + str(counter) + """)
|
||
) AS tabMain
|
||
--WHERE 1=1
|
||
|
||
ORDER BY
|
||
[artic_id], [Период] ASC, [Закупка] DESC;
|
||
"""
|
||
cursor = conn.cursor()
|
||
cursor.execute(sql_query)
|
||
pbi_totals = cursor.fetchall()
|
||
print(time.ctime(), ' Записей к обработке: ', len(pbi_totals))
|
||
return pbi_totals
|
||
|
||
|
||
|
||
def get_totalsManufacture(conn, manufactureLevel, start_range, end_range):
|
||
sql_query = """
|
||
SELECT --TOP (1000)
|
||
id, -- 0
|
||
artic_id, -- 1
|
||
COALESCE([Количество], 0) AS [Количество], -- 2
|
||
COALESCE([ЗатратыМП], 0) AS ЗатратыМП, -- 3
|
||
COALESCE([Закупка], 0) AS [Закупка], -- 4
|
||
COALESCE([Доставка], 0) AS [Доставка], -- 5
|
||
COALESCE([НДС], 0) AS [НДС], -- 6
|
||
COALESCE([Производство], 0) AS [Производство], -- 7
|
||
COALESCE([Таможня], 0) AS [Таможня], -- 8
|
||
[Курс usd2] AS [Курс usd2], -- 9
|
||
[Период] AS [Период], -- 10
|
||
[Валюта документа] AS [Валюта документа], -- 11
|
||
[Вид операции] AS [Вид операции], -- 12
|
||
[Статья] AS [Статья], -- 13
|
||
COALESCE([ЗатратыСкладХранение], 0) AS [ЗатратыСкладХранение], -- 14
|
||
COALESCE([Приемка], 0) AS [Приемка], -- 15
|
||
COALESCE([АтсМаркировка], 0) AS [АтсМаркировка], -- 16
|
||
COALESCE([СборкаЗаказа], 0) AS [СборкаЗаказа], -- 17
|
||
COALESCE([Закупка, usd2], 0) AS [Закупка, usd2], -- 18
|
||
COALESCE([Доставка USD2+2], 0) AS [Доставка USD2+2], -- 19
|
||
COALESCE([НДС USD2+2], 0) AS [НДС USD2+2], -- 20
|
||
COALESCE([Таможня USD2+2], 0) AS [Таможня USD2+2], -- 21
|
||
COALESCE([Производство USD2+2], 0) AS [Производство USD2+2], -- 22
|
||
COALESCE([Доп расходы], 0) AS [Доп расходы], -- 23
|
||
COALESCE([Доп расходы USD2+2], 0) AS [Доп расходы USD2+2] -- 24
|
||
FROM
|
||
(
|
||
SELECT
|
||
id,
|
||
artic_id,
|
||
COALESCE([Количество], 0) AS [Количество],
|
||
[ЗатратыМП],
|
||
COALESCE([Закупка], 0) AS [Закупка],
|
||
COALESCE([Доставка], 0) AS [Доставка],
|
||
[НДС],
|
||
COALESCE([Производство], 0) AS [Производство],
|
||
COALESCE([Таможня], 0) AS [Таможня],
|
||
[Курс usd2],
|
||
[Период],
|
||
[Валюта документа],
|
||
[Вид операции],
|
||
[Статья],
|
||
[ЗатратыСкладХранение],
|
||
[Приемка],
|
||
[АтсМаркировка],
|
||
[СборкаЗаказа],
|
||
COALESCE([Закупка, usd2], 0) AS [Закупка, usd2],
|
||
COALESCE([Доставка USD2+2], 0) AS [Доставка USD2+2],
|
||
COALESCE([НДС USD2+2], 0) AS [НДС USD2+2],
|
||
COALESCE([Таможня USD2+2], 0) AS [Таможня USD2+2],
|
||
COALESCE([Производство USD2+2], 0) AS [Производство USD2+2],
|
||
COALESCE([Доп расходы], 0) AS [Доп расходы],
|
||
COALESCE([Доп расходы USD2+2], 0) AS [Доп расходы USD2+2]
|
||
FROM [mag_pbi].[pbiProd].[СебестоимостьОт2022]
|
||
WHERE
|
||
1=1
|
||
--and [artic_id] = '24d0c24b-3a60-11e9-ae9c-b496910dcfd6'
|
||
and [1c_id] IN (SELECT
|
||
[1c_id]
|
||
FROM [mag_pbi].[pbiProd].[НоменклатураВПроизводствеПоУровням]
|
||
where [УровеньПроизводства] = """ + str(manufactureLevel) + """
|
||
and [RowNum] BETWEEN """ + str(start_range) + """ AND """ + str(end_range) + """
|
||
--and [1c_id] = 0x9981B49691D57EFD11EDDE7DA97A5E64
|
||
)
|
||
and [Период] >= '2022'
|
||
|
||
|
||
UNION ALL
|
||
|
||
SELECT
|
||
id,
|
||
artic_id,
|
||
COALESCE([Количество], 0),
|
||
[ЗатратыМП],
|
||
COALESCE([Закупка], 0),
|
||
COALESCE([Доставка], 0),
|
||
[НДС],
|
||
COALESCE([Сборка], 0),
|
||
COALESCE([Таможня], 0),
|
||
0,
|
||
'2021',
|
||
NULL,
|
||
'Приход',
|
||
'Ввод остатков до 22',
|
||
0,
|
||
0,
|
||
0,
|
||
0,
|
||
0,
|
||
0,
|
||
0,
|
||
0,
|
||
0,
|
||
0,
|
||
0
|
||
FROM [mag_pbi].[pbiProd].[СебестоимостьИтогиДо2022]
|
||
where
|
||
1 = 1
|
||
--and [artic_id] = '24d0c24b-3a60-11e9-ae9c-b496910dcfd6'
|
||
and [1c_id] IN (SELECT
|
||
[1c_id]
|
||
FROM [mag_pbi].[pbiProd].[НоменклатураВПроизводствеПоУровням]
|
||
where [УровеньПроизводства] = """ + str(manufactureLevel) + """
|
||
and [RowNum] BETWEEN """ + str(start_range) + """ AND """ + str(end_range) + """
|
||
--and [1c_id] = 0x9981B49691D57EFD11EDDE7DA97A5E64
|
||
)
|
||
) AS tabMain
|
||
--WHERE 1=1
|
||
|
||
ORDER BY
|
||
[artic_id], [Период] ASC, [Закупка] DESC;
|
||
"""
|
||
cursor = conn.cursor()
|
||
cursor.execute(sql_query)
|
||
pbi_totals = cursor.fetchall()
|
||
print(time.ctime(), ' Записей к обработке: ', len(pbi_totals))
|
||
return pbi_totals
|
||
|
||
def find_sumof_total(sebes_sales, date, current_sales_id, current_params, last_string_values):
|
||
quantity = current_params['quantity']
|
||
sumZakupka = current_params['sumZakupka']
|
||
sumZakupkaUSD2 = current_params['sumZakupkaUSD2']
|
||
sum_dostavka = current_params['sum_dostavka']
|
||
sum_dostavkaUSD2 = current_params['sum_dostavkaUSD2']
|
||
sum_NAT = current_params['sum_NAT']
|
||
sum_NATUSD2 = current_params['sum_NATUSD2']
|
||
sum_production = current_params['sum_production']
|
||
sum_productionUSD2 = current_params['sum_productionUSD2']
|
||
sum_zatratiMP = current_params['sum_zatratiMP']
|
||
sum_custom = current_params['sum_custom']
|
||
sum_customUSD2 = current_params['sum_customUSD2']
|
||
sum_skladHranenie = current_params['sum_skladHranenie']
|
||
sum_Priemka = current_params['sum_Priemka']
|
||
sum_AtsMarkirovka = current_params['sum_AtsMarkirovka']
|
||
sum_SborkaZakaza = current_params['sum_SborkaZakaza']
|
||
sum_DopRashod = current_params['sum_DopRashod']
|
||
sum_DopRashodUSD2 = current_params['sum_DopRashodUSD2']
|
||
i = current_params['counter']
|
||
len_sebes_sales = len(sebes_sales)
|
||
while i < len_sebes_sales:
|
||
try:
|
||
curr_str = sebes_sales[i]
|
||
except:
|
||
print('Ошибка в иттераторе, тек ид =', current_sales_id)
|
||
print(i)
|
||
print(len_sebes_sales)
|
||
break
|
||
|
||
if curr_str[10] > date or current_sales_id != curr_str[0]:
|
||
break
|
||
else:
|
||
i += 1
|
||
|
||
if curr_str[12] == 'Приход':
|
||
|
||
# кажется что можно и нужно удалить ...
|
||
if curr_str[13] == 'Закупка' or curr_str[13] == 'Ввод остатков до 22' or curr_str[13] == 'Производство товара' or curr_str[13] == 'Пересчет товара':
|
||
quantity += curr_str[2]
|
||
|
||
|
||
if curr_str[9] > 0:
|
||
usd2_course = curr_str[9]
|
||
else:
|
||
if curr_str[13] == 'Ввод остатков до 22':
|
||
# для ввода остатков возьём курс на 1 января 2023 года
|
||
usd2_course = 75.7785
|
||
else:
|
||
usd2_course = 1
|
||
|
||
sumZakupka += curr_str[4]
|
||
if curr_str[13] == 'Ввод остатков до 22':
|
||
sumZakupkaUSD2 += decimal.Decimal(float(sumZakupka) / usd2_course)
|
||
else:
|
||
sumZakupkaUSD2 += curr_str[18]
|
||
|
||
|
||
#if curr_str[11] == 'руб.':
|
||
# sumZakupkaUSD += sumZakupka / usd2_course
|
||
|
||
sum_dostavka += curr_str[5]
|
||
sum_dostavkaUSD2 += curr_str[19]
|
||
sum_NAT += curr_str[6]
|
||
sum_NATUSD2 += curr_str[20]
|
||
sum_production += curr_str[7]
|
||
sum_productionUSD2 += curr_str[22]
|
||
sum_zatratiMP += curr_str[3]
|
||
sum_custom += curr_str[8]
|
||
sum_customUSD2 += curr_str[21]
|
||
sum_skladHranenie += curr_str[14]
|
||
sum_Priemka += curr_str[15]
|
||
sum_AtsMarkirovka += curr_str[16]
|
||
sum_SborkaZakaza += curr_str[17]
|
||
sum_DopRashod += curr_str[23]
|
||
sum_DopRashodUSD2 += curr_str[24]
|
||
|
||
if curr_str[12] == 'Расход':
|
||
quantity -= last_string_values['quantity']
|
||
sumZakupka -= last_string_values['sumZakupka']
|
||
sumZakupkaUSD2 -= last_string_values['sumZakupkaUSD2']
|
||
sum_dostavka -= last_string_values['sum_dostavka']
|
||
sum_dostavkaUSD2 -= last_string_values['sum_dostavkaUSD2']
|
||
sum_NAT -= last_string_values['sum_NAT']
|
||
sum_NATUSD2 -= last_string_values['sum_NATUSD2']
|
||
sum_production -= last_string_values['sum_production']
|
||
sum_productionUSD2 -= last_string_values['sum_productionUSD2']
|
||
sum_zatratiMP -= last_string_values['sum_zatratiMP']
|
||
sum_custom -= last_string_values['sum_custom']
|
||
sum_customUSD2 -= last_string_values['sum_customUSD2']
|
||
sum_skladHranenie -= last_string_values['sum_skladHranenie']
|
||
sum_Priemka -= last_string_values['sum_Priemka']
|
||
sum_AtsMarkirovka -= last_string_values['sum_AtsMarkirovka']
|
||
sum_SborkaZakaza -= last_string_values['sum_SborkaZakaza']
|
||
sum_DopRashod -= last_string_values['sum_DopRashod']
|
||
sum_DopRashodUSD2 -= last_string_values['sum_DopRashodUSD2']
|
||
|
||
if quantity <= 0:
|
||
quantity = 0
|
||
sumZakupka = 0
|
||
sumZakupkaUSD2 = 0
|
||
sum_dostavka = 0
|
||
sum_NAT = 0
|
||
sum_production = 0
|
||
sum_zatratiMP = 0
|
||
sum_custom = 0
|
||
sum_skladHranenie = 0
|
||
sum_Priemka = 0
|
||
sum_AtsMarkirovka = 0
|
||
sum_SborkaZakaza = 0
|
||
sum_dostavkaUSD2 = 0
|
||
sum_NATUSD2 = 0
|
||
sum_productionUSD2 = 0
|
||
sum_customUSD2 = 0
|
||
sum_DopRashod = 0
|
||
sum_DopRashodUSD2 = 0
|
||
|
||
|
||
return {'quantity': quantity, 'sumZakupka': sumZakupka, 'sumZakupkaUSD2': sumZakupkaUSD2,
|
||
'sum_dostavka': sum_dostavka,
|
||
'sum_NAT': sum_NAT, 'sum_production': sum_production, 'sum_zatratiMP': sum_zatratiMP, 'sum_custom': sum_custom,
|
||
'sum_skladHranenie': sum_skladHranenie, 'sum_Priemka': sum_Priemka, 'sum_AtsMarkirovka': sum_AtsMarkirovka, 'sum_SborkaZakaza': sum_SborkaZakaza,
|
||
'sum_dostavkaUSD2': sum_dostavkaUSD2, 'sum_NATUSD2': sum_NATUSD2, 'sum_productionUSD2': sum_productionUSD2, 'sum_customUSD2': sum_customUSD2,
|
||
'sum_DopRashod': sum_DopRashod, 'sum_DopRashodUSD2': sum_DopRashodUSD2,
|
||
'counter': i}
|
||
|
||
|
||
def insert_to_DB_Production(arr, conn):
|
||
try:
|
||
cursor = conn.cursor()
|
||
conn.autocommit = False
|
||
cursor.fast_executemany = True
|
||
table = '[СебестоимостьПроизводствоОт2022]'
|
||
|
||
cursor.executemany("""
|
||
INSERT INTO [mag_pbi].[pbiProd].[СебестоимостьПроизводствоОт2022]
|
||
([Период], [artic_id], [Учетная цена], [Учетная цена USD2+2])
|
||
VALUES (?, ?, ?, ?);
|
||
""", arr)
|
||
|
||
|
||
except pyodbc.DatabaseError as err:
|
||
print('ошибка', err)
|
||
conn.rollback()
|
||
else:
|
||
conn.commit()
|
||
print(time.ctime(), 'обновлено', len(arr), ': записей')
|
||
finally:
|
||
conn.autocommit = True
|
||
|
||
def update_to_DB_Sales(arr, conn, year):
|
||
try:
|
||
cursor = conn.cursor()
|
||
conn.autocommit = False
|
||
cursor.fast_executemany = True
|
||
table = '[СебестоимостьОт2022]'
|
||
if year == '2022':
|
||
table = '[СебестоимостьОт2022]'
|
||
elif year == '2023':
|
||
table = '[Себестоимость2023]'
|
||
elif year == '2024':
|
||
table = '[Себестоимость2024]'
|
||
|
||
cursor.executemany(
|
||
"""UPDATE [mag_pbi].[pbiProd].""" + table + """
|
||
SET
|
||
[Закупка] = ? -- 0
|
||
, [Закупка, usd2] = ? -- 1
|
||
, [Доставка] = ? -- 2
|
||
, [Производство] = ? -- 3
|
||
, [НДС] = ? -- 4
|
||
, [ЗатратыМП] = ? -- 5
|
||
, [Таможня] = ? -- 6
|
||
, [ЗатратыСкладХранение] = ? -- 7
|
||
, [Учетная стоимость] = ? -- 8
|
||
, [Учетная стоимость USD2+2] = ? -- 9
|
||
, [Учетная цена] = ? -- 10
|
||
, [Учетная цена USD2+2] = ? -- 11
|
||
, [artic_id] = ? -- 12
|
||
, [Приемка] = ? -- 13
|
||
, [АтсМаркировка] = ? -- 14
|
||
, [СборкаЗаказа] = ? -- 15
|
||
, [Доставка USD2+2] = ? -- 16
|
||
, [НДС USD2+2] = ? -- 17
|
||
, [Таможня USD2+2] = ? -- 18
|
||
, [Производство USD2+2] = ? -- 19
|
||
, [Доп расходы] = ? -- 20
|
||
, [Доп расходы USD2+2] = ? -- 21
|
||
WHERE id = ?""",
|
||
arr)
|
||
|
||
|
||
except pyodbc.DatabaseError as err:
|
||
print('ошибка', err)
|
||
conn.rollback()
|
||
else:
|
||
conn.commit()
|
||
print(time.ctime(), 'обновлено', len(arr), ': записей')
|
||
finally:
|
||
conn.autocommit = True
|
||
|
||
|
||
def update_to_DB_sebest(arr, conn, year):
|
||
try:
|
||
cursor = conn.cursor()
|
||
conn.autocommit = False
|
||
cursor.fast_executemany = True
|
||
table = '[СебестоимостьОт2022]'
|
||
# if year == '2022':
|
||
# table = '[СебестоимостьОт2022]'
|
||
# elif year == '2023':
|
||
# table = '[Себестоимость2023]'
|
||
# elif year == '2024':
|
||
# table = '[Себестоимость2024]'
|
||
cursor.executemany(
|
||
"UPDATE [mag_pbi].[pbiProd]." + table + " SET [Учетная стоимость] = ?, [Учетная стоимость USD2+2] = ?, [Учетная цена] = ?, [Учетная цена USD2+2] = ? WHERE id = ?",
|
||
arr)
|
||
|
||
|
||
except pyodbc.DatabaseError as err:
|
||
print('ошибка', err)
|
||
conn.rollback()
|
||
else:
|
||
conn.commit()
|
||
print(time.ctime(), 'обновлено', len(arr), ': записей')
|
||
finally:
|
||
conn.autocommit = True
|
||
|
||
|
||
def exec_procedure(conn, procedure_name):
|
||
sql_query = 'EXEC ' + procedure_name
|
||
cursor = conn.cursor()
|
||
cursor.execute(sql_query).commit()
|
||
|
||
|
||
def getMaxCounter(conn, group):
|
||
sql_query = "SELECT MAX(" + group + ") FROM [mag_pbi].[pbiProd].[GroupsOfNomenclature]"
|
||
|
||
cursor = conn.cursor()
|
||
cursor.execute(sql_query)
|
||
maxCounter = cursor.fetchall()
|
||
return maxCounter[0][0]
|
||
|
||
|
||
|
||
def count_sebest(connect, counter = '2k', group = '1', manufactureLevel = 0, manufacture = False, start_range = 0, end_range = 0):
|
||
upload = True
|
||
ind = 0
|
||
arr_sebes = []
|
||
arr_sales = []
|
||
arr_production = []
|
||
arr_price = []
|
||
last_utid = ''
|
||
last_operation = ''
|
||
last_state = ''
|
||
|
||
if manufacture:
|
||
pbi_all = get_totalsManufacture(connect, manufactureLevel, start_range, end_range)
|
||
else:
|
||
pbi_all = get_totals(connect, counter, group)
|
||
|
||
|
||
nparr_all = np.asarray(pbi_all)
|
||
|
||
for str in pbi_all:
|
||
ind += 1
|
||
date = str[10]
|
||
utid = str[1]
|
||
id = str[0]
|
||
tableGod = str[14]
|
||
zakupkaRUB = round(0, 9)
|
||
zakupkaUSD2 = round(0, 9)
|
||
NAT = round(0, 9)
|
||
NATUSD2 = round(0, 9)
|
||
zatratiMP = round(0, 9)
|
||
production = round(0, 9)
|
||
dostavka = round(0, 9)
|
||
dostavkaUSD2 = round(0, 9)
|
||
custom = round(0, 9)
|
||
customUSD2 = round(0, 9)
|
||
skladHranenie = round(0, 9)
|
||
priemka = round(0, 9)
|
||
atsMarkirovka = round(0, 9)
|
||
sborkaZakaza = round(0, 9)
|
||
uchet_price = round(0, 9)
|
||
uchet_price_usd22 = round(0, 9)
|
||
dop_rashod = round(0, 9)
|
||
dop_rashod_usd22 = round(0, 9)
|
||
|
||
|
||
if utid != last_utid:
|
||
## если последняя операция не Реализация Расход, то сделаем фейковую продажу чтобы посчитать цену на сегодня ...
|
||
if last_operation != 'Расход' and last_state != 'Реализация' and last_operation != '' and False:
|
||
arr_price.append(count_price(all_params, last_utid, connect))
|
||
|
||
|
||
fltr = np.asarray([utid])
|
||
pbi_all_current_utid = nparr_all[np.in1d(nparr_all[:, 1], fltr)]
|
||
last_utid = utid
|
||
current_params = {'quantity': 0, 'sumZakupka': 0, 'sumZakupkaUSD2': 0,
|
||
'sum_dostavka': 0, 'sum_NAT': 0, 'sum_production': 0, 'sum_zatratiMP': 0, 'sum_custom': 0, 'sum_skladHranenie': 0, 'sum_Priemka': 0,
|
||
'sum_AtsMarkirovka': 0, 'sum_SborkaZakaza': 0, 'sum_dostavkaUSD2': 0, 'sum_NATUSD2': 0, 'sum_productionUSD2': 0, 'sum_customUSD2': 0,
|
||
'sum_zakupkaUSD2': 0, 'sum_DopRashod': 0, 'sum_DopRashodUSD2': 0,
|
||
'counter': 0}
|
||
last_string_values = {'quantity': 0, 'sumZakupka': 0, 'sumZakupkaUSD2': 0,
|
||
'sum_dostavka': 0, 'sum_NAT': 0, 'sum_production': 0, 'sum_zatratiMP': 0, 'sum_custom': 0, 'sum_skladHranenie': 0, 'sum_Priemka': 0,
|
||
'sum_AtsMarkirovka': 0, 'sum_SborkaZakaza': 0, 'sum_dostavkaUSD2': 0, 'sum_NATUSD2': 0, 'sum_productionUSD2': 0, 'sum_customUSD2': 0,
|
||
'sum_DopRashod': 0, 'sum_DopRashodUSD2': 0,
|
||
'sum_zakupkaUSD2': 0}
|
||
|
||
all_params = find_sumof_total(pbi_all_current_utid, date, str[0], current_params, last_string_values)
|
||
current_params = all_params.copy()
|
||
|
||
|
||
last_operation = str[12]
|
||
last_state = str[13]
|
||
sale_quantity = str[2]
|
||
|
||
if str[9] > 0:
|
||
usd2_course = str[9]
|
||
else:
|
||
usd2_course = 1
|
||
|
||
sum_quantity = all_params['quantity']
|
||
sum_zakupka = all_params['sumZakupka']
|
||
sum_zakupkaUSD2 = all_params['sumZakupkaUSD2']
|
||
sum_dostavka = all_params['sum_dostavka']
|
||
sum_dostavkaUSD2 = all_params['sum_dostavkaUSD2']
|
||
sum_NAT = all_params['sum_NAT']
|
||
sum_NATUSD2 = all_params['sum_NATUSD2']
|
||
sum_production = all_params['sum_production']
|
||
sum_productionUSD2 = all_params['sum_productionUSD2']
|
||
sum_zatratiMP = all_params['sum_zatratiMP']
|
||
sum_custom = all_params['sum_custom']
|
||
sum_customUSD2 = all_params['sum_customUSD2']
|
||
sum_skladHranenie = all_params['sum_skladHranenie']
|
||
sum_Priemka = all_params['sum_Priemka']
|
||
sum_AtsMarkirovka = all_params['sum_AtsMarkirovka']
|
||
sum_SborkaZakaza = all_params['sum_SborkaZakaza']
|
||
sum_DopRashod = all_params['sum_DopRashod']
|
||
sum_DopRashodUSD2 = all_params['sum_DopRashodUSD2']
|
||
|
||
|
||
if (str[12] == 'Приход') and str[13] != 'Ввод остатков до 22':
|
||
|
||
uchet_price = 0
|
||
uchet_price_usd22 = 0
|
||
uchet_stoimost = 0
|
||
uchet_stoimost_usd22 = 0
|
||
|
||
zakupkaRUB = round(sum_zakupka, 9)
|
||
zakupkaUSD2 = round(sum_zakupkaUSD2, 9)
|
||
|
||
|
||
if sum_quantity != 0:
|
||
dostavka = round(sum_dostavka, 9)
|
||
dostavkaUSD2 = round(sum_dostavkaUSD2, 9)
|
||
NAT = round(sum_NAT, 9)
|
||
NATUSD2 = round(sum_NATUSD2, 9)
|
||
production = round(sum_production, 9)
|
||
productionUSD2 = round(sum_productionUSD2, 9)
|
||
zatratiMP = round(sum_zatratiMP, 9)
|
||
custom = round(sum_custom, 9)
|
||
customUSD2 = round(sum_customUSD2, 9)
|
||
skladHranenie = round(sum_skladHranenie, 9)
|
||
priemka = round(sum_Priemka, 9)
|
||
atsMarkirovka = round(sum_AtsMarkirovka, 9)
|
||
sborkaZakaza = round(sum_SborkaZakaza, 9)
|
||
dop_rashod = round(sum_DopRashod, 9)
|
||
dop_rashod_usd22 = round(sum_DopRashodUSD2, 9)
|
||
|
||
uchet_price = round((dostavka + NAT + zakupkaRUB + custom + production) / sum_quantity, 9)
|
||
uchet_price_usd22 = round((dostavkaUSD2 + NATUSD2 + zakupkaUSD2 + customUSD2 + productionUSD2) / sum_quantity, 9)
|
||
|
||
if sale_quantity != 0:
|
||
uchet_stoimost = round(uchet_price * sale_quantity, 9)
|
||
uchet_stoimost_usd22 = round(uchet_price_usd22 * sale_quantity, 9)
|
||
|
||
|
||
arr_sebes.append((uchet_stoimost, uchet_stoimost_usd22, uchet_price, uchet_price_usd22, id))
|
||
|
||
|
||
elif str[12] == 'Расход':
|
||
|
||
if sale_quantity != 0:
|
||
|
||
if sum_zakupka < 0:
|
||
sum_zakupka = 0
|
||
|
||
if sale_quantity > sum_quantity or sum_quantity == 0:
|
||
zakupkaRUB = round(sum_zakupka, 9)
|
||
zakupkaUSD2 = round(sum_zakupkaUSD2, 9)
|
||
else:
|
||
zakupkaRUB = round(decimal.Decimal(sum_zakupka) / sum_quantity * sale_quantity, 9)
|
||
zakupkaUSD2 = round(decimal.Decimal(sum_zakupkaUSD2) / sum_quantity * sale_quantity, 9)
|
||
|
||
#zakupkaUSD2 = round(sum_zakupkaUSD2 / usd2_course, 15)
|
||
|
||
if sale_quantity > sum_quantity or sum_quantity == 0:
|
||
dostavka = round(sum_dostavka, 9)
|
||
dostavkaUSD2 = round(sum_dostavkaUSD2, 9)
|
||
NAT = round(sum_NAT, 9)
|
||
NATUSD2 = round(sum_NATUSD2, 9)
|
||
production = round(sum_production, 9)
|
||
productionUSD2 = round(sum_productionUSD2, 9)
|
||
zatratiMP = round(sum_zatratiMP, 9)
|
||
custom = round(sum_custom, 9)
|
||
customUSD2 = round(sum_customUSD2, 9)
|
||
skladHranenie = round(sum_skladHranenie, 9)
|
||
priemka = round(sum_Priemka, 9)
|
||
atsMarkirovka = round(sum_AtsMarkirovka, 9)
|
||
sborkaZakaza = round(sum_SborkaZakaza, 9)
|
||
dop_rashod = round(sum_DopRashod, 9)
|
||
dop_rashod_usd22 = round(sum_DopRashodUSD2, 9)
|
||
else:
|
||
dostavka = round(sum_dostavka / sum_quantity * sale_quantity, 9)
|
||
dostavkaUSD2 = round(sum_dostavkaUSD2 / sum_quantity * sale_quantity, 9)
|
||
NAT = round(sum_NAT / sum_quantity * sale_quantity, 9)
|
||
NATUSD2 = round(sum_NATUSD2 / sum_quantity * sale_quantity, 9)
|
||
production = round(sum_production / sum_quantity * sale_quantity, 9)
|
||
productionUSD2 = round(sum_productionUSD2 / sum_quantity * sale_quantity, 9)
|
||
zatratiMP = round(sum_zatratiMP / sum_quantity * sale_quantity, 9)
|
||
custom = round(sum_custom / sum_quantity * sale_quantity, 9)
|
||
customUSD2 = round(sum_customUSD2 / sum_quantity * sale_quantity, 9)
|
||
skladHranenie = round(sum_skladHranenie / sum_quantity * sale_quantity, 9)
|
||
priemka = round(sum_Priemka / sum_quantity * sale_quantity, 9)
|
||
atsMarkirovka = round(sum_AtsMarkirovka / sum_quantity * sale_quantity, 9)
|
||
sborkaZakaza = round(sum_SborkaZakaza / sum_quantity * sale_quantity, 9)
|
||
dop_rashod = round(sum_DopRashod / sum_quantity * sale_quantity, 9)
|
||
dop_rashod_usd22 = round(sum_DopRashodUSD2 / sum_quantity * sale_quantity, 9)
|
||
|
||
|
||
last_string_values = {'quantity': sale_quantity, 'sumZakupka': zakupkaRUB, 'sumZakupkaUSD2': zakupkaUSD2,
|
||
'sum_dostavka': dostavka,
|
||
'sum_NAT': NAT, 'sum_production': production, 'sum_zatratiMP': zatratiMP,
|
||
'sum_custom': custom, 'sum_skladHranenie': skladHranenie, 'sum_Priemka': priemka,
|
||
'sum_AtsMarkirovka': atsMarkirovka, 'sum_SborkaZakaza': sborkaZakaza,
|
||
'sum_dostavkaUSD2': dostavkaUSD2, 'sum_NATUSD2': NATUSD2, 'sum_productionUSD2': productionUSD2, 'sum_customUSD2': customUSD2,
|
||
'sum_DopRashod': dop_rashod, 'sum_DopRashodUSD2': dop_rashod_usd22}
|
||
|
||
if zakupkaRUB != 0 or zakupkaUSD2 != 0 or NAT != 0 or production != 0 or dostavka != 0 or custom != 0:
|
||
uchet_stoimost = round((dostavka + NAT + zakupkaRUB + custom + production), 9)
|
||
uchet_stoimost_usd22 = round((dostavkaUSD2 + NATUSD2 + zakupkaUSD2 + customUSD2 + productionUSD2), 9)
|
||
uchet_price = round((dostavka + NAT + zakupkaRUB + custom + production) / sale_quantity, 9)
|
||
uchet_price_usd22 = round((dostavkaUSD2 + NATUSD2 + zakupkaUSD2 + customUSD2 + productionUSD2) / sale_quantity, 9)
|
||
|
||
arr_sales.append(
|
||
(float(-zakupkaRUB), float(-zakupkaUSD2), float(-dostavka), float(-production), float(-NAT), float(-zatratiMP), float(-custom),
|
||
float(-skladHranenie), float(uchet_stoimost),
|
||
float(uchet_stoimost_usd22), float(uchet_price), float(uchet_price_usd22), utid, float(-priemka), float(-atsMarkirovka), float(-sborkaZakaza),
|
||
float(-dostavkaUSD2), float(-NATUSD2), float(-productionUSD2), float(-customUSD2), float(-dop_rashod), float(-dop_rashod_usd22),
|
||
id))
|
||
|
||
if str[13] == 'Производство товара':
|
||
arr_production.append((str[10], str[1], float(uchet_price), float(uchet_price_usd22)))
|
||
|
||
|
||
# break
|
||
|
||
if ind % 10000 == 0:
|
||
print(time.ctime(), ' ', ind, 'проходов')
|
||
|
||
if len(arr_price) > 0 and False:
|
||
insert_to_DB_UchetPrice(arr_price, connect)
|
||
|
||
if len(arr_production) > 0 and manufacture:
|
||
insert_to_DB_Production(arr_production, connect)
|
||
|
||
|
||
if upload and manufacture == False:
|
||
if len(arr_sales) > 0:
|
||
print(time.ctime(), ' записей sales: ', len(arr_sales))
|
||
update_to_DB_Sales(arr_sales, connect, '2022')
|
||
|
||
if len(arr_sebes) > 0:
|
||
print(time.ctime(), ' записей sebest: ', len(arr_sebes))
|
||
update_to_DB_sebest(arr_sebes, connect, '2022')
|
||
|
||
|
||
upload = False
|
||
|
||
|
||
def fill_table_sebestoim2022(connect, skip = False):
|
||
|
||
if skip:
|
||
return
|
||
|
||
|
||
#флаг для обработки без заполнения таблиц ...
|
||
prepare_table = True
|
||
fill_AtsMarkirovka = True
|
||
fill_DopRashod = True
|
||
fill_Dostavka = True
|
||
fill_Zakupka = True
|
||
fill_ZatratiMp = False
|
||
fill_Pereschet = True
|
||
fill_PereschetSklad = True
|
||
fill_Priemka = True
|
||
fill_Prodaji = True
|
||
fill_Proizvodstvo = True
|
||
fill_Sborka = True
|
||
|
||
if prepare_table:
|
||
print('Подготовка таблицы СебестоимостьОт2022 ~ ? мин, ? записей ...')
|
||
exec_procedure(connect, '[pbiProd].[Пакетное: Подготовка таблицы СебестоимостьОт2022]')
|
||
|
||
# заполним таблицы данными закупки ...
|
||
if fill_AtsMarkirovka:
|
||
print('Заполнение таблицы данными: АтсМаркировка ~ ? мин, ? записей ...')
|
||
exec_procedure(connect, '[pbiProd].[Пакетное: Заполнить себестоимостьОт2022(АтсМаркировка)]')
|
||
|
||
if fill_DopRashod:
|
||
print('Заполнение таблицы данными: Доп расходы ~ ? мин, ? записей ...')
|
||
exec_procedure(connect, '[pbiProd].[Пакетное: Заполнить себестоимостьОт2022(ДопРасходы)]')
|
||
|
||
if fill_Dostavka:
|
||
print('Заполнение таблицы данными: Доставка ~ ? мин, ? записей ...')
|
||
exec_procedure(connect, '[pbiProd].[Пакетное: Заполнить себестоимостьОт2022(Доставка)]')
|
||
|
||
if fill_Zakupka:
|
||
print('Заполнение таблицы данными: Закупка ~ ? мин, ? записей ...')
|
||
exec_procedure(connect, '[pbiProd].[Пакетное: Заполнить себестоимостьОт2022(Закупка)]')
|
||
|
||
if fill_ZatratiMp:
|
||
print('Заполнение таблицы данными: ЗатратыМП ~ ? мин, ? записей ...')
|
||
exec_procedure(connect, '[pbiProd].[Пакетное: Заполнить себестоимостьОт2022(ЗатратыМП)]')
|
||
|
||
if fill_Pereschet:
|
||
print('Заполнение таблицы данными: Пересчет ~ ? мин, ? записей ...')
|
||
exec_procedure(connect, '[pbiProd].[Пакетное: Заполнить себестоимостьОт2022(Перерасчет)]')
|
||
|
||
if fill_PereschetSklad:
|
||
print('Заполнение таблицы данными: Пересчет ~ ? мин, ? записей ...')
|
||
exec_procedure(connect, '[pbiProd].[Пакетное: Заполнить себестоимостьОт2022(ПерерасчетСкладскойКонтур)]')
|
||
|
||
if fill_Priemka:
|
||
print('Заполнение таблицы данными: Приемка ~ ? мин, ? записей ...')
|
||
exec_procedure(connect, '[pbiProd].[Пакетное: Заполнить себестоимостьОт2022(Приемка)]')
|
||
|
||
if fill_Prodaji:
|
||
print('Заполнение таблицы данными: Продажи ~ ? мин, ? записей ...')
|
||
exec_procedure(connect, '[pbiProd].[Пакетное: Заполнить себестоимостьОт2022(Продажи)]')
|
||
|
||
if fill_Proizvodstvo:
|
||
print('Заполнение таблицы данными: Производство ~ ? мин, ? записей ...')
|
||
exec_procedure(connect, '[pbiProd].[Пакетное: Заполнить себестоимостьОт2022(Производство)]')
|
||
|
||
if fill_Sborka:
|
||
print('Заполнение таблицы данными: Сборка ~ ? мин, ? записей ...')
|
||
exec_procedure(connect, '[pbiProd].[Пакетное: Заполнить себестоимостьОт2022(Сборка)]')
|
||
|
||
def count_price(all_params, last_utid, conn):
|
||
arr_price = []
|
||
uchet_price = 0
|
||
uchet_price_usd22 = 0
|
||
sale_quantity = 1
|
||
sum_quantity = all_params['quantity']
|
||
sum_zakupka = all_params['sumZakupka']
|
||
sum_zakupkaUSD2 = all_params['sumZakupkaUSD2']
|
||
sum_dostavka = all_params['sum_dostavka']
|
||
sum_dostavkaUSD2 = all_params['sum_dostavkaUSD2']
|
||
sum_NAT = all_params['sum_NAT']
|
||
sum_NATUSD2 = all_params['sum_NATUSD2']
|
||
sum_production = all_params['sum_production']
|
||
sum_productionUSD2 = all_params['sum_productionUSD2']
|
||
sum_custom = all_params['sum_custom']
|
||
sum_customUSD2 = all_params['sum_customUSD2']
|
||
|
||
|
||
if sale_quantity != 0:
|
||
|
||
|
||
if sale_quantity > sum_quantity or sum_quantity == 0:
|
||
zakupkaRUB = round(sum_zakupka, 9)
|
||
zakupkaUSD2 = round(sum_zakupkaUSD2, 9)
|
||
else:
|
||
zakupkaRUB = round(decimal.Decimal(sum_zakupka) / sum_quantity * sale_quantity, 9)
|
||
zakupkaUSD2 = round(decimal.Decimal(sum_zakupkaUSD2) / sum_quantity * sale_quantity, 9)
|
||
|
||
|
||
if sale_quantity > sum_quantity or sum_quantity == 0:
|
||
dostavka = round(sum_dostavka, 9)
|
||
dostavkaUSD2 = round(sum_dostavkaUSD2, 9)
|
||
NAT = round(sum_NAT, 9)
|
||
NATUSD2 = round(sum_NATUSD2, 9)
|
||
production = round(sum_production, 9)
|
||
productionUSD2 = round(sum_productionUSD2, 9)
|
||
custom = round(sum_custom, 9)
|
||
customUSD2 = round(sum_customUSD2, 9)
|
||
else:
|
||
dostavka = round(sum_dostavka / sum_quantity * sale_quantity, 9)
|
||
dostavkaUSD2 = round(sum_dostavkaUSD2 / sum_quantity * sale_quantity, 9)
|
||
NAT = round(sum_NAT / sum_quantity * sale_quantity, 9)
|
||
NATUSD2 = round(sum_NATUSD2 / sum_quantity * sale_quantity, 9)
|
||
production = round(sum_production / sum_quantity * sale_quantity, 9)
|
||
productionUSD2 = round(sum_productionUSD2 / sum_quantity * sale_quantity, 9)
|
||
custom = round(sum_custom / sum_quantity * sale_quantity, 9)
|
||
customUSD2 = round(sum_customUSD2 / sum_quantity * sale_quantity, 9)
|
||
|
||
|
||
|
||
if zakupkaRUB != 0 or zakupkaUSD2 != 0 or NAT != 0 or production != 0 or dostavka != 0 or custom != 0:
|
||
uchet_price = round((dostavka + NAT + zakupkaRUB + custom + production) / sale_quantity, 9)
|
||
uchet_price_usd22 = round((dostavkaUSD2 + NATUSD2 + zakupkaUSD2 + customUSD2 + productionUSD2) / sale_quantity, 9)
|
||
|
||
|
||
return (last_utid, float(uchet_price), float(uchet_price_usd22))
|
||
#arr_price.append((last_utid, float(uchet_price), float(uchet_price_usd22)))
|
||
#if len(arr_price) > 0:
|
||
# insert_to_DB_UchetPrice(arr_price, conn)
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
def insert_to_DB_UchetPrice(arr, conn):
|
||
try:
|
||
cursor = conn.cursor()
|
||
conn.autocommit = False
|
||
cursor.fast_executemany = True
|
||
table = '[pbiProd].[УчетнаяЦенаПоСебестоимости]'
|
||
|
||
cursor.executemany("""
|
||
INSERT INTO [mag_pbi].[pbiProd].[УчетнаяЦенаПоСебестоимости]
|
||
( [Период], [artic_id], [Учетная цена], [Учетная цена USD2+2])
|
||
VALUES (CONVERT(date, GETDATE()), ?, ?, ?);
|
||
""", arr)
|
||
|
||
|
||
except pyodbc.DatabaseError as err:
|
||
print('ошибка', err)
|
||
conn.rollback()
|
||
else:
|
||
conn.commit()
|
||
print(time.ctime(), 'обновлено', len(arr), ': записей')
|
||
finally:
|
||
conn.autocommit = True
|
||
|
||
|
||
|
||
|
||
union_sebes = True
|
||
print('start time', time.ctime())
|
||
connect = sql_connect()
|
||
ComputeManufacture = True
|
||
maxLvl = 1
|
||
|
||
if ComputeManufacture:
|
||
maxLvl = 4
|
||
exec_procedure(connect, '[pbiProd].[Подготовка Производство: единая процедура для подготовки]')
|
||
|
||
|
||
|
||
for stRange in range(0, maxLvl):
|
||
# Заполнение таблицы
|
||
skip = False
|
||
fill_table_sebestoim2022(connect, skip)
|
||
|
||
if True:
|
||
group = '[2k]'
|
||
max_counter = getMaxCounter(connect, group)
|
||
print('Группа: ', group, ' Всего групп - ', max_counter)
|
||
for counter in range(max_counter):
|
||
counter += 1
|
||
count_sebest(connect, counter, group)
|
||
print(time.ctime(), ' группа ', counter, ' обработана')
|
||
|
||
|
||
# Расчитаем товары которые учавствуют в производстве
|
||
if ComputeManufacture:
|
||
start_range = 0
|
||
for i in range(stRange, stRange + 1):
|
||
for i_range in range(2000, 20000, 2000):
|
||
end_range = i_range
|
||
count_sebest(connect, "", "", i, True, start_range, end_range)
|
||
start_range = i_range
|
||
|
||
# Нужно добавить 1с_id в таблицу ....
|
||
exec_procedure(connect, '[pbiProd].[Производство: Заполнить 1сid для СебестоимостьПроизводствоОт2022]')
|
||
|
||
|
||
# заполним сводную таблицу (финальную) для загрузки в пби ...
|
||
if union_sebes:
|
||
print('Объединение в сводную таблицу ~ 10 мин ...')
|
||
exec_procedure(connect, '[pbiProd].[ЗаполнитьСебестоимостьСводныйОт2022]')
|
||
|
||
|
||
connect.close()
|
||
print('end time ', time.ctime())
|