added columns to csv: price after promotion, discount in percentage and promotion type (regular/club/credit card).

This commit is contained in:
KorenLazar
2021-02-23 08:27:00 +02:00
parent 850d3963fe
commit 8aa33cbcda

View File

@@ -1,4 +1,6 @@
import re
from datetime import datetime from datetime import datetime
from enum import Enum
from typing import Dict, List from typing import Dict, List
import csv import csv
@@ -13,19 +15,34 @@ from supermarket_chain import SupermarketChain
PRODUCTS_TO_IGNORE = ['סירים', 'מגבות', 'מגבת', 'מפות', 'פסטיגל', 'ביגי'] PRODUCTS_TO_IGNORE = ['סירים', 'מגבות', 'מגבת', 'מפות', 'פסטיגל', 'ביגי']
# class ClubID(Enum):
# Regular = 'מבצע רגיל'
# Club = 'מועדון'
# CreditCard = 'כרטיס אשראי'
# Other = 'אחר'
class ClubID(Enum):
מבצע_רגיל = 0
מועדון = 1
כרטיס_אשראי = 2
אחר = 3
class Promotion: class Promotion:
""" """
A class of a promotion in Shufersal. A class of a promotion in Shufersal.
It contains only part of the available information in Shufersal's data. It contains only part of the available information in Shufersal's data.
""" """
def __init__(self, content: str, start_date: datetime, end_date: datetime, update_date: datetime, def __init__(self, content: str, start_date: datetime, end_date: datetime, update_date: datetime, items: List[Item],
items: List[Item]): price_after_promo, club_id):
self.content: str = content self.content: str = content
self.start_date: datetime = start_date self.start_date: datetime = start_date
self.end_date: datetime = end_date self.end_date: datetime = end_date
self.update_date: datetime = update_date self.update_date: datetime = update_date
self.price_after_promo = price_after_promo
self.items: List[Item] = items self.items: List[Item] = items
self.club_id = club_id
def __repr__(self): def __repr__(self):
title = self.content title = self.content
@@ -55,14 +72,17 @@ def write_promotions_to_csv(promotions: List[Promotion], output_filename: str) -
with open(output_filename, mode='w', newline='') as f_out: with open(output_filename, mode='w', newline='') as f_out:
promos_writer = csv.writer(f_out) promos_writer = csv.writer(f_out)
promos_writer.writerow([ promos_writer.writerow([
'תיאור המבצע', 'תיאור מבצע',
'הפריט המשתתף במבצע', 'הפריט המשתתף במבצע',
'מחיר לפני המבצע', 'מחיר לפני מבצע',
'זמן תחילת המבצע', 'מחיר אחרי מבצע',
'זמן סיום המבצע', 'אחוז הנחה',
'סוג מבצע',
'זמן תחילת מבצע',
'זמן סיום מבצע',
'זמן עדכון אחרון', 'זמן עדכון אחרון',
'יצרן', 'יצרן',
'ברקוד של הפריט' 'ברקוד פריט'
]) ])
for promo in promotions: for promo in promotions:
@@ -70,6 +90,9 @@ def write_promotions_to_csv(promotions: List[Promotion], output_filename: str) -
[[promo.content, [[promo.content,
item.name, item.name,
item.price, item.price,
f'{promo.price_after_promo:.3f}',
f'{(float(item.price) - promo.price_after_promo) / float(item.price):.3%}',
promo.club_id.name.replace('_', ' '),
promo.start_date, promo.start_date,
promo.end_date, promo.end_date,
promo.update_date, promo.update_date,
@@ -95,6 +118,14 @@ def get_available_promos(chain: SupermarketChain, store_id: int, load_prices: bo
promo_objs = list() promo_objs = list()
for promo in bs_promos.find_all(chain.promotion_tag_name): for promo in bs_promos.find_all(chain.promotion_tag_name):
discounted_price = promo.find('DiscountedPrice')
min_qty = promo.find('MinQty')
# if int(promo.find('IsGiftItem').text):
club_id = ClubID(int(promo.find(re.compile(r'ClubI[d|D]')).text))
if discounted_price and min_qty:
price_after_promo = float(discounted_price.text) / float(min_qty.text)
else:
price_after_promo = -1
promo = Promotion( promo = Promotion(
content=promo.find('PromotionDescription').text, content=promo.find('PromotionDescription').text,
start_date=datetime.strptime( start_date=datetime.strptime(
@@ -102,9 +133,13 @@ def get_available_promos(chain: SupermarketChain, store_id: int, load_prices: bo
chain.date_hour_format), chain.date_hour_format),
end_date=datetime.strptime(promo.find( end_date=datetime.strptime(promo.find(
'PromotionEndDate').text + ' ' + promo.find('PromotionEndHour').text, chain.date_hour_format), 'PromotionEndDate').text + ' ' + promo.find('PromotionEndHour').text, chain.date_hour_format),
update_date=datetime.strptime(promo.find(chain.promotion_update_tag_name).text, chain.update_date_format), update_date=datetime.strptime(promo.find(chain.promotion_update_tag_name).text,
chain.update_date_format),
items=chain.get_items(promo, items_dict), items=chain.get_items(promo, items_dict),
price_after_promo=price_after_promo,
club_id=club_id,
) )
if is_valid_promo(promo): if is_valid_promo(promo):
if promo_objs and promo_objs[-1] == promo: # Merge equal promos if promo_objs and promo_objs[-1] == promo: # Merge equal promos
promo_objs[-1].items.extend(promo.items) promo_objs[-1].items.extend(promo.items)