first commit

This commit is contained in:
root
2026-03-14 09:42:12 +00:00
commit 0adbd20c2c
10991 changed files with 1646955 additions and 0 deletions

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.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,76 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:product.product,supply_on_sale:"
msgid "Supply On Sale"
msgstr ""
msgctxt "field:product.template,supply_on_sale:"
msgid "Supply On Sale"
msgstr ""
msgctxt "field:purchase.request,sale_lines:"
msgid "Sale Lines"
msgstr ""
#, fuzzy
msgctxt "field:sale.line,purchase_request:"
msgid "Purchase Request"
msgstr "Заявка за покупка"
msgctxt "field:sale.line,supply_state:"
msgid "Supply State"
msgstr ""
#, fuzzy
msgctxt "model:ir.action,name:act_purchase_request_form"
msgid "Purchase Requests"
msgstr "Заявки за покупки"
#, python-format
msgctxt "model:ir.message,text:msg_order_point_product_supply_on_sale"
msgid "The product \"%(product)s\" is supplied on sale."
msgstr ""
#, python-format
msgctxt "model:ir.message,text:msg_template_supply_on_sale_order_point"
msgid "The product has purchase order points \"%(order_points)s\" defined."
msgstr ""
msgctxt "selection:product.product,supply_on_sale:"
msgid "Always"
msgstr ""
msgctxt "selection:product.product,supply_on_sale:"
msgid "Never"
msgstr ""
msgctxt "selection:product.product,supply_on_sale:"
msgid "Stock First"
msgstr ""
msgctxt "selection:product.template,supply_on_sale:"
msgid "Always"
msgstr ""
msgctxt "selection:product.template,supply_on_sale:"
msgid "Never"
msgstr ""
msgctxt "selection:product.template,supply_on_sale:"
msgid "Stock First"
msgstr ""
#, fuzzy
msgctxt "selection:sale.line,supply_state:"
msgid "Cancelled"
msgstr "Отказване"
msgctxt "selection:sale.line,supply_state:"
msgid "Requested"
msgstr ""
msgctxt "selection:sale.line,supply_state:"
msgid "Supplied"
msgstr ""

View File

@@ -0,0 +1,75 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:product.product,supply_on_sale:"
msgid "Supply On Sale"
msgstr "Subministra a la venda"
msgctxt "field:product.template,supply_on_sale:"
msgid "Supply On Sale"
msgstr "Subministra a la venda"
msgctxt "field:purchase.request,sale_lines:"
msgid "Sale Lines"
msgstr "Línies de venda"
msgctxt "field:sale.line,purchase_request:"
msgid "Purchase Request"
msgstr "Sol·licitud de compra"
msgctxt "field:sale.line,supply_state:"
msgid "Supply State"
msgstr "Estat subministrament"
msgctxt "model:ir.action,name:act_purchase_request_form"
msgid "Purchase Requests"
msgstr "Sol·licituds de compra"
#, python-format
msgctxt "model:ir.message,text:msg_order_point_product_supply_on_sale"
msgid "The product \"%(product)s\" is supplied on sale."
msgstr "El producte \"%(product)s\" es subministra a la venda."
#, python-format
msgctxt "model:ir.message,text:msg_template_supply_on_sale_order_point"
msgid "The product has purchase order points \"%(order_points)s\" defined."
msgstr ""
"El producte té regles d'aprovisionament de compra \"%(order_points)s\" "
"definits."
msgctxt "selection:product.product,supply_on_sale:"
msgid "Always"
msgstr "Sempre"
msgctxt "selection:product.product,supply_on_sale:"
msgid "Never"
msgstr "Mai"
msgctxt "selection:product.product,supply_on_sale:"
msgid "Stock First"
msgstr "Primer existències"
msgctxt "selection:product.template,supply_on_sale:"
msgid "Always"
msgstr "Sempre"
msgctxt "selection:product.template,supply_on_sale:"
msgid "Never"
msgstr "Mai"
msgctxt "selection:product.template,supply_on_sale:"
msgid "Stock First"
msgstr "Primer existències"
msgctxt "selection:sale.line,supply_state:"
msgid "Cancelled"
msgstr "Cancel·lat"
msgctxt "selection:sale.line,supply_state:"
msgid "Requested"
msgstr "Sol·licitat"
msgctxt "selection:sale.line,supply_state:"
msgid "Supplied"
msgstr "Subministrat"

View File

@@ -0,0 +1,74 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:product.product,supply_on_sale:"
msgid "Supply On Sale"
msgstr ""
msgctxt "field:product.template,supply_on_sale:"
msgid "Supply On Sale"
msgstr ""
msgctxt "field:purchase.request,sale_lines:"
msgid "Sale Lines"
msgstr ""
#, fuzzy
msgctxt "field:sale.line,purchase_request:"
msgid "Purchase Request"
msgstr "Purchase Requests"
msgctxt "field:sale.line,supply_state:"
msgid "Supply State"
msgstr ""
msgctxt "model:ir.action,name:act_purchase_request_form"
msgid "Purchase Requests"
msgstr "Purchase Requests"
#, python-format
msgctxt "model:ir.message,text:msg_order_point_product_supply_on_sale"
msgid "The product \"%(product)s\" is supplied on sale."
msgstr ""
#, python-format
msgctxt "model:ir.message,text:msg_template_supply_on_sale_order_point"
msgid "The product has purchase order points \"%(order_points)s\" defined."
msgstr ""
msgctxt "selection:product.product,supply_on_sale:"
msgid "Always"
msgstr ""
msgctxt "selection:product.product,supply_on_sale:"
msgid "Never"
msgstr ""
msgctxt "selection:product.product,supply_on_sale:"
msgid "Stock First"
msgstr ""
msgctxt "selection:product.template,supply_on_sale:"
msgid "Always"
msgstr ""
msgctxt "selection:product.template,supply_on_sale:"
msgid "Never"
msgstr ""
msgctxt "selection:product.template,supply_on_sale:"
msgid "Stock First"
msgstr ""
msgctxt "selection:sale.line,supply_state:"
msgid "Cancelled"
msgstr ""
msgctxt "selection:sale.line,supply_state:"
msgid "Requested"
msgstr ""
msgctxt "selection:sale.line,supply_state:"
msgid "Supplied"
msgstr ""

View File

@@ -0,0 +1,74 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:product.product,supply_on_sale:"
msgid "Supply On Sale"
msgstr "Beschaffung bei Verkauf"
msgctxt "field:product.template,supply_on_sale:"
msgid "Supply On Sale"
msgstr "Beschaffung bei Verkauf"
msgctxt "field:purchase.request,sale_lines:"
msgid "Sale Lines"
msgstr "Verkaufspositionen"
msgctxt "field:sale.line,purchase_request:"
msgid "Purchase Request"
msgstr "Bestellvorschlag"
msgctxt "field:sale.line,supply_state:"
msgid "Supply State"
msgstr "Beschaffungsstatus"
msgctxt "model:ir.action,name:act_purchase_request_form"
msgid "Purchase Requests"
msgstr "Bestellvorschläge"
#, python-format
msgctxt "model:ir.message,text:msg_order_point_product_supply_on_sale"
msgid "The product \"%(product)s\" is supplied on sale."
msgstr "Der Artikel \"%(product)s\" wird bei Bestellung beschafft."
#, python-format
msgctxt "model:ir.message,text:msg_template_supply_on_sale_order_point"
msgid "The product has purchase order points \"%(order_points)s\" defined."
msgstr ""
"Für den Artikel sind Einkaufsbestellpunkte \"%(order_points)s\" definiert."
msgctxt "selection:product.product,supply_on_sale:"
msgid "Always"
msgstr "Immer"
msgctxt "selection:product.product,supply_on_sale:"
msgid "Never"
msgstr "Niemals"
msgctxt "selection:product.product,supply_on_sale:"
msgid "Stock First"
msgstr "Lagerbestand Zuerst"
msgctxt "selection:product.template,supply_on_sale:"
msgid "Always"
msgstr "Immer"
msgctxt "selection:product.template,supply_on_sale:"
msgid "Never"
msgstr "Niemals"
msgctxt "selection:product.template,supply_on_sale:"
msgid "Stock First"
msgstr "Lagerbestand Zuerst"
msgctxt "selection:sale.line,supply_state:"
msgid "Cancelled"
msgstr "Annulliert"
msgctxt "selection:sale.line,supply_state:"
msgid "Requested"
msgstr "Angefragt"
msgctxt "selection:sale.line,supply_state:"
msgid "Supplied"
msgstr "Beschafft"

View File

@@ -0,0 +1,75 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:product.product,supply_on_sale:"
msgid "Supply On Sale"
msgstr "Suministrar en la venta"
msgctxt "field:product.template,supply_on_sale:"
msgid "Supply On Sale"
msgstr "Suministra en la venta"
msgctxt "field:purchase.request,sale_lines:"
msgid "Sale Lines"
msgstr "Líneas de venta"
msgctxt "field:sale.line,purchase_request:"
msgid "Purchase Request"
msgstr "Solicitud de compra"
msgctxt "field:sale.line,supply_state:"
msgid "Supply State"
msgstr "Estado suministro"
msgctxt "model:ir.action,name:act_purchase_request_form"
msgid "Purchase Requests"
msgstr "Solicitudes de compra"
#, python-format
msgctxt "model:ir.message,text:msg_order_point_product_supply_on_sale"
msgid "The product \"%(product)s\" is supplied on sale."
msgstr "El producto \"%(product)s\" se subministra en la venta."
#, python-format
msgctxt "model:ir.message,text:msg_template_supply_on_sale_order_point"
msgid "The product has purchase order points \"%(order_points)s\" defined."
msgstr ""
"El producto tiene reglas de abastecimientod de compra \"%(order_points)s\" "
"definidos."
msgctxt "selection:product.product,supply_on_sale:"
msgid "Always"
msgstr "Siempre"
msgctxt "selection:product.product,supply_on_sale:"
msgid "Never"
msgstr "Nunca"
msgctxt "selection:product.product,supply_on_sale:"
msgid "Stock First"
msgstr "Primero existencias"
msgctxt "selection:product.template,supply_on_sale:"
msgid "Always"
msgstr "Siempre"
msgctxt "selection:product.template,supply_on_sale:"
msgid "Never"
msgstr "Nunca"
msgctxt "selection:product.template,supply_on_sale:"
msgid "Stock First"
msgstr "Primero existencias"
msgctxt "selection:sale.line,supply_state:"
msgid "Cancelled"
msgstr "Cancelado"
msgctxt "selection:sale.line,supply_state:"
msgid "Requested"
msgstr "Solicitado"
msgctxt "selection:sale.line,supply_state:"
msgid "Supplied"
msgstr "Suministrado"

View File

@@ -0,0 +1,74 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:product.product,supply_on_sale:"
msgid "Supply On Sale"
msgstr ""
msgctxt "field:product.template,supply_on_sale:"
msgid "Supply On Sale"
msgstr ""
msgctxt "field:purchase.request,sale_lines:"
msgid "Sale Lines"
msgstr ""
msgctxt "field:sale.line,purchase_request:"
msgid "Purchase Request"
msgstr ""
msgctxt "field:sale.line,supply_state:"
msgid "Supply State"
msgstr ""
msgctxt "model:ir.action,name:act_purchase_request_form"
msgid "Purchase Requests"
msgstr ""
#, python-format
msgctxt "model:ir.message,text:msg_order_point_product_supply_on_sale"
msgid "The product \"%(product)s\" is supplied on sale."
msgstr ""
#, python-format
msgctxt "model:ir.message,text:msg_template_supply_on_sale_order_point"
msgid "The product has purchase order points \"%(order_points)s\" defined."
msgstr ""
msgctxt "selection:product.product,supply_on_sale:"
msgid "Always"
msgstr ""
msgctxt "selection:product.product,supply_on_sale:"
msgid "Never"
msgstr ""
msgctxt "selection:product.product,supply_on_sale:"
msgid "Stock First"
msgstr ""
msgctxt "selection:product.template,supply_on_sale:"
msgid "Always"
msgstr ""
msgctxt "selection:product.template,supply_on_sale:"
msgid "Never"
msgstr ""
msgctxt "selection:product.template,supply_on_sale:"
msgid "Stock First"
msgstr ""
msgctxt "selection:sale.line,supply_state:"
msgid "Cancelled"
msgstr ""
#, fuzzy
msgctxt "selection:sale.line,supply_state:"
msgid "Requested"
msgstr "Solicitado"
msgctxt "selection:sale.line,supply_state:"
msgid "Supplied"
msgstr ""

View File

@@ -0,0 +1,76 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:product.product,supply_on_sale:"
msgid "Supply On Sale"
msgstr "Müügitarne"
msgctxt "field:product.template,supply_on_sale:"
msgid "Supply On Sale"
msgstr "Müügitarne"
msgctxt "field:purchase.request,sale_lines:"
msgid "Sale Lines"
msgstr "Müügirida"
msgctxt "field:sale.line,purchase_request:"
msgid "Purchase Request"
msgstr "Ostupäring"
#, fuzzy
msgctxt "field:sale.line,supply_state:"
msgid "Supply State"
msgstr "Müügitarne"
msgctxt "model:ir.action,name:act_purchase_request_form"
msgid "Purchase Requests"
msgstr "Ostupäringud"
#, python-format
msgctxt "model:ir.message,text:msg_order_point_product_supply_on_sale"
msgid "The product \"%(product)s\" is supplied on sale."
msgstr ""
#, python-format
msgctxt "model:ir.message,text:msg_template_supply_on_sale_order_point"
msgid "The product has purchase order points \"%(order_points)s\" defined."
msgstr ""
msgctxt "selection:product.product,supply_on_sale:"
msgid "Always"
msgstr ""
msgctxt "selection:product.product,supply_on_sale:"
msgid "Never"
msgstr ""
msgctxt "selection:product.product,supply_on_sale:"
msgid "Stock First"
msgstr ""
msgctxt "selection:product.template,supply_on_sale:"
msgid "Always"
msgstr ""
msgctxt "selection:product.template,supply_on_sale:"
msgid "Never"
msgstr ""
msgctxt "selection:product.template,supply_on_sale:"
msgid "Stock First"
msgstr ""
#, fuzzy
msgctxt "selection:sale.line,supply_state:"
msgid "Cancelled"
msgstr "Tühista"
#, fuzzy
msgctxt "selection:sale.line,supply_state:"
msgid "Requested"
msgstr "Päritud"
msgctxt "selection:sale.line,supply_state:"
msgid "Supplied"
msgstr ""

View File

@@ -0,0 +1,76 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:product.product,supply_on_sale:"
msgid "Supply On Sale"
msgstr "عرضه در فروش"
msgctxt "field:product.template,supply_on_sale:"
msgid "Supply On Sale"
msgstr "عرضه در فروش"
msgctxt "field:purchase.request,sale_lines:"
msgid "Sale Lines"
msgstr "سطرهای فروش"
msgctxt "field:sale.line,purchase_request:"
msgid "Purchase Request"
msgstr "درخواست خرید"
#, fuzzy
msgctxt "field:sale.line,supply_state:"
msgid "Supply State"
msgstr "عرضه در فروش"
msgctxt "model:ir.action,name:act_purchase_request_form"
msgid "Purchase Requests"
msgstr "درخواست های خرید"
#, python-format
msgctxt "model:ir.message,text:msg_order_point_product_supply_on_sale"
msgid "The product \"%(product)s\" is supplied on sale."
msgstr ""
#, python-format
msgctxt "model:ir.message,text:msg_template_supply_on_sale_order_point"
msgid "The product has purchase order points \"%(order_points)s\" defined."
msgstr ""
msgctxt "selection:product.product,supply_on_sale:"
msgid "Always"
msgstr ""
msgctxt "selection:product.product,supply_on_sale:"
msgid "Never"
msgstr ""
msgctxt "selection:product.product,supply_on_sale:"
msgid "Stock First"
msgstr ""
msgctxt "selection:product.template,supply_on_sale:"
msgid "Always"
msgstr ""
msgctxt "selection:product.template,supply_on_sale:"
msgid "Never"
msgstr ""
msgctxt "selection:product.template,supply_on_sale:"
msgid "Stock First"
msgstr ""
#, fuzzy
msgctxt "selection:sale.line,supply_state:"
msgid "Cancelled"
msgstr "انصراف"
#, fuzzy
msgctxt "selection:sale.line,supply_state:"
msgid "Requested"
msgstr "درخواست شده"
msgctxt "selection:sale.line,supply_state:"
msgid "Supplied"
msgstr ""

View File

@@ -0,0 +1,74 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:product.product,supply_on_sale:"
msgid "Supply On Sale"
msgstr ""
msgctxt "field:product.template,supply_on_sale:"
msgid "Supply On Sale"
msgstr ""
msgctxt "field:purchase.request,sale_lines:"
msgid "Sale Lines"
msgstr ""
#, fuzzy
msgctxt "field:sale.line,purchase_request:"
msgid "Purchase Request"
msgstr "Purchase Requests"
msgctxt "field:sale.line,supply_state:"
msgid "Supply State"
msgstr ""
msgctxt "model:ir.action,name:act_purchase_request_form"
msgid "Purchase Requests"
msgstr "Purchase Requests"
#, python-format
msgctxt "model:ir.message,text:msg_order_point_product_supply_on_sale"
msgid "The product \"%(product)s\" is supplied on sale."
msgstr ""
#, python-format
msgctxt "model:ir.message,text:msg_template_supply_on_sale_order_point"
msgid "The product has purchase order points \"%(order_points)s\" defined."
msgstr ""
msgctxt "selection:product.product,supply_on_sale:"
msgid "Always"
msgstr ""
msgctxt "selection:product.product,supply_on_sale:"
msgid "Never"
msgstr ""
msgctxt "selection:product.product,supply_on_sale:"
msgid "Stock First"
msgstr ""
msgctxt "selection:product.template,supply_on_sale:"
msgid "Always"
msgstr ""
msgctxt "selection:product.template,supply_on_sale:"
msgid "Never"
msgstr ""
msgctxt "selection:product.template,supply_on_sale:"
msgid "Stock First"
msgstr ""
msgctxt "selection:sale.line,supply_state:"
msgid "Cancelled"
msgstr ""
msgctxt "selection:sale.line,supply_state:"
msgid "Requested"
msgstr ""
msgctxt "selection:sale.line,supply_state:"
msgid "Supplied"
msgstr ""

View File

@@ -0,0 +1,75 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:product.product,supply_on_sale:"
msgid "Supply On Sale"
msgstr "Approvisionnement sur vente"
msgctxt "field:product.template,supply_on_sale:"
msgid "Supply On Sale"
msgstr "Approvisionnement sur vente"
msgctxt "field:purchase.request,sale_lines:"
msgid "Sale Lines"
msgstr "Lignes de vente"
msgctxt "field:sale.line,purchase_request:"
msgid "Purchase Request"
msgstr "Demande d'achat"
msgctxt "field:sale.line,supply_state:"
msgid "Supply State"
msgstr "État d'approvisionnement"
msgctxt "model:ir.action,name:act_purchase_request_form"
msgid "Purchase Requests"
msgstr "Demandes d'achat"
#, python-format
msgctxt "model:ir.message,text:msg_order_point_product_supply_on_sale"
msgid "The product \"%(product)s\" is supplied on sale."
msgstr "Le produit « %(product)s » est approvisionné sur vente."
#, python-format
msgctxt "model:ir.message,text:msg_template_supply_on_sale_order_point"
msgid "The product has purchase order points \"%(order_points)s\" defined."
msgstr ""
"Le produit a des règles d'approvisionnements d'achat « %(order_points)s » "
"définies."
msgctxt "selection:product.product,supply_on_sale:"
msgid "Always"
msgstr "Toujours"
msgctxt "selection:product.product,supply_on_sale:"
msgid "Never"
msgstr "Jamais"
msgctxt "selection:product.product,supply_on_sale:"
msgid "Stock First"
msgstr "Stock d'abord"
msgctxt "selection:product.template,supply_on_sale:"
msgid "Always"
msgstr "Toujours"
msgctxt "selection:product.template,supply_on_sale:"
msgid "Never"
msgstr "Jamais"
msgctxt "selection:product.template,supply_on_sale:"
msgid "Stock First"
msgstr "Stock d'abord"
msgctxt "selection:sale.line,supply_state:"
msgid "Cancelled"
msgstr "Annulé"
msgctxt "selection:sale.line,supply_state:"
msgid "Requested"
msgstr "Demandé"
msgctxt "selection:sale.line,supply_state:"
msgid "Supplied"
msgstr "Approvisionné"

