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" ]