Initial import from Docker volume

This commit is contained in:
root
2025-12-26 13:11:43 +00:00
commit 4998dc066a
13336 changed files with 1767801 additions and 0 deletions

View File

@@ -0,0 +1,22 @@
# This file is part of Tryton. The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.
from trytond.pool import Pool
from . import sale
__all__ = ['register']
def register():
Pool.register(
sale.Promotion,
sale.PromotionCoupon,
sale.PromotionCouponNumber,
sale.Sale,
sale.Sale_PromotionCouponNumber,
module='sale_promotion_coupon', type_='model')
Pool.register(
module='sale_promotion_coupon', type_='wizard')
Pool.register(
module='sale_promotion_coupon', type_='report')

View File

@@ -0,0 +1,7 @@
# This file is part of Tryton. The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.
from trytond.model.exceptions import ValidationError
class DuplicateError(ValidationError):
pass

View File

@@ -0,0 +1,81 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:sale.promotion,coupons:"
msgid "Coupons"
msgstr ""
msgctxt "field:sale.promotion.coupon,name:"
msgid "Name"
msgstr ""
msgctxt "field:sale.promotion.coupon,number_of_use:"
msgid "Number of Use"
msgstr ""
msgctxt "field:sale.promotion.coupon,numbers:"
msgid "Numbers"
msgstr ""
msgctxt "field:sale.promotion.coupon,per_party:"
msgid "Per Party"
msgstr ""
msgctxt "field:sale.promotion.coupon,promotion:"
msgid "Promotion"
msgstr ""
msgctxt "field:sale.promotion.coupon.number,active:"
msgid "Active"
msgstr ""
msgctxt "field:sale.promotion.coupon.number,coupon:"
msgid "Coupon"
msgstr ""
msgctxt "field:sale.promotion.coupon.number,number:"
msgid "Number"
msgstr ""
msgctxt "field:sale.sale,coupon_parties:"
msgid "Coupon Parties"
msgstr ""
msgctxt "field:sale.sale,coupons:"
msgid "Coupons"
msgstr ""
msgctxt "field:sale.sale-sale.promotion.coupon.number,number:"
msgid "Number"
msgstr ""
msgctxt "field:sale.sale-sale.promotion.coupon.number,sale:"
msgid "Sale"
msgstr ""
msgctxt "help:sale.promotion.coupon,number_of_use:"
msgid ""
"How much times a coupon number can be used.\n"
"0 or below for no limit."
msgstr ""
msgctxt "help:sale.promotion.coupon,per_party:"
msgid "Check to count usage per party."
msgstr ""
msgctxt "model:ir.message,text:msg_duplicate_numbers"
msgid "The coupons numbered \"%(numbers)s\" are duplicated."
msgstr ""
msgctxt "model:sale.promotion.coupon,name:"
msgid "Promotion Coupon"
msgstr ""
msgctxt "model:sale.promotion.coupon.number,name:"
msgid "Promotion Coupon Number"
msgstr ""
msgctxt "model:sale.sale-sale.promotion.coupon.number,name:"
msgid "Sale - Promotion Coupon Number"
msgstr ""

View File

@@ -0,0 +1,83 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:sale.promotion,coupons:"
msgid "Coupons"
msgstr "Cupons"
msgctxt "field:sale.promotion.coupon,name:"
msgid "Name"
msgstr "Nom"
msgctxt "field:sale.promotion.coupon,number_of_use:"
msgid "Number of Use"
msgstr "Nombre d'usos"
msgctxt "field:sale.promotion.coupon,numbers:"
msgid "Numbers"
msgstr "Números"
msgctxt "field:sale.promotion.coupon,per_party:"
msgid "Per Party"
msgstr "Per tercer"
msgctxt "field:sale.promotion.coupon,promotion:"
msgid "Promotion"
msgstr "Promoció"
msgctxt "field:sale.promotion.coupon.number,active:"
msgid "Active"
msgstr "Actiu"
msgctxt "field:sale.promotion.coupon.number,coupon:"
msgid "Coupon"
msgstr "Cupó"
msgctxt "field:sale.promotion.coupon.number,number:"
msgid "Number"
msgstr "Número"
msgctxt "field:sale.sale,coupon_parties:"
msgid "Coupon Parties"
msgstr "Tercers dels cupons"
msgctxt "field:sale.sale,coupons:"
msgid "Coupons"
msgstr "Cupons"
msgctxt "field:sale.sale-sale.promotion.coupon.number,number:"
msgid "Number"
msgstr "Número"
msgctxt "field:sale.sale-sale.promotion.coupon.number,sale:"
msgid "Sale"
msgstr "Venda"
msgctxt "help:sale.promotion.coupon,number_of_use:"
msgid ""
"How much times a coupon number can be used.\n"
"0 or below for no limit."
msgstr ""
"El nombre de vegades que es pot utilitzar el cupó.\n"
"0 o menys indica sense límit."
msgctxt "help:sale.promotion.coupon,per_party:"
msgid "Check to count usage per party."
msgstr "Marca per contar l'ús per tercer."
msgctxt "model:ir.message,text:msg_duplicate_numbers"
msgid "The coupons numbered \"%(numbers)s\" are duplicated."
msgstr "El cupons numerats \"%(numbers)s\" estan duplicats."
msgctxt "model:sale.promotion.coupon,name:"
msgid "Promotion Coupon"
msgstr "Cupó promocional"
msgctxt "model:sale.promotion.coupon.number,name:"
msgid "Promotion Coupon Number"
msgstr "Número cupó promocional"
msgctxt "model:sale.sale-sale.promotion.coupon.number,name:"
msgid "Sale - Promotion Coupon Number"
msgstr "Venda - Número de cupó promocional"

View File

@@ -0,0 +1,81 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:sale.promotion,coupons:"
msgid "Coupons"
msgstr ""
msgctxt "field:sale.promotion.coupon,name:"
msgid "Name"
msgstr ""
msgctxt "field:sale.promotion.coupon,number_of_use:"
msgid "Number of Use"
msgstr ""
msgctxt "field:sale.promotion.coupon,numbers:"
msgid "Numbers"
msgstr ""
msgctxt "field:sale.promotion.coupon,per_party:"
msgid "Per Party"
msgstr ""
msgctxt "field:sale.promotion.coupon,promotion:"
msgid "Promotion"
msgstr ""
msgctxt "field:sale.promotion.coupon.number,active:"
msgid "Active"
msgstr ""
msgctxt "field:sale.promotion.coupon.number,coupon:"
msgid "Coupon"
msgstr ""
msgctxt "field:sale.promotion.coupon.number,number:"
msgid "Number"
msgstr ""
msgctxt "field:sale.sale,coupon_parties:"
msgid "Coupon Parties"
msgstr ""
msgctxt "field:sale.sale,coupons:"
msgid "Coupons"
msgstr ""
msgctxt "field:sale.sale-sale.promotion.coupon.number,number:"
msgid "Number"
msgstr ""
msgctxt "field:sale.sale-sale.promotion.coupon.number,sale:"
msgid "Sale"
msgstr ""
msgctxt "help:sale.promotion.coupon,number_of_use:"
msgid ""
"How much times a coupon number can be used.\n"
"0 or below for no limit."
msgstr ""
msgctxt "help:sale.promotion.coupon,per_party:"
msgid "Check to count usage per party."
msgstr ""
msgctxt "model:ir.message,text:msg_duplicate_numbers"
msgid "The coupons numbered \"%(numbers)s\" are duplicated."
msgstr ""
msgctxt "model:sale.promotion.coupon,name:"
msgid "Promotion Coupon"
msgstr ""
msgctxt "model:sale.promotion.coupon.number,name:"
msgid "Promotion Coupon Number"
msgstr ""
msgctxt "model:sale.sale-sale.promotion.coupon.number,name:"
msgid "Sale - Promotion Coupon Number"
msgstr ""

View File

