120 lines
No EOL
3.7 KiB
Python
120 lines
No EOL
3.7 KiB
Python
import win32com.client
|
|
import logging
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
def _rechercher_devis_dans_liste(numero_devis, factory_doc):
|
|
"""Recherche un devis dans les 100 premiers éléments de la liste."""
|
|
index = 1
|
|
while index < 100:
|
|
try:
|
|
persist_test = factory_doc.List(index)
|
|
if persist_test is None:
|
|
break
|
|
|
|
doc_test = win32com.client.CastTo(persist_test, "IBODocumentVente3")
|
|
doc_test.Read()
|
|
|
|
if (
|
|
getattr(doc_test, "DO_Type", -1) == 0
|
|
and getattr(doc_test, "DO_Piece", "") == numero_devis
|
|
):
|
|
logger.info(f" Document trouvé à l'index {index}")
|
|
return persist_test
|
|
|
|
index += 1
|
|
except:
|
|
index += 1
|
|
|
|
return None
|
|
|
|
def _recuperer_numero_devis(self, process, doc):
|
|
"""Récupère le numéro du devis créé via plusieurs méthodes."""
|
|
numero_devis = None
|
|
|
|
try:
|
|
doc_result = process.DocumentResult
|
|
if doc_result:
|
|
doc_result = win32com.client.CastTo(doc_result, "IBODocumentVente3")
|
|
doc_result.Read()
|
|
numero_devis = getattr(doc_result, "DO_Piece", "")
|
|
except:
|
|
pass
|
|
|
|
if not numero_devis:
|
|
numero_devis = getattr(doc, "DO_Piece", "")
|
|
|
|
if not numero_devis:
|
|
try:
|
|
doc.SetDefaultNumPiece()
|
|
doc.Write()
|
|
doc.Read()
|
|
numero_devis = getattr(doc, "DO_Piece", "")
|
|
except:
|
|
pass
|
|
|
|
return numero_devis
|
|
|
|
def _relire_devis(self, numero_devis, devis_data, forcer_brouillon):
|
|
"""Relit le devis créé et extrait les informations finales."""
|
|
factory_doc = self.cial.FactoryDocumentVente
|
|
persist_reread = factory_doc.ReadPiece(0, numero_devis)
|
|
|
|
if not persist_reread:
|
|
logger.debug("ReadPiece échoué, recherche dans List()...")
|
|
persist_reread = _rechercher_devis_dans_liste(
|
|
numero_devis, factory_doc
|
|
)
|
|
|
|
if persist_reread:
|
|
doc_final = win32com.client.CastTo(persist_reread, "IBODocumentVente3")
|
|
doc_final.Read()
|
|
|
|
total_ht = float(getattr(doc_final, "DO_TotalHT", 0.0))
|
|
total_ttc = float(getattr(doc_final, "DO_TotalTTC", 0.0))
|
|
statut_final = getattr(doc_final, "DO_Statut", 0)
|
|
reference_final = getattr(doc_final, "DO_Ref", "")
|
|
|
|
date_livraison_final = None
|
|
|
|
try:
|
|
date_livr = getattr(doc_final, "DO_DateLivr", None)
|
|
if date_livr:
|
|
date_livraison_final = date_livr.strftime("%Y-%m-%d")
|
|
except:
|
|
pass
|
|
else:
|
|
total_calcule = sum(
|
|
l.get("montant_ligne_ht", 0) for l in devis_data["lignes"]
|
|
)
|
|
total_ht = total_calcule
|
|
total_ttc = round(total_calcule * 1.20, 2)
|
|
statut_final = 0 if forcer_brouillon else 2
|
|
reference_final = devis_data.get("reference", "")
|
|
date_livraison_final = devis_data.get("date_livraison")
|
|
|
|
logger.info(f" Total HT: {total_ht}€")
|
|
logger.info(f" Total TTC: {total_ttc}€")
|
|
logger.info(f" Statut final: {statut_final}")
|
|
if reference_final:
|
|
logger.info(f" Référence: {reference_final}")
|
|
if date_livraison_final:
|
|
logger.info(f" Date livraison: {date_livraison_final}")
|
|
|
|
return {
|
|
"numero_devis": numero_devis,
|
|
"total_ht": total_ht,
|
|
"total_ttc": total_ttc,
|
|
"nb_lignes": len(devis_data["lignes"]),
|
|
"client_code": devis_data["client"]["code"],
|
|
"date_devis": str(devis_data.get("date_devis", "")),
|
|
"date_livraison": date_livraison_final,
|
|
"reference": reference_final,
|
|
"statut": statut_final,
|
|
}
|
|
|
|
|
|
__all__ = [
|
|
"_recuperer_numero_devis",
|
|
"_relire_devis"
|
|
] |