View File

@@ -0,0 +1,75 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:product.product,supply_on_sale:"
msgid "Supply On Sale"
msgstr ""
msgctxt "field:product.template,supply_on_sale:"
msgid "Supply On Sale"
msgstr ""
msgctxt "field:purchase.request,sale_lines:"
msgid "Sale Lines"
msgstr ""
#, fuzzy
msgctxt "field:sale.line,purchase_request:"
msgid "Purchase Request"
msgstr "Purchase Requests"
msgctxt "field:sale.line,supply_state:"
msgid "Supply State"
msgstr ""
msgctxt "model:ir.action,name:act_purchase_request_form"
msgid "Purchase Requests"
msgstr "Purchase Requests"
#, python-format
msgctxt "model:ir.message,text:msg_order_point_product_supply_on_sale"
msgid "The product \"%(product)s\" is supplied on sale."
msgstr ""
#, python-format
msgctxt "model:ir.message,text:msg_template_supply_on_sale_order_point"
msgid "The product has purchase order points \"%(order_points)s\" defined."
msgstr ""
msgctxt "selection:product.product,supply_on_sale:"
msgid "Always"
msgstr ""
msgctxt "selection:product.product,supply_on_sale:"
msgid "Never"
msgstr ""
msgctxt "selection:product.product,supply_on_sale:"
msgid "Stock First"
msgstr ""
msgctxt "selection:product.template,supply_on_sale:"
msgid "Always"
msgstr ""
msgctxt "selection:product.template,supply_on_sale:"
msgid "Never"
msgstr ""
msgctxt "selection:product.template,supply_on_sale:"
msgid "Stock First"
msgstr ""
#, fuzzy
msgctxt "selection:sale.line,supply_state:"
msgid "Cancelled"
msgstr "Mégse"
msgctxt "selection:sale.line,supply_state:"
msgid "Requested"
msgstr ""
msgctxt "selection:sale.line,supply_state:"
msgid "Supplied"
msgstr ""

View File

@@ -0,0 +1,73 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:product.product,supply_on_sale:"
msgid "Supply On Sale"
msgstr ""
msgctxt "field:product.template,supply_on_sale:"
msgid "Supply On Sale"
msgstr ""
msgctxt "field:purchase.request,sale_lines:"
msgid "Sale Lines"
msgstr ""
msgctxt "field:sale.line,purchase_request:"
msgid "Purchase Request"
msgstr ""
msgctxt "field:sale.line,supply_state:"
msgid "Supply State"
msgstr ""
msgctxt "model:ir.action,name:act_purchase_request_form"
msgid "Purchase Requests"
msgstr ""
#, python-format
msgctxt "model:ir.message,text:msg_order_point_product_supply_on_sale"
msgid "The product \"%(product)s\" is supplied on sale."
msgstr ""
#, python-format
msgctxt "model:ir.message,text:msg_template_supply_on_sale_order_point"
msgid "The product has purchase order points \"%(order_points)s\" defined."
msgstr ""
msgctxt "selection:product.product,supply_on_sale:"
msgid "Always"
msgstr ""
msgctxt "selection:product.product,supply_on_sale:"
msgid "Never"
msgstr ""
msgctxt "selection:product.product,supply_on_sale:"
msgid "Stock First"
msgstr ""
msgctxt "selection:product.template,supply_on_sale:"
msgid "Always"
msgstr ""
msgctxt "selection:product.template,supply_on_sale:"
msgid "Never"
msgstr ""
msgctxt "selection:product.template,supply_on_sale:"
msgid "Stock First"
msgstr ""
msgctxt "selection:sale.line,supply_state:"
msgid "Cancelled"
msgstr "Dibatalkan"
msgctxt "selection:sale.line,supply_state:"
msgid "Requested"
msgstr ""
msgctxt "selection:sale.line,supply_state:"
msgid "Supplied"
msgstr ""

View File

@@ -0,0 +1,73 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:product.product,supply_on_sale:"
msgid "Supply On Sale"
msgstr "forniture in vendita"
msgctxt "field:product.template,supply_on_sale:"
msgid "Supply On Sale"
msgstr "forniture in vendita"
msgctxt "field:purchase.request,sale_lines:"
msgid "Sale Lines"
msgstr "Righe di vendita"
msgctxt "field:sale.line,purchase_request:"
msgid "Purchase Request"
msgstr "Richiesta di acquisto"
msgctxt "field:sale.line,supply_state:"
msgid "Supply State"
msgstr "Stato della fornitura"
msgctxt "model:ir.action,name:act_purchase_request_form"
msgid "Purchase Requests"
msgstr "Richiesta acquisti"
#, python-format
msgctxt "model:ir.message,text:msg_order_point_product_supply_on_sale"
msgid "The product \"%(product)s\" is supplied on sale."
msgstr ""
#, python-format
msgctxt "model:ir.message,text:msg_template_supply_on_sale_order_point"
msgid "The product has purchase order points \"%(order_points)s\" defined."
msgstr ""
msgctxt "selection:product.product,supply_on_sale:"
msgid "Always"
msgstr ""
msgctxt "selection:product.product,supply_on_sale:"
msgid "Never"
msgstr ""
msgctxt "selection:product.product,supply_on_sale:"
msgid "Stock First"
msgstr ""
msgctxt "selection:product.template,supply_on_sale:"
msgid "Always"
msgstr ""
msgctxt "selection:product.template,supply_on_sale:"
msgid "Never"
msgstr ""
msgctxt "selection:product.template,supply_on_sale:"
msgid "Stock First"
msgstr ""
msgctxt "selection:sale.line,supply_state:"
msgid "Cancelled"
msgstr "Annullato"
msgctxt "selection:sale.line,supply_state:"
msgid "Requested"
msgstr "Richiesto"
msgctxt "selection:sale.line,supply_state:"
msgid "Supplied"
msgstr "Fornito"

View File

@@ -0,0 +1,77 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:product.product,supply_on_sale:"
msgid "Supply On Sale"
msgstr "ສະໜອງການຂາຍ"
msgctxt "field:product.template,supply_on_sale:"
msgid "Supply On Sale"
msgstr "ສະໜອງການຂາຍ"
msgctxt "field:purchase.request,sale_lines:"
msgid "Sale Lines"
msgstr "ລາຍການຂາຍ"
msgctxt "field:sale.line,purchase_request:"
msgid "Purchase Request"
msgstr "ຕ້ອງການສັ່ງຊື້"
#, fuzzy
msgctxt "field:sale.line,supply_state:"
msgid "Supply State"
msgstr "ສະໜອງການຂາຍ"
#, fuzzy
msgctxt "model:ir.action,name:act_purchase_request_form"
msgid "Purchase Requests"
msgstr "Purchase Requests"
#, python-format
msgctxt "model:ir.message,text:msg_order_point_product_supply_on_sale"
msgid "The product \"%(product)s\" is supplied on sale."
msgstr ""
#, python-format
msgctxt "model:ir.message,text:msg_template_supply_on_sale_order_point"
msgid "The product has purchase order points \"%(order_points)s\" defined."
msgstr ""
msgctxt "selection:product.product,supply_on_sale:"
msgid "Always"
msgstr ""
msgctxt "selection:product.product,supply_on_sale:"
msgid "Never"
msgstr ""
msgctxt "selection:product.product,supply_on_sale:"
msgid "Stock First"
msgstr ""
msgctxt "selection:product.template,supply_on_sale:"
msgid "Always"
msgstr ""
msgctxt "selection:product.template,supply_on_sale:"
msgid "Never"
msgstr ""
msgctxt "selection:product.template,supply_on_sale:"
msgid "Stock First"
msgstr ""
#, fuzzy
msgctxt "selection:sale.line,supply_state:"
msgid "Cancelled"
msgstr "ຍົກເລີກ"
#, fuzzy
msgctxt "selection:sale.line,supply_state:"
msgid "Requested"
msgstr "ສັ່ງແລ້ວ"
msgctxt "selection:sale.line,supply_state:"
msgid "Supplied"
msgstr ""

View File

@@ -0,0 +1,74 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:product.product,supply_on_sale:"
msgid "Supply On Sale"
msgstr ""
msgctxt "field:product.template,supply_on_sale:"
msgid "Supply On Sale"
msgstr ""
msgctxt "field:purchase.request,sale_lines:"
msgid "Sale Lines"
msgstr ""
#, fuzzy
msgctxt "field:sale.line,purchase_request:"
msgid "Purchase Request"
msgstr "Purchase Requests"
msgctxt "field:sale.line,supply_state:"
msgid "Supply State"
msgstr ""
msgctxt "model:ir.action,name:act_purchase_request_form"
msgid "Purchase Requests"
msgstr "Purchase Requests"
#, python-format
msgctxt "model:ir.message,text:msg_order_point_product_supply_on_sale"
msgid "The product \"%(product)s\" is supplied on sale."
msgstr ""
#, python-format
msgctxt "model:ir.message,text:msg_template_supply_on_sale_order_point"
msgid "The product has purchase order points \"%(order_points)s\" defined."
msgstr ""
msgctxt "selection:product.product,supply_on_sale:"
msgid "Always"
msgstr ""
msgctxt "selection:product.product,supply_on_sale:"
msgid "Never"
msgstr ""
msgctxt "selection:product.product,supply_on_sale:"
msgid "Stock First"
msgstr ""
msgctxt "selection:product.template,supply_on_sale:"
msgid "Always"
msgstr ""
msgctxt "selection:product.template,supply_on_sale:"
msgid "Never"
msgstr ""
msgctxt "selection:product.template,supply_on_sale:"
msgid "Stock First"
msgstr ""
msgctxt "selection:sale.line,supply_state:"
msgid "Cancelled"
msgstr ""
msgctxt "selection:sale.line,supply_state:"
msgid "Requested"
msgstr ""
msgctxt "selection:sale.line,supply_state:"
msgid "Supplied"
msgstr ""

View File

