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
|
#!/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,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
|
@ -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])]
|
||||||
)
|
)
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -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']))
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue