factures: designation est un unicode (si possible)

This commit is contained in:
Daniel STAN 2015-05-23 12:38:08 +02:00
parent d23bda8bd2
commit 8b3832355e
4 changed files with 40 additions and 18 deletions

View file

@ -1,10 +1,28 @@
#!/usr/bin/env python #!/usr/bin/env python
# -*- coding: utf-8 -*- # -*- 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 # Les clef sont un code article
items = { ITEMS = {
'CABLE' : {'designation': u'Cable Ethernet 5m', 'pu': 3, 'imprimeur': False}, 'CABLE': {
'ADAPTATEUR' : {'designation': u'Adaptateur Ethernet/USB', 'pu': 17, 'imprimeur': False}, 'designation': u'Cable Ethernet 5m',
'RELIURE': {'designation': u'Reliure plastique', 'pu': 0.12, 'imprimeur': False}, 'pu': 3.,
'SOLDE':{'designation': u'Rechargement du solde', 'pu':'*', 'imprimeur': False}, },
'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,
},
} }

View file

@ -457,7 +457,7 @@ class Dialog(machine.Dialog, blacklist.Dialog):
def box_choose_item(tags): def box_choose_item(tags):
choices = [] 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)) 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( return self.dialog.checklist(
text="", text="",
@ -564,5 +564,5 @@ class Dialog(machine.Dialog, blacklist.Dialog):
output=tags, output=tags,
cancel_cont=cont, cancel_cont=cont,
error_cont=self_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])]
) )

View file

@ -1035,7 +1035,7 @@ def set_vente(proprio):
u""" u"""
Vend un objet à l'adherent : génère la facture associée. 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(): def choose_items():
# Construction de la boîte de dialogue # Construction de la boîte de dialogue
@ -1043,7 +1043,7 @@ def set_vente(proprio):
texte = [] texte = []
for key, value in items.iteritems(): for key, value in items.iteritems():
if value['imprimeur'] and not isimprimeur: if value.get('imprimeur', False) and not isimprimeur:
continue continue
if value['pu'] != '*': if value['pu'] != '*':
checklist.append(u'"%s" "%s (%s€)" "%s"' % (key, value['designation'], value['pu'], on_off(False))) 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.recuPaiement(strftime("%Y-%m-%d %H:%M:%S"))
f.save() f.save()
arg = u'--title "Vente terminée" ' arg = u'--title "Vente terminée" '
arg += u'--msgbox "Vous pouvez remettre à l\'adherent les articles suivant :\n%s" 0 0' % '\n'.join( 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()]) ["%s %s" % (art['nombre'], art['designation']) for art in f.articles()]),
f.numero())
dialog(arg) dialog(arg)
except ValueError as error: except ValueError as error:
f.delete() f.delete()

View file

@ -4080,8 +4080,11 @@ class Facture(BaseClasseCrans):
# modifie la liste des articles # modifie la liste des articles
if arts != None: if arts != None:
self._set('article', self._set('article',
['%s~~%s~~%s~~%s' % (art['code'], art['designation'], ['%s~~%s~~%s~~%s' % (
str(art['nombre']), str(art['pu'])) art['code'],
art['designation'].encode('utf-8', errors='replace'),
str(art['nombre']),
str(art['pu']))
for art in arts]) for art in arts])
# charge la liste des articles # charge la liste des articles
@ -4089,7 +4092,7 @@ class Facture(BaseClasseCrans):
for art in self._data.get("article", []): for art in self._data.get("article", []):
art = art.split('~~') art = art.split('~~')
art = { 'code' : art[0], art = { 'code' : art[0],
'designation' : art[1], 'designation' : art[1].decode('utf-8', errors='replace'),
'nombre' : int(art[2]), 'nombre' : int(art[2]),
'pu' : float(art[3]) } 'pu' : float(art[3]) }
arts.append(art) arts.append(art)
@ -4105,7 +4108,7 @@ class Facture(BaseClasseCrans):
self.ajoute({ self.ajoute({
'nombre': 1, 'nombre': 1,
'code': 'REMISE', 'code': 'REMISE',
'designation': 'Remise : %s' % (reason,), 'designation': u'Remise : %s' % (reason,),
'pu': -amount, 'pu': -amount,
}) })
@ -4130,7 +4133,7 @@ class Facture(BaseClasseCrans):
if float(int(art['pu']*100)/100.0) != art['pu']: 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' raise ValueError, u'pu ne doit pas avoir plus de 2 chiffres apres la virgule'
art['nombre'] = int(art['nombre']) 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' raise ValueError, u'Ne pas mettre de ~~ dans les champs'
arts.append(art) arts.append(art)
@ -4166,7 +4169,7 @@ class Facture(BaseClasseCrans):
Retourne la liste des articles. Retourne la liste des articles.
Un article est un dictionnaire de la forme : Un article est un dictionnaire de la forme :
{ 'code' : string, { 'code' : string,
'designation' : string, 'designation' : unicode,
'nombre' : int, 'nombre' : int,
'pu' : int/float } 'pu' : int/float }
""" """
@ -4204,7 +4207,7 @@ class Facture(BaseClasseCrans):
item_id = 0 item_id = 0
for item in self.articles(): for item in self.articles():
item_id += 1 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 += "&amount_%d=%s" % (item_id, item['pu'])
url += "&quantity_%d=%s" % (item_id, int(item['nombre'])) url += "&quantity_%d=%s" % (item_id, int(item['nombre']))