@@ -0,0 +1,85 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:sale.promotion,coupons:"
msgid "Coupons"
msgstr "Coupons"
msgctxt "field:sale.promotion.coupon,name:"
msgid "Name"
msgstr "Name"
# For a condensed but talking representation in list view it seems better to
# put 'Anzahl' at the first place.
msgctxt "field:sale.promotion.coupon,number_of_use:"
msgid "Number of Use"
msgstr "Maximale Anzahl Verwendung"
msgctxt "field:sale.promotion.coupon,numbers:"
msgid "Numbers"
msgstr "Nummern"
msgctxt "field:sale.promotion.coupon,per_party:"
msgid "Per Party"
msgstr "Pro Partei"
msgctxt "field:sale.promotion.coupon,promotion:"
msgid "Promotion"
msgstr "Verkaufsaktion"
msgctxt "field:sale.promotion.coupon.number,active:"
msgid "Active"
msgstr "Aktiv"
msgctxt "field:sale.promotion.coupon.number,coupon:"
msgid "Coupon"
msgstr "Coupon"
msgctxt "field:sale.promotion.coupon.number,number:"
msgid "Number"
msgstr "Nummer"
msgctxt "field:sale.sale,coupon_parties:"
msgid "Coupon Parties"
msgstr "Coupons Parteien"
msgctxt "field:sale.sale,coupons:"
msgid "Coupons"
msgstr "Coupons"
msgctxt "field:sale.sale-sale.promotion.coupon.number,number:"
msgid "Number"
msgstr "Nummer"
msgctxt "field:sale.sale-sale.promotion.coupon.number,sale:"
msgid "Sale"
msgstr "Verkauf"
msgctxt "help:sale.promotion.coupon,number_of_use:"
msgid ""
"How much times a coupon number can be used.\n"
"0 or below for no limit."
msgstr ""
"Wie oft eine Coupon-Nummer genutzt werden kann.\n"
"0 oder weniger für kein Limit."
msgctxt "help:sale.promotion.coupon,per_party:"
msgid "Check to count usage per party."
msgstr "Aktivieren um die Anzahl der Verwendungen pro Partei zu zählen."
msgctxt "model:ir.message,text:msg_duplicate_numbers"
msgid "The coupons numbered \"%(numbers)s\" are duplicated."
msgstr "Die Coupon Nummern \"%(numbers)s\" sind doppelt."
msgctxt "model:sale.promotion.coupon,name:"
msgid "Promotion Coupon"
msgstr "Aktions-Coupon"
msgctxt "model:sale.promotion.coupon.number,name:"
msgid "Promotion Coupon Number"
msgstr "Aktions-Coupon-Nummer"
msgctxt "model:sale.sale-sale.promotion.coupon.number,name:"
msgid "Sale - Promotion Coupon Number"
msgstr "Verkauf - Aktions-Coupon-Nummer"

View File

@@ -0,0 +1,83 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:sale.promotion,coupons:"
msgid "Coupons"
msgstr "Cupones"
msgctxt "field:sale.promotion.coupon,name:"
msgid "Name"
msgstr "Nombre"
msgctxt "field:sale.promotion.coupon,number_of_use:"
msgid "Number of Use"
msgstr "Nombre de usos"
msgctxt "field:sale.promotion.coupon,numbers:"
msgid "Numbers"
msgstr "Números"
msgctxt "field:sale.promotion.coupon,per_party:"
msgid "Per Party"
msgstr "Por tercero"
msgctxt "field:sale.promotion.coupon,promotion:"
msgid "Promotion"
msgstr "Promoción"
msgctxt "field:sale.promotion.coupon.number,active:"
msgid "Active"
msgstr "Activo"
msgctxt "field:sale.promotion.coupon.number,coupon:"
msgid "Coupon"
msgstr "Cupón"
msgctxt "field:sale.promotion.coupon.number,number:"
msgid "Number"
msgstr "Número"
msgctxt "field:sale.sale,coupon_parties:"
msgid "Coupon Parties"
msgstr "Terceros de los cupones"
msgctxt "field:sale.sale,coupons:"
msgid "Coupons"
msgstr "Cupones"
msgctxt "field:sale.sale-sale.promotion.coupon.number,number:"
msgid "Number"
msgstr "Número"
msgctxt "field:sale.sale-sale.promotion.coupon.number,sale:"
msgid "Sale"
msgstr "Venta"
msgctxt "help:sale.promotion.coupon,number_of_use:"
msgid ""
"How much times a coupon number can be used.\n"
"0 or below for no limit."
msgstr ""
"El número de veces que se puede utilizar el cupón.\n"
"0 o menos indica sin límite."
msgctxt "help:sale.promotion.coupon,per_party:"
msgid "Check to count usage per party."
msgstr "Marcar para contar el uso por tercero."
msgctxt "model:ir.message,text:msg_duplicate_numbers"
msgid "The coupons numbered \"%(numbers)s\" are duplicated."
msgstr "Los cupones con numeración \"%(numbers)s\" están duplicados."
msgctxt "model:sale.promotion.coupon,name:"
msgid "Promotion Coupon"
msgstr "Cupón promocional"
msgctxt "model:sale.promotion.coupon.number,name:"
msgid "Promotion Coupon Number"
msgstr "Número de cupón promocional"
msgctxt "model:sale.sale-sale.promotion.coupon.number,name:"
msgid "Sale - Promotion Coupon Number"
msgstr "Venta - Número de cupón promocional"

View File

@@ -0,0 +1,81 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:sale.promotion,coupons:"
msgid "Coupons"
msgstr ""
msgctxt "field:sale.promotion.coupon,name:"
msgid "Name"
msgstr ""
msgctxt "field:sale.promotion.coupon,number_of_use:"
msgid "Number of Use"
msgstr ""
msgctxt "field:sale.promotion.coupon,numbers:"
msgid "Numbers"
msgstr ""
msgctxt "field:sale.promotion.coupon,per_party:"
msgid "Per Party"
msgstr ""
msgctxt "field:sale.promotion.coupon,promotion:"
msgid "Promotion"
msgstr ""
msgctxt "field:sale.promotion.coupon.number,active:"
msgid "Active"
msgstr ""
msgctxt "field:sale.promotion.coupon.number,coupon:"
msgid "Coupon"
msgstr ""
msgctxt "field:sale.promotion.coupon.number,number:"
msgid "Number"
msgstr ""
msgctxt "field:sale.sale,coupon_parties:"
msgid "Coupon Parties"
msgstr ""
msgctxt "field:sale.sale,coupons:"
msgid "Coupons"
msgstr ""
msgctxt "field:sale.sale-sale.promotion.coupon.number,number:"
msgid "Number"
msgstr ""
msgctxt "field:sale.sale-sale.promotion.coupon.number,sale:"
msgid "Sale"
msgstr ""
msgctxt "help:sale.promotion.coupon,number_of_use:"
msgid ""
"How much times a coupon number can be used.\n"
"0 or below for no limit."
msgstr ""
msgctxt "help:sale.promotion.coupon,per_party:"
msgid "Check to count usage per party."
msgstr ""
msgctxt "model:ir.message,text:msg_duplicate_numbers"
msgid "The coupons numbered \"%(numbers)s\" are duplicated."
msgstr ""
msgctxt "model:sale.promotion.coupon,name:"
msgid "Promotion Coupon"
msgstr ""
msgctxt "model:sale.promotion.coupon.number,name:"
msgid "Promotion Coupon Number"
msgstr ""
msgctxt "model:sale.sale-sale.promotion.coupon.number,name:"
msgid "Sale - Promotion Coupon Number"
msgstr ""

View File

@@ -0,0 +1,82 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:sale.promotion,coupons:"
msgid "Coupons"
msgstr "Kupongid"
msgctxt "field:sale.promotion.coupon,name:"
msgid "Name"
msgstr "Nimi"
msgctxt "field:sale.promotion.coupon,number_of_use:"
msgid "Number of Use"
msgstr "Kasutuse arv"
msgctxt "field:sale.promotion.coupon,numbers:"
msgid "Numbers"
msgstr "Numbrid"
msgctxt "field:sale.promotion.coupon,per_party:"
msgid "Per Party"
msgstr "Osapoole kohta"
msgctxt "field:sale.promotion.coupon,promotion:"
msgid "Promotion"
msgstr "Soodustus"
msgctxt "field:sale.promotion.coupon.number,active:"
msgid "Active"
msgstr "Aktiivne"
msgctxt "field:sale.promotion.coupon.number,coupon:"
msgid "Coupon"
msgstr "Kupong"
msgctxt "field:sale.promotion.coupon.number,number:"
msgid "Number"
msgstr "Number"
#, fuzzy
msgctxt "field:sale.sale,coupon_parties:"
msgid "Coupon Parties"
msgstr "Kupongid"
msgctxt "field:sale.sale,coupons:"
msgid "Coupons"
msgstr "Kupongid"
msgctxt "field:sale.sale-sale.promotion.coupon.number,number:"
msgid "Number"
msgstr "Number"
msgctxt "field:sale.sale-sale.promotion.coupon.number,sale:"
msgid "Sale"
msgstr "Müük"
msgctxt "help:sale.promotion.coupon,number_of_use:"
msgid ""
"How much times a coupon number can be used.\n"
"0 or below for no limit."
msgstr ""
msgctxt "help:sale.promotion.coupon,per_party:"
msgid "Check to count usage per party."
msgstr ""
msgctxt "model:ir.message,text:msg_duplicate_numbers"
msgid "The coupons numbered \"%(numbers)s\" are duplicated."
msgstr ""
msgctxt "model:sale.promotion.coupon,name:"
msgid "Promotion Coupon"
msgstr "Sooduskupong"
msgctxt "model:sale.promotion.coupon.number,name:"
msgid "Promotion Coupon Number"
msgstr "Sooduskupongi number"
msgctxt "model:sale.sale-sale.promotion.coupon.number,name:"
msgid "Sale - Promotion Coupon Number"
msgstr "Müük - sooduskupongi number"

View File

