From 6a397bd1517dbc41da8b54d7eac2602ae165feff Mon Sep 17 00:00:00 2001 From: Patrick Date: Sat, 11 Mar 2017 15:10:31 +0100 Subject: [PATCH] The customer can now add an higher qty of any product to a confirmed invoice. The invoice has to be confirmed again. --- repanier/locale/fr/LC_MESSAGES/django.mo | Bin 81059 -> 81149 bytes repanier/locale/fr/LC_MESSAGES/django.po | 250 +++++++++++------------ repanier/models/invoice.py | 5 + repanier/models/purchase.py | 3 + repanier/tools.py | 46 +++-- repanier/views/order_ajax.py | 6 +- 6 files changed, 165 insertions(+), 145 deletions(-) diff --git a/repanier/locale/fr/LC_MESSAGES/django.mo b/repanier/locale/fr/LC_MESSAGES/django.mo index 9de9c1b03fe28cfb88bf26ef6a38e21f0e2518ac..0416ea8e9e8d3803b9602ce577fae90006dd3f36 100644 GIT binary patch delta 20398 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 E4^x=12mk;8 delta 20325 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

avFh diff --git a/repanier/locale/fr/LC_MESSAGES/django.po b/repanier/locale/fr/LC_MESSAGES/django.po index 8dc808e..456d5f7 100644 --- a/repanier/locale/fr/LC_MESSAGES/django.po +++ b/repanier/locale/fr/LC_MESSAGES/django.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: Repanier\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-03-09 11:35+0100\n" -"PO-Revision-Date: 2017-03-09 20:26+0100\n" +"POT-Creation-Date: 2017-03-11 14:45+0100\n" +"PO-Revision-Date: 2017-03-11 14:56+0100\n" "Last-Translator: Patrick Colmant \n" "Language-Team: Patrick Colmant \n" "Language: fr\n" @@ -19,7 +19,7 @@ msgstr "" "X-Poedit-SourceCharset: UTF-8\n" #: admin/admin_filter.py:20 models/offeritem.py:181 models/permanence.py:60 -#: models/producer.py:292 xlsx/xlsx_order.py:214 +#: models/producer.py:295 xlsx/xlsx_order.py:214 msgid "producers" msgstr "Producteurs" @@ -36,22 +36,22 @@ msgid "product_placement" msgstr "Emplacement du produit pendant la préparation" #: admin/admin_filter.py:116 models/offeritem.py:96 models/offeritem.py:99 -#: models/product.py:69 models/product.py:72 models/purchase.py:81 -#: models/purchase.py:84 xlsx/xlsx_product.py:51 +#: models/product.py:69 models/product.py:72 models/purchase.py:84 +#: models/purchase.py:87 xlsx/xlsx_product.py:51 msgid "vat" msgstr "TVA" #: admin/admin_filter.py:133 admin/bankaccount.py:144 models/bankaccount.py:23 -#: models/bankaccount.py:110 models/customer.py:268 models/invoice.py:21 -#: models/invoice.py:24 models/invoice.py:401 models/invoice.py:445 +#: models/bankaccount.py:110 models/customer.py:268 models/invoice.py:23 +#: models/invoice.py:26 models/invoice.py:406 models/invoice.py:450 #: models/permanenceboard.py:15 models/purchase.py:42 models/purchase.py:44 #: xlsx/xlsx_order.py:304 xlsx/xlsx_purchase.py:45 xlsx/xlsx_purchase.py:593 msgid "customer" msgstr "Consommateur" #: admin/admin_filter.py:160 admin/bankaccount.py:152 models/bankaccount.py:20 -#: models/bankaccount.py:86 models/invoice.py:288 models/invoice.py:404 -#: models/offeritem.py:62 models/producer.py:291 models/product.py:29 +#: models/bankaccount.py:86 models/invoice.py:293 models/invoice.py:409 +#: models/offeritem.py:62 models/producer.py:294 models/product.py:29 #: models/purchase.py:40 templates/repanier/pre_order_form.html:32 #: xlsx/xlsx_order.py:301 xlsx/xlsx_product.py:49 xlsx/xlsx_purchase.py:43 #: xlsx/xlsx_purchase.py:587 xlsx/xlsx_purchase.py:588 @@ -59,7 +59,7 @@ msgid "producer" msgstr "Fournisseur" #: admin/admin_filter.py:186 admin/admin_filter.py:207 -#: models/permanence.py:469 models/purchase.py:171 +#: models/permanence.py:469 models/purchase.py:174 msgid "permanence" msgstr "permanence" @@ -80,9 +80,9 @@ msgid "not invoiced" msgstr "Pas encore facturés" #: admin/admin_filter.py:244 models/customer.py:100 models/customer.py:161 -#: models/customer.py:190 models/invoice.py:90 models/invoice.py:335 -#: models/producer.py:97 models/producer.py:158 models/producer.py:225 -#: models/producer.py:260 +#: models/customer.py:190 models/invoice.py:92 models/invoice.py:340 +#: models/producer.py:97 models/producer.py:158 models/producer.py:228 +#: models/producer.py:263 msgid "balance" msgstr "Solde" @@ -114,24 +114,24 @@ msgstr "" "faites le manuellement sans passer par l'importation." #: admin/bankaccount.py:158 models/bankaccount.py:37 models/bankaccount.py:59 -#: models/invoice.py:82 models/invoice.py:327 xlsx/xlsx_invoice.py:72 +#: models/invoice.py:84 models/invoice.py:332 xlsx/xlsx_invoice.py:72 #: xlsx/xlsx_invoice.py:124 msgid "bank_amount_in" msgstr "Entrée" -#: admin/bankaccount.py:159 models/bankaccount.py:37 models/invoice.py:82 -#: models/invoice.py:327 +#: admin/bankaccount.py:159 models/bankaccount.py:37 models/invoice.py:84 +#: models/invoice.py:332 msgid "payment_on_the_account" msgstr "Virement entrant" #: admin/bankaccount.py:162 models/bankaccount.py:41 models/bankaccount.py:69 -#: models/invoice.py:85 models/invoice.py:330 xlsx/xlsx_invoice.py:73 +#: models/invoice.py:87 models/invoice.py:335 xlsx/xlsx_invoice.py:73 #: xlsx/xlsx_invoice.py:125 msgid "bank_amount_out" msgstr "Sortie" -#: admin/bankaccount.py:163 models/bankaccount.py:41 models/invoice.py:85 -#: models/invoice.py:330 +#: admin/bankaccount.py:163 models/bankaccount.py:41 models/invoice.py:87 +#: models/invoice.py:335 msgid "payment_from_the_account" msgstr "Virement sortant" @@ -433,15 +433,15 @@ msgstr "Date du paiement" msgid "short_profile_name" msgstr "Nom abrégé" -#: admin/forms.py:75 models/invoice.py:367 +#: admin/forms.py:75 models/invoice.py:372 msgid "calculated balance to be invoiced" msgstr "Montant réclamé par le producteur calculé par Repanier" -#: admin/forms.py:77 models/invoice.py:370 +#: admin/forms.py:77 models/invoice.py:375 msgid "balance to be invoiced" msgstr "Montant réclamé par le producteur" -#: admin/forms.py:78 models/invoice.py:372 +#: admin/forms.py:78 models/invoice.py:377 msgid "invoice reference" msgstr "Référence facture" @@ -674,7 +674,7 @@ msgstr "" #: admin/permanence_in_preparation.py:591 admin/purchase.py:94 #: models/customer.py:108 models/deliveryboard.py:26 models/lut.py:97 -#: models/purchase.py:179 xlsx/xlsx_order.py:38 +#: models/purchase.py:182 xlsx/xlsx_order.py:38 msgid "delivery point" msgstr "Point de livraison" @@ -985,12 +985,12 @@ msgid "Duplicate offer_items are not allowed." msgstr "Le même produit ne peut pas être sélectionné deux fois." #: admin/rule_of_3_per_customer.py:95 admin/rule_of_3_per_product.py:100 -#: models/invoice.py:411 models/invoice.py:425 models/offeritem.py:113 +#: models/invoice.py:416 models/invoice.py:430 models/offeritem.py:113 #: models/offeritem.py:261 msgid "producer amount invoiced" msgstr "Facturé par le producteur" -#: admin/rule_of_3_per_customer.py:97 models/invoice.py:416 +#: admin/rule_of_3_per_customer.py:97 models/invoice.py:421 #: models/offeritem.py:118 msgid "customer amount invoiced" msgstr "Facturé au consommateur TVAC" @@ -1634,7 +1634,7 @@ msgstr "" msgid "/!\\ Order cancelled" msgstr "⚠ Commande annulée" -#: management/commands/delete_pending_purchases.py:40 task/task_order.py:349 +#: management/commands/delete_pending_purchases.py:43 task/task_order.py:349 #: task/task_order.py:439 msgid "Canceled order" msgstr "Commande annulée" @@ -1660,7 +1660,7 @@ msgid "customer_invoice" msgstr "Facture d'un consommateur" #: models/bankaccount.py:51 models/deliveryboard.py:38 models/permanence.py:68 -#: models/product.py:133 models/purchase.py:106 +#: models/product.py:133 models/purchase.py:109 msgid "is_updated_on" msgstr "Enregistrement mis à jour le" @@ -1848,11 +1848,11 @@ msgstr "" "Ces frais sont ajoutés aux commandes dont le minimum de commande n'est pas " "atteint." -#: models/configuration.py:94 models/invoice.py:103 models/lut.py:86 +#: models/configuration.py:94 models/invoice.py:105 models/lut.py:86 msgid "Minium order amount for free shipping cost" msgstr "Minimum pour livraison gratuite" -#: models/configuration.py:95 models/invoice.py:104 models/lut.py:87 +#: models/configuration.py:95 models/invoice.py:106 models/lut.py:87 msgid "This is the minimum order amount to avoid shipping cost." msgstr "" "Minimum à commander pour éviter des frais (0 = les frais s'appliquent " @@ -1997,7 +1997,7 @@ msgstr "Montrer mon n° ✆ aux autres membres" msgid "membership fee valid until" msgstr "Cotisation à renouveler le" -#: models/customer.py:90 models/purchase.py:99 +#: models/customer.py:90 models/purchase.py:102 #: templates/repanier/customer_invoice_form.html:38 msgid "Customer price list multiplier" msgstr "Coefficient appliqué au tarif consommateur" @@ -2007,8 +2007,8 @@ msgid "This multiplier is applied to each product ordered by this customer." msgstr "" "0,9 signifie -10% sur le prix tarif. 1,06 signifie +6% sur le prix tarif." -#: models/customer.py:98 models/customer.py:118 models/invoice.py:88 -#: models/invoice.py:333 models/producer.py:95 models/producer.py:129 +#: models/customer.py:98 models/customer.py:118 models/invoice.py:90 +#: models/invoice.py:338 models/producer.py:95 models/producer.py:129 msgid "date_balance" msgstr "Date de calcul du solde" @@ -2046,15 +2046,15 @@ msgstr "Date de la dernière cotisation" msgid "participation" msgstr "Participation" -#: models/customer.py:256 models/purchase.py:249 +#: models/customer.py:256 models/purchase.py:252 msgid "purchase" msgstr "Achat" -#: models/customer.py:269 models/invoice.py:446 +#: models/customer.py:269 models/invoice.py:451 msgid "customers" msgstr "Consommateurs" -#: models/deliveryboard.py:22 models/purchase.py:104 xlsx/xlsx_invoice.py:284 +#: models/deliveryboard.py:22 models/purchase.py:107 xlsx/xlsx_invoice.py:284 #: xlsx/xlsx_purchase.py:52 xlsx/xlsx_purchase.py:600 msgid "comment" msgstr "Commentaire" @@ -2077,7 +2077,7 @@ msgid "" "done" msgstr "Statut (Planifié, Ouvert, Commandes transmises, Facturé)" -#: models/deliveryboard.py:102 models/invoice.py:31 +#: models/deliveryboard.py:102 models/invoice.py:33 msgid "delivery board" msgstr "Tableau des livraisons" @@ -2085,77 +2085,77 @@ msgstr "Tableau des livraisons" msgid "deliveries board" msgstr "Tableaux des livraisons" -#: models/invoice.py:38 models/invoice.py:297 models/purchase.py:35 +#: models/invoice.py:40 models/invoice.py:302 models/purchase.py:35 msgid "invoice_status" msgstr "Statut" -#: models/invoice.py:47 +#: models/invoice.py:49 msgid "is_order_confirm_send" msgstr "confirmation de la commande envoyée" -#: models/invoice.py:49 models/invoice.py:299 +#: models/invoice.py:51 models/invoice.py:304 msgid "invoice sort order" msgstr "Ordre de tri des factures" -#: models/invoice.py:52 models/invoice.py:302 +#: models/invoice.py:54 models/invoice.py:307 msgid "date_previous_balance" msgstr "Date de calcul du solde précédemment facturé" -#: models/invoice.py:54 models/invoice.py:304 +#: models/invoice.py:56 models/invoice.py:309 msgid "previous_balance" msgstr "Solde précédent facturé" -#: models/invoice.py:57 models/invoice.py:69 models/invoice.py:307 -#: models/invoice.py:338 +#: models/invoice.py:59 models/invoice.py:71 models/invoice.py:312 +#: models/invoice.py:343 msgid "Total amount" msgstr "Total avec TVA" -#: models/invoice.py:58 models/invoice.py:308 models/offeritem.py:114 +#: models/invoice.py:60 models/invoice.py:313 models/offeritem.py:114 msgid "Total purchase amount vat included" msgstr "Facturé par le producteur TVAC" -#: models/invoice.py:61 models/invoice.py:73 models/invoice.py:311 -#: models/invoice.py:346 xlsx/xlsx_order.py:42 xlsx/xlsx_order.py:91 +#: models/invoice.py:63 models/invoice.py:75 models/invoice.py:316 +#: models/invoice.py:351 xlsx/xlsx_order.py:42 xlsx/xlsx_order.py:91 msgid "Total vat" msgstr "Total avec TVA" -#: models/invoice.py:62 models/invoice.py:312 +#: models/invoice.py:64 models/invoice.py:317 msgid "Vat part of the total purchased" msgstr "TVA" -#: models/invoice.py:65 models/invoice.py:323 models/invoice.py:359 -#: models/invoice.py:363 models/offeritem.py:102 models/product.py:75 -#: models/purchase.py:87 models/purchase.py:165 xlsx/xlsx_invoice.py:240 +#: models/invoice.py:67 models/invoice.py:328 models/invoice.py:364 +#: models/invoice.py:368 models/offeritem.py:102 models/product.py:75 +#: models/purchase.py:90 models/purchase.py:168 xlsx/xlsx_invoice.py:240 #: xlsx/xlsx_offer.py:67 xlsx/xlsx_purchase.py:48 msgid "deposit" msgstr "Consigne" -#: models/invoice.py:66 models/invoice.py:324 models/product.py:76 -#: models/purchase.py:88 +#: models/invoice.py:68 models/invoice.py:329 models/product.py:76 +#: models/purchase.py:91 msgid "deposit to add to the original unit price" msgstr "En supplément" -#: models/invoice.py:70 models/invoice.py:339 +#: models/invoice.py:72 models/invoice.py:344 msgid "purchase to add amount vat included" msgstr "Montant à ajouter TVA incluse" -#: models/invoice.py:74 models/invoice.py:347 models/invoice.py:351 +#: models/invoice.py:76 models/invoice.py:352 models/invoice.py:356 msgid "vat to add" msgstr "TVA à ajouter" -#: models/invoice.py:77 models/invoice.py:354 models/lut.py:81 +#: models/invoice.py:79 models/invoice.py:359 models/lut.py:81 msgid "Delivery point transport" msgstr "Frais de livraison" -#: models/invoice.py:78 models/invoice.py:355 +#: models/invoice.py:80 models/invoice.py:360 msgid "transport to add" msgstr "Transport à ajouter" -#: models/invoice.py:93 models/lut.py:76 +#: models/invoice.py:95 models/lut.py:76 msgid "Delivery point price list multiplier" msgstr "Coefficient appliqué à ce point de livraison" -#: models/invoice.py:94 +#: models/invoice.py:96 msgid "" "This multiplier is applied once for groups with entitled customer or at each " "customer invoice for open groups." @@ -2164,11 +2164,11 @@ msgstr "" "total de la facture globale du groupe. Dans le cas contraire, il est " "appliqué au total des factures individuelles de chaque consommateur." -#: models/invoice.py:98 +#: models/invoice.py:100 msgid "Delivery point shipping cost" msgstr "Frais de livraison" -#: models/invoice.py:99 models/lut.py:82 +#: models/invoice.py:101 models/lut.py:82 msgid "" "This amount is added once for groups with entitled customer or at each " "customer for open groups." @@ -2177,73 +2177,73 @@ msgstr "" "cas où le groupe possède un consommateur responsable. Sinon il est ajouté au " "total de chaque facture individuelle." -#: models/invoice.py:280 +#: models/invoice.py:285 msgid "customer invoice" msgstr "Facture d'un consommateur" -#: models/invoice.py:281 +#: models/invoice.py:286 msgid "customers invoices" msgstr "Factures de consommateurs" -#: models/invoice.py:315 +#: models/invoice.py:320 msgid "Total profit vat included" msgstr "Profit TVA incluse" -#: models/invoice.py:316 +#: models/invoice.py:321 msgid "Difference between purchase and selling price" msgstr "Différence entre le prix d'achat et le prix de vente" -#: models/invoice.py:319 +#: models/invoice.py:324 msgid "Total profit vat" msgstr "Profit TVA incluse" -#: models/invoice.py:320 +#: models/invoice.py:325 msgid "Vat part of the profit" msgstr "TVA sur le profit" -#: models/invoice.py:342 +#: models/invoice.py:347 msgid "Total stock" msgstr "Montant déduit du stock" -#: models/invoice.py:343 +#: models/invoice.py:348 msgid "stock taken amount vat included" msgstr "Montant déduit du stock TVA incluse" -#: models/invoice.py:350 +#: models/invoice.py:355 msgid "Total stock vat" msgstr "Total TVA déduit du stock" -#: models/invoice.py:360 models/invoice.py:364 views/forms.py:190 +#: models/invoice.py:365 models/invoice.py:369 views/forms.py:190 msgid "deposit to add" msgstr "+ Consigne" -#: models/invoice.py:368 models/producer.py:79 +#: models/invoice.py:373 models/producer.py:79 msgid "to be paid" msgstr "A payer" -#: models/invoice.py:393 +#: models/invoice.py:398 msgid "producer invoice" msgstr "Facture d'un producteur" -#: models/invoice.py:394 +#: models/invoice.py:399 msgid "producers invoices" msgstr "Facture de producteurs" -#: models/invoice.py:412 models/invoice.py:417 models/offeritem.py:119 +#: models/invoice.py:417 models/invoice.py:422 models/offeritem.py:119 msgid "Total selling amount vat included" msgstr "Facturé au consommateur à la pièce ou au kg TVA incluse" -#: models/invoice.py:422 models/offeritem.py:258 models/purchase.py:154 -#: models/purchase.py:162 +#: models/invoice.py:427 models/offeritem.py:258 models/purchase.py:157 +#: models/purchase.py:165 #, python-format msgid "%(price)s" msgstr "%(price)s" -#: models/invoice.py:433 +#: models/invoice.py:438 msgid "customer x producer invoice" msgstr "Consommateur X Fournisseur - Facture" -#: models/invoice.py:434 +#: models/invoice.py:439 msgid "customers x producers invoices" msgstr "Consommateur X Fournisseur - Factures" @@ -2340,8 +2340,8 @@ msgstr "1,7 = 1 kg 700 grammes ou 1,7 ℓ. 0,25 = 250 grammes ou 250 cℓ." msgid "used for helping to determine the order of preparation of this product" msgstr "Utilisé pour aider à déterminer l'ordre de préparation des paniers" -#: models/offeritem.py:87 models/product.py:63 models/purchase.py:149 -#: models/purchase.py:157 views/forms.py:187 xlsx/xlsx_invoice.py:250 +#: models/offeritem.py:87 models/product.py:63 models/purchase.py:152 +#: models/purchase.py:160 views/forms.py:187 xlsx/xlsx_invoice.py:250 #: xlsx/xlsx_offer.py:62 xlsx/xlsx_purchase.py:47 xlsx/xlsx_purchase.py:630 #: xlsx/xlsx_stock.py:35 xlsx/xlsx_stock.py:323 msgid "producer unit price" @@ -2352,7 +2352,7 @@ msgid "" "producer unit price (/piece or /kg or /l), including vat, without deposit" msgstr "(/pièce, /kg ou /ℓ)" -#: models/offeritem.py:91 models/product.py:66 models/purchase.py:116 +#: models/offeritem.py:91 models/product.py:66 models/purchase.py:119 #: xlsx/xlsx_invoice.py:267 xlsx/xlsx_offer.py:65 xlsx/xlsx_stock.py:35 #: xlsx/xlsx_stock.py:323 msgid "customer unit price" @@ -2370,13 +2370,13 @@ msgstr "Les tarifs de ce producteur sont hors TVA" msgid "deposit to add to the unit price" msgstr "En supplément" -#: models/offeritem.py:109 models/product.py:84 models/purchase.py:96 +#: models/offeritem.py:109 models/product.py:84 models/purchase.py:99 #: templates/repanier/pre_order_form.html:41 views/forms.py:196 #: xlsx/xlsx_purchase.py:50 msgid "tax" msgstr "Taxe" -#: models/offeritem.py:127 models/purchase.py:71 models/purchase.py:188 +#: models/offeritem.py:127 models/purchase.py:74 models/purchase.py:191 #: xlsx/xlsx_purchase.py:46 xlsx/xlsx_purchase.py:601 #: xlsx/xlsx_purchase.py:602 msgid "quantity invoiced" @@ -2414,7 +2414,7 @@ msgstr "Pré-ouvrir les cdes" msgid "price_list_multiplier" msgstr "Coefficient appliqué au tarif producteur" -#: models/offeritem.py:144 models/producer.py:83 models/purchase.py:100 +#: models/offeritem.py:144 models/producer.py:83 models/purchase.py:103 msgid "This multiplier is applied to each price automatically imported/pushed." msgstr "" "0,9 signifie -10% sur le prix tarif. 1,06 signifie +6% sur le prix tarif." @@ -2665,11 +2665,11 @@ msgstr "Produits" msgid "link to his products" msgstr "Produits" -#: models/producer.py:282 +#: models/producer.py:285 msgid "last invoice" msgstr "dernière facture" -#: models/producer.py:287 templates/repanier/confirm_admin_invoice.html:110 +#: models/producer.py:290 templates/repanier/confirm_admin_invoice.html:110 #: templates/repanier/pre_order_create_product_form.html:115 #: templates/repanier/pre_order_form.html:38 #: templates/repanier/pre_order_update_product_form.html:111 @@ -2694,19 +2694,23 @@ msgstr "Facture consommateur X producteur" msgid "quantity ordered" msgstr "Qté commandée" -#: models/purchase.py:65 +#: models/purchase.py:63 +msgid "quantity confirmed" +msgstr "Qté confirmée" + +#: models/purchase.py:68 msgid "quantity for preparation order_by" msgstr "Qté pour trier les listes de préparation" -#: models/purchase.py:74 +#: models/purchase.py:77 msgid "producer row price" msgstr "Total au tarif producteur" -#: models/purchase.py:77 models/purchase.py:140 +#: models/purchase.py:80 models/purchase.py:143 msgid "customer row price" msgstr "Total tarif consommateur" -#: models/purchase.py:250 +#: models/purchase.py:253 msgid "purchases" msgstr "Achats" @@ -3413,13 +3417,13 @@ msgstr "" msgid "Login me" msgstr "Me connecter" -#: templates/repanier/order_form.html:20 +#: templates/repanier/order_form.html:19 msgid "You are not allowed to order products" msgstr "" "La fonctionnalité de commande n'est pas activée sur votre compte. Si vous " "souhaitez commander, veuillez vous adresser aux responsables de votre groupe." -#: templates/repanier/order_form.html:49 +#: templates/repanier/order_form.html:48 msgid "Details of your order" msgstr "Détail de votre commande" @@ -3436,12 +3440,12 @@ msgid "All products" msgstr "Tous les produits" #: templates/repanier/order_form.html:198 -#: templates/repanier/order_form.html:327 templates/repanier/task_form.html:96 +#: templates/repanier/order_form.html:328 templates/repanier/task_form.html:96 msgid "Page " msgstr "Écran " #: templates/repanier/order_form.html:198 -#: templates/repanier/order_form.html:327 templates/repanier/task_form.html:96 +#: templates/repanier/order_form.html:328 templates/repanier/task_form.html:96 msgid "of" msgstr "/" @@ -3462,32 +3466,32 @@ msgstr "Fermer" msgid "To order a bigger quantity, please contact your " msgstr "Pour commander une quantité plus grande, veuillez contacter votre " -#: templates/repanier/order_form.html:308 +#: templates/repanier/order_form.html:309 msgid "All" msgstr "Tous" -#: templates/repanier/order_form.html:363 -#: templates/repanier/order_form.html:400 -#: templates/repanier/order_form.html:419 -#: templates/repanier/order_form.html:427 -#: templates/repanier/order_form.html:489 -#: templates/repanier/order_form.html:528 +#: templates/repanier/order_form.html:364 +#: templates/repanier/order_form.html:401 +#: templates/repanier/order_form.html:420 +#: templates/repanier/order_form.html:428 +#: templates/repanier/order_form.html:488 +#: templates/repanier/order_form.html:527 msgid "retry" msgstr "Veuillez réessayer" -#: templates/repanier/order_form.html:370 +#: templates/repanier/order_form.html:371 msgid "You may not order" msgstr "Commande impossible" -#: templates/repanier/order_form.html:479 +#: templates/repanier/order_form.html:478 msgid "Personnal communication" msgstr "Communication personnelle" -#: templates/repanier/order_form.html:552 +#: templates/repanier/order_form.html:551 msgid "Communication error" msgstr "Erreur de connexion" -#: templates/repanier/order_form.html:553 +#: templates/repanier/order_form.html:552 #: templates/repanier/pre_order_form.html:156 msgid "Please close this window and retry." msgstr "Veuillez fermer cette fenêtre et ressayer l\\'opération." @@ -3991,39 +3995,40 @@ msgstr "" "Pour ce point de livraison, une réduction de %(decrease)s %% est appliqué " "au total facturé (hors consigne)." -#: tools.py:1199 +#: tools.py:1200 +msgid "An unconfirmed order will be canceled." +msgstr "⚠ Les commandes non confirmées sont annulées." + +#: tools.py:1201 msgid "Confirm this order and receive an email containing its summary." -msgstr "" -" ➜ Confirmer ma commande. ⚠ Les commandes non confirmées sont annulées." +msgstr " ➜ Confirmer ma commande et recevoir un ✉ récapitulatif." -#: tools.py:1204 +#: tools.py:1206 msgid "Verify my order content before validating it." -msgstr "" -"⚠ Les commandes non confirmées sont annulées. ➜ Passer à l'étape de " -"confirmation de ma commande." +msgstr "➜ Passer à l'étape de confirmation de ma commande." -#: tools.py:1217 +#: tools.py:1219 msgid "Receive an email containing this order summary." msgstr "Recevoir un ✉ récapitulatif de ma commande." -#: tools.py:1270 +#: tools.py:1272 #, python-format msgid "" "Your order is confirmed. An email containing this order summary has been " "sent to %s." msgstr "Commande confirmée : un ✉ récapitulatif de celle-ci a été envoyé à %s" -#: tools.py:1272 +#: tools.py:1274 #, python-format msgid "An email containing this order summary has been sent to %s." msgstr "Un ✉ récapitulatif de la commande a été envoyé à %s." -#: tools.py:1340 +#: tools.py:1342 #, python-format msgid "Cancelled qty : %s" msgstr "Qté non confirmée : %s" -#: tools.py:1631 +#: tools.py:1636 msgid "" "You can change the order quantities as long as the orders are open for your " "delivery point." @@ -4031,17 +4036,17 @@ msgstr "" "Vous pouvez modifier les produits et quantités commandés aussi longtemps que " "les commandes sont ouvertes pour votre point de livraison." -#: tools.py:1635 +#: tools.py:1640 msgid "You can change the order quantities as long as the orders are open." msgstr "" "Vous pouvez modifier les produits et quantités commandés aussi longtemps que " "les commandes sont ouvertes." -#: tools.py:1640 +#: tools.py:1645 msgid "The orders are closed for your delivery point." msgstr "Les commandes sont clôturées pour votre point de livraison." -#: tools.py:1644 views/order_init_ajax.py:88 +#: tools.py:1649 views/order_init_ajax.py:88 msgid "The orders are closed." msgstr "Les commandes sont clôturées." @@ -4893,11 +4898,6 @@ msgstr "Importer, mettre à jour le stock" #~ msgid "nonetheless keep the orders" #~ msgstr "Conserver néanmoins les commandes" -#~ msgid "This order will be charged." -#~ msgstr "" -#~ "Cette commande vous sera facturée sans autre confirmation. Modifiez-la si " -#~ "nécessaire." - #~ msgid "display deliveries point" #~ msgstr "Activer les points de livraisons" diff --git a/repanier/models/invoice.py b/repanier/models/invoice.py index f22a819..1a0bc5a 100644 --- a/repanier/models/invoice.py +++ b/repanier/models/invoice.py @@ -6,9 +6,11 @@ import datetime from django.core.validators import MinValueValidator from django.db import models from django.db import transaction +from django.db.models import F from django.utils.encoding import python_2_unicode_compatible from django.utils.translation import ugettext_lazy as _ +import purchase from repanier.apps import REPANIER_SETTINGS_PERMANENCE_NAME import producer from repanier.const import * @@ -187,6 +189,9 @@ class CustomerInvoice(models.Model): @transaction.atomic def confirm_order(self): + purchase.Purchase.objects.filter( + customer_invoice__id=self.id + ).update(quantity_confirmed=F('quantity_ordered')) getcontext().rounding = ROUND_HALF_UP producer_invoice_buyinggroup = ProducerInvoice.objects.filter( producer__represent_this_buyinggroup=True, diff --git a/repanier/models/purchase.py b/repanier/models/purchase.py index 2604256..6474cef 100644 --- a/repanier/models/purchase.py +++ b/repanier/models/purchase.py @@ -59,6 +59,9 @@ class Purchase(models.Model): quantity_ordered = models.DecimalField( _("quantity ordered"), max_digits=9, decimal_places=4, default=DECIMAL_ZERO) + quantity_confirmed = models.DecimalField( + _("quantity confirmed"), + max_digits=9, decimal_places=4, default=DECIMAL_ZERO) # 0 if this is not a KG product -> the preparation list for this product will be produced by family # qty if not -> the preparation list for this product will be produced by qty then by family quantity_for_preparation_sort_order = models.DecimalField( diff --git a/repanier/tools.py b/repanier/tools.py index 0de58f0..1fb9049 100644 --- a/repanier/tools.py +++ b/repanier/tools.py @@ -1167,14 +1167,15 @@ def my_order_confirmation(permanence, customer_invoice, is_basket=False, ) else: msg_delivery = EMPTY_STRING + msg_confirmation1 = EMPTY_STRING if not is_basket and not apps.REPANIER_SETTINGS_CUSTOMERS_MUST_CONFIRM_ORDERS: # or customer_invoice.total_price_with_tax.amount != DECIMAL_ZERO: # If apps.REPANIER_SETTINGS_CUSTOMERS_MUST_CONFIRM_ORDERS is True, # then permanence.with_delivery_point is also True - msg_confirmation = msg_html = EMPTY_STRING + msg_confirmation2 = msg_html = EMPTY_STRING else: if customer_invoice.is_order_confirm_send: - msg_confirmation = my_order_confirmation_email_send_to(customer_invoice.customer) + msg_confirmation2 = my_order_confirmation_email_send_to(customer_invoice.customer) msg_html = """

