yeref 0.25.5__py3-none-any.whl → 0.25.6__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
yeref/yeref.py CHANGED
@@ -16097,7 +16097,7 @@ async def calc_metrics(bot, PROJECT_USERNAME, dataroom_folder_id, EXTRA_D, BASE_
16097
16097
  offset += len(tbl['rows'])
16098
16098
 
16099
16099
  # 5.3) Оставляем минимум 2 пустые строки перед следующей таблицей
16100
- offset += 2
16100
+ offset += 3
16101
16101
 
16102
16102
  # 6) Выполняем единый batchUpdate для всех data_requests
16103
16103
  write_body = {
@@ -16342,7 +16342,7 @@ async def return_unit_metrics(bot, data_users, EXTRA_D):
16342
16342
  factors = [1 + v for v in cmgr_vals]
16343
16343
  avg = math.prod(factors) ** (1 / len(factors))
16344
16344
  writer.writerow([])
16345
- writer.writerow([f"Rev ~ ×{round(avg, 2)} monthly"])
16345
+ writer.writerow([f"Rev ~ ×{round(avg, 2)} monthly".replace('.', ',')])
16346
16346
 
16347
16347
  result = f_name
16348
16348
  thumb = types.FSInputFile(os.path.join(EXTRA_D, "parse.jpg"))
@@ -16437,7 +16437,7 @@ async def return_cohort_metrics(bot, data_users, EXTRA_D):
16437
16437
  for r in table:
16438
16438
  writer.writerow(r)
16439
16439
  writer.writerow([])
16440
- writer.writerow([f"Churn ~ ×{avg_churn:.2f} monthly"])
16440
+ writer.writerow([f"Churn ~ ×{avg_churn:.2f} monthly".replace('.', ',')])
16441
16441
 
16442
16442
  result = f_name
16443
16443
  thumb = types.FSInputFile(os.path.join(EXTRA_D, "parse.jpg"))
@@ -16511,12 +16511,12 @@ async def return_retention_metrics(bot, data_users, EXTRA_D):
16511
16511
  else:
16512
16512
  rev = rev_by_cohort[c].get(offset, 0.0)
16513
16513
  if rev > 0:
16514
- cell = f"{rev:.1f}"
16514
+ cell = f"{rev:.1f}".replace('.', ',')
16515
16515
  row.append(cell)
16516
16516
  row_sum += rev
16517
16517
  else:
16518
- row.append("0.0")
16519
- row.append(f"{row_sum:.1f}")
16518
+ row.append("0,0")
16519
+ row.append(f"{row_sum:.1f}".replace('.', ','))
16520
16520
  writer.writerow(row)
16521
16521
 
16522
16522
  factors = []
@@ -16529,7 +16529,7 @@ async def return_retention_metrics(bot, data_users, EXTRA_D):
16529
16529
  avg_multiplier = math.prod(factors) ** (1 / len(factors)) if factors else 1.0
16530
16530
 
16531
16531
  writer.writerow([])
16532
- writer.writerow([f"NRR ~ ×{avg_multiplier:.2f} monthly"])
16532
+ writer.writerow([f"NRR ~ ×{avg_multiplier:.2f} monthly".replace('.', ',')])
16533
16533
 
16534
16534
  result = f_name
16535
16535
  thumb = types.FSInputFile(os.path.join(EXTRA_D, "parse.jpg"))
@@ -16546,6 +16546,7 @@ async def return_profit_and_loss_metrics(bot, data_users, EXTRA_D):
16546
16546
  try:
16547
16547
  metrics = defaultdict(lambda: {"sum_amount": 0.0})
16548
16548
 
16549
+ # Собираем данные по месяцам
16549
16550
  for USER_TID, USER_VARS, USER_LSTS in data_users:
16550
16551
  USER_LSTS = json.loads(USER_LSTS or "{}")
16551
16552
  USER_PAYMENTS = USER_LSTS.get("USER_PAYMENTS", [])
@@ -16556,12 +16557,14 @@ async def return_profit_and_loss_metrics(bot, data_users, EXTRA_D):
16556
16557
  amt = float(pay.get("AMOUNT", 0)) * 0.013
16557
16558
  metrics[mo_p]["sum_amount"] += amt
16558
16559
 
16560
+ # Функция форматирования с запятой
16559
16561
  def fmt(x):
16560
- return f"{x:.2f}".rstrip("0").rstrip(".") if x is not None else ""
16562
+ return f"{x:.2f}".rstrip("0").rstrip(".").replace(".", ",") if x is not None else ""
16561
16563
 
16562
16564
  # Сортируем месяцы
16563
16565
  months_sorted = sorted(metrics.keys())
16564
16566
  results = []
16567
+ np_values = []
16565
16568
 
16566
16569
  for mo in months_sorted:
16567
16570
  MRR = metrics[mo]["sum_amount"]
@@ -16570,12 +16573,12 @@ async def return_profit_and_loss_metrics(bot, data_users, EXTRA_D):
16570
16573
  OPEX = 4.5
16571
16574
  OP = GP - OPEX
16572
16575
 
16573
- # из OP сначала вычитаем 30%, затем из результата вычитаем 1%
16574
- after_comm = OP * 0.70 # остаётся после 30% комиссии
16575
- after_fiat = after_comm * 0.99 # остаётся после ещё 1% на обмен
16576
- COMM = OP - after_comm # сама комиссия (30% от OP)
16577
- EXCH = after_comm - after_fiat # сама часть обмена (1% от остатка после комиссии)
16578
- NP = after_fiat # чистая прибыль
16576
+ # комиссия 30% и обмен 1%
16577
+ after_comm = OP * 0.70
16578
+ after_fiat = after_comm * 0.99
16579
+ COMM = OP - after_comm
16580
+ EXCH = after_comm - after_fiat
16581
+ NP = after_fiat
16579
16582
 
16580
16583
  results.append([
16581
16584
  mo,
@@ -16588,16 +16591,27 @@ async def return_profit_and_loss_metrics(bot, data_users, EXTRA_D):
16588
16591
  fmt(EXCH),
16589
16592
  fmt(NP)
16590
16593
  ])
16594
+ np_values.append(NP)
16595
+
16596
+ # Вычисляем средний NP (если есть хотя бы одно значение)
16597
+ avg_np = sum(np_values) / len(np_values) if np_values else 0.0
16598
+ avg_np_str = fmt(avg_np)
16591
16599
 
16592
16600
  f_name = os.path.join(EXTRA_D, "5_profit_and_loss_metrics.csv")
16593
16601
  with open(f_name, "w", newline="", encoding="utf-8") as f:
16594
16602
  writer = csv.writer(f)
16603
+ # Заголовок
16595
16604
  writer.writerow([
16596
16605
  "Mo", "MRR", "COGS", "Gross Profit",
16597
16606
  "OPEX", "Operating Profit", "Comission (30%)", "Fiat (1%)", "Net Profit"
16598
16607
  ])
16608
+ # Строки по месяцам
16599
16609
  for row in results:
16600
16610
  writer.writerow(row)
16611
+ # Пустая строка перед средним
16612
+ writer.writerow([])
16613
+ # Строка со средним Net Profit
16614
+ writer.writerow([f"Average Net Profit: {avg_np_str}"])
16601
16615
 
16602
16616
  result = f_name
16603
16617
  thumb = types.FSInputFile(os.path.join(EXTRA_D, "parse.jpg"))
@@ -16607,6 +16621,7 @@ async def return_profit_and_loss_metrics(bot, data_users, EXTRA_D):
16607
16621
  await asyncio.sleep(round(random.uniform(0, 1), 2))
16608
16622
  finally:
16609
16623
  return result
16624
+
16610
16625
  # endregion
16611
16626
 
16612
16627
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: yeref
3
- Version: 0.25.5
3
+ Version: 0.25.6
4
4
  Summary: desc-f
5
5
  Author: john smith
6
6
  Dynamic: author
@@ -0,0 +1,8 @@
1
+ yeref/__init__.py,sha256=Qpv3o6Xa78VdLcsSRmctGtpnYE9btpAkCekgGhgJyXM,49
2
+ yeref/l_.py,sha256=LMX_olmJwq-tgoALJCnhV_fGrL_i_43yBLkLIcEVqGo,1176743
3
+ yeref/tonweb.js,sha256=Jf6aFOQ1OIY4q7fINYz-m5LsI3seMus124M5SYYZmtE,443659
4
+ yeref/yeref.py,sha256=8Ow6asK12jj3noAAUVtCKwq-txpj_ks_w-L-IQKqaZA,1056443
5
+ yeref-0.25.6.dist-info/METADATA,sha256=bsrMXHVBgRzsBy8TBIwOSrV1PA13MYOgpYrFdb4BfPY,118
6
+ yeref-0.25.6.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
7
+ yeref-0.25.6.dist-info/top_level.txt,sha256=yCQKchWHbfV-3OuQPYRdi2loypD-nmbDJbtt3OuKKkY,6
8
+ yeref-0.25.6.dist-info/RECORD,,
@@ -1,8 +0,0 @@
1
- yeref/__init__.py,sha256=Qpv3o6Xa78VdLcsSRmctGtpnYE9btpAkCekgGhgJyXM,49
2
- yeref/l_.py,sha256=LMX_olmJwq-tgoALJCnhV_fGrL_i_43yBLkLIcEVqGo,1176743
3
- yeref/tonweb.js,sha256=Jf6aFOQ1OIY4q7fINYz-m5LsI3seMus124M5SYYZmtE,443659
4
- yeref/yeref.py,sha256=ljsCvG1omKMY2PpVKfFunM1eTcMNd7w_aW_GFX3b8Ps,1055985
5
- yeref-0.25.5.dist-info/METADATA,sha256=L3eS_VIOpEfv271siW57nYb5571PNCcE-XqbHoAID-k,118
6
- yeref-0.25.5.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
7
- yeref-0.25.5.dist-info/top_level.txt,sha256=yCQKchWHbfV-3OuQPYRdi2loypD-nmbDJbtt3OuKKkY,6
8
- yeref-0.25.5.dist-info/RECORD,,
File without changes