@@ -0,0 +1,84 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:sale.promotion,coupons:"
msgid "Coupons"
msgstr "کوپن ها"
msgctxt "field:sale.promotion.coupon,name:"
msgid "Name"
msgstr "نام"
msgctxt "field:sale.promotion.coupon,number_of_use:"
msgid "Number of Use"
msgstr "تعداد استفاده"
msgctxt "field:sale.promotion.coupon,numbers:"
msgid "Numbers"
msgstr "تعداد"
msgctxt "field:sale.promotion.coupon,per_party:"
msgid "Per Party"
msgstr "در هر نهاد/سازمان"
msgctxt "field:sale.promotion.coupon,promotion:"
msgid "Promotion"
msgstr "تبلیغ و ترویج"
msgctxt "field:sale.promotion.coupon.number,active:"
msgid "Active"
msgstr "فعال"
msgctxt "field:sale.promotion.coupon.number,coupon:"
msgid "Coupon"
msgstr "کوپن"
msgctxt "field:sale.promotion.coupon.number,number:"
msgid "Number"
msgstr "شماره"
#, fuzzy
msgctxt "field:sale.sale,coupon_parties:"
msgid "Coupon Parties"
msgstr "کوپن ها"
msgctxt "field:sale.sale,coupons:"
msgid "Coupons"
msgstr "کوپن ها"
msgctxt "field:sale.sale-sale.promotion.coupon.number,number:"
msgid "Number"
msgstr "شماره"
msgctxt "field:sale.sale-sale.promotion.coupon.number,sale:"
msgid "Sale"
msgstr "فروش"
msgctxt "help:sale.promotion.coupon,number_of_use:"
msgid ""
"How much times a coupon number can be used.\n"
"0 or below for no limit."
msgstr ""
"چه مدت زمان یک کوپن باید استفاده شود.\n"
"0 یا کمتر برای نامحدود."
msgctxt "help:sale.promotion.coupon,per_party:"
msgid "Check to count usage per party."
msgstr "تیک بزنید برای شمارش استفاده در هر نهاد/سازمان."
msgctxt "model:ir.message,text:msg_duplicate_numbers"
msgid "The coupons numbered \"%(numbers)s\" are duplicated."
msgstr "تعداد کوپن های :\"%s\" دوبرابر شده است."
msgctxt "model:sale.promotion.coupon,name:"
msgid "Promotion Coupon"
msgstr "کوپن تبلیغ و ترویج"
msgctxt "model:sale.promotion.coupon.number,name:"
msgid "Promotion Coupon Number"
msgstr "شماره کوپن تبلیغ و ترویج"
msgctxt "model:sale.sale-sale.promotion.coupon.number,name:"
msgid "Sale - Promotion Coupon Number"
msgstr "فروش - شماره کوپن تبلیغ و ترویج"

View File

@@ -0,0 +1,81 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:sale.promotion,coupons:"
msgid "Coupons"
msgstr ""
msgctxt "field:sale.promotion.coupon,name:"
msgid "Name"
msgstr ""
msgctxt "field:sale.promotion.coupon,number_of_use:"
msgid "Number of Use"
msgstr ""
msgctxt "field:sale.promotion.coupon,numbers:"
msgid "Numbers"
msgstr ""
msgctxt "field:sale.promotion.coupon,per_party:"
msgid "Per Party"
msgstr ""
msgctxt "field:sale.promotion.coupon,promotion:"
msgid "Promotion"
msgstr ""
msgctxt "field:sale.promotion.coupon.number,active:"
msgid "Active"
msgstr ""
msgctxt "field:sale.promotion.coupon.number,coupon:"
msgid "Coupon"
msgstr ""
msgctxt "field:sale.promotion.coupon.number,number:"
msgid "Number"
msgstr ""
msgctxt "field:sale.sale,coupon_parties:"
msgid "Coupon Parties"
msgstr ""
msgctxt "field:sale.sale,coupons:"
msgid "Coupons"
msgstr ""
msgctxt "field:sale.sale-sale.promotion.coupon.number,number:"
msgid "Number"
msgstr ""
msgctxt "field:sale.sale-sale.promotion.coupon.number,sale:"
msgid "Sale"
msgstr ""
msgctxt "help:sale.promotion.coupon,number_of_use:"
msgid ""
"How much times a coupon number can be used.\n"
"0 or below for no limit."
msgstr ""
msgctxt "help:sale.promotion.coupon,per_party:"
msgid "Check to count usage per party."
msgstr ""
msgctxt "model:ir.message,text:msg_duplicate_numbers"
msgid "The coupons numbered \"%(numbers)s\" are duplicated."
msgstr ""
msgctxt "model:sale.promotion.coupon,name:"
msgid "Promotion Coupon"
msgstr ""
msgctxt "model:sale.promotion.coupon.number,name:"
msgid "Promotion Coupon Number"
msgstr ""
msgctxt "model:sale.sale-sale.promotion.coupon.number,name:"
msgid "Sale - Promotion Coupon Number"
msgstr ""

View File

@@ -0,0 +1,83 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:sale.promotion,coupons:"
msgid "Coupons"
msgstr "Coupons"
msgctxt "field:sale.promotion.coupon,name:"
msgid "Name"
msgstr "Nom"
msgctxt "field:sale.promotion.coupon,number_of_use:"
msgid "Number of Use"
msgstr "Nombre d'utilisation"
msgctxt "field:sale.promotion.coupon,numbers:"
msgid "Numbers"
msgstr "Numéros"
msgctxt "field:sale.promotion.coupon,per_party:"
msgid "Per Party"
msgstr "Par tiers"
msgctxt "field:sale.promotion.coupon,promotion:"
msgid "Promotion"
msgstr "Promotion"
msgctxt "field:sale.promotion.coupon.number,active:"
msgid "Active"
msgstr "Actif"
msgctxt "field:sale.promotion.coupon.number,coupon:"
msgid "Coupon"
msgstr "Coupon"
msgctxt "field:sale.promotion.coupon.number,number:"
msgid "Number"
msgstr "Numéro"
msgctxt "field:sale.sale,coupon_parties:"
msgid "Coupon Parties"
msgstr "Tiers de coupon"
msgctxt "field:sale.sale,coupons:"
msgid "Coupons"
msgstr "Coupons"
msgctxt "field:sale.sale-sale.promotion.coupon.number,number:"
msgid "Number"
msgstr "Numéro"
msgctxt "field:sale.sale-sale.promotion.coupon.number,sale:"
msgid "Sale"
msgstr "Vente"
msgctxt "help:sale.promotion.coupon,number_of_use:"
msgid ""
"How much times a coupon number can be used.\n"
"0 or below for no limit."
msgstr ""
"Combien de fois un numéro de coupon peut être utilisé.\n"
"0 ou moins pour aucune limite."
msgctxt "help:sale.promotion.coupon,per_party:"
msgid "Check to count usage per party."
msgstr "Cochez pour compter l'utilisation par tiers."
msgctxt "model:ir.message,text:msg_duplicate_numbers"
msgid "The coupons numbered \"%(numbers)s\" are duplicated."
msgstr "Les coupons numérotés « %(numbers)s » sont en double."
msgctxt "model:sale.promotion.coupon,name:"
msgid "Promotion Coupon"
msgstr "Coupon de promotion"
msgctxt "model:sale.promotion.coupon.number,name:"
msgid "Promotion Coupon Number"
msgstr "Numéro de coupon de promotion"
msgctxt "model:sale.sale-sale.promotion.coupon.number,name:"
msgid "Sale - Promotion Coupon Number"
msgstr "Vente - Numéro de coupon de promotion"

View File

@@ -0,0 +1,81 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:sale.promotion,coupons:"
msgid "Coupons"
msgstr ""
msgctxt "field:sale.promotion.coupon,name:"
msgid "Name"
msgstr ""
msgctxt "field:sale.promotion.coupon,number_of_use:"
msgid "Number of Use"
msgstr ""
msgctxt "field:sale.promotion.coupon,numbers:"
msgid "Numbers"
msgstr ""
msgctxt "field:sale.promotion.coupon,per_party:"
msgid "Per Party"
msgstr ""
msgctxt "field:sale.promotion.coupon,promotion:"
msgid "Promotion"
msgstr ""
msgctxt "field:sale.promotion.coupon.number,active:"
msgid "Active"
msgstr ""
msgctxt "field:sale.promotion.coupon.number,coupon:"
msgid "Coupon"
msgstr ""
msgctxt "field:sale.promotion.coupon.number,number:"
msgid "Number"
msgstr ""
msgctxt "field:sale.sale,coupon_parties:"
msgid "Coupon Parties"
msgstr ""
msgctxt "field:sale.sale,coupons:"
msgid "Coupons"
msgstr ""
msgctxt "field:sale.sale-sale.promotion.coupon.number,number:"
msgid "Number"
msgstr ""
msgctxt "field:sale.sale-sale.promotion.coupon.number,sale:"
msgid "Sale"
msgstr ""
msgctxt "help:sale.promotion.coupon,number_of_use:"
msgid ""
"How much times a coupon number can be used.\n"
"0 or below for no limit."
msgstr ""
msgctxt "help:sale.promotion.coupon,per_party:"
msgid "Check to count usage per party."
msgstr ""
msgctxt "model:ir.message,text:msg_duplicate_numbers"
msgid "The coupons numbered \"%(numbers)s\" are duplicated."
msgstr ""
msgctxt "model:sale.promotion.coupon,name:"
msgid "Promotion Coupon"
msgstr ""
msgctxt "model:sale.promotion.coupon.number,name:"
msgid "Promotion Coupon Number"
msgstr ""
msgctxt "model:sale.sale-sale.promotion.coupon.number,name:"
msgid "Sale - Promotion Coupon Number"
msgstr ""