@@ -0,0 +1,74 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:product.product,supply_on_sale:"
msgid "Supply On Sale"
msgstr "Inkopen Bij Verkoop"
msgctxt "field:product.template,supply_on_sale:"
msgid "Supply On Sale"
msgstr "Inkopen Bij Verkoop"
msgctxt "field:purchase.request,sale_lines:"
msgid "Sale Lines"
msgstr "Verkoop Regels"
msgctxt "field:sale.line,purchase_request:"
msgid "Purchase Request"
msgstr "Inkoop Aanvraag"
msgctxt "field:sale.line,supply_state:"
msgid "Supply State"
msgstr "Lever Status"
msgctxt "model:ir.action,name:act_purchase_request_form"
msgid "Purchase Requests"
msgstr "Inkoop Aanvragen"
#, python-format
msgctxt "model:ir.message,text:msg_order_point_product_supply_on_sale"
msgid "The product \"%(product)s\" is supplied on sale."
msgstr "Het product \"%(product)s\" is aangeleverd voor verkoop."
#, python-format
msgctxt "model:ir.message,text:msg_template_supply_on_sale_order_point"
msgid "The product has purchase order points \"%(order_points)s\" defined."
msgstr ""
"Op het product zijn inkoop order niveaus \"%(order_points)s\" gedefinieerd."
msgctxt "selection:product.product,supply_on_sale:"
msgid "Always"
msgstr "Altijd"
msgctxt "selection:product.product,supply_on_sale:"
msgid "Never"
msgstr "Nooit"
msgctxt "selection:product.product,supply_on_sale:"
msgid "Stock First"
msgstr "Voorraad eerst"
msgctxt "selection:product.template,supply_on_sale:"
msgid "Always"
msgstr "Altijd"
msgctxt "selection:product.template,supply_on_sale:"
msgid "Never"
msgstr "Nooit"
msgctxt "selection:product.template,supply_on_sale:"
msgid "Stock First"
msgstr "Voorraad eerst"
msgctxt "selection:sale.line,supply_state:"
msgid "Cancelled"
msgstr "Geannuleerd"
msgctxt "selection:sale.line,supply_state:"
msgid "Requested"
msgstr "Aangevraagd"
msgctxt "selection:sale.line,supply_state:"
msgid "Supplied"
msgstr "Geleverd"

View File

@@ -0,0 +1,76 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:product.product,supply_on_sale:"
msgid "Supply On Sale"
msgstr ""
msgctxt "field:product.template,supply_on_sale:"
msgid "Supply On Sale"
msgstr ""
msgctxt "field:purchase.request,sale_lines:"
msgid "Sale Lines"
msgstr "Wiersze sprzedaży"
#, fuzzy
msgctxt "field:sale.line,purchase_request:"
msgid "Purchase Request"
msgstr "Purchase Requests"
msgctxt "field:sale.line,supply_state:"
msgid "Supply State"
msgstr ""
#, fuzzy
msgctxt "model:ir.action,name:act_purchase_request_form"
msgid "Purchase Requests"
msgstr "Purchase Requests"
#, python-format
msgctxt "model:ir.message,text:msg_order_point_product_supply_on_sale"
msgid "The product \"%(product)s\" is supplied on sale."
msgstr ""
#, python-format
msgctxt "model:ir.message,text:msg_template_supply_on_sale_order_point"
msgid "The product has purchase order points \"%(order_points)s\" defined."
msgstr ""
msgctxt "selection:product.product,supply_on_sale:"
msgid "Always"
msgstr ""
msgctxt "selection:product.product,supply_on_sale:"
msgid "Never"
msgstr ""
msgctxt "selection:product.product,supply_on_sale:"
msgid "Stock First"
msgstr ""
msgctxt "selection:product.template,supply_on_sale:"
msgid "Always"
msgstr ""
msgctxt "selection:product.template,supply_on_sale:"
msgid "Never"
msgstr ""
msgctxt "selection:product.template,supply_on_sale:"
msgid "Stock First"
msgstr ""
#, fuzzy
msgctxt "selection:sale.line,supply_state:"
msgid "Cancelled"
msgstr "Anuluj"
msgctxt "selection:sale.line,supply_state:"
msgid "Requested"
msgstr ""
msgctxt "selection:sale.line,supply_state:"
msgid "Supplied"
msgstr ""

View File

@@ -0,0 +1,75 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:product.product,supply_on_sale:"
msgid "Supply On Sale"
msgstr "Abastecimento Na Venda"
msgctxt "field:product.template,supply_on_sale:"
msgid "Supply On Sale"
msgstr "Abastecimento Na Venda"
msgctxt "field:purchase.request,sale_lines:"
msgid "Sale Lines"
msgstr "Linhas de Venda"
msgctxt "field:sale.line,purchase_request:"
msgid "Purchase Request"
msgstr "Pedido de Compra"
#, fuzzy
msgctxt "field:sale.line,supply_state:"
msgid "Supply State"
msgstr "Abastecimento Na Venda"
msgctxt "model:ir.action,name:act_purchase_request_form"
msgid "Purchase Requests"
msgstr "Solicitações de Compra"
#, python-format
msgctxt "model:ir.message,text:msg_order_point_product_supply_on_sale"
msgid "The product \"%(product)s\" is supplied on sale."
msgstr ""
#, python-format
msgctxt "model:ir.message,text:msg_template_supply_on_sale_order_point"
msgid "The product has purchase order points \"%(order_points)s\" defined."
msgstr ""
msgctxt "selection:product.product,supply_on_sale:"
msgid "Always"
msgstr ""
msgctxt "selection:product.product,supply_on_sale:"
msgid "Never"
msgstr ""
msgctxt "selection:product.product,supply_on_sale:"
msgid "Stock First"
msgstr ""
msgctxt "selection:product.template,supply_on_sale:"
msgid "Always"
msgstr ""
msgctxt "selection:product.template,supply_on_sale:"
msgid "Never"
msgstr ""
msgctxt "selection:product.template,supply_on_sale:"
msgid "Stock First"
msgstr ""
msgctxt "selection:sale.line,supply_state:"
msgid "Cancelled"
msgstr "Cancelado"
#, fuzzy
msgctxt "selection:sale.line,supply_state:"
msgid "Requested"
msgstr "Solicitado"
msgctxt "selection:sale.line,supply_state:"
msgid "Supplied"
msgstr ""

View File

@@ -0,0 +1,73 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:product.product,supply_on_sale:"
msgid "Supply On Sale"
msgstr ""
msgctxt "field:product.template,supply_on_sale:"
msgid "Supply On Sale"
msgstr ""
msgctxt "field:purchase.request,sale_lines:"
msgid "Sale Lines"
msgstr ""
msgctxt "field:sale.line,purchase_request:"
msgid "Purchase Request"
msgstr ""
msgctxt "field:sale.line,supply_state:"
msgid "Supply State"
msgstr ""
msgctxt "model:ir.action,name:act_purchase_request_form"
msgid "Purchase Requests"
msgstr ""
#, python-format
msgctxt "model:ir.message,text:msg_order_point_product_supply_on_sale"
msgid "The product \"%(product)s\" is supplied on sale."
msgstr ""
#, python-format
msgctxt "model:ir.message,text:msg_template_supply_on_sale_order_point"
msgid "The product has purchase order points \"%(order_points)s\" defined."
msgstr ""
msgctxt "selection:product.product,supply_on_sale:"
msgid "Always"
msgstr ""
msgctxt "selection:product.product,supply_on_sale:"
msgid "Never"
msgstr ""
msgctxt "selection:product.product,supply_on_sale:"
msgid "Stock First"
msgstr ""
msgctxt "selection:product.template,supply_on_sale:"
msgid "Always"
msgstr ""
msgctxt "selection:product.template,supply_on_sale:"
msgid "Never"
msgstr ""
msgctxt "selection:product.template,supply_on_sale:"
msgid "Stock First"
msgstr ""
msgctxt "selection:sale.line,supply_state:"
msgid "Cancelled"
msgstr ""
msgctxt "selection:sale.line,supply_state:"
msgid "Requested"
msgstr ""
msgctxt "selection:sale.line,supply_state:"
msgid "Supplied"
msgstr ""

View File

@@ -0,0 +1,76 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:product.product,supply_on_sale:"
msgid "Supply On Sale"
msgstr ""
msgctxt "field:product.template,supply_on_sale:"
msgid "Supply On Sale"
msgstr ""
msgctxt "field:purchase.request,sale_lines:"
msgid "Sale Lines"
msgstr ""
#, fuzzy
msgctxt "field:sale.line,purchase_request:"
msgid "Purchase Request"
msgstr "Запрос на покупку"
msgctxt "field:sale.line,supply_state:"
msgid "Supply State"
msgstr ""
#, fuzzy
msgctxt "model:ir.action,name:act_purchase_request_form"
msgid "Purchase Requests"
msgstr "Запросы на покупку"
#, python-format
msgctxt "model:ir.message,text:msg_order_point_product_supply_on_sale"
msgid "The product \"%(product)s\" is supplied on sale."
msgstr ""
#, python-format
msgctxt "model:ir.message,text:msg_template_supply_on_sale_order_point"
msgid "The product has purchase order points \"%(order_points)s\" defined."
msgstr ""
msgctxt "selection:product.product,supply_on_sale:"
msgid "Always"
msgstr ""
msgctxt "selection:product.product,supply_on_sale:"
msgid "Never"
msgstr ""
msgctxt "selection:product.product,supply_on_sale:"
msgid "Stock First"
msgstr ""
msgctxt "selection:product.template,supply_on_sale:"
msgid "Always"
msgstr ""
msgctxt "selection:product.template,supply_on_sale:"
msgid "Never"
msgstr ""
msgctxt "selection:product.template,supply_on_sale:"
msgid "Stock First"
msgstr ""
#, fuzzy
msgctxt "selection:sale.line,supply_state:"
msgid "Cancelled"
msgstr "Отменить"
msgctxt "selection:sale.line,supply_state:"
msgid "Requested"
msgstr ""
msgctxt "selection:sale.line,supply_state:"
msgid "Supplied"
msgstr ""

View File

