diff --git a/gestion/config/factures.py b/gestion/config/factures.py index 39c10127..50ed5662 100644 --- a/gestion/config/factures.py +++ b/gestion/config/factures.py @@ -1,10 +1,28 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- +"""Déclaration des items accessibles à la vente (prix coûtant) et générant +une facture. +items est un dictionnaire, dont chaque entrée est composée d'un dictionnaire +ayant une désignation, un prix unitaire, et indique si l'item n'est accessible +qu'aux imprimeurs (par défaut, non).""" # Les clef sont un code article -items = { - 'CABLE' : {'designation': u'Cable Ethernet 5m', 'pu': 3, 'imprimeur': False}, - 'ADAPTATEUR' : {'designation': u'Adaptateur Ethernet/USB', 'pu': 17, 'imprimeur': False}, - 'RELIURE': {'designation': u'Reliure plastique', 'pu': 0.12, 'imprimeur': False}, - 'SOLDE':{'designation': u'Rechargement du solde', 'pu':'*', 'imprimeur': False}, +ITEMS = { + 'CABLE': { + 'designation': u'Cable Ethernet 5m', + 'pu': 3., + }, + 'ADAPTATEUR': { + 'designation': u'Adaptateur Ethernet/USB', + 'pu': 17., + }, + 'RELIURE': { + 'designation': u'Reliure plastique', + 'pu': 0.12, + }, + 'SOLDE': { + 'designation': u'Rechargement du solde', + 'pu': '*', + 'imprimeur': True, + }, } diff --git a/gestion/dialog/proprio.py b/gestion/dialog/proprio.py index 6906c8da..e1daeabb 100644 --- a/gestion/dialog/proprio.py +++ b/gestion/dialog/proprio.py @@ -457,7 +457,7 @@ class Dialog(machine.Dialog, blacklist.Dialog): def box_choose_item(tags): choices = [] - for code, article in gestion.config.factures.items.items(): + for code, article in gestion.config.factures.ITEMS.items(): choices.append((code, u"%s%s" % (article['designation'], (u' (%s€)' % article['pu']) if article['pu'] != '*' else ""), 1 if code in tags else 0)) return self.dialog.checklist( text="", @@ -564,5 +564,5 @@ class Dialog(machine.Dialog, blacklist.Dialog): output=tags, cancel_cont=cont, error_cont=self_cont, - codes_todo=[([self.dialog.DIALOG_OK], choose_item, [proprio, tags, copy.deepcopy(gestion.config.factures.items), self_cont])] + codes_todo=[([self.dialog.DIALOG_OK], choose_item, [proprio, tags, copy.deepcopy(gestion.config.factures.ITEMS), self_cont])] ) diff --git a/gestion/gest_crans.py b/gestion/gest_crans.py index 1d570109..e8a96362 100755 --- a/gestion/gest_crans.py +++ b/gestion/gest_crans.py @@ -1035,7 +1035,7 @@ def set_vente(proprio): u""" Vend un objet à l'adherent : génère la facture associée. """ - from config.factures import items + from config.factures import ITEMS as items def choose_items(): # Construction de la boîte de dialogue @@ -1043,7 +1043,7 @@ def set_vente(proprio): texte = [] for key, value in items.iteritems(): - if value['imprimeur'] and not isimprimeur: + if value.get('imprimeur', False) and not isimprimeur: continue if value['pu'] != '*': checklist.append(u'"%s" "%s (%s€)" "%s"' % (key, value['designation'], value['pu'], on_off(False))) @@ -1170,8 +1170,9 @@ def set_vente(proprio): f.recuPaiement(strftime("%Y-%m-%d %H:%M:%S")) f.save() arg = u'--title "Vente terminée" ' - arg += u'--msgbox "Vous pouvez remettre à l\'adherent les articles suivant :\n%s" 0 0' % '\n'.join( - ["%s %s" % (art['nombre'], art['designation']) for art in f.articles()]) + arg += u'--msgbox "Vous pouvez remettre à l\'adherent les articles suivant :\n%s\n\nMerci de noter la facture: fid=%s" 0 0' % ('\n'.join( + ["%s %s" % (art['nombre'], art['designation']) for art in f.articles()]), + f.numero()) dialog(arg) except ValueError as error: f.delete() diff --git a/gestion/ldap_crans.py b/gestion/ldap_crans.py index 413e3fa6..cb99b272 100755 --- a/gestion/ldap_crans.py +++ b/gestion/ldap_crans.py @@ -4080,8 +4080,11 @@ class Facture(BaseClasseCrans): # modifie la liste des articles if arts != None: self._set('article', - ['%s~~%s~~%s~~%s' % (art['code'], art['designation'], - str(art['nombre']), str(art['pu'])) + ['%s~~%s~~%s~~%s' % ( + art['code'], + art['designation'].encode('utf-8', errors='replace'), + str(art['nombre']), + str(art['pu'])) for art in arts]) # charge la liste des articles @@ -4089,7 +4092,7 @@ class Facture(BaseClasseCrans): for art in self._data.get("article", []): art = art.split('~~') art = { 'code' : art[0], - 'designation' : art[1], + 'designation' : art[1].decode('utf-8', errors='replace'), 'nombre' : int(art[2]), 'pu' : float(art[3]) } arts.append(art) @@ -4105,7 +4108,7 @@ class Facture(BaseClasseCrans): self.ajoute({ 'nombre': 1, 'code': 'REMISE', - 'designation': 'Remise : %s' % (reason,), + 'designation': u'Remise : %s' % (reason,), 'pu': -amount, }) @@ -4130,7 +4133,7 @@ class Facture(BaseClasseCrans): if float(int(art['pu']*100)/100.0) != art['pu']: raise ValueError, u'pu ne doit pas avoir plus de 2 chiffres apres la virgule' art['nombre'] = int(art['nombre']) - if '~~' in ' '.join([str(x) for x in art.values()]): + if '~~' in ' '.join([unicode(x) for x in art.values()]): raise ValueError, u'Ne pas mettre de ~~ dans les champs' arts.append(art) @@ -4166,7 +4169,7 @@ class Facture(BaseClasseCrans): Retourne la liste des articles. Un article est un dictionnaire de la forme : { 'code' : string, - 'designation' : string, + 'designation' : unicode, 'nombre' : int, 'pu' : int/float } """ @@ -4204,7 +4207,7 @@ class Facture(BaseClasseCrans): item_id = 0 for item in self.articles(): item_id += 1 - url += "&item_name_%d=%s" % (item_id, item['designation']) + url += "&item_name_%d=%s" % (item_id, item['designation'].encode('ascii', errors='replace')) url += "&amount_%d=%s" % (item_id, item['pu']) url += "&quantity_%d=%s" % (item_id, int(item['nombre']))