View File

@@ -0,0 +1,84 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:sale.promotion,coupons:"
msgid "Coupons"
msgstr "Kupon"
msgctxt "field:sale.promotion.coupon,name:"
msgid "Name"
msgstr "Nama"
msgctxt "field:sale.promotion.coupon,number_of_use:"
msgid "Number of Use"
msgstr ""
msgctxt "field:sale.promotion.coupon,numbers:"
msgid "Numbers"
msgstr ""
msgctxt "field:sale.promotion.coupon,per_party:"
msgid "Per Party"
msgstr ""
msgctxt "field:sale.promotion.coupon,promotion:"
msgid "Promotion"
msgstr ""
msgctxt "field:sale.promotion.coupon.number,active:"
msgid "Active"
msgstr "Aktif"
msgctxt "field:sale.promotion.coupon.number,coupon:"
msgid "Coupon"
msgstr ""
msgctxt "field:sale.promotion.coupon.number,number:"
msgid "Number"
msgstr "Nomor"
#, fuzzy
msgctxt "field:sale.sale,coupon_parties:"
msgid "Coupon Parties"
msgstr "Kupon"
msgctxt "field:sale.sale,coupons:"
msgid "Coupons"
msgstr "Kupon"
msgctxt "field:sale.sale-sale.promotion.coupon.number,number:"
msgid "Number"
msgstr "Nomor"
msgctxt "field:sale.sale-sale.promotion.coupon.number,sale:"
msgid "Sale"
msgstr "Penjualan"
msgctxt "help:sale.promotion.coupon,number_of_use:"
msgid ""
"How much times a coupon number can be used.\n"
"0 or below for no limit."
msgstr ""
"Berapa kali nomor kupondapat digunakan.\n"
"0 atau di bawahnya untuk tanpa batas."
msgctxt "help:sale.promotion.coupon,per_party:"
msgid "Check to count usage per party."
msgstr "Periksa untuk menghitung penggunaan per pihak."
msgctxt "model:ir.message,text:msg_duplicate_numbers"
msgid "The coupons numbered \"%(numbers)s\" are duplicated."
msgstr "Kupon bernomor \"%(numbers)s\" digandakan."
msgctxt "model:sale.promotion.coupon,name:"
msgid "Promotion Coupon"
msgstr "Kupon Promosi"
msgctxt "model:sale.promotion.coupon.number,name:"
msgid "Promotion Coupon Number"
msgstr "Nomor Kupon Promosi"
msgctxt "model:sale.sale-sale.promotion.coupon.number,name:"
msgid "Sale - Promotion Coupon Number"
msgstr "Penjualan - Nomor Kupon Promosi"

View File

@@ -0,0 +1,81 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:sale.promotion,coupons:"
msgid "Coupons"
msgstr ""
msgctxt "field:sale.promotion.coupon,name:"
msgid "Name"
msgstr "Nome"
msgctxt "field:sale.promotion.coupon,number_of_use:"
msgid "Number of Use"
msgstr ""
msgctxt "field:sale.promotion.coupon,numbers:"
msgid "Numbers"
msgstr ""
msgctxt "field:sale.promotion.coupon,per_party:"
msgid "Per Party"
msgstr ""
msgctxt "field:sale.promotion.coupon,promotion:"
msgid "Promotion"
msgstr ""
msgctxt "field:sale.promotion.coupon.number,active:"
msgid "Active"
msgstr "Attivo"
msgctxt "field:sale.promotion.coupon.number,coupon:"
msgid "Coupon"
msgstr ""
msgctxt "field:sale.promotion.coupon.number,number:"
msgid "Number"
msgstr "Numero"
msgctxt "field:sale.sale,coupon_parties:"
msgid "Coupon Parties"
msgstr ""
msgctxt "field:sale.sale,coupons:"
msgid "Coupons"
msgstr ""
msgctxt "field:sale.sale-sale.promotion.coupon.number,number:"
msgid "Number"
msgstr "Numero"
msgctxt "field:sale.sale-sale.promotion.coupon.number,sale:"
msgid "Sale"
msgstr ""
msgctxt "help:sale.promotion.coupon,number_of_use:"
msgid ""
"How much times a coupon number can be used.\n"
"0 or below for no limit."
msgstr ""
msgctxt "help:sale.promotion.coupon,per_party:"
msgid "Check to count usage per party."
msgstr ""
msgctxt "model:ir.message,text:msg_duplicate_numbers"
msgid "The coupons numbered \"%(numbers)s\" are duplicated."
msgstr ""
msgctxt "model:sale.promotion.coupon,name:"
msgid "Promotion Coupon"
msgstr ""
msgctxt "model:sale.promotion.coupon.number,name:"
msgid "Promotion Coupon Number"
msgstr ""
msgctxt "model:sale.sale-sale.promotion.coupon.number,name:"
msgid "Sale - Promotion Coupon Number"
msgstr ""

View File

@@ -0,0 +1,81 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:sale.promotion,coupons:"
msgid "Coupons"
msgstr ""
msgctxt "field:sale.promotion.coupon,name:"
msgid "Name"
msgstr ""
msgctxt "field:sale.promotion.coupon,number_of_use:"
msgid "Number of Use"
msgstr ""
msgctxt "field:sale.promotion.coupon,numbers:"
msgid "Numbers"
msgstr ""
msgctxt "field:sale.promotion.coupon,per_party:"
msgid "Per Party"
msgstr ""
msgctxt "field:sale.promotion.coupon,promotion:"
msgid "Promotion"
msgstr ""
msgctxt "field:sale.promotion.coupon.number,active:"
msgid "Active"
msgstr ""
msgctxt "field:sale.promotion.coupon.number,coupon:"
msgid "Coupon"
msgstr ""
msgctxt "field:sale.promotion.coupon.number,number:"
msgid "Number"
msgstr ""
msgctxt "field:sale.sale,coupon_parties:"
msgid "Coupon Parties"
msgstr ""
msgctxt "field:sale.sale,coupons:"
msgid "Coupons"
msgstr ""
msgctxt "field:sale.sale-sale.promotion.coupon.number,number:"
msgid "Number"
msgstr ""
msgctxt "field:sale.sale-sale.promotion.coupon.number,sale:"
msgid "Sale"
msgstr ""
msgctxt "help:sale.promotion.coupon,number_of_use:"
msgid ""
"How much times a coupon number can be used.\n"
"0 or below for no limit."
msgstr ""
msgctxt "help:sale.promotion.coupon,per_party:"
msgid "Check to count usage per party."
msgstr ""
msgctxt "model:ir.message,text:msg_duplicate_numbers"
msgid "The coupons numbered \"%(numbers)s\" are duplicated."
msgstr ""
msgctxt "model:sale.promotion.coupon,name:"
msgid "Promotion Coupon"
msgstr ""
msgctxt "model:sale.promotion.coupon.number,name:"
msgid "Promotion Coupon Number"
msgstr ""
msgctxt "model:sale.sale-sale.promotion.coupon.number,name:"
msgid "Sale - Promotion Coupon Number"
msgstr ""

View File

@@ -0,0 +1,81 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:sale.promotion,coupons:"
msgid "Coupons"
msgstr ""
msgctxt "field:sale.promotion.coupon,name:"
msgid "Name"
msgstr ""
msgctxt "field:sale.promotion.coupon,number_of_use:"
msgid "Number of Use"
msgstr ""
msgctxt "field:sale.promotion.coupon,numbers:"
msgid "Numbers"
msgstr ""
msgctxt "field:sale.promotion.coupon,per_party:"
msgid "Per Party"
msgstr "Kontrahentui"
msgctxt "field:sale.promotion.coupon,promotion:"
msgid "Promotion"
msgstr ""
msgctxt "field:sale.promotion.coupon.number,active:"
msgid "Active"
msgstr ""
msgctxt "field:sale.promotion.coupon.number,coupon:"
msgid "Coupon"
msgstr ""
msgctxt "field:sale.promotion.coupon.number,number:"
msgid "Number"
msgstr ""
msgctxt "field:sale.sale,coupon_parties:"
msgid "Coupon Parties"
msgstr ""
msgctxt "field:sale.sale,coupons:"
msgid "Coupons"
msgstr ""
msgctxt "field:sale.sale-sale.promotion.coupon.number,number:"
msgid "Number"
msgstr ""
msgctxt "field:sale.sale-sale.promotion.coupon.number,sale:"
msgid "Sale"
msgstr ""
msgctxt "help:sale.promotion.coupon,number_of_use:"
msgid ""
"How much times a coupon number can be used.\n"
"0 or below for no limit."
msgstr ""
msgctxt "help:sale.promotion.coupon,per_party:"
msgid "Check to count usage per party."
msgstr ""
msgctxt "model:ir.message,text:msg_duplicate_numbers"
msgid "The coupons numbered \"%(numbers)s\" are duplicated."
msgstr ""
msgctxt "model:sale.promotion.coupon,name:"
msgid "Promotion Coupon"
msgstr ""
msgctxt "model:sale.promotion.coupon.number,name:"
msgid "Promotion Coupon Number"
msgstr ""
msgctxt "model:sale.sale-sale.promotion.coupon.number,name:"
msgid "Sale - Promotion Coupon Number"
msgstr ""

