factures: designation est un unicode (si possible)
This commit is contained in:
parent
d23bda8bd2
commit
8b3832355e
4 changed files with 40 additions and 18 deletions
|
@ -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,
|
||||
},
|
||||
}
|
||||
|
|
|
@ -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])]
|
||||
)
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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']))
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue