Skip to content

Commit

Permalink
Update .gitignore and modify code in Create_Browser.py, inventaireMon…
Browse files Browse the repository at this point in the history
…go.py, csvReader.py, UpdatePricePromocash.py, Course.py, and remiseStockManuelle.py. Update inventory files in csv folder.
  • Loading branch information
BaptTF committed Mar 29, 2024
1 parent c02be19 commit ccaf5c3
Show file tree
Hide file tree
Showing 14 changed files with 228 additions and 44 deletions.
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,9 @@ Inventaire.csv
Inventaire_modif.csv
ProduitARecalculer.csv
Course_non_drive.csv
Produit_non_trouve.csv
Produits_non_trouves.csv
Update_optimal.csv
Update_optimal_manquant.csv
.env
.vscode
bar.categories.json
Expand Down
7 changes: 4 additions & 3 deletions csv/Inventaire_Auchan.csv
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
Produit,Quantité restante,Quantité optimale,Nombre de produits par lots,REF
Petits saucissons secs,6,8,1,45710
Pringles Original,5,5,1,909371
Tuiles Oignon,5,5,1,58596
Expand All @@ -18,12 +19,12 @@ Riz cantonais,0,5,1,159143
Monster Munch Original,3,3,1,404838
Monster munch ketchup,2,6,1,579367
Brownie,15,16,8,71713
Crepe fourree choco,24,30,15,917944
Crepe fourree choco,21,30,15,917944
Gaufre chocolat,19,24,6,78106
KitKat,33,20,10,662145
Barre Nesquik,21,24,6,510716
Barre chocapic,22,24,6,509565
2 Pains choco indus,23,16,8,252180
2 Pains choco indus,22,40,8,252180
Barre Cereales Chocolat,27,24,6,514819
Skittles Mini Rouges,4,8,8,149149
Barre Cereales Fruits Rouges,23,24,6,336405
Expand All @@ -47,7 +48,7 @@ Oreo Pocket,18,20,5,468893
Nouilles Boeuf,5,3,1,482770
Kinder Country,21,30,18,426818
Twix White,15,20,5,631948
5 Schokobons,33,16,16,72628
5 Schokobons,33,20,16,72628
Napolitain,29,24,12,114583
Magnum Amande,18,16,8,802809
Magnum Double Gold,3,8,4,862306
Expand Down
19 changes: 10 additions & 9 deletions csv/Inventaire_Promocash.csv
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
Produit,Quantité restante,Quantité optimale,Nombre de produits par lots,REF
Coca Cola,66,62,24,525199
Coca Cherry,55,62,24,418172
Coca Cola Zero,40,48,24,418171
Expand All @@ -23,15 +24,15 @@ Jus Orange,20,24,12,892560
Jus fraise,15,18,12,592698
Jus Multifruit,11,18,12,892620
Jus Peche,13,18,12,892522
Jus ACE,14,18,12,892619
Jus ACE,13,18,12,892619
Jus Mangue,12,18,12,892590
Jus Banane,14,18,12,892580
Jus Banane,13,18,12,892580
Jus Abricot,24,18,12,892571
Jus Pomme,20,24,12,892556
Jus Raisin,12,18,12,892628
Jus tomate,8,18,12,892629
Jus Poire,0,0,12,892540
Jus Pamplemousse,12,18,12,
Jus Pamplemousse,11,18,12,
Arizona Mucho Mango,7,6,6,611479
Arizona Green Tea,8,6,6,609713
Arizona Fruit Punch,16,6,6,611243
Expand All @@ -45,14 +46,14 @@ Canada dry,51,12,6,826746
Monster Mango Loco,16,12,12,421904
Monster Pipeline Punch,7,12,12,368789
Monster Ultra Zero Sugar,11,12,12,296648
Monster Ultra Paradise,33,12,12,267133
Monster Ultra Paradise,32,12,12,267133
Monster Energy,27,36,24,394647
Monster Ultra Gold,14,12,12,815429
Capri-Sun 20cl Multi Vitamin,36,40,10,778766
Capri-Sun 20cl Multi Vitamin,35,40,10,778766
Cacolac,19,12,24,599300
Sprite,15,24,24,905216
Jus Pamplemousse,12,18,12,892552
Kinder Bueno$,90,150,30,070295
Kinder Bueno White,76,100,30,961578
Sprite,14,24,24,905216
Jus Pamplemousse,11,18,12,892552
Kinder Bueno$,87,150,30,070295
Kinder Bueno White,75,100,30,961578
Kinder Country,21,30,24,723788
Oreo Pocket,18,20,5,896676
32 changes: 18 additions & 14 deletions src/Auchan.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,8 +41,8 @@ def auchan(IDENTIFIANT_AUCHAN, PASSWORD_AUCHAN, WEB_BROWSER):
print("Le panier a été vidé")
except:
print("Le panier est déjà vide")
prix = []
produit_non_trouve = []
prix = [('Produit', 'Nombre de lots à acheter', 'Nombre de produits par lots', 'Prix')]
produits_non_trouves = [('Produit', 'Nombre de lots à acheter', 'Nombre de produits par lots', 'REF')]
sleep(1)
# Ajouts des produits
def ajout_produit(row):
Expand All @@ -51,38 +51,42 @@ def ajout_produit(row):
try:
prix_produit = float(driver.find_element(By.XPATH, "//meta[@itemprop='price']").get_attribute("content").replace(',','.'))
except:
print(f"Le produit {produits[row]} n'est pas disponible")
produit_non_trouve.append((produits[i], nb_de_lots_a_acheter, nb_produits[i], supposed_nb_produits[i], nb_produits_par_lots[i], ref_produits_auchan[row]))
print(f"{produits[row]} ajouté dans le fichier Produit_non_trouve.csv")
print(f"Le produit {produits[row]} n'est pas était trouvé sur le drive, ajout dans le fichier Produits_non_trouves.csv")
produits_non_trouves.append((produits[row], nb_de_lots_a_acheter[row], nb_produits_par_lots[row], ref_produits_auchan[row]))
print("Passage au produit suivant")
return
prix.append((produits[row],nb_de_lots_a_acheter[row], nb_produits_par_lots[row], prix_produit))
prix.append((produits[row], nb_de_lots_a_acheter[row], nb_produits_par_lots[row], prix_produit))
for i in range(int(nb_de_lots_a_acheter[row])):
try:
driver.find_element(By.XPATH, "//button[contains(.,'Ajouter au panier')]").click()
except:
print(f"Le produit {produits[row]} est au max, il y a {i+1} / {nb_de_lots_a_acheter[row]} mis dans le panier")
prix[-1][2] = i + 1
produit_non_trouve.append((produits[i], nb_de_lots_a_acheter - i - 1, nb_produits[i], supposed_nb_produits[i], nb_produits_par_lots[i], ref_produits_auchan[row]))
print(f"{nb_de_lots_a_acheter - i - 1} {produits[row]} ajouté dans le fichier Produit_non_trouve.csv")
prix[-1] = (produits[row], i + 1, nb_produits_par_lots[row], ref_produits_auchan[row])
produits_non_trouves.append((produits[row], nb_de_lots_a_acheter[row] - i - 1, nb_produits_par_lots[row], ref_produits_auchan[row]))
print(f"{nb_de_lots_a_acheter - i - 1} {produits[row]} ajouté dans le fichier Produits_non_trouves.csv")
print("Passage au produit suivant")
break
sleep(0.5)

for row in range(len(produits)):
try:
ajout_produit(row)
if ref_produits_auchan[row] != '':
ajout_produit(row)
else:
print(f"Le produit {produits[row]} n'est pas disponible sur le drive, ajout dans le fichier produits_non_trouves.csv")
produits_non_trouves.append((produits[row], nb_de_lots_a_acheter[row], nb_produits_par_lots[row], ref_produits_auchan[row]))
except Exception as e:
print(f"{produits[row]} n'as pas réussi à être ajouté à cause de l'erreur suivante : {e}")
produit_non_trouve.append((produits[row], nb_de_lots_a_acheter, nb_produits[row], supposed_nb_produits[row], nb_produits_par_lots[row], ref_produits_auchan[row]))
print(f"{produits[row]} ajouté dans le fichier Produit_non_trouve.csv")
produits_non_trouves.append((produits[row], nb_de_lots_a_acheter[row], nb_produits_par_lots[row], ref_produits_auchan[row]))
print(f"{produits[row]} ajouté dans le fichier Produits_non_trouves.csv")
print("Passage au produit suivant")
sleep(1)
# Vérification du panier
sleep(1)
driver.get("https://www.auchan.fr/checkout/cart/")
csv_writer('Prix.csv', prix)
if produit_non_trouve != []:
csv_writer('Produit_non_trouve.csv', produit_non_trouve)
if produits_non_trouves != []:
csv_writer('Produits_non_trouves.csv', produits_non_trouves)