View File

@@ -0,0 +1,83 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:sale.promotion,coupons:"
msgid "Coupons"
msgstr "Bonnen"
msgctxt "field:sale.promotion.coupon,name:"
msgid "Name"
msgstr "Naam"
msgctxt "field:sale.promotion.coupon,number_of_use:"
msgid "Number of Use"
msgstr "aantal gebruik"
msgctxt "field:sale.promotion.coupon,numbers:"
msgid "Numbers"
msgstr "Nummers"
msgctxt "field:sale.promotion.coupon,per_party:"
msgid "Per Party"
msgstr "Per relatie"
msgctxt "field:sale.promotion.coupon,promotion:"
msgid "Promotion"
msgstr "Promotie"
msgctxt "field:sale.promotion.coupon.number,active:"
msgid "Active"
msgstr "Aktief"
msgctxt "field:sale.promotion.coupon.number,coupon:"
msgid "Coupon"
msgstr "Bon"
msgctxt "field:sale.promotion.coupon.number,number:"
msgid "Number"
msgstr "Nummer"
msgctxt "field:sale.sale,coupon_parties:"
msgid "Coupon Parties"
msgstr "Relatie Bon"
msgctxt "field:sale.sale,coupons:"
msgid "Coupons"
msgstr "Bonnen"
msgctxt "field:sale.sale-sale.promotion.coupon.number,number:"
msgid "Number"
msgstr "Nummer"
msgctxt "field:sale.sale-sale.promotion.coupon.number,sale:"
msgid "Sale"
msgstr "verkoop"
msgctxt "help:sale.promotion.coupon,number_of_use:"
msgid ""
"How much times a coupon number can be used.\n"
"0 or below for no limit."
msgstr ""
"Hoe vaak kan een couponnummer gebruikt worden.\n"
"0 of lager voor geen limiet."
msgctxt "help:sale.promotion.coupon,per_party:"
msgid "Check to count usage per party."
msgstr "Vink aan om het gebruik per relatie te tellen."
msgctxt "model:ir.message,text:msg_duplicate_numbers"
msgid "The coupons numbered \"%(numbers)s\" are duplicated."
msgstr "De couponnummers \"%(numbers)s\" zijn gedupliceerd."
msgctxt "model:sale.promotion.coupon,name:"
msgid "Promotion Coupon"
msgstr "Promotiecoupon"
msgctxt "model:sale.promotion.coupon.number,name:"
msgid "Promotion Coupon Number"
msgstr "Promotie coupon nummer"
msgctxt "model:sale.sale-sale.promotion.coupon.number,name:"
msgid "Sale - Promotion Coupon Number"
msgstr "Verkoop - Promotiecouponnummer"

View File

@@ -0,0 +1,81 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:sale.promotion,coupons:"
msgid "Coupons"
msgstr ""
msgctxt "field:sale.promotion.coupon,name:"
msgid "Name"
msgstr ""
msgctxt "field:sale.promotion.coupon,number_of_use:"
msgid "Number of Use"
msgstr ""
msgctxt "field:sale.promotion.coupon,numbers:"
msgid "Numbers"
msgstr ""
msgctxt "field:sale.promotion.coupon,per_party:"
msgid "Per Party"
msgstr ""
msgctxt "field:sale.promotion.coupon,promotion:"
msgid "Promotion"
msgstr ""
msgctxt "field:sale.promotion.coupon.number,active:"
msgid "Active"
msgstr ""
msgctxt "field:sale.promotion.coupon.number,coupon:"
msgid "Coupon"
msgstr ""
msgctxt "field:sale.promotion.coupon.number,number:"
msgid "Number"
msgstr ""
msgctxt "field:sale.sale,coupon_parties:"
msgid "Coupon Parties"
msgstr ""
msgctxt "field:sale.sale,coupons:"
msgid "Coupons"
msgstr ""
msgctxt "field:sale.sale-sale.promotion.coupon.number,number:"
msgid "Number"
msgstr ""
msgctxt "field:sale.sale-sale.promotion.coupon.number,sale:"
msgid "Sale"
msgstr ""
msgctxt "help:sale.promotion.coupon,number_of_use:"
msgid ""
"How much times a coupon number can be used.\n"
"0 or below for no limit."
msgstr ""
msgctxt "help:sale.promotion.coupon,per_party:"
msgid "Check to count usage per party."
msgstr ""
msgctxt "model:ir.message,text:msg_duplicate_numbers"
msgid "The coupons numbered \"%(numbers)s\" are duplicated."
msgstr ""
msgctxt "model:sale.promotion.coupon,name:"
msgid "Promotion Coupon"
msgstr ""
msgctxt "model:sale.promotion.coupon.number,name:"
msgid "Promotion Coupon Number"
msgstr ""
msgctxt "model:sale.sale-sale.promotion.coupon.number,name:"
msgid "Sale - Promotion Coupon Number"
msgstr ""

View File

@@ -0,0 +1,81 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:sale.promotion,coupons:"
msgid "Coupons"
msgstr ""
msgctxt "field:sale.promotion.coupon,name:"
msgid "Name"
msgstr ""
msgctxt "field:sale.promotion.coupon,number_of_use:"
msgid "Number of Use"
msgstr ""
msgctxt "field:sale.promotion.coupon,numbers:"
msgid "Numbers"
msgstr ""
msgctxt "field:sale.promotion.coupon,per_party:"
msgid "Per Party"
msgstr ""
msgctxt "field:sale.promotion.coupon,promotion:"
msgid "Promotion"
msgstr ""
msgctxt "field:sale.promotion.coupon.number,active:"
msgid "Active"
msgstr ""
msgctxt "field:sale.promotion.coupon.number,coupon:"
msgid "Coupon"
msgstr ""
msgctxt "field:sale.promotion.coupon.number,number:"
msgid "Number"
msgstr ""
msgctxt "field:sale.sale,coupon_parties:"
msgid "Coupon Parties"
msgstr ""
msgctxt "field:sale.sale,coupons:"
msgid "Coupons"
msgstr ""
msgctxt "field:sale.sale-sale.promotion.coupon.number,number:"
msgid "Number"
msgstr ""
msgctxt "field:sale.sale-sale.promotion.coupon.number,sale:"
msgid "Sale"
msgstr ""
msgctxt "help:sale.promotion.coupon,number_of_use:"
msgid ""
"How much times a coupon number can be used.\n"
"0 or below for no limit."
msgstr ""
msgctxt "help:sale.promotion.coupon,per_party:"
msgid "Check to count usage per party."
msgstr ""
msgctxt "model:ir.message,text:msg_duplicate_numbers"
msgid "The coupons numbered \"%(numbers)s\" are duplicated."
msgstr ""
msgctxt "model:sale.promotion.coupon,name:"
msgid "Promotion Coupon"
msgstr ""
msgctxt "model:sale.promotion.coupon.number,name:"
msgid "Promotion Coupon Number"
msgstr ""
msgctxt "model:sale.sale-sale.promotion.coupon.number,name:"
msgid "Sale - Promotion Coupon Number"
msgstr ""

View File

