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 = 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())