if __name__ == '__main__':
load_dotenv()
Expand Down
112 changes: 112 additions & 0 deletions src/CalculOptimalAmount.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
from pymongo import MongoClient
from datetime import datetime, timedelta
from datetime import timezone as tz
from dotenv import load_dotenv
from csvReader import csv_reader
from csvWriter import csv_writer
from os import getenv
from bson.int64 import Int64
import math

def arrondi_au_mutilple(x, a):
if a <= 0:
return x
return math.ceil(x / a) * a

def calcul_optimal_amount(client, magasin, days=21, security=True):
# Access a specific database
db = client["bar"]

# Access a specific collection within the database
collection_transactions = db["transactions"]
week_quantities = get_item_sales_weeks(collection_transactions, days)
collection_items = db["items"]

if magasin == "p":
produits = csv_reader(file='Inventaire_Promocash.csv', row_number=0)
nb_produits_par_lots = csv_reader(file='Inventaire_Promocash.csv', row_number=3)
elif magasin == "a":
produits = csv_reader(file='Inventaire_Auchan.csv', row_number=0)
nb_produits_par_lots = csv_reader(file='Inventaire_Auchan.csv', row_number=3)
else:
print("Magasin inconnu")
exit()

print("La sécurité est désactivée, vous êtes sûr de ce que vous faites" if security == False else "La sécurité est activée, vous pouvez annuler à tout moment")
update_optimal_amount = [('id', 'name', 'amount_sold', 'new_optimal_amount', 'old_optimal_amount')]
update_optimal_manquant = [('id', 'name', 'amount_left', 'optimal_amount', 'optimal_amount')]
for i in range(len(produits)):
query = { "name": { "$regex": produits[i], "$options" :'i'}, "deleted_at": None}
produit = collection_items.find_one(query)
if produit["name"] in week_quantities.keys() and produit["amount_left"] != 0:
new_optimal_amount = Int64(arrondi_au_mutilple(week_quantities[produit["name"]], int(nb_produits_par_lots[i])))
if new_optimal_amount != produit["optimal_amount"]:
update_optimal_amount.append((produit["_id"], produit["name"], week_quantities[produit["name"]], new_optimal_amount, produit["optimal_amount"]))
if not security:
if input(f"Voulez vous modifier le montant optimal du produit {produit['name']} de {produit['optimal_amount']} pour {new_optimal_amount} (nb_produit_vendu: {int(week_quantities[produit['name']])})? (y/n)") == "y":
collection_items.update_one({"name": produit["name"]}, {"$set": {"optimal_amount": new_optimal_amount}})
print(f"{produit['name']} Modifier")
else:
update_optimal_manquant.append((produit["_id"], produit["name"], produit["amount_left"], produit["optimal_amount"], produit["optimal_amount"]))

print("Modification écrite dans le fichier Update_optimal.csv et Update_optimal_manquant.csv")
print("(id, name, amount_sold, new_optimal_amount, old_optimal_amount)")
csv_writer('Update_optimal.csv', update_optimal_amount)
csv_writer('Update_optimal_manquant.csv', update_optimal_manquant)

def get_item_sales_weeks(transactions_collection, w):
# Calculate the date w weeks ago
three_weeks_ago = int((datetime.now(tz.utc) - timedelta(days=w)).timestamp())
# Create the pipeline for the aggregation
pipeline = [
{
"$match": {
"created_at": { "$gte": three_weeks_ago }
}
},
{
"$unwind": "$items"
},
{
"$group": {
"_id": "$items.item_id",
"totalQuantity": { "$sum": "$items.item_amount" }
}
},
{
"$lookup": {
"from": "items",
"localField": "_id",
"foreignField": "id",
"as": "item_data"
}
},
{
"$unwind": "$item_data"
},
{
"$project": {
"_id": 0,
"item_name": "$item_data.name",
"totalQuantity": 1
}
},
{
"$group": {
"_id": "$item_name",
"totalQuantity": { "$sum": "$totalQuantity" }
}
}
]