@@ -0,0 +1,81 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:sale.promotion,coupons:"
msgid "Coupons"
msgstr ""
msgctxt "field:sale.promotion.coupon,name:"
msgid "Name"
msgstr ""
msgctxt "field:sale.promotion.coupon,number_of_use:"
msgid "Number of Use"
msgstr ""
msgctxt "field:sale.promotion.coupon,numbers:"
msgid "Numbers"
msgstr ""
msgctxt "field:sale.promotion.coupon,per_party:"
msgid "Per Party"
msgstr ""
msgctxt "field:sale.promotion.coupon,promotion:"
msgid "Promotion"
msgstr ""
msgctxt "field:sale.promotion.coupon.number,active:"
msgid "Active"
msgstr ""
msgctxt "field:sale.promotion.coupon.number,coupon:"
msgid "Coupon"
msgstr ""
msgctxt "field:sale.promotion.coupon.number,number:"
msgid "Number"
msgstr ""
msgctxt "field:sale.sale,coupon_parties:"
msgid "Coupon Parties"
msgstr ""
msgctxt "field:sale.sale,coupons:"
msgid "Coupons"
msgstr ""
msgctxt "field:sale.sale-sale.promotion.coupon.number,number:"
msgid "Number"
msgstr ""
msgctxt "field:sale.sale-sale.promotion.coupon.number,sale:"
msgid "Sale"
msgstr ""
msgctxt "help:sale.promotion.coupon,number_of_use:"
msgid ""
"How much times a coupon number can be used.\n"
"0 or below for no limit."
msgstr ""
msgctxt "help:sale.promotion.coupon,per_party:"
msgid "Check to count usage per party."
msgstr ""
msgctxt "model:ir.message,text:msg_duplicate_numbers"
msgid "The coupons numbered \"%(numbers)s\" are duplicated."
msgstr ""
msgctxt "model:sale.promotion.coupon,name:"
msgid "Promotion Coupon"
msgstr ""
msgctxt "model:sale.promotion.coupon.number,name:"
msgid "Promotion Coupon Number"
msgstr ""
msgctxt "model:sale.sale-sale.promotion.coupon.number,name:"
msgid "Sale - Promotion Coupon Number"
msgstr ""

View File

@@ -0,0 +1,81 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:sale.promotion,coupons:"
msgid "Coupons"
msgstr ""
msgctxt "field:sale.promotion.coupon,name:"
msgid "Name"
msgstr ""
msgctxt "field:sale.promotion.coupon,number_of_use:"
msgid "Number of Use"
msgstr ""
msgctxt "field:sale.promotion.coupon,numbers:"
msgid "Numbers"
msgstr ""
msgctxt "field:sale.promotion.coupon,per_party:"
msgid "Per Party"
msgstr ""
msgctxt "field:sale.promotion.coupon,promotion:"
msgid "Promotion"
msgstr ""
msgctxt "field:sale.promotion.coupon.number,active:"
msgid "Active"
msgstr ""
msgctxt "field:sale.promotion.coupon.number,coupon:"
msgid "Coupon"
msgstr ""
msgctxt "field:sale.promotion.coupon.number,number:"
msgid "Number"
msgstr ""
msgctxt "field:sale.sale,coupon_parties:"
msgid "Coupon Parties"
msgstr ""
msgctxt "field:sale.sale,coupons:"
msgid "Coupons"
msgstr ""
msgctxt "field:sale.sale-sale.promotion.coupon.number,number:"
msgid "Number"
msgstr ""
msgctxt "field:sale.sale-sale.promotion.coupon.number,sale:"
msgid "Sale"
msgstr ""
msgctxt "help:sale.promotion.coupon,number_of_use:"
msgid ""
"How much times a coupon number can be used.\n"
"0 or below for no limit."
msgstr ""
msgctxt "help:sale.promotion.coupon,per_party:"
msgid "Check to count usage per party."
msgstr ""
msgctxt "model:ir.message,text:msg_duplicate_numbers"
msgid "The coupons numbered \"%(numbers)s\" are duplicated."
msgstr ""
msgctxt "model:sale.promotion.coupon,name:"
msgid "Promotion Coupon"
msgstr ""
msgctxt "model:sale.promotion.coupon.number,name:"
msgid "Promotion Coupon Number"
msgstr ""
msgctxt "model:sale.sale-sale.promotion.coupon.number,name:"
msgid "Sale - Promotion Coupon Number"
msgstr ""

View File

@@ -0,0 +1,81 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:sale.promotion,coupons:"
msgid "Coupons"
msgstr ""
msgctxt "field:sale.promotion.coupon,name:"
msgid "Name"
msgstr ""
msgctxt "field:sale.promotion.coupon,number_of_use:"
msgid "Number of Use"
msgstr ""
msgctxt "field:sale.promotion.coupon,numbers:"
msgid "Numbers"
msgstr ""
msgctxt "field:sale.promotion.coupon,per_party:"
msgid "Per Party"
msgstr ""
msgctxt "field:sale.promotion.coupon,promotion:"
msgid "Promotion"
msgstr ""
msgctxt "field:sale.promotion.coupon.number,active:"
msgid "Active"
msgstr ""
msgctxt "field:sale.promotion.coupon.number,coupon:"
msgid "Coupon"
msgstr ""
msgctxt "field:sale.promotion.coupon.number,number:"
msgid "Number"
msgstr ""
msgctxt "field:sale.sale,coupon_parties:"
msgid "Coupon Parties"
msgstr ""
msgctxt "field:sale.sale,coupons:"
msgid "Coupons"
msgstr ""
msgctxt "field:sale.sale-sale.promotion.coupon.number,number:"
msgid "Number"
msgstr ""
msgctxt "field:sale.sale-sale.promotion.coupon.number,sale:"
msgid "Sale"
msgstr ""
msgctxt "help:sale.promotion.coupon,number_of_use:"
msgid ""
"How much times a coupon number can be used.\n"
"0 or below for no limit."
msgstr ""
msgctxt "help:sale.promotion.coupon,per_party:"
msgid "Check to count usage per party."
msgstr ""
msgctxt "model:ir.message,text:msg_duplicate_numbers"
msgid "The coupons numbered \"%(numbers)s\" are duplicated."
msgstr ""
msgctxt "model:sale.promotion.coupon,name:"
msgid "Promotion Coupon"
msgstr ""
msgctxt "model:sale.promotion.coupon.number,name:"
msgid "Promotion Coupon Number"
msgstr ""
msgctxt "model:sale.sale-sale.promotion.coupon.number,name:"
msgid "Sale - Promotion Coupon Number"
msgstr ""

View File

@@ -0,0 +1,81 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:sale.promotion,coupons:"
msgid "Coupons"
msgstr ""
msgctxt "field:sale.promotion.coupon,name:"
msgid "Name"
msgstr ""
msgctxt "field:sale.promotion.coupon,number_of_use:"
msgid "Number of Use"
msgstr ""
msgctxt "field:sale.promotion.coupon,numbers:"
msgid "Numbers"
msgstr ""
msgctxt "field:sale.promotion.coupon,per_party:"
msgid "Per Party"
msgstr ""
msgctxt "field:sale.promotion.coupon,promotion:"
msgid "Promotion"
msgstr ""
msgctxt "field:sale.promotion.coupon.number,active:"
msgid "Active"
msgstr ""
msgctxt "field:sale.promotion.coupon.number,coupon:"
msgid "Coupon"
msgstr ""
msgctxt "field:sale.promotion.coupon.number,number:"
msgid "Number"
msgstr ""
msgctxt "field:sale.sale,coupon_parties:"
msgid "Coupon Parties"
msgstr ""
msgctxt "field:sale.sale,coupons:"
msgid "Coupons"
msgstr ""
msgctxt "field:sale.sale-sale.promotion.coupon.number,number:"
msgid "Number"
msgstr ""
msgctxt "field:sale.sale-sale.promotion.coupon.number,sale:"
msgid "Sale"
msgstr ""
msgctxt "help:sale.promotion.coupon,number_of_use:"
msgid ""
"How much times a coupon number can be used.\n"
"0 or below for no limit."
msgstr ""
msgctxt "help:sale.promotion.coupon,per_party:"
msgid "Check to count usage per party."
msgstr ""
msgctxt "model:ir.message,text:msg_duplicate_numbers"
msgid "The coupons numbered \"%(numbers)s\" are duplicated."
msgstr ""
msgctxt "model:sale.promotion.coupon,name:"
msgid "Promotion Coupon"
msgstr ""
msgctxt "model:sale.promotion.coupon.number,name:"
msgid "Promotion Coupon Number"
msgstr ""
msgctxt "model:sale.sale-sale.promotion.coupon.number,name:"
msgid "Sale - Promotion Coupon Number"
msgstr ""

View File

