analytics/python script/Calculationofthecostofproductionreferences.py
2026-02-20 14:16:45 +03:00

951 lines
46 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import decimal
import time
import numpy as np
import pyodbc
def sql_connect():
server = '192.168.35.207'
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 = False
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())