@@ -0,0 +1,77 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:product.product,supply_on_sale:"
msgid "Supply On Sale"
msgstr "Dobava ob prodaji"
msgctxt "field:product.template,supply_on_sale:"
msgid "Supply On Sale"
msgstr "Dobava ob prodaji"
msgctxt "field:purchase.request,sale_lines:"
msgid "Sale Lines"
msgstr "Prodajne postavke"
msgctxt "field:sale.line,purchase_request:"
msgid "Purchase Request"
msgstr "Nabavni zahtevek"
#, fuzzy
msgctxt "field:sale.line,supply_state:"
msgid "Supply State"
msgstr "Dobava ob prodaji"
#, fuzzy
msgctxt "model:ir.action,name:act_purchase_request_form"
msgid "Purchase Requests"
msgstr "Purchase Requests"
#, python-format
msgctxt "model:ir.message,text:msg_order_point_product_supply_on_sale"
msgid "The product \"%(product)s\" is supplied on sale."
msgstr ""
#, python-format
msgctxt "model:ir.message,text:msg_template_supply_on_sale_order_point"
msgid "The product has purchase order points \"%(order_points)s\" defined."
msgstr ""
msgctxt "selection:product.product,supply_on_sale:"
msgid "Always"
msgstr ""
msgctxt "selection:product.product,supply_on_sale:"
msgid "Never"
msgstr ""
msgctxt "selection:product.product,supply_on_sale:"
msgid "Stock First"
msgstr ""
msgctxt "selection:product.template,supply_on_sale:"
msgid "Always"
msgstr ""
msgctxt "selection:product.template,supply_on_sale:"
msgid "Never"
msgstr ""
msgctxt "selection:product.template,supply_on_sale:"
msgid "Stock First"
msgstr ""
#, fuzzy
msgctxt "selection:sale.line,supply_state:"
msgid "Cancelled"
msgstr "Preklicano"
#, fuzzy
msgctxt "selection:sale.line,supply_state:"
msgid "Requested"
msgstr "Zahtevano"
msgctxt "selection:sale.line,supply_state:"
msgid "Supplied"
msgstr ""

View File

@@ -0,0 +1,80 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
#, fuzzy
msgctxt "field:product.product,supply_on_sale:"
msgid "Supply On Sale"
msgstr "Satış Tedariği"
#, fuzzy
msgctxt "field:product.template,supply_on_sale:"
msgid "Supply On Sale"
msgstr "Satış Tedariği"
#, fuzzy
msgctxt "field:purchase.request,sale_lines:"
msgid "Sale Lines"
msgstr "Satış Kanalları"
msgctxt "field:sale.line,purchase_request:"
msgid "Purchase Request"
msgstr "Satınalma Talebi"
#, fuzzy
msgctxt "field:sale.line,supply_state:"
msgid "Supply State"
msgstr "Satış Tedariği"
#, fuzzy
msgctxt "model:ir.action,name:act_purchase_request_form"
msgid "Purchase Requests"
msgstr "Purchase Requests"
#, python-format
msgctxt "model:ir.message,text:msg_order_point_product_supply_on_sale"
msgid "The product \"%(product)s\" is supplied on sale."
msgstr ""
#, python-format
msgctxt "model:ir.message,text:msg_template_supply_on_sale_order_point"
msgid "The product has purchase order points \"%(order_points)s\" defined."
msgstr ""
msgctxt "selection:product.product,supply_on_sale:"
msgid "Always"
msgstr ""
msgctxt "selection:product.product,supply_on_sale:"
msgid "Never"
msgstr ""
msgctxt "selection:product.product,supply_on_sale:"
msgid "Stock First"
msgstr ""
msgctxt "selection:product.template,supply_on_sale:"
msgid "Always"
msgstr ""
msgctxt "selection:product.template,supply_on_sale:"
msgid "Never"
msgstr ""
msgctxt "selection:product.template,supply_on_sale:"
msgid "Stock First"
msgstr ""
#, fuzzy
msgctxt "selection:sale.line,supply_state:"
msgid "Cancelled"
msgstr "Vazgeç"
#, fuzzy
msgctxt "selection:sale.line,supply_state:"
msgid "Requested"
msgstr "Talep Edilen"
msgctxt "selection:sale.line,supply_state:"
msgid "Supplied"
msgstr ""

View File

@@ -0,0 +1,73 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:product.product,supply_on_sale:"
msgid "Supply On Sale"
msgstr ""
msgctxt "field:product.template,supply_on_sale:"
msgid "Supply On Sale"
msgstr ""
msgctxt "field:purchase.request,sale_lines:"
msgid "Sale Lines"
msgstr ""
msgctxt "field:sale.line,purchase_request:"
msgid "Purchase Request"
msgstr ""
msgctxt "field:sale.line,supply_state:"
msgid "Supply State"
msgstr ""
msgctxt "model:ir.action,name:act_purchase_request_form"
msgid "Purchase Requests"
msgstr ""
#, python-format
msgctxt "model:ir.message,text:msg_order_point_product_supply_on_sale"
msgid "The product \"%(product)s\" is supplied on sale."
msgstr ""
#, python-format
msgctxt "model:ir.message,text:msg_template_supply_on_sale_order_point"
msgid "The product has purchase order points \"%(order_points)s\" defined."
msgstr ""
msgctxt "selection:product.product,supply_on_sale:"
msgid "Always"
msgstr ""
msgctxt "selection:product.product,supply_on_sale:"
msgid "Never"
msgstr ""
msgctxt "selection:product.product,supply_on_sale:"
msgid "Stock First"
msgstr ""
msgctxt "selection:product.template,supply_on_sale:"
msgid "Always"
msgstr ""
msgctxt "selection:product.template,supply_on_sale:"
msgid "Never"
msgstr ""
msgctxt "selection:product.template,supply_on_sale:"
msgid "Stock First"
msgstr ""
msgctxt "selection:sale.line,supply_state:"
msgid "Cancelled"
msgstr ""
msgctxt "selection:sale.line,supply_state:"
msgid "Requested"
msgstr ""
msgctxt "selection:sale.line,supply_state:"
msgid "Supplied"
msgstr ""

View File

@@ -0,0 +1,75 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:product.product,supply_on_sale:"
msgid "Supply On Sale"
msgstr ""
msgctxt "field:product.template,supply_on_sale:"
msgid "Supply On Sale"
msgstr ""
msgctxt "field:purchase.request,sale_lines:"
msgid "Sale Lines"
msgstr ""
#, fuzzy
msgctxt "field:sale.line,purchase_request:"
msgid "Purchase Request"
msgstr "Purchase Requests"
msgctxt "field:sale.line,supply_state:"
msgid "Supply State"
msgstr ""
msgctxt "model:ir.action,name:act_purchase_request_form"
msgid "Purchase Requests"
msgstr "采购申请"
#, python-format
msgctxt "model:ir.message,text:msg_order_point_product_supply_on_sale"
msgid "The product \"%(product)s\" is supplied on sale."
msgstr ""
#, python-format
msgctxt "model:ir.message,text:msg_template_supply_on_sale_order_point"
msgid "The product has purchase order points \"%(order_points)s\" defined."
msgstr ""
msgctxt "selection:product.product,supply_on_sale:"
msgid "Always"
msgstr ""
msgctxt "selection:product.product,supply_on_sale:"
msgid "Never"
msgstr ""
msgctxt "selection:product.product,supply_on_sale:"
msgid "Stock First"
msgstr ""
msgctxt "selection:product.template,supply_on_sale:"
msgid "Always"
msgstr ""
msgctxt "selection:product.template,supply_on_sale:"
msgid "Never"
msgstr ""
msgctxt "selection:product.template,supply_on_sale:"
msgid "Stock First"
msgstr ""
#, fuzzy
msgctxt "selection:sale.line,supply_state:"
msgid "Cancelled"
msgstr "取消"
msgctxt "selection:sale.line,supply_state:"
msgid "Requested"
msgstr ""
msgctxt "selection:sale.line,supply_state:"
msgid "Supplied"
msgstr ""

View File

@@ -0,0 +1,13 @@
<?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_order_point_product_supply_on_sale">
<field name="text">The product "%(product)s" is supplied on sale.</field>
</record>
<record model="ir.message" id="msg_template_supply_on_sale_order_point">
<field name="text">The product has purchase order points "%(order_points)s" defined.</field>
</record>
</data>
</tryton>

View File

@@ -0,0 +1,91 @@
# 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 trytond.i18n import gettext
from trytond.model import fields
from trytond.pool import Pool, PoolMeta
from trytond.pyson import Eval
from trytond.transaction import Transaction
class Template(metaclass=PoolMeta):
__name__ = 'product.template'
supply_on_sale = fields.Selection([
(None, "Never"),
('stock_first', "Stock First"),
('always', "Always"),
], "Supply On Sale",
states={
'invisible': ~Eval('purchasable') | ~Eval('salable'),
})
@classmethod
def __register__(cls, module):
table_h = cls.__table_handler__(module)
table = cls.__table__()
cursor = Transaction().connection.cursor()
migrate_supply_on_sale = (
table_h.column_exist('supply_on_sale')
and table_h.column_is_type('supply_on_sale', 'BOOL'))
if migrate_supply_on_sale:
table_h.column_rename('supply_on_sale', '_temp_supply_on_sale')
if cls._history:
h_table_h = cls.__table_handler__(module, history=True)
h_table = cls.__table_history__()
h_migrate_supply_on_sale = (
h_table_h.column_exist('supply_on_sale')
and h_table_h.column_is_type('supply_on_sale', 'BOOL'))
if h_migrate_supply_on_sale:
h_table_h.column_rename(
'supply_on_sale', '_temp_supply_on_sale')
super().__register__(module)
# Migration from 6.6: convert supply_on_sale from boolean to selection
if migrate_supply_on_sale:
cursor.execute(*table.update(
[table.supply_on_sale],
['always'],
where=table._temp_supply_on_sale == Literal(True)))
table_h.drop_column('_temp_supply_on_sale')
if cls._history and h_migrate_supply_on_sale:
cursor.execute(*h_table.update(
[h_table.supply_on_sale],
['always'],
where=h_table._temp_supply_on_sale == Literal(True)))
h_table_h.drop_column('_temp_supply_on_sale')
@fields.depends(methods=['_notify_order_point'])
def on_change_notify(self):
notifications = super().on_change_notify()
notifications.extend(self._notify_order_point())
return notifications
@fields.depends('id', 'supply_on_sale')
def _notify_order_point(self):
pool = Pool()
try:
OrderPoint = pool.get('stock.order_point')
except KeyError:
return
if self.supply_on_sale and self.id is not None and self.id >= 0:
order_points = OrderPoint.search([
('product.template.id', '=', self.id),
('type', '=', 'purchase'),
], limit=6)
if order_points:
names = ', '.join(o.rec_name for o in order_points[:5])
if len(order_points) > 5:
names + '...'
yield ('warning', gettext(
'sale_supply'
'.msg_template_supply_on_sale_order_point',
order_points=names))
class Product(metaclass=PoolMeta):
__name__ = 'product.product'

View File

@@ -0,0 +1,12 @@
<?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="template_view_form">
<field name="model">product.template</field>
<field name="inherit" ref="product.template_view_form"/>
<field name="name">template_form</field>
</record>
</data>
</tryton>

View File

@@ -0,0 +1,61 @@
# 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 import fields
from trytond.pool import Pool, PoolMeta
from trytond.transaction import Transaction, without_check_access
class Request(metaclass=PoolMeta):
__name__ = 'purchase.request'
sale_lines = fields.One2Many(
'sale.line', 'purchase_request', "Sale Lines", readonly=True)
@classmethod
def _get_origin(cls):
return super()._get_origin() | {'sale.sale'}
@classmethod
def update_state(cls, requests):
pool = Pool()
Sale = pool.get('sale.sale')
transaction = Transaction()
context = transaction.context
super().update_state(requests)
sales = {r.origin for r in requests if isinstance(r.origin, Sale)}
if sales:
with transaction.set_context(
queue_batch=context.get('queue_batch', True)):
Sale.__queue__.process(Sale.browse(sales))
@classmethod
def copy(cls, requests, default=None):
default = default.copy() if default is not None else {}
default.setdefault('sale_lines')
return super().copy(requests, default=default)
@classmethod
def on_delete(cls, requests):
pool = Pool()
Sale = pool.get('sale.sale')
SaleLine = pool.get('sale.line')
transaction = Transaction()
context = transaction.context
with without_check_access():
reqs = cls.browse(requests)
sales = set(r.origin for r in reqs if isinstance(r.origin, Sale))
sale_lines = [l for r in reqs for l in r.sale_lines]
if sale_lines:
SaleLine.write(sale_lines, {
'purchase_request': None,
})
if sales:
with transaction.set_context(
queue_batch=context.get('queue_batch', True)):
Sale.__queue__.process(sales)
return super().on_delete(requests)

285
modules/sale_supply/sale.py Normal file
View File

@@ -0,0 +1,285 @@
# 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 collections import defaultdict
from itertools import groupby
from operator import attrgetter
from trytond.model import fields
from trytond.pool import Pool, PoolMeta
from trytond.pyson import Eval
from trytond.transaction import Transaction
class Sale(metaclass=PoolMeta):
__name__ = 'sale.sale'
def is_done(self):
done = super().is_done()
if done:
if any(l.supply_state == 'requested'
for l in self.lines if l.supply_on_sale):
return False
return done
@classmethod
def _process_shipment(cls, sales):
pool = Pool()
Product = pool.get('product.product')
product_quantities = defaultdict(float)
for (company, warehouse), sub_sales in groupby(
filter(attrgetter('warehouse'), sales),
key=attrgetter('company', 'warehouse')):
sub_sales = list(sub_sales)
products = {
l.product for s in sub_sales for l in s.lines
if l.product and l.product.supply_on_sale == 'stock_first'}
locations = [warehouse.id]
with Transaction().set_context(
company=company.id, locations=locations,
stock_assign=True,
stock_date_end=None):
product_quantities.update(
(p, p.forecast_quantity)
for p in Product.browse(products))
# purchase requests must be created before shipments to get
# information about requests during the shipments creation like the
# supplier
cls._process_supply(sub_sales, product_quantities)
product_quantities.clear()
super()._process_shipment(sales)
@classmethod
def _process_supply(cls, sales, product_quantities):
pool = Pool()
Line = pool.get('sale.line')
PurchaseRequest = pool.get('purchase.request')
requests, lines = [], []
for sale in sales:
reqs, lns = sale.create_purchase_requests(product_quantities)
requests.extend(reqs)
lines.extend(lns)
PurchaseRequest.save(requests)
Line.save(lines)
cls._update_moves_from_supply(sales)
def create_purchase_requests(self, product_quantities):
requests, lines = [], []
for line in self.lines:
request = line.get_purchase_request(product_quantities)
if not request:
continue
requests.append(request)
assert not line.purchase_request
line.purchase_request = request
lines.append(line)
return requests, lines
@classmethod
def _update_moves_from_supply(cls, sales):
pool = Pool()
Shipment = pool.get('stock.shipment.out')
Move = pool.get('stock.move')
shipments = set()
def add_shipment(shipment):
if (isinstance(shipment, Shipment)
and shipment.state in {'draft', 'waiting'}):
shipments.add(shipment)
moves_to_draft, moves_to_cancel = [], []
for sale in sales:
for line in sale.lines:
for move in line.moves:
if move.state == 'staging':
if (not line.has_supply
or line.supply_state == 'supplied'):
moves_to_draft.append(move)
elif line.supply_state == 'cancelled':
moves_to_cancel.append(move)
else:
continue
add_shipment(move.shipment)
if moves_to_draft:
Move.draft(moves_to_draft)
shipments = Shipment.browse(shipments)
shipments_waiting = [s for s in shipments if s.state == 'waiting']
if shipments:
Shipment.draft(shipments) # clear inventory moves
if moves_to_cancel:
Move.cancel(moves_to_cancel)
if shipments:
Shipment.wait([
s for s in shipments_waiting
if any(m.state != 'cancelled' for m in s.moves)])
Shipment.cancel([
s for s in shipments
if all(m.state == 'cancelled' for m in s.moves)])
class Line(metaclass=PoolMeta):
__name__ = 'sale.line'
purchase_request = fields.Many2One('purchase.request', 'Purchase Request',
ondelete='SET NULL', readonly=True)
supply_state = fields.Function(fields.Selection([
('', ""),
('requested', "Requested"),
('supplied', "Supplied"),
('cancelled', "Cancelled"),
], "Supply State",
states={
'invisible': ~Eval('supply_state'),
}), 'get_supply_state')
@property
def has_supply(self):
return bool(self.purchase_request)
def get_supply_state(self, name):
if self.purchase_request is not None:
if self.purchase_request.state == 'cancelled':
return 'cancelled'
else:
purchase_line = self.purchase_request.purchase_line
if purchase_line is not None:
purchase = purchase_line.purchase
if purchase.state in {'processing', 'done'}:
return 'supplied'
return 'requested'
return ''
@classmethod
def copy(cls, lines, default=None):
if default is None:
default = {}
else:
default = default.copy()
default.setdefault('purchase_request', None)
return super().copy(lines, default=default)
@property
def supply_on_sale(self):
"Returns True if the sale line has to be supply by purchase request"
if (self.type != 'line'
or self.sale.shipment_method == 'manual'
or not self.product
or self.quantity <= 0
or any(m.state not in ['staging', 'cancelled']
for m in self.moves)):
return False
return bool(self.product.supply_on_sale)
@property
def ready_for_supply(self):
if self.sale.shipment_method == 'invoice':
# Ensure to create the request for the maximum paid
invoice_skips = (
set(self.sale.invoices_ignored)
| set(self.sale.invoices_recreated))
invoice_lines = [
l for l in self.invoice_lines
if l.invoice not in invoice_skips]
if (not invoice_lines
or any(
(not l.invoice) or l.invoice.state != 'paid'
for l in invoice_lines)):
return False
return True
def get_move(self, shipment_type):
move = super().get_move(shipment_type)
if (move
and shipment_type == 'out'
and self.has_supply):
if self.supply_state == 'requested':
move.state = 'staging'
return move
def _get_move_quantity(self, shipment_type):
quantity = super()._get_move_quantity(shipment_type)
if self.supply_on_sale and not self.ready_for_supply:
quantity = 0
return quantity
def _get_purchase_request_product_supplier_pattern(self):
return {
'company': self.sale.company.id,
}
def get_purchase_request(self, product_quantities):
"""Return purchase request for the sale line
depending on the product quantities"""
pool = Pool()
Uom = pool.get('product.uom')
Request = pool.get('purchase.request')
if (not self.supply_on_sale
or self.purchase_request
or not self.ready_for_supply
or not self.product.purchasable):
return
product = self.product
quantity = self._get_move_quantity('out')
if product.supply_on_sale == 'stock_first':
available_qty = product_quantities[product]
available_qty = Uom.compute_qty(
product.default_uom, available_qty, self.unit,
round=False)
if available_qty > 0:
product_quantities[product] -= Uom.compute_qty(
self.unit, quantity, product.default_uom, round=False)
return
supplier, purchase_date = Request.find_best_supplier(product,
self.shipping_date,
**self._get_purchase_request_product_supplier_pattern())
unit = product.purchase_uom or product.default_uom
quantity = Uom.compute_qty(self.unit, quantity, unit)
return Request(
product=product,
party=supplier,
quantity=quantity,
unit=unit,
computed_quantity=quantity,
computed_unit=unit,
purchase_date=purchase_date,
supply_date=self.shipping_date,
company=self.sale.company,
warehouse=self.warehouse,
origin=self.sale,
)
def assign_supplied(self, quantities, grouping=('product',)):
'''
Assign supplied move
The quantities will be updated according to assigned quantities.
'''
pool = Pool()
Move = pool.get('stock.move')
ShipmentOut = pool.get('stock.shipment.out')
if self.supply_state != 'supplied':
return
moves = set()
for move in self.moves:
shipment = move.shipment
if isinstance(shipment, ShipmentOut):
if shipment.warehouse_storage == shipment.warehouse_output:
inventory_moves = shipment.outgoing_moves
else:
inventory_moves = shipment.inventory_moves
for inv_move in inventory_moves:
if inv_move.product == self.product:
moves.add(inv_move)
Move.assign_try(list(moves), grouping=grouping, pblc={
self.company.id: quantities,
})

View File

@@ -0,0 +1,36 @@
<?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="sale_line_view_form">
<field name="model">sale.line</field>
<field name="inherit" ref="sale.sale_line_view_form"/>
<field name="name">sale_line_form</field>
</record>
<record model="ir.action.act_window" id="act_purchase_request_form">
<field name="name">Purchase Requests</field>
<field name="res_model">purchase.request</field>
<field name="domain"
eval="[If(Eval('active_ids', []) == [Eval('active_id')], ('origin.id', '=', Eval('active_id'), 'sale.sale'), ('origin.id', 'in', Eval('active_ids'), 'sale.sale'))]"
pyson="1"/>
</record>
<record model="ir.action.keyword"
id="act_open_purchase_request_keyword">
<field name="keyword">form_relate</field>
<field name="model">sale.sale,-1</field>
<field name="action" ref="act_purchase_request_form"/>
</record>
<record model="ir.action-res.group"
id="action_purchase_request_group_purchase_request">
<field name="action" ref="act_purchase_request_form"/>
<field name="group" ref="purchase_request.group_purchase_request"/>
</record>
<record model="ir.action-res.group"
id="action_purchase_request_group_purchase">
<field name="action" ref="act_purchase_request_form"/>
<field name="group" ref="purchase.group_purchase"/>
</record>
</data>
</tryton>

