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
# -*- 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,
},
}

View file

@ -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])]
)

View file

@ -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()

View file

@ -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']))