@@ -1186,35 +1187,38 @@ def my_order_confirmation(permanence, customer_invoice, is_basket=False,
- """ % (msg_delivery, msg_confirmation, basket_message) + """ % (msg_delivery, msg_confirmation2, basket_message) else: msg_html = None btn_disabled = EMPTY_STRING - msg_confirmation = EMPTY_STRING + msg_confirmation2 = EMPTY_STRING if apps.REPANIER_SETTINGS_CUSTOMERS_MUST_CONFIRM_ORDERS: if is_basket: if customer_invoice.status == PERMANENCE_OPENED: - if permanence.with_delivery_point and customer_invoice.delivery is None: + if customer_invoice.delivery is None: btn_disabled = "disabled" - msg_confirmation = '  %s' % _("Confirm this order and receive an email containing its summary.") - else: + msg_confirmation1 = '%s
' % _("An unconfirmed order will be canceled.") + msg_confirmation2 = '  %s' % _("Confirm this order and receive an email containing its summary.") + elif permanence.with_delivery_point: href = urlresolvers.reverse( 'basket_view', args=(permanence.id,) ) - msg_confirmation = _("Verify my order content before validating it.") + msg_confirmation1 = '%s
' % _("An unconfirmed order will be canceled.") + msg_confirmation2 = _("Verify my order content before validating it.") msg_html = """
%s + %s %s
- """ % (msg_delivery, href, btn_disabled, msg_confirmation) + """ % (msg_delivery, msg_confirmation1, href, btn_disabled, msg_confirmation2) else: if is_basket: - msg_confirmation = _("Receive an email containing this order summary.") + msg_confirmation2 = _("Receive an email containing this order summary.") elif permanence.with_delivery_point: msg_html = """
@@ -1228,7 +1232,7 @@ def my_order_confirmation(permanence, customer_invoice, is_basket=False, else: msg_html = EMPTY_STRING if msg_html is None: - if msg_confirmation == EMPTY_STRING: + if msg_confirmation2 == EMPTY_STRING: msg_html = """
@@ -1246,17 +1250,17 @@ def my_order_confirmation(permanence, customer_invoice, is_basket=False,
%s + %s
%s
- """ % (msg_delivery, btn_disabled, msg_confirmation, basket_message) + """ % (msg_delivery, msg_confirmation1, btn_disabled, msg_confirmation2, basket_message) if to_json is not None: option_dict = {'id': "#span_btn_confirm_order", 'html': msg_html} to_json.append(option_dict) - return msg_confirmation def my_order_confirmation_email_send_to(customer): @@ -1336,10 +1340,18 @@ def create_or_update_one_purchase(customer, offer_item, value_id, value, close_o q_alert = offer_item.customer_alert_order_quantity if q_order <= q_alert: if purchase is not None: - if close_orders and value_id == DECIMAL_ZERO: - purchase.comment = _("Cancelled qty : %s") % number_format(purchase.quantity_ordered, 4) - purchase.quantity_ordered = q_order - purchase.save() + if close_orders: + if value_id == DECIMAL_ZERO: + purchase.comment = _("Cancelled qty : %s") % number_format(purchase.quantity_ordered, 4) + else: + purchase.quantity_ordered = q_order + purchase.save() + else: + if purchase.quantity_confirmed < q_order: + purchase.quantity_ordered = q_order + purchase.save() + else: + return purchase, False else: permanence = models.Permanence.objects.filter(id=offer_item.permanence_id) \ .only("permanence_date") \ diff --git a/repanier/views/order_ajax.py b/repanier/views/order_ajax.py index bb9e20a..efb50e6 100644 --- a/repanier/views/order_ajax.py +++ b/repanier/views/order_ajax.py @@ -34,9 +34,9 @@ def order_ajax(request): permanence__offeritem=offer_item_id, customer_id=customer.id, status=PERMANENCE_OPENED).order_by('?') - from repanier.apps import REPANIER_SETTINGS_CUSTOMERS_MUST_CONFIRM_ORDERS - if REPANIER_SETTINGS_CUSTOMERS_MUST_CONFIRM_ORDERS: - qs = qs.filter(is_order_confirm_send=False) + # from repanier.apps import REPANIER_SETTINGS_CUSTOMERS_MUST_CONFIRM_ORDERS + # if REPANIER_SETTINGS_CUSTOMERS_MUST_CONFIRM_ORDERS: + # qs = qs.filter(is_order_confirm_send=False) result = None if qs.exists(): qs = ProducerInvoice.objects.filter( -- GitLab