View File

@@ -0,0 +1,78 @@
# 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 collections import defaultdict
from trytond.i18n import gettext
from trytond.model import Model, ModelView, Workflow, fields
from trytond.pool import Pool, PoolMeta
class ShipmentIn(metaclass=PoolMeta):
__name__ = 'stock.shipment.in'
@classmethod
@ModelView.button
@Workflow.transition('done')
def do(cls, shipments):
super().do(shipments)
# Assigned sale move lines
for shipment in shipments:
shipment.assign_supplied()
def assign_supplied(self, grouping=('product',), filter_=None):
pool = Pool()
SaleLine = pool.get('sale.line')
def filter_func(move):
if filter_ is None:
return True
for fieldname, values in filter_:
value = getattr(move, fieldname)
if isinstance(value, Model):
value = value.id
if value not in values:
return False
def get_key(move):
key = (move.to_location.id,)
for field in grouping:
value = getattr(move, field)
if isinstance(value, Model):
value = value.id
key += (value,)
return key
move_ids = [m.id for m in filter(filter_func, self.incoming_moves)]
sale_lines = SaleLine.search([
('purchase_request.purchase_line.moves', 'in', move_ids),
('purchase_request.origin', 'like', 'sale.sale,%'),
])
pbl = defaultdict(lambda: defaultdict(int))
if self.warehouse_storage == self.warehouse_input:
inventory_moves = self.incoming_moves
else:
inventory_moves = self.inventory_moves
for move in filter(filter_func, inventory_moves):
pbl[move.product][get_key(move)] += move.internal_quantity
for sale_line in sale_lines:
sale_line.assign_supplied(
pbl[sale_line.product], grouping=grouping)
class OrderPoint(metaclass=PoolMeta):
__name__ = 'stock.order_point'
@fields.depends(methods=['_notify_product_supply_on_sale'])
def on_change_notify(self):
notifications = super().on_change_notify()
notifications.extend(self._notify_product_supply_on_sale())
return notifications
@fields.depends('type', 'product')
def _notify_product_supply_on_sale(self):
if (self.type == 'purchase'
and self.product and self.product.supply_on_sale):
yield ('warning', gettext(
'sale_supply'
'.msg_order_point_product_supply_on_sale',
product=self.product.rec_name))

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,209 @@
====================
Sale Supply Scenario
====================
Imports::
>>> from decimal import Decimal
>>> from proteus import Model, Wizard
>>> from trytond.modules.account.tests.tools import (
... create_chart, create_fiscalyear, get_accounts)
>>> from trytond.modules.account_invoice.tests.tools import (
... create_payment_term, set_fiscalyear_invoice_sequences)
>>> from trytond.modules.company.tests.tools import create_company
>>> from trytond.tests.tools import activate_modules
Activate modules::
>>> config = activate_modules(
... ['sale_supply', 'sale', 'purchase'],
... create_company, create_chart)
Create fiscal year::
>>> fiscalyear = set_fiscalyear_invoice_sequences(create_fiscalyear())
>>> fiscalyear.click('create_period')
Get accounts::
>>> accounts = get_accounts()
>>> revenue = accounts['revenue']
>>> expense = accounts['expense']
Create parties::
>>> Party = Model.get('party.party')
>>> supplier = Party(name='Supplier')
>>> supplier.save()
>>> 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_expense = expense
>>> account_category.account_revenue = revenue
>>> account_category.save()
Create product::
>>> ProductUom = Model.get('product.uom')
>>> unit, = ProductUom.find([('name', '=', 'Unit')])
>>> ProductTemplate = Model.get('product.template')
>>> template = ProductTemplate()
>>> template.name = 'product'
>>> template.default_uom = unit
>>> template.type = 'goods'
>>> template.purchasable = True
>>> template.salable = True
>>> template.list_price = Decimal('10')
>>> template.supply_on_sale = 'always'
>>> template.account_category = account_category
>>> template.save()
>>> product, = template.products
Create payment term::
>>> payment_term = create_payment_term()
>>> payment_term.save()
Sale 250 products::
>>> Sale = Model.get('sale.sale')
>>> sale = Sale()
>>> sale.party = customer
>>> sale.payment_term = payment_term
>>> sale_line = sale.lines.new()
>>> sale_line.product = product
>>> sale_line.quantity = 250
>>> sale.click('quote')
>>> sale.click('confirm')
>>> sale.state
'processing'
>>> shipment, = sale.shipments
>>> move, = shipment.outgoing_moves
>>> move.state
'staging'
>>> move, = shipment.inventory_moves
>>> move.state
'staging'
Delete Purchase Request::
>>> PurchaseRequest = Model.get('purchase.request')
>>> purchase_request, = PurchaseRequest.find()
>>> purchase_request.quantity
250.0
>>> purchase_request.delete()
>>> purchase_request, = PurchaseRequest.find()
>>> purchase_request.quantity
250.0
Create Purchase from Request::
>>> Purchase = Model.get('purchase.purchase')
>>> purchase_request, = PurchaseRequest.find()
>>> purchase_request.quantity
250.0
>>> create_purchase = Wizard('purchase.request.create_purchase',
... [purchase_request])
>>> create_purchase.form.party = supplier
>>> create_purchase.execute('start')
>>> purchase, = Purchase.find()
>>> purchase.payment_term = payment_term
>>> purchase_line, = purchase.lines
>>> purchase_line.unit_price = Decimal('5.0000')
>>> purchase.click('quote')
>>> purchase.click('confirm')
>>> purchase.state
'processing'
>>> sale.reload()
>>> shipment, = sale.shipments
>>> move, = shipment.outgoing_moves
>>> move.state
'draft'
>>> move, = shipment.inventory_moves
>>> move.state
'draft'
Receive 100 products::
>>> ShipmentIn = Model.get('stock.shipment.in')
>>> Move = Model.get('stock.move')
>>> shipment = ShipmentIn(supplier=supplier)
>>> move, = shipment.incoming_moves.find()
>>> shipment.incoming_moves.append(move)
>>> move.quantity = 100
>>> shipment.click('receive')
>>> shipment.click('do')
>>> shipment.state
'done'
>>> sale.reload()
>>> shipment, = sale.shipments
>>> move, = [x for x in shipment.inventory_moves
... if x.state == 'assigned']
>>> move.quantity
100.0
>>> move, = [x for x in shipment.inventory_moves
... if x.state == 'draft']
>>> move.quantity
150.0
Switching from not supplying on sale to supplying on sale for product should
not create a new purchase request::
>>> changing_template = ProductTemplate()
>>> changing_template.name = 'product'
>>> changing_template.default_uom = unit
>>> changing_template.type = 'goods'
>>> changing_template.purchasable = True
>>> changing_template.salable = True
>>> changing_template.list_price = Decimal('10')
>>> changing_template.account_category = account_category
>>> changing_template.supply_on_sale = None
>>> changing_template.save()
>>> changing_product, = changing_template.products
>>> Sale = Model.get('sale.sale')
>>> sale = Sale()
>>> sale.party = customer
>>> sale.payment_term = payment_term
>>> sale_line = sale.lines.new()
>>> sale_line.product = changing_product
>>> sale_line.quantity = 100
>>> sale.click('quote')
>>> sale.click('confirm')
>>> sale.state
'processing'
>>> shipment, = sale.shipments
>>> Inventory = Model.get('stock.inventory')
>>> Location = Model.get('stock.location')
>>> storage, = Location.find([
... ('code', '=', 'STO'),
... ])
>>> inventory = Inventory()
>>> inventory.location = storage
>>> inventory.save()
>>> inventory_line = inventory.lines.new()
>>> inventory_line.product = changing_product
>>> inventory_line.quantity = 100.0
>>> inventory_line.expected_quantity = 0.0
>>> inventory.save()
>>> inventory.click('confirm')
>>> inventory.state
'done'
>>> shipment.click('assign_try')
>>> shipment.click('pick')
>>> shipment.click('pack')
>>> changing_template.supply_on_sale = 'always'
>>> changing_template.save()
>>> shipment.click('do')
>>> len(PurchaseRequest.find([('product', '=', changing_product.id)]))
0

View File

@@ -0,0 +1,53 @@
=========================
Sale Supply Notifications
=========================
Imports::
>>> from proteus import Model
>>> from trytond.modules.company.tests.tools import create_company
>>> from trytond.tests.tools import activate_modules
Activate modules::
>>> config = activate_modules(['sale_supply', 'stock_supply'], create_company)
>>> Location = Model.get('stock.location')
>>> OrderPoint = Model.get('stock.order_point')
>>> ProductTemplate = Model.get('product.template')
>>> UoM = Model.get('product.uom')
Get locations::
>>> warehouse_location, = Location.find([('type', '=', 'warehouse')])
Create product::
>>> unit, = UoM.find([('name', '=', "Unit")])
>>> product_template = ProductTemplate()
>>> product_template.name = "Product"
>>> product_template.type = 'goods'
>>> product_template.default_uom = unit
>>> product_template.purchasable = True
>>> product_template.salable = True
>>> product_template.supply_on_sale = 'always'
>>> product_template.save()
>>> product, = product_template.products
Create order point::
>>> order_point = OrderPoint()
>>> order_point.product = product
>>> order_point.location = warehouse_location
>>> order_point.type = 'purchase'
>>> order_point.min_quantity = 0
>>> order_point.target_quantity = 5
>>> order_point.save()
Check notifications::
>>> len(product_template.notifications())
1
>>> len(order_point.notifications())
1

View File

