Ela_Back/Dashbord_queries/factures_tbd_qries.py

2541 lines
102 KiB
Python

"""
Ce fichier permet de gerer les tableaux de bord liée aux factures, commandes et devis
"""
import ast
import dateutil
import pymongo
import xlsxwriter
from flask import send_file
from pymongo import MongoClient
import json
from bson import ObjectId
import re
from datetime import datetime, timezone, date
import prj_common as mycommon
import secrets
import inspect
import sys, os
import csv
import pandas as pd
from pymongo import ReturnDocument
import GlobalVariable as MYSY_GV
from math import isnan
import GlobalVariable as MYSY_GV
from datetime import timedelta
from datetime import timedelta
import Dashbord_queries.formation_tbd_qries as formation_tbd_qries
from dateutil.relativedelta import relativedelta
"""
Recuperation du chiffre d'affaire (factures)
par mois, client,
"""
def Get_Qery_List_Factures_Data_By_Periode(diction):
try:
diction = mycommon.strip_dictionary(diction)
"""
Verification des input acceptés
"""
field_list = ['token', 'periode_start_date', 'periode_end_date', 'filter_value', 'filter_client_id' ]
incom_keys = diction.keys()
for val in incom_keys:
if val not in field_list and val.startswith('my_') is False:
mycommon.myprint(str(
inspect.stack()[0][3]) + " Le champ '" + val + "' n'existe pas")
return False, " Les informations fournies sont incorrectes",
"""
Verification des champs obligatoires
"""
field_list_obligatoire = ['token', ]
for val in field_list_obligatoire:
if val not in diction:
mycommon.myprint(
str(inspect.stack()[0][3]) + " - La valeur '" + val + "' n'est pas presente dans la liste des arguments ")
return False, " Les informations fournies sont incorrectes",
"""
Verification de l'identité et autorisation de l'entité qui
appelle cette API
"""
token = ""
if ("token" in diction.keys()):
if diction['token']:
token = diction['token']
local_status, my_partner = mycommon.Check_Connexion_And_Return_Partner_Data(diction)
if (local_status is not True):
return local_status, my_partner
filt_client_id = {}
if ("filter_client_id" in diction.keys() and diction['filter_client_id']):
filt_client_id = {'order_header_client_id': str(diction['filter_client_id'])}
filt_periode_start_date = ""
if ("periode_start_date" in diction.keys() and diction['periode_start_date']):
filt_periode_start_date = str(diction['periode_start_date'])[0:10]
local_status = mycommon.CheckisDate(filt_periode_start_date)
if (local_status is False):
mycommon.myprint(str(
inspect.stack()[0][3]) + " Le filtre : 'date de debut' n'est pas au format jj/mm/aaaa.")
return False, " Le filtre : 'date de debut' n'est pas au format jj/mm/aaaa."
filt_periode_end_date = ""
if ("periode_end_date" in diction.keys() and diction['periode_end_date']):
filt_periode_end_date = str(diction['periode_end_date'])[0:10]
local_status = mycommon.CheckisDate(filt_periode_end_date)
if (local_status is False):
mycommon.myprint(str(
inspect.stack()[0][3]) + " Le filtre : 'date de fin' n'est pas au format jj/mm/aaaa.")
return False, " Le filtre : 'date de fin' n'est pas au format jj/mm/aaaa."
"""
Si la valeur de 'filter_value' est m0 ou m1, on va aller recuperer les date du mois correspondant.
On ecrase les valeur de filt_session_start_date et filt_session_end_date
"""
if ('filter_value' in diction.keys()):
# print(" filter_value = ", diction['filter_value'])
if (str(diction['filter_value']) == "m0"):
# On recupere les date du mois en cours
local_status, start_current_month_date, end_current_month_date = mycommon.Get_Current_Month_Start_End_Date()
if (local_status is False):
return local_status, start_current_month_date
filt_periode_start_date = start_current_month_date
filt_periode_end_date = end_current_month_date
# print(" ### filt_session_start_date = ", filt_session_start_date, " ### filt_session_end_date = ", filt_session_end_date)
elif (str(diction['filter_value']) == "m1"):
# On recupere les date du mois en cours
local_status, start_current_month_date, end_current_month_date = mycommon.Get_Previous_Month_Start_End_Date()
if (local_status is False):
return local_status, start_current_month_date
filt_periode_start_date = start_current_month_date
filt_periode_end_date = end_current_month_date
filt_periode_start_date_ISODATE = datetime.strptime(str(filt_periode_start_date), '%d/%m/%Y')
filt_periode_end_date_ISODATE = datetime.strptime(str(filt_periode_end_date), '%d/%m/%Y')
"""
Creation de la range des mois entre filt_periode_start_date_ISODATE et
filt_periode_end_date_ISODATE
"""
range_date_month = []
start = filt_periode_start_date_ISODATE
end = filt_periode_end_date_ISODATE
while start <= end:
node = {}
node['month_year'] = '{:02d}'.format(start.month) +"_"+str(start.year)
node['label'] = '{:02d}'.format(start.month) + "_" + str(start.year)
node['TotalAmount'] = 0
node['value'] = 0
node['count'] = 0
range_date_month.append(node)
start += relativedelta(months=1)
qery_match = {'$and': [{"partner_owner_recid": str(my_partner['recid'])},
{"valide": '1'},filt_client_id,
{
'mysy_invoice_date': {'$gte': filt_periode_start_date_ISODATE,
'$lte': filt_periode_end_date_ISODATE}}, ]}
pipe_qry = ([
{"$addFields": {
"mysy_invoice_date": {
'$dateFromString': {
'dateString': '$invoice_date',
'format': "%d/%m/%Y"
}
}
}
},
{'$match': qery_match},
{'$lookup': {
'from': 'partner_client',
"let": {'order_header_client_id': "$order_header_client_id", 'partner_owner_recid': '$partner_owner_recid'},
'pipeline': [
{'$match':
{'$expr':
{'$and':
[
{'$eq': ["$_id", {'$convert': {
'input': "$$order_header_client_id",
'to': "objectId",
'onError': {'error': 'true'},
'onNull': {'isnull': 'true'}
}}]},
{'$eq': ["$valide", "1"]},
{'$eq': ["$partner_recid", '$$partner_owner_recid']}
]
}
}
},
],
'as': 'partner_client_collection'
}
},
{'$group': {
'_id': {
"mois_annee_facture": { "$concat": [{'$substr': ["$invoice_date", 3, 2]},"_", {'$substr': ["$invoice_date", 6, 4]}]},
"annee_facture": {'$substr': ["$invoice_date", 6, 4]},
"mois_facture": {'$substr': ["$invoice_date", 3, 2]},
},
"TotalAmount": {"$sum": {'$toDouble': '$total_header_toutes_taxes'}},
"count": { "$sum": 1}
}
},
{
'$sort': {'_id.mois_annee_facture': 1}
},
])
#print(" ### Get_Qery_List_Factures_Data ici pipe_qry = ", pipe_qry)
RetObject = []
val_tmp = 0
axis_data = []
series_TotalAmount_data = []
count_cumule = 0
"""
On recupere les données, on les format dans le 'range_date_month' et on retourne"""
for retval in MYSY_GV.dbname['partner_invoice_header'].aggregate(pipe_qry):
val_tmp = val_tmp + 1
for tmp in range_date_month:
axis_data.append(str(tmp['month_year']))
if( str(retval['_id']['mois_annee_facture']) == str(tmp['month_year']) ):
tmp['TotalAmount'] = mycommon.tryFloat(str(retval['TotalAmount']))
tmp['count'] = mycommon.tryFloat(str(retval['count']))
count_cumule = mycommon.tryFloat(str(retval['TotalAmount'])) + count_cumule
tmp['TotalAmount_cumule'] = count_cumule
series_TotalAmount_data.append( str(retval['TotalAmount']))
else:
series_TotalAmount_data.append("0")
json_retval = {}
json_retval['data'] = range_date_month
json_retval['axis_data'] = axis_data
json_retval['series_TotalAmount_data'] = series_TotalAmount_data
print(" ### Get_Qery_List_Factures_Data_By_Periode : json_retval = ", json_retval)
RetObject.append(mycommon.JSONEncoder().encode(json_retval))
return True, RetObject
except Exception as e:
exc_type, exc_obj, exc_tb = sys.exc_info()
mycommon.myprint(str(inspect.stack()[0][3]) + " -" + str(e) + " - Line : " + str(exc_tb.tb_lineno))
return False, " Impossible de récupérer les données "
"""
Recuperation du chiffre d'affaire par formation
important : seulement les formation ayant un CA > 0
"""
def Get_Qery_List_Factures_Data_By_Class(diction):
try:
diction = mycommon.strip_dictionary(diction)
"""
Verification des input acceptés
"""
field_list = ['token', 'periode_start_date', 'periode_end_date', 'filter_value', ]
incom_keys = diction.keys()
for val in incom_keys:
if val not in field_list and val.startswith('my_') is False:
mycommon.myprint(str(
inspect.stack()[0][3]) + " Le champ '" + val + "' n'existe pas")
return False, " Les informations fournies sont incorrectes",
"""
Verification des champs obligatoires
"""
field_list_obligatoire = ['token', ]
for val in field_list_obligatoire:
if val not in diction:
mycommon.myprint(
str(inspect.stack()[0][3]) + " - La valeur '" + val + "' n'est pas presente dans la liste des arguments ")
return False, " Les informations fournies sont incorrectes",
"""
Verification de l'identité et autorisation de l'entité qui
appelle cette API
"""
token = ""
if ("token" in diction.keys()):
if diction['token']:
token = diction['token']
local_status, my_partner = mycommon.Check_Connexion_And_Return_Partner_Data(diction)
if (local_status is not True):
return local_status, my_partner
filt_periode_start_date = ""
if ("periode_start_date" in diction.keys() and diction['periode_start_date']):
filt_periode_start_date = str(diction['periode_start_date'])[0:10]
local_status = mycommon.CheckisDate(filt_periode_start_date)
if (local_status is False):
mycommon.myprint(str(
inspect.stack()[0][3]) + " Le filtre : 'date de debut' n'est pas au format jj/mm/aaaa.")
return False, " Le filtre : 'date de debut' n'est pas au format jj/mm/aaaa."
filt_periode_end_date = ""
if ("periode_end_date" in diction.keys() and diction['periode_end_date']):
filt_periode_end_date = str(diction['periode_end_date'])[0:10]
local_status = mycommon.CheckisDate(filt_periode_end_date)
if (local_status is False):
mycommon.myprint(str(
inspect.stack()[0][3]) + " Le filtre : 'date de fin' n'est pas au format jj/mm/aaaa.")
return False, " Le filtre : 'date de fin' n'est pas au format jj/mm/aaaa."
"""
Si la valeur de 'filter_value' est m0 ou m1, on va aller recuperer les date du mois correspondant.
On ecrase les valeur de filt_session_start_date et filt_session_end_date
"""
if ('filter_value' in diction.keys()):
# print(" filter_value = ", diction['filter_value'])
if (str(diction['filter_value']) == "m0"):
# On recupere les date du mois en cours
local_status, start_current_month_date, end_current_month_date = mycommon.Get_Current_Month_Start_End_Date()
if (local_status is False):
return local_status, start_current_month_date
filt_periode_start_date = start_current_month_date
filt_periode_end_date = end_current_month_date
# print(" ### filt_session_start_date = ", filt_session_start_date, " ### filt_session_end_date = ", filt_session_end_date)
elif (str(diction['filter_value']) == "m1"):
# On recupere les date du mois en cours
local_status, start_current_month_date, end_current_month_date = mycommon.Get_Previous_Month_Start_End_Date()
if (local_status is False):
return local_status, start_current_month_date
filt_periode_start_date = start_current_month_date
filt_periode_end_date = end_current_month_date
filt_periode_start_date_ISODATE = datetime.strptime(str(filt_periode_start_date), '%d/%m/%Y')
filt_periode_end_date_ISODATE = datetime.strptime(str(filt_periode_end_date), '%d/%m/%Y')
qery_match = {'$and': [{"partner_owner_recid": str(my_partner['recid'])},
{"valide": '1'},
{
'mysy_invoice_date': {'$gte': filt_periode_start_date_ISODATE,
'$lte': filt_periode_end_date_ISODATE}}, ]}
pipe_qry = ([
{"$addFields": {
"mysy_invoice_date": {
'$dateFromString': {
'dateString': '$invoice_date',
'format': "%d/%m/%Y"
}
}
}
},
{'$match': qery_match},
{'$lookup': {
'from': 'partner_invoice_line',
"let": {"invoice_header_id": {'$toString': "$_id"},
'partner_invoice_line_partner_owner_recid': '$partner_owner_recid',
'partner_invoice_line_invoice_header_ref_interne': '$invoice_header_ref_interne'},
'pipeline': [
{'$match':
{'$expr':
{'$and':
[
{'$eq': ["$valide", "1"]},
{'$eq': ["$invoice_header_ref_interne",'$$partner_invoice_line_invoice_header_ref_interne']},
{'$eq': ["$partner_owner_recid", '$$partner_invoice_line_partner_owner_recid']},
]
}
}
},
],
'as': 'collection_partner_invoice_line'
}
},
{
'$unwind': '$collection_partner_invoice_line'
},
{'$group': {
'_id': {
"class_internal_url": "$collection_partner_invoice_line.order_line_formation",
},
"TotalAmount_HT": {
"$sum": {'$toDouble': '$collection_partner_invoice_line.order_line_montant_hors_taxes'}},
"count": {"$sum": 1}
}
},
{
'$sort': {'count': -1}
},
])
print(" ### Get_Qery_List_Factures_Data_By_Class ici pipe_qry = ", pipe_qry)
RetObject = []
val_tmp = 0
axis_data = []
series_TotalAmount_data = []
tab_data = []
tab_axis_data_class_code = []
tab_axis_data_class_title = []
"""
On recupere les données, on les format dans le 'range_date_month' et on retourne"""
for retval in MYSY_GV.dbname['partner_invoice_header'].aggregate(pipe_qry):
val_tmp = val_tmp + 1
node = {}
node['class_internal_url'] = retval['_id']['class_internal_url']
node['TotalAmount_HT'] = retval['TotalAmount_HT']
node['label'] = retval['TotalAmount_HT']
node['nb_line'] = retval['count']
# Recuperation des données de la formation
class_data = MYSY_GV.dbname['myclass'].find_one({'internal_url':str(retval['_id']['class_internal_url']),
'partner_owner_recid':str(my_partner['recid']),
'valide':'1'})
if( class_data and "title" in class_data.keys() ):
node['class_title'] = class_data['title']
tab_axis_data_class_title.append(class_data['title'])
else:
node['class_title'] = ""
tab_axis_data_class_title.append("")
if (class_data and "external_code" in class_data.keys()):
node['class_external_code'] = class_data['external_code']
tab_axis_data_class_code.append(class_data['external_code'])
else:
node['class_external_code'] = ""
tab_axis_data_class_code.append("")
tab_data.append(node)
json_retval = {}
json_retval['data'] = tab_data
json_retval['axis_class_code'] = tab_axis_data_class_code
json_retval['axis_class_title'] = tab_axis_data_class_title
print(" ### Get_Qery_List_Factures_Data_By_Class json_retval = ", json_retval)
RetObject.append(mycommon.JSONEncoder().encode(json_retval))
return True, RetObject
except Exception as e:
exc_type, exc_obj, exc_tb = sys.exc_info()
mycommon.myprint(str(inspect.stack()[0][3]) + " -" + str(e) + " - Line : " + str(exc_tb.tb_lineno))
return False, " Impossible de récupérer les données "
"""
Affichage du chiffre d'affaire par client sur une periode
"""
def Get_Qery_List_Factures_Data_By_Client_Periode(diction):
try:
diction = mycommon.strip_dictionary(diction)
"""
Verification des input acceptés
"""
field_list = ['token', 'periode_start_date', 'periode_end_date', 'filter_value', 'filter_client_id']
incom_keys = diction.keys()
for val in incom_keys:
if val not in field_list and val.startswith('my_') is False:
mycommon.myprint(str(
inspect.stack()[0][3]) + " Le champ '" + val + "' n'existe pas")
return False, " Les informations fournies sont incorrectes",
"""
Verification des champs obligatoires
"""
field_list_obligatoire = ['token', ]
for val in field_list_obligatoire:
if val not in diction:
mycommon.myprint(
str(inspect.stack()[0][3]) + " - La valeur '" + val + "' n'est pas presente dans la liste des arguments ")
return False, " Les informations fournies sont incorrectes",
"""
Verification de l'identité et autorisation de l'entité qui
appelle cette API
"""
token = ""
if ("token" in diction.keys()):
if diction['token']:
token = diction['token']
local_status, my_partner = mycommon.Check_Connexion_And_Return_Partner_Data(diction)
if (local_status is not True):
return local_status, my_partner
filt_client_id = {}
if ("filter_client_id" in diction.keys() and diction['filter_client_id']):
filt_client_id = {'order_header_client_id': str(diction['filter_client_id'])}
filt_periode_start_date = ""
if ("periode_start_date" in diction.keys() and diction['periode_start_date']):
filt_periode_start_date = str(diction['periode_start_date'])[0:10]
local_status = mycommon.CheckisDate(filt_periode_start_date)
if (local_status is False):
mycommon.myprint(str(
inspect.stack()[0][3]) + " Le filtre : 'date de debut' n'est pas au format jj/mm/aaaa.")
return False, " Le filtre : 'date de debut' n'est pas au format jj/mm/aaaa."
filt_periode_end_date = ""
if ("periode_end_date" in diction.keys() and diction['periode_end_date']):
filt_periode_end_date = str(diction['periode_end_date'])[0:10]
local_status = mycommon.CheckisDate(filt_periode_end_date)
if (local_status is False):
mycommon.myprint(str(
inspect.stack()[0][3]) + " Le filtre : 'date de fin' n'est pas au format jj/mm/aaaa.")
return False, " Le filtre : 'date de fin' n'est pas au format jj/mm/aaaa."
"""
Si la valeur de 'filter_value' est m0 ou m1, on va aller recuperer les date du mois correspondant.
On ecrase les valeur de filt_session_start_date et filt_session_end_date
"""
if ('filter_value' in diction.keys()):
# print(" filter_value = ", diction['filter_value'])
if (str(diction['filter_value']) == "m0"):
# On recupere les date du mois en cours
local_status, start_current_month_date, end_current_month_date = mycommon.Get_Current_Month_Start_End_Date()
if (local_status is False):
return local_status, start_current_month_date
filt_periode_start_date = start_current_month_date
filt_periode_end_date = end_current_month_date
# print(" ### filt_session_start_date = ", filt_session_start_date, " ### filt_session_end_date = ", filt_session_end_date)
elif (str(diction['filter_value']) == "m1"):
# On recupere les date du mois en cours
local_status, start_current_month_date, end_current_month_date = mycommon.Get_Previous_Month_Start_End_Date()
if (local_status is False):
return local_status, start_current_month_date
filt_periode_start_date = start_current_month_date
filt_periode_end_date = end_current_month_date
filt_periode_start_date_ISODATE = datetime.strptime(str(filt_periode_start_date), '%d/%m/%Y')
filt_periode_end_date_ISODATE = datetime.strptime(str(filt_periode_end_date), '%d/%m/%Y')
qery_match = {'$and': [{"partner_owner_recid": str(my_partner['recid'])},
{"valide": '1'},filt_client_id,
{
'mysy_invoice_date': {'$gte': filt_periode_start_date_ISODATE,
'$lte': filt_periode_end_date_ISODATE}}, ]}
pipe_qry = ([
{"$addFields": {
"mysy_invoice_date": {
'$dateFromString': {
'dateString': '$invoice_date',
'format': "%d/%m/%Y"
}
}
}
},
{'$match': qery_match},
{'$lookup': {
'from': 'partner_client',
"let": {'order_header_client_id': "$order_header_client_id", 'partner_owner_recid': '$partner_owner_recid'},
'pipeline': [
{'$match':
{'$expr':
{'$and':
[
{'$eq': ["$_id", {'$convert': {
'input': "$$order_header_client_id",
'to': "objectId",
'onError': {'error': 'true'},
'onNull': {'isnull': 'true'}
}}]},
{'$eq': ["$valide", "1"]},
{'$eq': ["$partner_recid", '$$partner_owner_recid']}
]
}
}
},
],
'as': 'partner_client_collection'
}
},
{'$group': {
'_id': {
"Client_id": "$order_header_client_id",
"Client_nom": "$partner_client_collection.nom",
"Client_raison_sociale": "$partner_client_collection.raison_sociale",
},
"TotalAmount": {"$sum": {'$toDouble': '$total_header_toutes_taxes'}},
"count": { "$sum": 1}
}
},
{
'$sort': {'count': -1}
},
])
#print(" ### Get_Qery_List_Factures_Data ici pipe_qry = ", pipe_qry)
RetObject = []
val_tmp = 0
axis_data = []
series_TotalAmount_data = []
"""
On recupere les données, on les format dans le 'range_date_month' et on retourne"""
for retval in MYSY_GV.dbname['partner_invoice_header'].aggregate(pipe_qry):
val_tmp = val_tmp + 1
user = {}
user['label'] = retval['_id']['Client_nom'][0]
user['value'] = retval['TotalAmount']
user['count'] = retval['count']
user['Client_id'] = retval['_id']['Client_id']
user['Client_nom'] = retval['_id']['Client_nom'][0]
user['Client_raison_sociale'] = retval['_id']['Client_raison_sociale'][0]
RetObject.append(mycommon.JSONEncoder().encode(user))
print(" ### Get_Qery_List_Factures_Data_By_Client_Periode RetObject = ", RetObject)
return True, RetObject
except Exception as e:
exc_type, exc_obj, exc_tb = sys.exc_info()
mycommon.myprint(str(inspect.stack()[0][3]) + " -" + str(e) + " - Line : " + str(exc_tb.tb_lineno))
return False, " Impossible de récupérer les données "
"""
V2 Affichage du chiffre d'affaire par client
"""
def Get_Qery_List_Factures_Data_By_Client_V2(diction):
try:
diction = mycommon.strip_dictionary(diction)
"""
Verification des input acceptés
"""
field_list = ['token', 'periode_start_date', 'periode_end_date', 'filter_value', 'filter_client_id']
incom_keys = diction.keys()
for val in incom_keys:
if val not in field_list and val.startswith('my_') is False:
mycommon.myprint(str(
inspect.stack()[0][3]) + " Le champ '" + val + "' n'existe pas")
return False, " Les informations fournies sont incorrectes",
"""
Verification des champs obligatoires
"""
field_list_obligatoire = ['token', ]
for val in field_list_obligatoire:
if val not in diction:
mycommon.myprint(
str(inspect.stack()[0][3]) + " - La valeur '" + val + "' n'est pas presente dans la liste des arguments ")
return False, " Les informations fournies sont incorrectes",
"""
Verification de l'identité et autorisation de l'entité qui
appelle cette API
"""
token = ""
if ("token" in diction.keys()):
if diction['token']:
token = diction['token']
local_status, my_partner = mycommon.Check_Connexion_And_Return_Partner_Data(diction)
if (local_status is not True):
return local_status, my_partner
filt_client_id = {}
if ("filter_client_id" in diction.keys() and diction['filter_client_id']):
filt_client_id = {'order_header_client_id': str(diction['filter_client_id'])}
filt_periode_start_date = ""
if ("periode_start_date" in diction.keys() and diction['periode_start_date']):
filt_periode_start_date = str(diction['periode_start_date'])[0:10]
local_status = mycommon.CheckisDate(filt_periode_start_date)
if (local_status is False):
mycommon.myprint(str(
inspect.stack()[0][3]) + " Le filtre : 'date de debut' n'est pas au format jj/mm/aaaa.")
return False, " Le filtre : 'date de debut' n'est pas au format jj/mm/aaaa."
filt_periode_end_date = ""
if ("periode_end_date" in diction.keys() and diction['periode_end_date']):
filt_periode_end_date = str(diction['periode_end_date'])[0:10]
local_status = mycommon.CheckisDate(filt_periode_end_date)
if (local_status is False):
mycommon.myprint(str(
inspect.stack()[0][3]) + " Le filtre : 'date de fin' n'est pas au format jj/mm/aaaa.")
return False, " Le filtre : 'date de fin' n'est pas au format jj/mm/aaaa."
"""
Si la valeur de 'filter_value' est m0 ou m1, on va aller recuperer les date du mois correspondant.
On ecrase les valeur de filt_session_start_date et filt_session_end_date
"""
if ('filter_value' in diction.keys()):
# print(" filter_value = ", diction['filter_value'])
if (str(diction['filter_value']) == "m0"):
# On recupere les date du mois en cours
local_status, start_current_month_date, end_current_month_date = mycommon.Get_Current_Month_Start_End_Date()
if (local_status is False):
return local_status, start_current_month_date
filt_periode_start_date = start_current_month_date
filt_periode_end_date = end_current_month_date
# print(" ### filt_session_start_date = ", filt_session_start_date, " ### filt_session_end_date = ", filt_session_end_date)
elif (str(diction['filter_value']) == "m1"):
# On recupere les date du mois en cours
local_status, start_current_month_date, end_current_month_date = mycommon.Get_Previous_Month_Start_End_Date()
if (local_status is False):
return local_status, start_current_month_date
filt_periode_start_date = start_current_month_date
filt_periode_end_date = end_current_month_date
filt_periode_start_date_ISODATE = datetime.strptime(str(filt_periode_start_date), '%d/%m/%Y')
filt_periode_end_date_ISODATE = datetime.strptime(str(filt_periode_end_date), '%d/%m/%Y')
qery_match = {'$and': [{"partner_owner_recid": str(my_partner['recid'])},
{"valide": '1'},filt_client_id,
{
'mysy_invoice_date': {'$gte': filt_periode_start_date_ISODATE,
'$lte': filt_periode_end_date_ISODATE}}, ]}
pipe_qry = ([
{"$addFields": {
"mysy_invoice_date": {
'$dateFromString': {
'dateString': '$invoice_date',
'format': "%d/%m/%Y"
}
}
}
},
{'$match': qery_match},
{'$lookup': {
'from': 'partner_client',
"let": {'order_header_client_id': "$order_header_client_id", 'partner_owner_recid': '$partner_owner_recid'},
'pipeline': [
{'$match':
{'$expr':
{'$and':
[
{'$eq': ["$_id", {'$convert': {
'input': "$$order_header_client_id",
'to': "objectId",
'onError': {'error': 'true'},
'onNull': {'isnull': 'true'}
}}]},
{'$eq': ["$valide", "1"]},
{'$eq': ["$partner_recid", '$$partner_owner_recid']}
]
}
}
},
],
'as': 'partner_client_collection'
}
},
{'$group': {
'_id': {
"Client_id": "$order_header_client_id",
"Client_nom": "$partner_client_collection.nom",
"Client_raison_sociale": "$partner_client_collection.raison_sociale",
},
"TotalAmount": {"$sum": {'$toDouble': '$total_header_toutes_taxes'}},
"count": { "$sum": 1}
}
},
{
'$sort': {'count': -1}
},
])
print(" ### Get_Qery_List_Factures_Data_By_Client_V2 ici pipe_qry = ", pipe_qry)
RetObject = []
val_tmp = 0
axis_data = []
series_TotalAmount_data = []
"""
On recupere les données, on les format dans le 'range_date_month' et on retourne
"""
tab_data = []
for retval in MYSY_GV.dbname['partner_invoice_header'].aggregate(pipe_qry):
#print(" ### retval ici pipe_qry = ", retval)
val_tmp = val_tmp + 1
user = {}
if( retval['_id']['Client_nom'] and retval['_id']['Client_nom'][0] ):
user['label'] = retval['_id']['Client_nom'][0]
else:
user['label'] = "?"
user['value'] = retval['TotalAmount']
user['count'] = retval['count']
if (retval['_id']['Client_id']):
user['Client_id'] = retval['_id']['Client_id']
else:
user['Client_id'] = "?"
if (retval['_id']['Client_nom'] and retval['_id']['Client_nom'][0]):
user['Client_nom'] = retval['_id']['Client_nom'][0]
else:
user['Client_nom'] = "?"
if (retval['_id']['Client_raison_sociale'] and retval['_id']['Client_raison_sociale'][0]):
user['Client_raison_sociale'] = retval['_id']['Client_raison_sociale'][0]
else:
user['Client_raison_sociale'] = "?"
tab_data.append(user)
retval = {}
retval['data'] = tab_data
RetObject.append(mycommon.JSONEncoder().encode(retval))
#print(" ### Get_Qery_List_Factures_Data_By_Client_Periode RetObject = ", RetObject)
return True, RetObject
except Exception as e:
exc_type, exc_obj, exc_tb = sys.exc_info()
mycommon.myprint(str(inspect.stack()[0][3]) + " -" + str(e) + " - Line : " + str(exc_tb.tb_lineno))
return False, " Impossible de récupérer les données "
"""
Cette fonctionne donne le CA des devis (gagné ou perdu ) sur une periode
"""
def Get_Qery_List_Quotation_Data_By_Periode(diction):
try:
diction = mycommon.strip_dictionary(diction)
"""
Verification des input acceptés
"""
field_list = ['token', 'periode_start_date', 'periode_end_date', 'filter_value', 'filter_client_id' ]
incom_keys = diction.keys()
for val in incom_keys:
if val not in field_list and val.startswith('my_') is False:
mycommon.myprint(str(
inspect.stack()[0][3]) + " Le champ '" + val + "' n'existe pas")
return False, " Les informations fournies sont incorrectes",
"""
Verification des champs obligatoires
"""
field_list_obligatoire = ['token', ]
for val in field_list_obligatoire:
if val not in diction:
mycommon.myprint(
str(inspect.stack()[0][3]) + " - La valeur '" + val + "' n'est pas presente dans la liste des arguments ")
return False, " Les informations fournies sont incorrectes",
"""
Verification de l'identité et autorisation de l'entité qui
appelle cette API
"""
token = ""
if ("token" in diction.keys()):
if diction['token']:
token = diction['token']
local_status, my_partner = mycommon.Check_Connexion_And_Return_Partner_Data(diction)
if (local_status is not True):
return local_status, my_partner
filt_client_id = {}
if ("filter_client_id" in diction.keys() and diction['filter_client_id']):
filt_client_id = {'order_header_client_id': str(diction['filter_client_id'])}
filt_periode_start_date = ""
if ("periode_start_date" in diction.keys() and diction['periode_start_date']):
filt_periode_start_date = str(diction['periode_start_date'])[0:10]
local_status = mycommon.CheckisDate(filt_periode_start_date)
if (local_status is False):
mycommon.myprint(str(
inspect.stack()[0][3]) + " Le filtre : 'date de debut' n'est pas au format jj/mm/aaaa.")
return False, " Le filtre : 'date de debut' n'est pas au format jj/mm/aaaa."
filt_periode_end_date = ""
if ("periode_end_date" in diction.keys() and diction['periode_end_date']):
filt_periode_end_date = str(diction['periode_end_date'])[0:10]
local_status = mycommon.CheckisDate(filt_periode_end_date)
if (local_status is False):
mycommon.myprint(str(
inspect.stack()[0][3]) + " Le filtre : 'date de fin' n'est pas au format jj/mm/aaaa.")
return False, " Le filtre : 'date de fin' n'est pas au format jj/mm/aaaa."
"""
Si la valeur de 'filter_value' est m0 ou m1, on va aller recuperer les date du mois correspondant.
On ecrase les valeur de filt_session_start_date et filt_session_end_date
"""
if ('filter_value' in diction.keys()):
# print(" filter_value = ", diction['filter_value'])
if (str(diction['filter_value']) == "m0"):
# On recupere les date du mois en cours
local_status, start_current_month_date, end_current_month_date = mycommon.Get_Current_Month_Start_End_Date()
if (local_status is False):
return local_status, start_current_month_date
filt_periode_start_date = start_current_month_date
filt_periode_end_date = end_current_month_date
# print(" ### filt_session_start_date = ", filt_session_start_date, " ### filt_session_end_date = ", filt_session_end_date)
elif (str(diction['filter_value']) == "m1"):
# On recupere les date du mois en cours
local_status, start_current_month_date, end_current_month_date = mycommon.Get_Previous_Month_Start_End_Date()
if (local_status is False):
return local_status, start_current_month_date
filt_periode_start_date = start_current_month_date
filt_periode_end_date = end_current_month_date
filt_periode_start_date_ISODATE = datetime.strptime(str(filt_periode_start_date), '%d/%m/%Y')
filt_periode_end_date_ISODATE = datetime.strptime(str(filt_periode_end_date), '%d/%m/%Y')
"""
Creation de la range des mois entre filt_periode_start_date_ISODATE et
filt_periode_end_date_ISODATE
"""
range_date_month = []
start = filt_periode_start_date_ISODATE
end = filt_periode_end_date_ISODATE
while start <= end:
node = {}
node['month_year'] = '{:02d}'.format(start.month) +"_"+str(start.year)
node['mois_annee_facture'] = '{:02d}'.format(start.month) + "_" + str(start.year)
node['label'] = '{:02d}'.format(start.month) + "_" + str(start.year)
node['TotalAmount'] = 0
node['value'] = 0
node['count'] = 0
node['nb_devis_gagne'] = 0
node['nb_devis_perdu'] = 0
range_date_month.append(node)
start += relativedelta(months=1)
qery_match = {'$and': [{"partner_owner_recid": str(my_partner['recid'])},
{"valide": '1'},filt_client_id, { 'is_validated': {'$exists': True}},
{
"order_header_type": "devis"
},
{
'mysy_quotation_date': {'$gte': filt_periode_start_date_ISODATE,
'$lte': filt_periode_end_date_ISODATE}
},
]}
pipe_qry = ([
{"$addFields": {
"mysy_quotation_date": {
'$dateFromString': {
'dateString': '$order_header_date_cmd',
'format': "%d/%m/%Y"
}
}
}
},
{'$match': qery_match},
{'$lookup': {
'from': 'partner_client',
"let": {'order_header_client_id': "$order_header_client_id", 'partner_owner_recid': '$partner_owner_recid'},
'pipeline': [
{'$match':
{'$expr':
{'$and':
[
{'$eq': ["$_id", {'$convert': {
'input': "$$order_header_client_id",
'to': "objectId",
'onError': {'error': 'true'},
'onNull': {'isnull': 'true'}
}}]},
{'$eq': ["$valide", "1"]},
{'$eq': ["$partner_recid", '$$partner_owner_recid']}
]
}
}
},
],
'as': 'partner_client_collection'
}
},
{'$group': {
'_id': {
"order_header_status": "$order_header_status",
"mois_annee_facture": { "$concat": [{'$substr': ["$order_header_date_cmd", 3, 2]},"_", {'$substr': ["$order_header_date_cmd", 6, 4]}]},
"annee_facture": {'$substr': ["$order_header_date_cmd", 6, 4]},
"mois_facture": {'$substr': ["$order_header_date_cmd", 3, 2]},
},
"TotalAmount": {"$sum": {'$toDouble': '$total_header_toutes_taxes'}},
"count": { "$sum": 1}
}
},
{
'$sort': {'_id.mois_annee_facture': 1}
},
])
print(" ### Get_Qery_List_Factures_Data ici pipe_qry = ", pipe_qry)
RetObject = []
val_tmp = 0
axis_data = []
series_TotalAmount_data = []
nb_cumule_gagne = 0
nb_cumule_perdu = 0
"""
On recupere les données, on les format dans le 'range_date_month' et on retourne"""
for retval in MYSY_GV.dbname['partner_order_header'].aggregate(pipe_qry):
val_tmp = val_tmp + 1
for tmp in range_date_month:
axis_data.append(str(tmp['month_year']))
if( str(retval['_id']['mois_annee_facture']) == str(tmp['month_year']) and str(retval['_id']['order_header_status']) == "3" ):
tmp['TotalAmount'] = mycommon.tryFloat(str(retval['TotalAmount']))
tmp['count'] = mycommon.tryFloat(str(retval['count']))
tmp['nb_devis_gagne'] = mycommon.tryFloat(str(retval['count']))
nb_cumule_gagne = mycommon.tryFloat(str(retval['count'])) + nb_cumule_gagne
tmp['nb_cumule_perdu'] = mycommon.tryFloat(str(nb_cumule_perdu))
tmp['nb_cumule_gagne'] = mycommon.tryFloat(str(nb_cumule_gagne))
series_TotalAmount_data.append( str(retval['TotalAmount']))
elif (str(retval['_id']['mois_annee_facture']) == str(tmp['month_year']) and str(retval['_id']['order_header_status']) == "4"):
tmp['TotalAmount'] = mycommon.tryFloat(str(retval['TotalAmount']))
tmp['count'] = mycommon.tryFloat(str(retval['count']))
tmp['nb_devis_perdu'] = mycommon.tryFloat(str(retval['count']))
nb_cumule_perdu = mycommon.tryFloat(str(retval['count'])) + nb_cumule_perdu
tmp['nb_cumule_perdu'] = mycommon.tryFloat(str(nb_cumule_perdu))
tmp['nb_cumule_gagne'] = mycommon.tryFloat(str(nb_cumule_gagne))
series_TotalAmount_data.append(str(retval['TotalAmount']))
json_retval = {}
json_retval['data'] = range_date_month
print(" ### Get_Qery_List_Quotation_Data_By_Periode json_retval = ", json_retval)
RetObject.append(mycommon.JSONEncoder().encode(json_retval))
return True, RetObject
except Exception as e:
exc_type, exc_obj, exc_tb = sys.exc_info()
mycommon.myprint(str(inspect.stack()[0][3]) + " -" + str(e) + " - Line : " + str(exc_tb.tb_lineno))
return False, " Impossible de récupérer les données "
"""
Cette fonctionne donne le CA des devis (gagné ou perdu ) par client
"""
def Get_Qery_List_Quotation_Data_By_Client(diction):
try:
diction = mycommon.strip_dictionary(diction)
"""
Verification des input acceptés
"""
field_list = ['token', 'periode_start_date', 'periode_end_date', 'filter_value', 'filter_client_id' ]
incom_keys = diction.keys()
for val in incom_keys:
if val not in field_list and val.startswith('my_') is False:
mycommon.myprint(str(
inspect.stack()[0][3]) + " Le champ '" + val + "' n'existe pas")
return False, " Les informations fournies sont incorrectes",
"""
Verification des champs obligatoires
"""
field_list_obligatoire = ['token', ]
for val in field_list_obligatoire:
if val not in diction:
mycommon.myprint(
str(inspect.stack()[0][3]) + " - La valeur '" + val + "' n'est pas presente dans la liste des arguments ")
return False, " Les informations fournies sont incorrectes",
"""
Verification de l'identité et autorisation de l'entité qui
appelle cette API
"""
token = ""
if ("token" in diction.keys()):
if diction['token']:
token = diction['token']
local_status, my_partner = mycommon.Check_Connexion_And_Return_Partner_Data(diction)
if (local_status is not True):
return local_status, my_partner
filt_client_id = {}
if ("filter_client_id" in diction.keys() and diction['filter_client_id']):
filt_client_id = {'order_header_client_id': str(diction['filter_client_id'])}
filt_periode_start_date = ""
if ("periode_start_date" in diction.keys() and diction['periode_start_date']):
filt_periode_start_date = str(diction['periode_start_date'])[0:10]
local_status = mycommon.CheckisDate(filt_periode_start_date)
if (local_status is False):
mycommon.myprint(str(
inspect.stack()[0][3]) + " Le filtre : 'date de debut' n'est pas au format jj/mm/aaaa.")
return False, " Le filtre : 'date de debut' n'est pas au format jj/mm/aaaa."
filt_periode_end_date = ""
if ("periode_end_date" in diction.keys() and diction['periode_end_date']):
filt_periode_end_date = str(diction['periode_end_date'])[0:10]
local_status = mycommon.CheckisDate(filt_periode_end_date)
if (local_status is False):
mycommon.myprint(str(
inspect.stack()[0][3]) + " Le filtre : 'date de fin' n'est pas au format jj/mm/aaaa.")
return False, " Le filtre : 'date de fin' n'est pas au format jj/mm/aaaa."
"""
Si la valeur de 'filter_value' est m0 ou m1, on va aller recuperer les date du mois correspondant.
On ecrase les valeur de filt_session_start_date et filt_session_end_date
"""
if ('filter_value' in diction.keys()):
# print(" filter_value = ", diction['filter_value'])
if (str(diction['filter_value']) == "m0"):
# On recupere les date du mois en cours
local_status, start_current_month_date, end_current_month_date = mycommon.Get_Current_Month_Start_End_Date()
if (local_status is False):
return local_status, start_current_month_date
filt_periode_start_date = start_current_month_date
filt_periode_end_date = end_current_month_date
# print(" ### filt_session_start_date = ", filt_session_start_date, " ### filt_session_end_date = ", filt_session_end_date)
elif (str(diction['filter_value']) == "m1"):
# On recupere les date du mois en cours
local_status, start_current_month_date, end_current_month_date = mycommon.Get_Previous_Month_Start_End_Date()
if (local_status is False):
return local_status, start_current_month_date
filt_periode_start_date = start_current_month_date
filt_periode_end_date = end_current_month_date
filt_periode_start_date_ISODATE = datetime.strptime(str(filt_periode_start_date), '%d/%m/%Y')
filt_periode_end_date_ISODATE = datetime.strptime(str(filt_periode_end_date), '%d/%m/%Y')
"""
Creation de la range des mois entre filt_periode_start_date_ISODATE et
filt_periode_end_date_ISODATE
"""
range_date_month = []
start = filt_periode_start_date_ISODATE
end = filt_periode_end_date_ISODATE
while start <= end:
node = {}
node['month_year'] = '{:02d}'.format(start.month) +"_"+str(start.year)
node['mois_annee_facture'] = '{:02d}'.format(start.month) + "_" + str(start.year)
node['label'] = '{:02d}'.format(start.month) + "_" + str(start.year)
node['TotalAmount'] = 0
node['value'] = 0
node['count'] = 0
node['nb_devis_gagne'] = 0
node['nb_devis_perdu'] = 0
range_date_month.append(node)
start += relativedelta(months=1)
qery_match = {'$and': [{"partner_owner_recid": str(my_partner['recid'])},
{"valide": '1'},filt_client_id, { 'is_validated': {'$exists': True}},
{
"order_header_type": "devis"
},
{
'mysy_quotation_date': {'$gte': filt_periode_start_date_ISODATE,
'$lte': filt_periode_end_date_ISODATE}
},
]}
pipe_qry = ([
{"$addFields": {
"mysy_quotation_date": {
'$dateFromString': {
'dateString': '$order_header_date_cmd',
'format': "%d/%m/%Y"
}
}
}
},
{'$match': qery_match},
{'$lookup': {
'from': 'partner_client',
"let": {'order_header_client_id': "$order_header_client_id", 'partner_owner_recid': '$partner_owner_recid'},
'pipeline': [
{'$match':
{'$expr':
{'$and':
[
{'$eq': ["$_id", {'$convert': {
'input': "$$order_header_client_id",
'to': "objectId",
'onError': {'error': 'true'},
'onNull': {'isnull': 'true'}
}}]},
{'$eq': ["$valide", "1"]},
{'$eq': ["$partner_recid", '$$partner_owner_recid']}
]
}
}
},
],
'as': 'partner_client_collection'
}
},
{'$group': {
'_id': {
"Client_id": "$order_header_client_id",
"Client_nom": "$partner_client_collection.nom",
"Client_raison_sociale": "$partner_client_collection.raison_sociale",
},
"TotalAmount": {"$sum": {'$toDouble': '$total_header_toutes_taxes'}},
"count": {"$sum": 1}
}
},
{
'$sort': {'count': -1}
},
])
print(" ### Get_Qery_List_Factures_Data ici pipe_qry = ", pipe_qry)
RetObject = []
val_tmp = 0
axis_data = []
series_TotalAmount_data = []
nb_cumule_gagne = 0
nb_cumule_perdu = 0
"""
On recupere les données, on les format dans le 'range_date_month' et on retourne"""
for retval in MYSY_GV.dbname['partner_order_header'].aggregate(pipe_qry):
val_tmp = val_tmp + 1
for tmp in range_date_month:
axis_data.append(str(tmp['month_year']))
tmp['label'] = retval['_id']['Client_nom'][0]
tmp['Client_id'] = retval['_id']['Client_id']
tmp['Client_nom'] = retval['_id']['Client_nom'][0]
tmp['Client_raison_sociale'] = retval['_id']['Client_raison_sociale'][0]
if( str(retval['_id']['mois_annee_facture']) == str(tmp['month_year']) and str(retval['_id']['order_header_status']) == "3" ):
tmp['TotalAmount'] = mycommon.tryFloat(str(retval['TotalAmount']))
tmp['count'] = mycommon.tryFloat(str(retval['count']))
tmp['nb_devis_gagne'] = mycommon.tryFloat(str(retval['count']))
series_TotalAmount_data.append( str(retval['TotalAmount']))
elif (str(retval['_id']['mois_annee_facture']) == str(tmp['month_year']) and str(retval['_id']['order_header_status']) == "4"):
tmp['TotalAmount'] = mycommon.tryFloat(str(retval['TotalAmount']))
tmp['count'] = mycommon.tryFloat(str(retval['count']))
tmp['nb_devis_perdu'] = mycommon.tryFloat(str(retval['count']))
series_TotalAmount_data.append(str(retval['TotalAmount']))
json_retval = {}
json_retval['data'] = range_date_month
print(" ### Get_Qery_List_Quotation_Data_By_Periode json_retval = ", json_retval)
RetObject.append(mycommon.JSONEncoder().encode(json_retval))
return True, RetObject
except Exception as e:
exc_type, exc_obj, exc_tb = sys.exc_info()
mycommon.myprint(str(inspect.stack()[0][3]) + " -" + str(e) + " - Line : " + str(exc_tb.tb_lineno))
return False, " Impossible de récupérer les données "
"""
Cette fonction permet d'exporter au format excel les données des TBD des factures
Get_Qery_List_Factures_Data_By_Periode (facture_01)
"""
def TBD_FACTURE_01_Export_Dashbord_To_Excel(diction):
try:
diction = mycommon.strip_dictionary(diction)
"""
Verification des input acceptés
"""
field_list = ['token', 'user_dashbord_id', 'date_from', 'date_to', 'client_id']
incom_keys = diction.keys()
for val in incom_keys:
if val not in field_list and val.startswith('my_') is False:
mycommon.myprint(str(
inspect.stack()[0][3]) + " Le champ '" + val + "' n'existe pas")
return False, " Les informations fournies sont incorrectes",
"""
Verification des champs obligatoires
"""
field_list_obligatoire = ['token', 'user_dashbord_id']
for val in field_list_obligatoire:
if val not in diction:
mycommon.myprint(
str(inspect.stack()[0][3]) + " - La valeur '" + val + "' n'est pas presente dans la liste des arguments ")
return False, " Les informations fournies sont incorrectes",
"""
Verification de l'identité et autorisation de l'entité qui
appelle cette API
"""
token = ""
if ("token" in diction.keys()):
if diction['token']:
token = diction['token']
local_status, my_partner = mycommon.Check_Connexion_And_Return_Partner_Data(diction)
if (local_status is not True):
return local_status, my_partner
# Recuperation des données du user_dashbord
my_user_dashbord = MYSY_GV.dbname['user_dashbord'].find_one({'_id': ObjectId(str(diction['user_dashbord_id'])),
'valide': '1',
'locked': '0',
'partner_owner_recid': str(my_partner['recid'])})
if (my_user_dashbord is None):
mycommon.myprint(
str(inspect.stack()[0][3]) + " - L'identifiant du tableau de bord est invalide ")
return False, " L'identifiant du tableau de bord est invalide",
print(" ### my_user_dashbord = ", my_user_dashbord)
new_retval_data = {}
my_new_diction = {}
my_new_diction['token'] = diction['token']
session_start_date = ""
session_end_date = ""
local_default_filter = ast.literal_eval(str(my_user_dashbord['default_filter']))
if ("session_start_date" in local_default_filter.keys() and "session_end_date" in local_default_filter.keys()):
session_start_date = local_default_filter['session_start_date']
session_end_date = local_default_filter['session_end_date']
elif ("periode" in local_default_filter.keys()):
my_new_diction['filter_value'] = str(local_default_filter['periode'])
if (str(local_default_filter['periode']) == "m0"):
# On recupere les date du mois en cours
local_status, start_current_month_date, end_current_month_date = mycommon.Get_Current_Month_Start_End_Date()
if (local_status is False):
return local_status, start_current_month_date
session_start_date = start_current_month_date
session_end_date = end_current_month_date
elif (str(local_default_filter['periode']) == "m1"):
# On recupere les date du mois en cours
local_status, start_current_month_date, end_current_month_date = mycommon.Get_Previous_Month_Start_End_Date()
if (local_status is False):
return local_status, start_current_month_date
session_start_date = start_current_month_date
session_end_date = end_current_month_date
my_new_diction['periode_start_date'] = session_start_date
my_new_diction['periode_end_date'] = session_end_date
if (my_user_dashbord['dashbord_internal_code'] == "tbd_facture_01"):
# Recuperation des colonne à exporter
base_config_dashbord_data = MYSY_GV.dbname['base_config_dashbord'].find_one(
{'dashbord_internal_code': str(my_user_dashbord['dashbord_internal_code'])})
tab_exported_fields = []
if ("exported_fields" in base_config_dashbord_data):
tab_exported_fields = base_config_dashbord_data['exported_fields']
# Remettres les dates de filtres en debut de liste
if ("filtre_date_fin" in tab_exported_fields):
tab_exported_fields.remove("filtre_date_fin")
tab_exported_fields.insert(0, "filtre_date_fin")
if ("filtre_date_debut" in tab_exported_fields):
tab_exported_fields.remove("filtre_date_debut")
tab_exported_fields.insert(0, "filtre_date_debut")
tab_exported_fields.insert(0, "date_extraction")
todays_date = str(date.today().strftime("%d/%m/%Y"))
ts = datetime.now().timestamp()
ts = str(ts).replace(".", "").replace(",", "")[-5:]
orig_file_name = "Export_csv_" + str(my_partner['recid']) + "_" + str(ts) + ".csv"
outputFilename = str(MYSY_GV.TEMPORARY_DIRECTORY) + "/" + str(orig_file_name)
# Create a workbook and add a worksheet.
workbook = xlsxwriter.Workbook(outputFilename)
worksheet = workbook.add_worksheet()
row = 0
column = 0
# Ecrire l'entete
for header_item in tab_exported_fields:
worksheet.write(row, column, header_item)
column += 1
"""
Si dans la requete l'utilisateur a fornir des dates debut, fin et code client, alors
on ecrase ce qui a été fait et on replace par les valeurs du diction
"""
if ("date_from" in diction.keys() and diction['date_from'] and "date_to" in diction.keys() and diction['date_to']):
my_new_diction['periode_start_date'] = diction['date_from']
my_new_diction['periode_end_date'] = diction['date_to']
if ("client_id" in diction.keys() and diction['client_id']):
my_new_diction['filter_client_id'] = diction['client_id']
#print(" ### my_new_diction === ", my_new_diction)
local_status, local_retval = Get_Qery_List_Factures_Data_By_Periode(my_new_diction)
if (local_status is False):
return local_status, local_retval
new_retval_data = local_retval
answers_record_JSON_Data = ast.literal_eval(str(new_retval_data))
flattened_record = {}
for val_tmp in answers_record_JSON_Data:
val_tmp_JSON = ast.literal_eval(str(val_tmp))
for val_tmp2 in val_tmp_JSON['data'] :
column = 0
row = row + 1
worksheet.write(row, column, str(todays_date))
column += 1
if ("date_from" in diction.keys() and diction['date_from'] and "date_to" in diction.keys() and diction['date_to']):
worksheet.write(row, column, str(diction['date_from']))
column += 1
worksheet.write(row, column, str(diction['date_to']))
column += 1
else :
worksheet.write(row, column, str(session_start_date))
column += 1
worksheet.write(row, column, str(session_end_date))
column += 1
for local_fiels in tab_exported_fields:
answers_record_JSON = ast.literal_eval(str(val_tmp2))
if (str(local_fiels) in answers_record_JSON.keys()):
local_status, local_retval = mycommon.IsFloat(
str(answers_record_JSON[str(local_fiels)]).strip())
no_html = ""
if (local_status is True):
no_html = answers_record_JSON[str(local_fiels)]
else:
no_html = mycommon.cleanhtml(answers_record_JSON[str(local_fiels)])
worksheet.write(row, column, no_html)
column += 1
elif (my_user_dashbord['dashbord_internal_code'] == "tbd_facture_02"):
# Recuperation des colonne à exporter
base_config_dashbord_data = MYSY_GV.dbname['base_config_dashbord'].find_one(
{'dashbord_internal_code': str(my_user_dashbord['dashbord_internal_code'])})
tab_exported_fields = []
if ("exported_fields" in base_config_dashbord_data):
tab_exported_fields = base_config_dashbord_data['exported_fields']
# Remettres les dates de filtres en debut de liste
if ("filtre_date_fin" in tab_exported_fields):
tab_exported_fields.remove("filtre_date_fin")
tab_exported_fields.insert(0, "filtre_date_fin")
if ("filtre_date_debut" in tab_exported_fields):
tab_exported_fields.remove("filtre_date_debut")
tab_exported_fields.insert(0, "filtre_date_debut")
tab_exported_fields.insert(0, "date_extraction")
todays_date = str(date.today().strftime("%d/%m/%Y"))
ts = datetime.now().timestamp()
ts = str(ts).replace(".", "").replace(",", "")[-5:]
orig_file_name = "Export_csv_" + str(my_partner['recid']) + "_" + str(ts) + ".csv"
outputFilename = str(MYSY_GV.TEMPORARY_DIRECTORY) + "/" + str(orig_file_name)
# Create a workbook and add a worksheet.
workbook = xlsxwriter.Workbook(outputFilename)
worksheet = workbook.add_worksheet()
row = 0
column = 0
# Ecrire l'entete
for header_item in tab_exported_fields:
worksheet.write(row, column, header_item)
column += 1
"""
Si dans la requete l'utilisateur a fornir des dates debut, fin et code client, alors
on ecrase ce qui a été fait et on replace par les valeurs du diction
"""
if ("date_from" in diction.keys() and diction['date_from'] and "date_to" in diction.keys() and diction['date_to']):
my_new_diction['periode_start_date'] = diction['date_from']
my_new_diction['periode_end_date'] = diction['date_to']
if ("client_id" in diction.keys() and diction['client_id']):
my_new_diction['filter_client_id'] = diction['client_id']
local_status, local_retval = Get_Qery_List_Factures_Data_By_Client_Periode(my_new_diction)
if (local_status is False):
return local_status, local_retval
new_retval_data = local_retval
# Ecrire le reste des lignes
for answers_record in new_retval_data: # Here we are using 'cursor' as an iterator
column = 0
row = row + 1
worksheet.write(row, column, str(todays_date))
column += 1
if ("date_from" in diction.keys() and diction['date_from'] and "date_to" in diction.keys() and diction['date_to']):
worksheet.write(row, column, str(diction['date_from']))
column += 1
worksheet.write(row, column, str(diction['date_to']))
column += 1
else:
worksheet.write(row, column, str(session_start_date))
column += 1
worksheet.write(row, column, str(session_end_date))
column += 1
flattened_record = {}
for local_fiels in tab_exported_fields:
answers_record_JSON = ast.literal_eval(str(answers_record))
if (str(local_fiels) in answers_record_JSON.keys()):
local_status, local_retval = mycommon.IsFloat(
str(answers_record_JSON[str(local_fiels)]).strip())
no_html = ""
if (local_status is True):
no_html = answers_record_JSON[str(local_fiels)]
else:
no_html = mycommon.cleanhtml(answers_record_JSON[str(local_fiels)])
worksheet.write(row, column, no_html)
column += 1
elif (my_user_dashbord['dashbord_internal_code'] == "tbd_facture_03"):
# Recuperation des colonne à exporter
base_config_dashbord_data = MYSY_GV.dbname['base_config_dashbord'].find_one(
{'dashbord_internal_code': str(my_user_dashbord['dashbord_internal_code'])})
tab_exported_fields = []
if ("exported_fields" in base_config_dashbord_data):
tab_exported_fields = base_config_dashbord_data['exported_fields']
# Remettres les dates de filtres en debut de liste
if ("filtre_date_fin" in tab_exported_fields):
tab_exported_fields.remove("filtre_date_fin")
tab_exported_fields.insert(0, "filtre_date_fin")
if ("filtre_date_debut" in tab_exported_fields):
tab_exported_fields.remove("filtre_date_debut")
tab_exported_fields.insert(0, "filtre_date_debut")
tab_exported_fields.insert(0, "date_extraction")
todays_date = str(date.today().strftime("%d/%m/%Y"))
ts = datetime.now().timestamp()
ts = str(ts).replace(".", "").replace(",", "")[-5:]
orig_file_name = "Export_csv_" + str(my_partner['recid']) + "_" + str(ts) + ".csv"
outputFilename = str(MYSY_GV.TEMPORARY_DIRECTORY) + "/" + str(orig_file_name)
# Create a workbook and add a worksheet.
workbook = xlsxwriter.Workbook(outputFilename)
worksheet = workbook.add_worksheet()
row = 0
column = 0
# Ecrire l'entete
for header_item in tab_exported_fields:
worksheet.write(row, column, header_item)
column += 1
"""
Si dans la requete l'utilisateur a fornir des dates debut, fin et code client, alors
on ecrase ce qui a été fait et on replace par les valeurs du diction
"""
if ("date_from" in diction.keys() and diction['date_from'] and "date_to" in diction.keys() and diction[
'date_to']):
my_new_diction['periode_start_date'] = diction['date_from']
my_new_diction['periode_end_date'] = diction['date_to']
if ("client_id" in diction.keys() and diction['client_id']):
my_new_diction['filter_client_id'] = diction['client_id']
#print(" ### my_new_diction === ", my_new_diction)
local_status, local_retval = Get_Qery_List_Quotation_Data_By_Periode(my_new_diction)
if (local_status is False):
return local_status, local_retval
new_retval_data = local_retval
answers_record_JSON_Data = ast.literal_eval(str(new_retval_data))
flattened_record = {}
for val_tmp in answers_record_JSON_Data:
val_tmp_JSON = ast.literal_eval(str(val_tmp))
for val_tmp2 in val_tmp_JSON['data']:
column = 0
row = row + 1
worksheet.write(row, column, str(todays_date))
column += 1
if ("date_from" in diction.keys() and diction['date_from'] and "date_to" in diction.keys() and
diction['date_to']):
worksheet.write(row, column, str(diction['date_from']))
column += 1
worksheet.write(row, column, str(diction['date_to']))
column += 1
else:
worksheet.write(row, column, str(session_start_date))
column += 1
worksheet.write(row, column, str(session_end_date))
column += 1
for local_fiels in tab_exported_fields:
answers_record_JSON = ast.literal_eval(str(val_tmp2))
if (str(local_fiels) in answers_record_JSON.keys()):
local_status, local_retval = mycommon.IsFloat(
str(answers_record_JSON[str(local_fiels)]).strip())
no_html = ""
if (local_status is True):
no_html = answers_record_JSON[str(local_fiels)]
else:
no_html = mycommon.cleanhtml(answers_record_JSON[str(local_fiels)])
worksheet.write(row, column, no_html)
column += 1
elif (my_user_dashbord['dashbord_internal_code'] == "tbd_facture_04"):
# Recuperation des colonne à exporter
base_config_dashbord_data = MYSY_GV.dbname['base_config_dashbord'].find_one(
{'dashbord_internal_code': str(my_user_dashbord['dashbord_internal_code'])})
tab_exported_fields = []
if ("exported_fields" in base_config_dashbord_data):
tab_exported_fields = base_config_dashbord_data['exported_fields']
# Remettres les dates de filtres en debut de liste
if ("filtre_date_fin" in tab_exported_fields):
tab_exported_fields.remove("filtre_date_fin")
tab_exported_fields.insert(0, "filtre_date_fin")
if ("filtre_date_debut" in tab_exported_fields):
tab_exported_fields.remove("filtre_date_debut")
tab_exported_fields.insert(0, "filtre_date_debut")
tab_exported_fields.insert(0, "date_extraction")
todays_date = str(date.today().strftime("%d/%m/%Y"))
ts = datetime.now().timestamp()
ts = str(ts).replace(".", "").replace(",", "")[-5:]
orig_file_name = "Export_csv_" + str(my_partner['recid']) + "_" + str(ts) + ".csv"
outputFilename = str(MYSY_GV.TEMPORARY_DIRECTORY) + "/" + str(orig_file_name)
# Create a workbook and add a worksheet.
workbook = xlsxwriter.Workbook(outputFilename)
worksheet = workbook.add_worksheet()
row = 0
column = 0
# Ecrire l'entete
for header_item in tab_exported_fields:
worksheet.write(row, column, header_item)
column += 1
"""
Si dans la requete l'utilisateur a fornir des dates debut, fin et code client, alors
on ecrase ce qui a été fait et on replace par les valeurs du diction
"""
if ("date_from" in diction.keys() and diction['date_from'] and "date_to" in diction.keys() and diction[
'date_to']):
my_new_diction['periode_start_date'] = diction['date_from']
my_new_diction['periode_end_date'] = diction['date_to']
if ("client_id" in diction.keys() and diction['client_id']):
my_new_diction['filter_client_id'] = diction['client_id']
# print(" ### my_new_diction === ", my_new_diction)
local_status, local_retval = Get_Qery_List_Facture_Previsionnelle_Data_By_Periode(my_new_diction)
if (local_status is False):
return local_status, local_retval
new_retval_data = local_retval
print( " ### new_retval_data = ", new_retval_data )
answers_record_JSON_Data = ast.literal_eval(str(new_retval_data))
flattened_record = {}
for val_tmp in answers_record_JSON_Data:
val_tmp_JSON = ast.literal_eval(str(val_tmp))
for val_tmp2 in val_tmp_JSON['data']:
column = 0
row = row + 1
worksheet.write(row, column, str(todays_date))
column += 1
if ("date_from" in diction.keys() and diction['date_from'] and "date_to" in diction.keys() and
diction['date_to']):
worksheet.write(row, column, str(diction['date_from']))
column += 1
worksheet.write(row, column, str(diction['date_to']))
column += 1
else:
worksheet.write(row, column, str(session_start_date))
column += 1
worksheet.write(row, column, str(session_end_date))
column += 1
for local_fiels in tab_exported_fields:
answers_record_JSON = ast.literal_eval(str(val_tmp2))
if (str(local_fiels) in answers_record_JSON.keys()):
local_status, local_retval = mycommon.IsFloat(
str(answers_record_JSON[str(local_fiels)]).strip())
no_html = ""
if (local_status is True):
no_html = answers_record_JSON[str(local_fiels)]
else:
no_html = mycommon.cleanhtml(answers_record_JSON[str(local_fiels)])
worksheet.write(row, column, no_html)
column += 1
else:
mycommon.myprint(
str(inspect.stack()[0][3]) + " Requête inconnue ")
return False, " Requête inconnue ",
workbook.close()
if os.path.exists(outputFilename):
# print(" ### ok os.path.exists(outputFilename) "+str(outputFilename))
return True, send_file(outputFilename, as_attachment=True)
return False, "Impossible de générer l'export csv (2) "
except Exception as e:
exc_type, exc_obj, exc_tb = sys.exc_info()
mycommon.myprint(str(inspect.stack()[0][3]) + " -" + str(e) + " - Line : " + str(exc_tb.tb_lineno))
return False, " Impossible d'exporter les données "
"""
Recuperation du chiffre d'affaire previsionnelle sur une période donnée
"""
def Get_Qery_List_Facture_Previsionnelle_Data_By_Periode_save(diction):
try:
diction = mycommon.strip_dictionary(diction)
"""
Verification des input acceptés
"""
field_list = ['token', 'periode_start_date', 'periode_end_date', 'filter_value', 'filter_client_id' ]
incom_keys = diction.keys()
for val in incom_keys:
if val not in field_list and val.startswith('my_') is False:
mycommon.myprint(str(
inspect.stack()[0][3]) + " Le champ '" + val + "' n'existe pas")
return False, " Les informations fournies sont incorrectes",
"""
Verification des champs obligatoires
"""
field_list_obligatoire = ['token', ]
for val in field_list_obligatoire:
if val not in diction:
mycommon.myprint(
str(inspect.stack()[0][3]) + " - La valeur '" + val + "' n'est pas presente dans la liste des arguments ")
return False, " Les informations fournies sont incorrectes",
"""
Verification de l'identité et autorisation de l'entité qui
appelle cette API
"""
token = ""
if ("token" in diction.keys()):
if diction['token']:
token = diction['token']
local_status, my_partner = mycommon.Check_Connexion_And_Return_Partner_Data(diction)
if (local_status is not True):
return local_status, my_partner
filt_client_id = {}
if ("filter_client_id" in diction.keys() and diction['filter_client_id']):
filt_client_id = {'order_header_client_id': str(diction['filter_client_id'])}
filt_periode_start_date = ""
if ("periode_start_date" in diction.keys() and diction['periode_start_date']):
filt_periode_start_date = str(diction['periode_start_date'])[0:10]
local_status = mycommon.CheckisDate(filt_periode_start_date)
if (local_status is False):
mycommon.myprint(str(
inspect.stack()[0][3]) + " Le filtre : 'date de debut' n'est pas au format jj/mm/aaaa.")
return False, " Le filtre : 'date de debut' n'est pas au format jj/mm/aaaa."
filt_periode_end_date = ""
if ("periode_end_date" in diction.keys() and diction['periode_end_date']):
filt_periode_end_date = str(diction['periode_end_date'])[0:10]
local_status = mycommon.CheckisDate(filt_periode_end_date)
if (local_status is False):
mycommon.myprint(str(
inspect.stack()[0][3]) + " Le filtre : 'date de fin' n'est pas au format jj/mm/aaaa.")
return False, " Le filtre : 'date de fin' n'est pas au format jj/mm/aaaa."
"""
Si la valeur de 'filter_value' est m0 ou m1, on va aller recuperer les date du mois correspondant.
On ecrase les valeur de filt_session_start_date et filt_session_end_date
"""
if ('filter_value' in diction.keys()):
# print(" filter_value = ", diction['filter_value'])
if (str(diction['filter_value']) == "m0"):
# On recupere les date du mois en cours
local_status, start_current_month_date, end_current_month_date = mycommon.Get_Current_Month_Start_End_Date()
if (local_status is False):
return local_status, start_current_month_date
filt_periode_start_date = start_current_month_date
filt_periode_end_date = end_current_month_date
# print(" ### filt_session_start_date = ", filt_session_start_date, " ### filt_session_end_date = ", filt_session_end_date)
elif (str(diction['filter_value']) == "m1"):
# On recupere les date du mois en cours
local_status, start_current_month_date, end_current_month_date = mycommon.Get_Previous_Month_Start_End_Date()
if (local_status is False):
return local_status, start_current_month_date
filt_periode_start_date = start_current_month_date
filt_periode_end_date = end_current_month_date
filt_periode_start_date_ISODATE = datetime.strptime(str(filt_periode_start_date), '%d/%m/%Y')
filt_periode_end_date_ISODATE = datetime.strptime(str(filt_periode_end_date), '%d/%m/%Y')
"""
Creation de la range des mois entre filt_periode_start_date_ISODATE et
filt_periode_end_date_ISODATE
"""
range_date_month = []
start = filt_periode_start_date_ISODATE
end = filt_periode_end_date_ISODATE
while start <= end:
node = {}
node['month_year'] = '{:02d}'.format(start.month) +"_"+str(start.year)
node['label'] = '{:02d}'.format(start.month) + "_" + str(start.year)
node['TotalAmount'] = 0
node['value'] = 0
node['count'] = 0
range_date_month.append(node)
start += relativedelta(months=1)
print(" ### range_date_month = ", range_date_month)
qery_match = {'$and': [{"partner_owner_recid": str(my_partner['recid'])},
{"valide": '1'},filt_client_id,
{
'mysy_invoice_date': {'$gte': filt_periode_start_date_ISODATE,
'$lte': filt_periode_end_date_ISODATE}}, ]}
pipe_qry = ([
{"$addFields": {
"mysy_invoice_date": {
'$dateFromString': {
'dateString': '$invoice_date',
'format': "%d/%m/%Y"
}
}
}
},
{'$match': qery_match},
{'$lookup': {
'from': 'partner_client',
"let": {'order_header_client_id': "$order_header_client_id", 'partner_owner_recid': '$partner_owner_recid'},
'pipeline': [
{'$match':
{'$expr':
{'$and':
[
{'$eq': ["$_id", {'$convert': {
'input': "$$order_header_client_id",
'to': "objectId",
'onError': {'error': 'true'},
'onNull': {'isnull': 'true'}
}}]},
{'$eq': ["$valide", "1"]},
{'$eq': ["$partner_recid", '$$partner_owner_recid']}
]
}
}
},
],
'as': 'partner_client_collection'
}
},
{'$group': {
'_id': {
"mois_annee_facture": { "$concat": [{'$substr': ["$invoice_date", 3, 2]},"_", {'$substr': ["$invoice_date", 6, 4]}]},
"annee_facture": {'$substr': ["$invoice_date", 6, 4]},
"mois_facture": {'$substr': ["$invoice_date", 3, 2]},
},
"TotalAmount": {"$sum": {'$toDouble': '$total_header_toutes_taxes'}},
"count": { "$sum": 1}
}
},
{
'$sort': {'count': -1}
},
])
print(" ### Get_Qery_List_Facture_Previsionnelle_Data_By_Periode ici pipe_qry = ", pipe_qry)
RetObject = []
val_tmp = 0
axis_data = []
series_TotalAmount_data = []
"""
On recupere les données, on les format dans le 'range_date_month' et on retourne"""
for retval in MYSY_GV.dbname['partner_invoice_header'].aggregate(pipe_qry):
val_tmp = val_tmp + 1
for tmp in range_date_month:
axis_data.append(str(tmp['month_year']))
if( str(retval['_id']['mois_annee_facture']) == str(tmp['month_year']) ):
tmp['TotalAmount'] = mycommon.tryFloat(str(retval['TotalAmount']))
tmp['count'] = mycommon.tryFloat(str(retval['count']))
series_TotalAmount_data.append( str(retval['TotalAmount']))
else:
series_TotalAmount_data.append("0")
json_retval = {}
json_retval['data'] = range_date_month
json_retval['axis_data'] = axis_data
json_retval['series_TotalAmount_data'] = series_TotalAmount_data
RetObject.append(mycommon.JSONEncoder().encode(json_retval))
return True, RetObject
except Exception as e:
exc_type, exc_obj, exc_tb = sys.exc_info()
mycommon.myprint(str(inspect.stack()[0][3]) + " -" + str(e) + " - Line : " + str(exc_tb.tb_lineno))
return False, " Impossible de récupérer les données "
def Get_Qery_List_Facture_Previsionnelle_Data_By_Periode(diction):
try:
diction = mycommon.strip_dictionary(diction)
"""
Verification des input acceptés
"""
field_list = ['token', 'periode_start_date', 'periode_end_date', 'filter_value', 'filter_client_id']
incom_keys = diction.keys()
for val in incom_keys:
if val not in field_list and val.startswith('my_') is False:
mycommon.myprint(str(
inspect.stack()[0][3]) + " Le champ '" + val + "' n'existe pas")
return False, " Les informations fournies sont incorrectes",
"""
Verification des champs obligatoires
"""
field_list_obligatoire = ['token', ]
for val in field_list_obligatoire:
if val not in diction:
mycommon.myprint(
str(inspect.stack()[0][3]) + " - La valeur '" + val + "' n'est pas presente dans la liste des arguments ")
return False, " Les informations fournies sont incorrectes",
"""
Verification de l'identité et autorisation de l'entité qui
appelle cette API
"""
token = ""
if ("token" in diction.keys()):
if diction['token']:
token = diction['token']
local_status, my_partner = mycommon.Check_Connexion_And_Return_Partner_Data(diction)
if (local_status is not True):
return local_status, my_partner
filt_client_id = {}
if ("filter_client_id" in diction.keys() and diction['filter_client_id']):
filt_client_id = {'order_header_client_id': str(diction['filter_client_id'])}
filt_periode_start_date = ""
if ("periode_start_date" in diction.keys() and diction['periode_start_date']):
filt_periode_start_date = str(diction['periode_start_date'])[0:10]
local_status = mycommon.CheckisDate(filt_periode_start_date)
if (local_status is False):
mycommon.myprint(str(
inspect.stack()[0][3]) + " Le filtre : 'date de debut' n'est pas au format jj/mm/aaaa.")
return False, " Le filtre : 'date de debut' n'est pas au format jj/mm/aaaa."
filt_periode_end_date = ""
if ("periode_end_date" in diction.keys() and diction['periode_end_date']):
filt_periode_end_date = str(diction['periode_end_date'])[0:10]
local_status = mycommon.CheckisDate(filt_periode_end_date)
if (local_status is False):
mycommon.myprint(str(
inspect.stack()[0][3]) + " Le filtre : 'date de fin' n'est pas au format jj/mm/aaaa.")
return False, " Le filtre : 'date de fin' n'est pas au format jj/mm/aaaa."
"""
Si la valeur de 'filter_value' est m0 ou m1, on va aller recuperer les date du mois correspondant.
On ecrase les valeur de filt_session_start_date et filt_session_end_date
"""
if ('filter_value' in diction.keys()):
# print(" filter_value = ", diction['filter_value'])
if (str(diction['filter_value']) == "m0"):
# On recupere les date du mois en cours
local_status, start_current_month_date, end_current_month_date = mycommon.Get_Current_Month_Start_End_Date()
if (local_status is False):
return local_status, start_current_month_date
filt_periode_start_date = start_current_month_date
filt_periode_end_date = end_current_month_date
# print(" ### filt_session_start_date = ", filt_session_start_date, " ### filt_session_end_date = ", filt_session_end_date)
elif (str(diction['filter_value']) == "m1"):
# On recupere les date du mois en cours
local_status, start_current_month_date, end_current_month_date = mycommon.Get_Previous_Month_Start_End_Date()
if (local_status is False):
return local_status, start_current_month_date
filt_periode_start_date = start_current_month_date
filt_periode_end_date = end_current_month_date
filt_periode_start_date_ISODATE = datetime.strptime(str(filt_periode_start_date), '%d/%m/%Y')
filt_periode_end_date_ISODATE = datetime.strptime(str(filt_periode_end_date), '%d/%m/%Y')
"""
Creation de la range des mois entre filt_periode_start_date_ISODATE et
filt_periode_end_date_ISODATE
"""
range_date_month = []
start = filt_periode_start_date_ISODATE
end = filt_periode_end_date_ISODATE
while start <= end:
node = {}
node['month_year'] = '{:02d}'.format(start.month) + "_" + str(start.year)
node['label'] = '{:02d}'.format(start.month) + "_" + str(start.year)
node['first_day'] = "01/"+'{:02d}'.format(start.month) + "/" + str(start.year)
node['list_session'] = []
node['TotalAmount'] = 0
node['value'] = 0
node['count'] = 0
range_date_month.append(node)
start += relativedelta(months=1)
#print(" ### range_date_month = ", range_date_month)
for data in range_date_month:
#print(" data = ", data)
ca_month_previsionnel = 0
local_first_day_ISODATE = datetime.strptime(str(data['first_day']), '%d/%m/%Y')
work_first_day = str(local_first_day_ISODATE.strftime("%d/%m/%Y"))
#filt_periode_start_date_ISODATE = datetime.strptime(str(filt_periode_start_date), '%d/%m/%Y')
#print(" local_first_day_ISODATE = ", local_first_day_ISODATE)
qery_match = {'$and': [{"valide": '1', 'partner_owner_recid': str(my_partner['recid'])},
{
'mysy_session_start_date': {'$lte': local_first_day_ISODATE},
},
{
'mysy_session_end_date': {'$gte': local_first_day_ISODATE, },
},
]}
pipe_qry = [
{"$addFields": {
"mysy_session_start_date": {
'$dateFromString': {
'dateString': '$date_debut',
'format': "%d/%m/%Y"
}
}
}
},
{"$addFields": {
"mysy_session_end_date": {
'$dateFromString': {
'dateString': '$date_fin',
'format': "%d/%m/%Y"
}
}
}
},
{'$match': qery_match},
{'$lookup': {
'from': 'inscription',
'let': {'session_id': {'$toString': '$_id'}, 'session_partner_owner_recid': '$partner_owner_recid'},
'pipeline': [
{'$match':
{'$expr':
{'$and':
[
{'$eq': ['$session_id', '$$session_id']},
{'$eq': ['$partner_owner_recid', '$$session_partner_owner_recid']}
]
}
}
},
],
'as': 'inscription_collection'
}
},
]
#print(" ### pipe_qry previsionnel = ", pipe_qry)
#print(" ### datetime.strptime(str(data['first_day']), '%d/%m/%Y') = ", datetime.strptime(str(data['first_day']), '%d/%m/%Y'))
for val in MYSY_GV.dbname['session_formation'].aggregate(pipe_qry):
"""
30/05/2024 - update :
/!\ : Ici on parle du prix TOTAL de la session
Pour recalculer le prix mensuelle, il faut prendre
on fait un ratio :
- calculer le nombre de mois
- diviser le prix par le nombre de mois
"""
local_diction = {}
local_diction['date_from'] = str(val['date_debut'])
local_diction['date_to'] = str(val['date_fin'])
local_diction['total_price'] = str(val['prix_session'])
local_price_status, local_price_retval = mycommon.Compute_Monthly_Price_From_Dates(local_diction)
if (local_price_status is False):
return local_price_status, local_price_retval
new_price_data = local_price_retval['monthly_price']
#print(" ### pour la session : "+str(val['code_session'])+" le prix mensuel est de new_price_data = ", local_price_retval)
for tmp in range_date_month:
CA_previsionnel = 0
if( tmp['first_day'] == work_first_day):
ca_prev = 0
local_node = {}
local_node['session_id'] = str(val['_id'])
local_node['code_session'] = val['code_session']
local_node['prix_session'] = val['prix_session']
local_node['price_by'] = val['price_by']
if( "inscription_collection" in val.keys() ):
local_node['nb_participant'] = len(val['inscription_collection'])
else:
local_node['nb_participant'] = '0'
if( val['price_by'] == "perstagiaire"):
ca_prev = (mycommon.tryFloat( new_price_data) * mycommon.tryFloat( local_node['nb_participant'])) + ca_prev
elif( val['price_by'] == "persession"):
ca_prev = (mycommon.tryFloat( new_price_data) ) + ca_prev
local_node['ca_previsionnel'] = str(ca_prev)
#tmp['list_session'].append(local_node)
ca_month_previsionnel = ca_month_previsionnel + ca_prev
data['ca_month_previsionnel'] = mycommon.tryFloat(str(ca_month_previsionnel))
final_data = {}
final_data['data'] = range_date_month
final_data['axis_data'] = []
final_data['series_TotalAmount_data'] = []
#print(" ### final_data = ", final_data)
RetObject = []
RetObject.append(mycommon.JSONEncoder().encode(final_data))
return True, RetObject
except Exception as e:
exc_type, exc_obj, exc_tb = sys.exc_info()
mycommon.myprint(str(inspect.stack()[0][3]) + " -" + str(e) + " - Line : " + str(exc_tb.tb_lineno))
return False, " Impossible de récupérer les données "
"""
Voici la requete pour le chiffre d'affaire groupé par client et par mois et année
On obtient un resultat comme ca :
{
_id: {
mois_facture: '03',
annee_facture: '2024'
},
TotalAmount: 103,
count: 9
},
{
_id: {
mois_facture: '04',
annee_facture: '2024'
},
TotalAmount: 255544,
count: 1
}
---
--
db.partner_invoice_header.aggregate(
[
{
"$addFields":{
"mysy_invoice_date":{
"$dateFromString":{
"dateString":"$invoice_date",
"format":"%d/%m/%Y"
}
}
}
},
{
"$match":{
"partner_owner_recid":"43598820dd270936c3d2fd822717d0f18f194b1a1b894aaf89"
}
},
{
"$lookup":{
"from":"partner_client",
"let":{
"order_header_client_id":"$order_header_client_id",
"partner_owner_recid":"$partner_owner_recid"
},
"pipeline":[
{
"$match":{
"$expr":{
"$and":[
{
"$eq":[
"$_id",
{
"$convert":{
"input":"$$order_header_client_id",
"to":"objectId",
"onError":{
"error":"true"
},
"onNull":{
"isnull":"true"
}
}
}
]
},
{
"$eq":[
"$valide",
"1"
]
},
{
"$eq":[
"$partner_recid",
"$$partner_owner_recid"
]
}
]
}
}
}
],
"as":"partner_client_collection"
}
},
{
"$group":{
"_id":{
"Client_id":"$order_header_client_id",
"Client_nom":"$partner_client_collection.nom",
"Client_raison_sociale":"$partner_client_collection.raison_sociale",
"mois_facture":{
"$substr":[
"$invoice_date",
3,
2
]
},
"annee_facture":{
"$substr":[
"$invoice_date",
6,
4
]
}
},
"totalAmount": { "$sum": {'$toDouble': '$total_header_toutes_taxes'} },
"count": { $sum: 1 }
}
},
{
"$sort":{
"count":-1
}
}
])
"""