@@ -0,0 +1,81 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:sale.promotion,coupons:"
msgid "Coupons"
msgstr ""
msgctxt "field:sale.promotion.coupon,name:"
msgid "Name"
msgstr ""
msgctxt "field:sale.promotion.coupon,number_of_use:"
msgid "Number of Use"
msgstr ""
msgctxt "field:sale.promotion.coupon,numbers:"
msgid "Numbers"
msgstr ""
msgctxt "field:sale.promotion.coupon,per_party:"
msgid "Per Party"
msgstr ""
msgctxt "field:sale.promotion.coupon,promotion:"
msgid "Promotion"
msgstr ""
msgctxt "field:sale.promotion.coupon.number,active:"
msgid "Active"
msgstr ""
msgctxt "field:sale.promotion.coupon.number,coupon:"
msgid "Coupon"
msgstr ""
msgctxt "field:sale.promotion.coupon.number,number:"
msgid "Number"
msgstr ""
msgctxt "field:sale.sale,coupon_parties:"
msgid "Coupon Parties"
msgstr ""
msgctxt "field:sale.sale,coupons:"
msgid "Coupons"
msgstr ""
msgctxt "field:sale.sale-sale.promotion.coupon.number,number:"
msgid "Number"
msgstr ""
msgctxt "field:sale.sale-sale.promotion.coupon.number,sale:"
msgid "Sale"
msgstr ""
msgctxt "help:sale.promotion.coupon,number_of_use:"
msgid ""
"How much times a coupon number can be used.\n"
"0 or below for no limit."
msgstr ""
msgctxt "help:sale.promotion.coupon,per_party:"
msgid "Check to count usage per party."
msgstr ""
msgctxt "model:ir.message,text:msg_duplicate_numbers"
msgid "The coupons numbered \"%(numbers)s\" are duplicated."
msgstr ""
msgctxt "model:sale.promotion.coupon,name:"
msgid "Promotion Coupon"
msgstr ""
msgctxt "model:sale.promotion.coupon.number,name:"
msgid "Promotion Coupon Number"
msgstr ""
msgctxt "model:sale.sale-sale.promotion.coupon.number,name:"
msgid "Sale - Promotion Coupon Number"
msgstr ""

View File

@@ -0,0 +1,81 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:sale.promotion,coupons:"
msgid "Coupons"
msgstr ""
msgctxt "field:sale.promotion.coupon,name:"
msgid "Name"
msgstr ""
msgctxt "field:sale.promotion.coupon,number_of_use:"
msgid "Number of Use"
msgstr ""
msgctxt "field:sale.promotion.coupon,numbers:"
msgid "Numbers"
msgstr ""
msgctxt "field:sale.promotion.coupon,per_party:"
msgid "Per Party"
msgstr ""
msgctxt "field:sale.promotion.coupon,promotion:"
msgid "Promotion"
msgstr ""
msgctxt "field:sale.promotion.coupon.number,active:"
msgid "Active"
msgstr ""
msgctxt "field:sale.promotion.coupon.number,coupon:"
msgid "Coupon"
msgstr ""
msgctxt "field:sale.promotion.coupon.number,number:"
msgid "Number"
msgstr ""
msgctxt "field:sale.sale,coupon_parties:"
msgid "Coupon Parties"
msgstr ""
msgctxt "field:sale.sale,coupons:"
msgid "Coupons"
msgstr ""
msgctxt "field:sale.sale-sale.promotion.coupon.number,number:"
msgid "Number"
msgstr ""
msgctxt "field:sale.sale-sale.promotion.coupon.number,sale:"
msgid "Sale"
msgstr ""
msgctxt "help:sale.promotion.coupon,number_of_use:"
msgid ""
"How much times a coupon number can be used.\n"
"0 or below for no limit."
msgstr ""
msgctxt "help:sale.promotion.coupon,per_party:"
msgid "Check to count usage per party."
msgstr ""
msgctxt "model:ir.message,text:msg_duplicate_numbers"
msgid "The coupons numbered \"%(numbers)s\" are duplicated."
msgstr ""
msgctxt "model:sale.promotion.coupon,name:"
msgid "Promotion Coupon"
msgstr ""
msgctxt "model:sale.promotion.coupon.number,name:"
msgid "Promotion Coupon Number"
msgstr ""
msgctxt "model:sale.sale-sale.promotion.coupon.number,name:"
msgid "Sale - Promotion Coupon Number"
msgstr ""

View File

@@ -0,0 +1,10 @@
<?xml version="1.0"?>
<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
this repository contains the full copyright notices and license terms. -->
<tryton>
<data grouped="1">
<record model="ir.message" id="msg_duplicate_numbers">
<field name="text">The coupons numbered "%(numbers)s" are duplicated.</field>
</record>
</data>
</tryton>

View File

@@ -0,0 +1,230 @@
# This file is part of Tryton. The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.
from sql import Literal
from sql.aggregate import Count
from sql.conditionals import Case, Coalesce
from trytond.i18n import gettext
from trytond.model import (
DeactivableMixin, ModelSQL, ModelView, Workflow, fields)
from trytond.pool import Pool, PoolMeta
from trytond.pyson import Eval
from trytond.tools import grouped_slice, reduce_ids
from trytond.transaction import Transaction
from .exceptions import DuplicateError
class Promotion(metaclass=PoolMeta):
__name__ = 'sale.promotion'
coupons = fields.One2Many('sale.promotion.coupon', 'promotion', "Coupons")
def get_pattern(self, sale):
pattern = super(Promotion, self).get_pattern(sale)
if sale.coupons:
pattern['coupons'] = [c.coupon.id for c in sale.coupons]
return pattern
def match(self, pattern):
if self.coupons:
pattern = pattern.copy()
coupons = pattern.pop('coupons', [])
if not set(coupons).intersection({c.id for c in self.coupons}):
return False
return super(Promotion, self).match(pattern)
class PromotionCoupon(ModelSQL, ModelView):
"Promotion Coupon"
__name__ = 'sale.promotion.coupon'
name = fields.Char("Name", required=True)
number_of_use = fields.Integer(
"Number of Use", required=True,
help="How much times a coupon number can be used.\n"
"0 or below for no limit.")
per_party = fields.Boolean(
"Per Party", help="Check to count usage per party.")
numbers = fields.One2Many(
'sale.promotion.coupon.number', 'coupon', "Numbers")
promotion = fields.Many2One('sale.promotion', "Promotion", required=True)
@classmethod
def __setup__(cls):
super().__setup__()
cls.__access__.add('promotion')
@classmethod
def default_number_of_use(cls):
return 0
@classmethod
def default_per_party(cls):
return False
class PromotionCouponNumber(DeactivableMixin, ModelSQL, ModelView):
"Promotion Coupon Number"
__name__ = 'sale.promotion.coupon.number'
_rec_name = 'number'
number = fields.Char("Number", required=True)
coupon = fields.Many2One(
'sale.promotion.coupon', "Coupon", required=True)
@classmethod
def __setup__(cls):
super(PromotionCouponNumber, cls).__setup__()
cls.__access__.add('coupon')
cls.active = fields.Function(
fields.Boolean("Active"), 'get_active', searcher='search_active')
@classmethod
def _active_query(cls):
pool = Pool()
Coupon = pool.get('sale.promotion.coupon')
Sale = pool.get('sale.sale')
Sale_Number = pool.get('sale.sale-sale.promotion.coupon.number')
table = cls.__table__()
coupon = Coupon.__table__()
sale = Sale.__table__()
sale_number = Sale_Number.__table__()
context = Transaction().context
party = context.get('party')
if isinstance(party, int):
party = [party]
query = (table
.join(sale_number, 'LEFT',
condition=table.id == sale_number.number)
.join(coupon, condition=table.coupon == coupon.id))
if party:
query = query.join(sale, 'LEFT',
condition=(sale_number.sale == sale.id)
& (sale.party.in_(party)))
active = Case(
((coupon.number_of_use > 0) & (coupon.per_party),
Count(sale.id) < coupon.number_of_use),
((coupon.number_of_use > 0)
& ~Coalesce(coupon.per_party, False),
Count(sale_number.sale) < coupon.number_of_use),
else_=Literal(True))
else:
active = Case(
((coupon.number_of_use > 0)
& ~Coalesce(coupon.per_party, False),
Count(sale_number.sale) < coupon.number_of_use),
else_=Literal(True))
query = query.select(
group_by=[table.id, coupon.number_of_use, coupon.per_party])
return query, table, active
@classmethod
def get_active(cls, numbers, name):
cursor = Transaction().connection.cursor()
query, table, active = cls._active_query()
query.columns = [table.id, active]
result = {}
for sub_numbers in grouped_slice(numbers):
query.where = reduce_ids(table.id, map(int, sub_numbers))
cursor.execute(*query)
result.update(dict(cursor))
return result
@classmethod
def search_active(cls, name, clause):
_, operator, value = clause
Operator = fields.SQL_OPERATORS[operator]
query, table, active = cls._active_query()
query.columns = [table.id]
query.having = Operator(active, value)
return [('id', 'in', query)]
@classmethod
def validate_fields(cls, numbers, field_names):
super().validate_fields(numbers, field_names)
cls.check_unique(numbers, field_names)
@classmethod
def check_unique(cls, numbers, field_names=None):
if field_names and not (field_names & {'number', 'coupon'}):
return
duplicates = []
for sub_numbers in grouped_slice(numbers):
domain = ['OR']
for number in sub_numbers:
domain.append([
('number', '=', number.number),
('id', '!=', number.id),
('coupon.promotion.company', '=',
number.coupon.promotion.company.id),
])
duplicates.extend(cls.search(domain))
if duplicates:
numbers = ', '.join(n.number for n in duplicates[:5])
if len(duplicates) > 5:
numbers += '...'
raise DuplicateError(
gettext('sale_promotion_coupon.msg_duplicate_numbers',
numbers=numbers))
class Sale(metaclass=PoolMeta):
__name__ = 'sale.sale'
coupons = fields.Many2Many(
'sale.sale-sale.promotion.coupon.number', 'sale', 'number', "Coupons",
domain=[
('coupon.promotion.company', '=', Eval('company', -1)),
],
context={
'party': Eval('coupon_parties', []),
},
states={
'readonly': Eval('state') != 'draft',
},
depends={'coupon_parties'})
coupon_parties = fields.Function(fields.Many2Many(
'party.party', None, None, "Coupon Parties",
context={
'company': Eval('company', -1),
}),
'on_change_with_coupon_parties')
@fields.depends(methods=['_coupon_parties'])
def on_change_with_coupon_parties(self, name=None):
return list(self._coupon_parties())
@fields.depends('party')
def _coupon_parties(self):
parties = set()
if self.party:
parties.add(self.party)
return parties
@classmethod
@ModelView.button
@Workflow.transition('cancelled')
def cancel(cls, sales):
for sale in sales:
if sale.coupons:
sale.coupons = []
cls.save(sales)
super(Sale, cls).cancel(sales)
class Sale_PromotionCouponNumber(ModelSQL):
"Sale - Promotion Coupon Number"
__name__ = 'sale.sale-sale.promotion.coupon.number'
sale = fields.Many2One(
'sale.sale', "Sale", required=True, ondelete='CASCADE')
number = fields.Many2One(
'sale.promotion.coupon.number', "Number",
required=True, ondelete='RESTRICT')