# Execute the aggregation and fetch the results
results = transactions_collection.aggregate(pipeline)
item_sales_dict = {result['_id']: result['totalQuantity'] for result in results}
return item_sales_dict


if __name__ == '__main__':
load_dotenv()
client = MongoClient(f"mongodb://bar:{getenv('MONGO_MDP')}@mongo.telecomnancy.net:443/?authMechanism=DEFAULT&authSource=bar&directConnection=true&tls=true&tlsCertificateKeyFile={getenv('MONGO_PEM')}")
calcul_optimal_amount(client, "p")
#update_optimal_amount(client, "Update_optimal.csv")
4 changes: 2 additions & 2 deletions src/Course.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@ def creation_de_la_liste_de_course(seuil_pour_acheter_pourcentage_du_nombre_de_p
ifls_produits_promocash = csv_reader(file, row_number=4)
#produits = [(p,nb,s) for p,nb,s in zip(produits,nb_produits, supposed_nb_produits)]

course = []
course_non_drive = []
course = [('Produit', 'Nombre de lots à acheter', 'Nombre de produits', 'Nombre de produits supposé', 'Nombre de produits par lots', 'REF')]
course_non_drive = [('Produit', 'Nombre de lots à acheter', 'Nombre de produits', 'Nombre de produits supposé', 'Nombre de produits par lots', 'REF')]
for i in range(len(produits)):
if nb_produits[i] == 'Produit non trouvé': nb_produits[i] = 999999999
nb_produits[i] = int(nb_produits[i])
Expand Down
2 changes: 1 addition & 1 deletion src/Create_Browser.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ def create_browser(WEB_BROWSER):
else:
print("Le navigateur n'est pas reconnu, veuillez choisir entre chrome et firefox")
exit()
driver.implicitly_wait(100)
driver.implicitly_wait(2)
return driver

if __name__ == '__main__':
Expand Down
15 changes: 8 additions & 7 deletions src/Promocash.py
Original file line number Diff line number Diff line change
Expand Up @@ -54,19 +54,20 @@ def ajout_produit(row):
except:
print("Le panier était déjà vide")
sleep(0.2)
prix = []
produits_non_trouves = []
prix = [('Produit', 'Nombre de lots à acheter', 'Nombre de produits par lots', 'Prix', 'REF')]
produits_non_trouves = [('Produit', 'Nombre de lots à acheter', 'Nombre de produits par lots', 'REF')]
for row in range(len(produits)):
if ifls_produits_promocash[row] != '' and produits[row] != "Bonbons Haribo":
try:
ajout_produit(row)
except Exception as e:
print(f"{produits[row]} n'as pas réussi à être ajouté à cause de l'erreur suivante : {e}")
produits_non_trouves.append((produits[row], nb_de_lots_a_acheter[row], nb_produits[row], supposed_nb_produits[row], nb_produits_par_lots[row], ifls_produits_promocash[row]))
produits_non_trouves.append((produits[row], nb_de_lots_a_acheter[row], nb_produits_par_lots[row], ifls_produits_promocash[row]))
print(f"{produits[row]} ajouté dans le fichier Produit_non_trouve.csv")
print("Passage au produit suivant")
else:
print(f"Le produit {produits[row]} n'a pas été ajouté car il n'est pas dans la base de données")
print(f"Le produit {produits[row]} n'est pas disponible sur le drive, ajout dans le fichier Produit_non_trouve.csv")
produits_non_trouves.append((produits[row], nb_de_lots_a_acheter[row], nb_produits[row], supposed_nb_produits[row], nb_produits_par_lots[row], ifls_produits_promocash[row]))

csv_writer('Prix.csv', prix)

Expand All @@ -80,7 +81,7 @@ def ajout_produit(row):
nb_produits = csv_reader('Course_manuelle.csv', row_number=1)
supposed_nb_produits = csv_reader('Course_manuelle.csv', row_number=2)
ifls_produits_promocash = csv_reader('Course_manuelle.csv', row_number=3)
prix_manuelle = []
prix_manuelle = [('Produit', 'Nombre de lots à acheter', 'Prix', 'REF')]
def ajout_produit(row):
driver.get(f"https://nancy.promocash.com/produitListe.php?searchString={ifls_produits_promocash[row]}")
nb_de_lots_int = int(supposed_nb_produits[row]) - int(nb_produits[row])
Expand All @@ -101,8 +102,8 @@ def ajout_produit(row):
produits_non_trouves.append((produits[row], nb_de_lots_a_acheter[row], nb_produits[row], supposed_nb_produits[row], nb_produits_par_lots[row], ifls_produits_promocash[row]))
print(f"{produits[row]} ajouté dans le fichier Produit_non_trouve.csv")
print("Passage au produit suivant")
if prix_manuelle != []:
prix_manuelle.append(("Total HT",sum([x[2] for x in prix_manuelle])))
if prix_manuelle != [('Produit', 'Nombre de lots à acheter', 'Prix', 'REF')]:
prix_manuelle.append(("Total HT",sum([x[2] for x in prix_manuelle[1:]])))
else:
prix_manuelle.append(("Total HT",0))
csv_writer('Prix_manuelle.csv', prix_manuelle)
Expand Down
27 changes: 26 additions & 1 deletion src/ReapproComplete.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
from remiseStockManuelle import stock_max
from UpdatePricePromocash import updatePricePromocash
from PrintCalculPrixTotal import print_calcul_prix_total
from CalculOptimalAmount import calcul_optimal_amount
from UpdateOptimalAmount import update_optimal_amount
from pymongo import MongoClient
from os import getenv
from dotenv import load_dotenv
Expand Down Expand Up @@ -42,13 +44,15 @@
if input("Voulez-vous commander sur Promocash (y/n) ?") == 'y':
promocash(getenv("NUMERO_CARTE_PROMOCASH"), getenv("PASSWORD_PROMOCASH"), getenv("WEB_BROWSER"))
print("Commande faite sur Promocash et enregistré le fichier Prix.csv (nom_produit, nb_de_lots_acheter, nb_produits_par_lots, prix)")
print("Les produits non trouvés sont dans le fichier Produits_non_trouves.csv")
else:
exit()
else:
# 3 EME ETAPE: ALLER SUR AUCHAN
if input("Voulez-vous commander sur Auchan (y/n) ?") == 'y':
auchan(getenv("IDENTIFIANT_AUCHAN"), getenv("PASSWORD_AUCHAN"), getenv("WEB_BROWSER"))
print("Commande faite sur Auchan et enregistré le fichier Prix.csv (nom_produit, nb_de_lots_acheter, nb_produits_par_lots, prix)")
print("Les produits non trouvés sont dans le fichier Produits_non_trouves.csv")
else:
exit()

Expand All @@ -59,7 +63,7 @@
print("Stock manuelle remis à jour")
else:
print("Stock manuelle non modifié")
else:
elif magasin == 'r':
# 4 EME ETAPE: FAIRE LA REAPPRO SUR LE BAR
print_calcul_prix_total("all")
magasin = input("Voulez-vous faire la reappro pour Promocash ou pour Auchan (p/a) ?")
Expand All @@ -84,5 +88,26 @@
print("Reappro fait via la base de données directement")
else:
exit()
elif magasin == 'u':
# 5 EME ETAPE: CALCULER LE NOMBRE OPTIMAL DE PRODUITS
magasin = input("Voulez-vous calculer le nombre optimal de produits pour Promocash ou pour Auchan (p/a) ?")
if magasin == 'p':
calcul_optimal_amount(client, magasin)
elif magasin == 'a':
calcul_optimal_amount(client, magasin)
else:
print("Drive inconnue")

# 6 EME ETAPE: METTRE A JOUR LE NOMBRE OPTIMAL DE PRODUITS
magasin = input("Voulez-vous mettre à jour le nombre optimal de produits (y/n) ?")
if magasin == 'y':
update_optimal_amount(client, "Update_optimal.csv", security=False)
elif magasin == 'n':
print("Le nombre optimal de produits n'a pas été mis à jour")
else:
print("Commande inconnue, Le nombre optimal de produits n'a pas été mis à jour")
else:
print("Commande inconnue")

# Close the connection when you're done
client.close()
Loading

0 comments on commit ccaf5c3

Please sign in to comment.