@@ -0,0 +1,150 @@
======================================
Sale Supply Request Cancelled Scenario
======================================
Imports::
>>> from decimal import Decimal
>>> from proteus import Model, Wizard
>>> from trytond.modules.account.tests.tools import create_chart, get_accounts
>>> from trytond.modules.company.tests.tools import create_company
>>> from trytond.tests.tools import activate_modules
Activate modules::
>>> config = activate_modules('sale_supply', create_company, create_chart)
>>> Party = Model.get('party.party')
>>> ProductCategory = Model.get('product.category')
>>> ProductTemplate = Model.get('product.template')
>>> Purchase = Model.get('purchase.purchase')
>>> PurchaseRequest = Model.get('purchase.request')
>>> Sale = Model.get('sale.sale')
>>> UoM = Model.get('product.uom')
Get accounts::
>>> accounts = get_accounts()
Create parties::
>>> supplier = Party(name="Supplier")
>>> supplier.save()
>>> customer = Party(name="Customer")
>>> customer.save()
Create account category::
>>> account_category = ProductCategory(name="Account Category")
>>> account_category.accounting = True
>>> account_category.account_expense = accounts['expense']
>>> account_category.account_revenue = accounts['revenue']
>>> account_category.save()
Create product::
>>> unit, = UoM.find([('name', '=', "Unit")])
>>> template = ProductTemplate(name="Product")
>>> template.default_uom = unit
>>> template.type = 'goods'
>>> template.purchasable = True
>>> template.salable = True
>>> template.list_price = Decimal('100.0000')
>>> template.supply_on_sale = 'always'
>>> product_supplier = template.product_suppliers.new()
>>> product_supplier.party = supplier
>>> template.account_category = account_category
>>> template.save()
>>> product, = template.products
Sale product::
>>> sale = Sale(party=customer)
>>> line = sale.lines.new()
>>> line.product = product
>>> line.quantity = 1
>>> sale.click('quote')
>>> sale.click('confirm')
>>> sale.state
'processing'
>>> shipment, = sale.shipments
>>> shipment.state
'waiting'
>>> [m.state for m in shipment.moves]
['staging', 'staging']
Create purchase from request::
>>> purchase_request, = PurchaseRequest.find()
>>> create_purchase = Wizard(
... 'purchase.request.create_purchase', [purchase_request])
>>> purchase_request.state
'purchased'
>>> shipment.reload()
>>> [m.state for m in shipment.moves]
['staging', 'staging']
Cancel purchase::
>>> purchase = purchase_request.purchase
>>> purchase.click('cancel')
>>> purchase.state
'cancelled'
>>> purchase_request.reload()
>>> purchase_request.state
'exception'
>>> shipment.reload()
>>> [m.state for m in shipment.moves]
['staging', 'staging']
Reset exception::
>>> handle_purchase = purchase_request.click(
... 'handle_purchase_cancellation_exception')
>>> handle_purchase.execute('reset')
>>> purchase_request.state
'draft'
>>> shipment.reload()
>>> [m.state for m in shipment.moves]
['staging', 'staging']
Cancel again purchase::
>>> create_purchase = Wizard(
... 'purchase.request.create_purchase', [purchase_request])
>>> purchase = purchase_request.purchase
>>> purchase.click('cancel')
>>> purchase.state
'cancelled'
>>> purchase_request.reload()
>>> purchase_request.state
'exception'
>>> shipment.reload()
>>> [m.state for m in shipment.moves]
['staging', 'staging']
Cancel request::
>>> handle_purchase = purchase_request.click(
... 'handle_purchase_cancellation_exception')
>>> handle_purchase.execute('cancel_request')
>>> purchase_request.state
'cancelled'
>>> shipment.reload()
>>> move, = shipment.moves
>>> move.state
'cancelled'
>>> shipment.state
'cancelled'
>>> sale.reload()
>>> sale.shipment_state
'exception'

View File

@@ -0,0 +1,123 @@
=============================================
Sale Supply with Shipment on Invoice Scenario
=============================================
Imports::
>>> from decimal import Decimal
>>> from proteus import Model
>>> from trytond.modules.account.tests.tools import (
... create_chart, create_fiscalyear, get_accounts)
>>> from trytond.modules.account_invoice.tests.tools import (
... set_fiscalyear_invoice_sequences)
>>> from trytond.modules.company.tests.tools import create_company
>>> from trytond.tests.tools import activate_modules
Activate modules::
>>> config = activate_modules('sale_supply', create_company, create_chart)
Create fiscal year::
>>> fiscalyear = set_fiscalyear_invoice_sequences(create_fiscalyear())
>>> fiscalyear.click('create_period')
Get accounts::
>>> accounts = get_accounts()
>>> Journal = Model.get('account.journal')
>>> PaymentMethod = Model.get('account.invoice.payment.method')
>>> cash_journal, = Journal.find([('type', '=', 'cash')])
>>> cash_journal.save()
>>> payment_method = PaymentMethod()
>>> payment_method.name = 'Cash'
>>> payment_method.journal = cash_journal
>>> payment_method.credit_account = accounts['cash']
>>> payment_method.debit_account = accounts['cash']
>>> payment_method.save()
Create parties::
>>> 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_expense = accounts['expense']
>>> account_category.account_revenue = accounts['revenue']
>>> account_category.save()
Create product::
>>> ProductUom = Model.get('product.uom')
>>> unit, = ProductUom.find([('name', '=', 'Unit')])
>>> ProductTemplate = Model.get('product.template')
>>> template = ProductTemplate()
>>> template.name = 'product'
>>> template.default_uom = unit
>>> template.type = 'goods'
>>> template.salable = True
>>> template.purchasable = True
>>> template.list_price = Decimal('10')
>>> template.supply_on_sale = 'always'
>>> template.account_category = account_category
>>> template.save()
>>> product, = template.products
Sale 5 products with shipment method on invoice::
>>> Sale = Model.get('sale.sale')
>>> sale = Sale()
>>> sale.party = customer
>>> sale.shipment_method = 'invoice'
>>> sale_line = sale.lines.new()
>>> sale_line.product = product
>>> sale_line.quantity = 5
>>> sale.click('quote')
>>> sale.click('confirm')
>>> sale.click('process')
>>> sale.state
'processing'
>>> len(sale.shipments)
0
>>> invoice, = sale.invoices
>>> sale_line, = sale.lines
>>> sale_line.purchase_request
Pay for 4 products::
>>> invoice_line, = invoice.lines
>>> invoice_line.quantity = 4
>>> invoice.click('post')
>>> pay = invoice.click('pay')
>>> pay.form.payment_method = payment_method
>>> pay.execute('choice')
Not yet a purchase request::
>>> sale_line.reload()
>>> sale_line.purchase_request
Pay for remaining products::
>>> sale.reload()
>>> _, invoice = sale.invoices
>>> invoice.click('post')
>>> pay = invoice.click('pay')
>>> pay.form.payment_method = payment_method
>>> pay.execute('choice')
Check purchase request::
>>> sale_line.reload()
>>> bool(sale_line.purchase_request)
True
>>> sale_line.purchase_request.quantity
5.0

View File

@@ -0,0 +1,123 @@
================================
Sale Supply Stock First 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
>>> from trytond.tests.tools import activate_modules
Activate modules::
>>> config = activate_modules('sale_supply', create_company, create_chart)
>>> Inventory = Model.get('stock.inventory')
>>> Location = Model.get('stock.location')
>>> Party = Model.get('party.party')
>>> ProductCategory = Model.get('product.category')
>>> ProductTemplate = Model.get('product.template')
>>> Sale = Model.get('sale.sale')
>>> UoM = Model.get('product.uom')
Get accounts::
>>> accounts = get_accounts()
Create parties::
>>> supplier = Party(name="Supplier")
>>> supplier.save()
>>> customer = Party(name="Customer")
>>> customer.save()
Create account category::
>>> account_category = ProductCategory(name="Account Category")
>>> account_category.accounting = True
>>> account_category.account_expense = accounts['expense']
>>> account_category.account_revenue = accounts['revenue']
>>> account_category.save()
Create product::
>>> unit, = UoM.find([('name', '=', "Unit")])
>>> template = ProductTemplate(name="Product")
>>> template.default_uom = unit
>>> template.type = 'goods'
>>> template.purchasable = True
>>> template.salable = True
>>> template.list_price = Decimal('100.0000')
>>> template.supply_on_sale = 'stock_first'
>>> template.account_category = account_category
>>> template.save()
>>> product, = template.products
Fill warehouse::
>>> inventory = Inventory()
>>> inventory.location, = Location.find([('code', '=', 'STO')])
>>> line = inventory.lines.new()
>>> line.product = product
>>> line.quantity = 5
>>> inventory.click('confirm')
>>> inventory.state
'done'
Sale 3 products with 5 in stock::
>>> sale = Sale()
>>> sale.party = customer
>>> line = sale.lines.new()
>>> line.product = product
>>> line.quantity = 3
>>> sale.click('quote')
>>> sale.click('confirm')
>>> sale.state
'processing'
>>> line, = sale.lines
>>> bool(line.purchase_request)
False
>>> move, = line.moves
>>> move.state
'draft'
Sale 3 products with 2 in stock::
>>> sale = Sale()
>>> sale.party = customer
>>> line = sale.lines.new()
>>> line.product = product
>>> line.quantity = 3
>>> sale.click('quote')
>>> sale.click('confirm')
>>> sale.state
'processing'
>>> line, = sale.lines
>>> bool(line.purchase_request)
False
>>> move, = line.moves
>>> move.state
'draft'
Sale 4 products with no stock::
>>> sale = Sale()
>>> sale.party = customer
>>> line = sale.lines.new()
>>> line.product = product
>>> line.quantity = 4
>>> sale.click('quote')
>>> sale.click('confirm')
>>> sale.state
'processing'
>>> line, = sale.lines
>>> bool(line.purchase_request)
True
>>> move, = line.moves
>>> move.state
'staging'

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.tests.test_tryton import ModuleTestCase
class SaleSupplyTestCase(ModuleTestCase):
'Test SaleSupply module'
module = 'sale_supply'
extras = ['stock_supply']
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,27 @@
[tryton]
version=7.8.0
depends:
ir
purchase
purchase_request
sale
stock
extras_depend:
stock_supply
xml:
product.xml
sale.xml
message.xml
[register]
model:
product.Template
product.Product
sale.Sale
sale.Line
purchase.Request
stock.ShipmentIn
[register stock_supply]
model:
stock.OrderPoint

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="/form/notebook/page/field[@name='shipping_date']"
position="after">
<label name="supply_state"/>
<field name="supply_state"/>
</xpath>
</data>

View File

@@ -0,0 +1,12 @@
<?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="/form/notebook/page[@id='suppliers']/field[@name='product_suppliers']"
position="before">
<label name="supply_on_sale"/>
<field name="supply_on_sale"/>
<newline/>
</xpath>
</data>