View File

@@ -0,0 +1,40 @@
<?xml version="1.0"?>
<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
this repository contains the full copyright notices and license terms. -->
<tryton>
<data>
<record model="ir.ui.view" id="promotion_view_form">
<field name="model">sale.promotion</field>
<field name="inherit" ref="sale_promotion.promotion_view_form"/>
<field name="name">promotion_form</field>
</record>
<record model="ir.ui.view" id="coupon_view_form">
<field name="model">sale.promotion.coupon</field>
<field name="type">form</field>
<field name="name">coupon_form</field>
</record>
<record model="ir.ui.view" id="coupon_view_list">
<field name="model">sale.promotion.coupon</field>
<field name="type">tree</field>
<field name="name">coupon_list</field>
</record>
<record model="ir.ui.view" id="coupon_number_view_form">
<field name="model">sale.promotion.coupon.number</field>
<field name="type">form</field>
<field name="name">coupon_number_form</field>
</record>
<record model="ir.ui.view" id="coupon_number_view_list">
<field name="model">sale.promotion.coupon.number</field>
<field name="type">tree</field>
<field name="name">coupon_number_list</field>
</record>
<record model="ir.ui.view" id="sale_view_form">
<field name="model">sale.sale</field>
<field name="inherit" ref="sale.sale_view_form"/>
<field name="name">sale_form</field>
</record>
</data>
</tryton>

View File

@@ -0,0 +1,2 @@
# This file is part of Tryton. The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.

View File

@@ -0,0 +1,129 @@
==============================
Sale Promotion Coupon Scenario
==============================
Imports::
>>> from decimal import Decimal
>>> from proteus import Model
>>> from trytond.modules.account.tests.tools import create_chart, get_accounts
>>> from trytond.modules.company.tests.tools import create_company, get_company
>>> from trytond.tests.tools import activate_modules
Activate modules::
>>> config = activate_modules('sale_promotion_coupon')
Create company::
>>> _ = create_company()
>>> company = get_company()
Create chart of accounts::
>>> _ = create_chart(company)
>>> accounts = get_accounts(company)
>>> revenue = accounts['revenue']
Create customer::
>>> Party = Model.get('party.party')
>>> customer = Party(name='Customer')
>>> customer.save()
Create account category::
>>> ProductCategory = Model.get('product.category')
>>> account_category = ProductCategory(name="Account Category")
>>> account_category.accounting = True
>>> account_category.account_revenue = revenue
>>> account_category.save()
Create products::
>>> ProductUom = Model.get('product.uom')
>>> ProductTemplate = Model.get('product.template')
>>> Product = Model.get('product.product')
>>> unit, = ProductUom.find([('name', '=', 'Unit')])
>>> template = ProductTemplate()
>>> template.name = 'Product'
>>> template.default_uom = unit
>>> template.type = 'goods'
>>> template.salable = True
>>> template.list_price = Decimal('20')
>>> template.account_category = account_category
>>> template.save()
>>> product, = template.products
Create Promotion with coupon::
>>> Promotion = Model.get('sale.promotion')
>>> promotion = Promotion(name="10%")
>>> promotion.formula = '0.9 * unit_price'
>>> coupon = promotion.coupons.new(name="Promo")
>>> coupon.number_of_use = 0
>>> number = coupon.numbers.new(number="CODE10")
>>> promotion.save()
Sale without promotion coupon::
>>> Sale = Model.get('sale.sale')
>>> sale = Sale()
>>> sale.party = customer
>>> sale_line = sale.lines.new()
>>> sale_line.product = product
>>> sale_line.quantity = 5
>>> sale.save()
>>> sale.untaxed_amount
Decimal('100.00')
>>> sale.click('quote')
>>> sale.untaxed_amount
Decimal('100.00')
Add promotion coupon to the sale::
>>> sale.click('draft')
>>> sale.coupons.extend(sale.coupons.find([('rec_name', '=', 'CODE10')]))
>>> len(sale.coupons)
1
>>> sale.save()
>>> sale.untaxed_amount
Decimal('100.00')
>>> sale.click('quote')
>>> sale.untaxed_amount
Decimal('90.00')
Check coupon inactive after usage::
>>> Number = Model.get('sale.promotion.coupon.number')
>>> coupon, = promotion.coupons
>>> number, = Number.find([('rec_name', '=', 'CODE10')])
>>> bool(number.active)
True
>>> with config.set_context(party=customer.id):
... number_party, = Number.find([('rec_name', '=', 'CODE10')])
>>> bool(number_party.active)
True
>>> coupon.number_of_use = 1
>>> coupon.save()
>>> number.reload()
>>> bool(number.active)
False
>>> Number.find([('rec_name', '=', 'CODE10')])
[]
>>> number_party.reload()
>>> bool(number_party.active)
False
>>> with config.set_context(party=customer.id):
... Number.find([('rec_name', '=', 'CODE10')])
[]
Cancel sale remove the coupons::
>>> sale.click('cancel')
>>> len(sale.coupons)
0

View File

@@ -0,0 +1,13 @@
# This file is part of Tryton. The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.
from trytond.modules.company.tests import CompanyTestMixin
from trytond.tests.test_tryton import ModuleTestCase
class SalePromotionCouponTestCase(CompanyTestMixin, ModuleTestCase):
'Test Sale Promotion Coupon module'
module = 'sale_promotion_coupon'
del ModuleTestCase

View File

@@ -0,0 +1,8 @@
# This file is part of Tryton. The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.
from trytond.tests.test_tryton import load_doc_tests
def load_tests(*args, **kwargs):
return load_doc_tests(__name__, __file__, *args, **kwargs)

View File

@@ -0,0 +1,10 @@
[tryton]
version=7.2.0
depends:
company
ir
sale
sale_promotion
xml:
sale.xml
message.xml

View File

@@ -0,0 +1,14 @@
<?xml version="1.0"?>
<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
this repository contains the full copyright notices and license terms. -->
<form>
<label name="name"/>
<field name="name"/>
<label name="promotion"/>
<field name="promotion"/>
<label name="number_of_use"/>
<field name="number_of_use"/>
<label name="per_party"/>
<field name="per_party"/>
<field name="numbers" colspan="4"/>
</form>

View File

@@ -0,0 +1,9 @@
<?xml version="1.0"?>
<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
this repository contains the full copyright notices and license terms. -->
<tree>
<field name="promotion" expand="1"/>
<field name="name" expand="1"/>
<field name="number_of_use"/>
<field name="per_party"/>
</tree>

View File

@@ -0,0 +1,11 @@
<?xml version="1.0"?>
<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
this repository contains the full copyright notices and license terms. -->
<form>
<label name="coupon"/>
<field name="coupon" colspan="3"/>
<label name="number"/>
<field name="number"/>
<label name="active"/>
<field name="active"/>
</form>

View File

@@ -0,0 +1,7 @@
<?xml version="1.0"?>
<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
this repository contains the full copyright notices and license terms. -->
<tree>
<field name="coupon" expand="1"/>
<field name="number" expand="1"/>
</tree>

View File

@@ -0,0 +1,8 @@
<?xml version="1.0"?>
<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
this repository contains the full copyright notices and license terms. -->
<data>
<xpath expr="//field[@name='products']" position="after">
<field name="coupons"/>
</xpath>
</data>

View File

@@ -0,0 +1,10 @@
<?xml version="1.0"?>
<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
this repository contains the full copyright notices and license terms. -->
<data>
<xpath expr="//notebook/page[@id='sale']" position="after">
<page name="coupons">
<field name="coupons" colspan="4"/>
</page>
</xpath>
</data>