Skip to Content
Menu
This question has been flagged

Hello,

I'm trying to create a product from Form sale\.order\.line,\ from\ an\ other\ existant\ product\.

If\ i'm\ taking\ a\ sale\.order\.line\ that\ exist\ it\ works,\ but\ if\ i'm\ trying\ to\ Add\ a\ new\ product\ i'm\ taking\ an\ error\.

Following\ you\ will\ find\ my\ code\ :


Code

/\#\ \-\*\-\ coding:\ utf\-8\ \-\*\-

from\ odoo\ import\ api,\ fields,\ models,\ tools,\ _,\ SUPERUSER_ID
from\ odoo\.exceptions\ import\ ValidationError,\ RedirectWarning,\ UserError
from\ odoo\.osv\ import\ expression
import\ logging

_logger\ =\ logging\.getLogger\(__name__\)

class\ SaleOrderLineNU\(models\.Model\):
\ \ \ \ \#\ \ Bug\ At\ least\ one\ model\ cache\ has\ been\ invalidated,\ signaling\ through\ the\ database
\ \ \ \ cutLength\ =\ fields\.Float\(string='Cut\ Length',\ digits=\(2,\ 0\)\)
\ \ \ \ length\ =\ fields\.Float\(string='Length',\ digits=\(2,\ 0\)\)

\ \ \ \ _inherit\ =\ "sale\.order\.line"

\ \ \ \ def\ majPrice\(self,\ line,\ qty=False\):
\ \ \ \ \ \ \ \ mrp_bom\ =\ self\.env\['mrp\.bom'\]\ \ \#\ recuperation\ fichier\ python
\ \ \ \ \ \ \ \ bom_report\ =\ self\.env\['report\.mrp\.report_bom_structure'\]\ \ \#\ recuperation\ fichier\ python
\ \ \ \ \ \ \ \ if\ line\.product_id\ and\ line\.product_uom_qty:\ \ \#\ si\ un\ produit\ avec\ identifiant\ et\ qty
\ \ \ \ \ \ \ \ \ \ \ \ bom\ =\ mrp_bom\._bom_find\(products=line\.product_id\)\ \ \#\ recuperation\ du\ resultat\ de\ la\ fonction\ _bom_find
\ \ \ \ \ \ \ \ \ \ \ \ if\ bom:
\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ price\ =\ bom_report\._get_bom\(
\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ bom_id=bom\[line\.product_id\]\.id,\ product_id=str\(line\.product_id\.id\),
\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ line_qty=line\.product_uom_qty,\ line_id=False,
\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ level=False\)\['total'\]\ /\ line\.product_uom_qty\ \ \#\ Recuperation\ du\ resultat\ de\ la\ fonction\ _get_bom\['total'\]/qty
\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \#\ \ _logger\.warning\("MAJ\ %s:\ %s",\ line\.product_uom_qty,\ price\)
\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ return\ price

\ \ \ \ @api\.onchange\('product_uom_qty'\)
\ \ \ \ def\ _compute_so_line_bom_price\(self,\ qty=False\):
\ \ \ \ \ \ \ \ """Compute:\ Product\ BoM\ Cost\ Price\.
\ \ \ \ \ \ \ \ \ \ \ \ Compute\ the\ BoM\ Cost\ Price\ using\ _bom_find\ method\ of\ MRP\ BoM\ object\ and
\ \ \ \ \ \ \ \ \ \ \ \ _get_bom\ method\ of\ BoM\ Structure\ and\ Cost\ Report
\ \ \ \ \ \ \ \ \ \ \ \ \(BoM\ >\ Smart\ Button:\ Structure\ \&\ Cost\)\.
\ \ \ \ \ \ \ \ \ \ \ \ put\ this\ price\ in\ purchase_price\ in\ order_line\ and\ standard_price\ in\ product
\ \ \ \ \ \ \ \ \ \ \ \ for\ pricelist\ calculation
\ \ \ \ \ \ \ \ \ \ \ \ :return:\ None
\ \ \ \ \ \ \ \ \ \ \ \ """

\ \ \ \ \ \ \ \ for\ res\ in\ self:\ \ \#\ pour\ chaque\ ligne
\ \ \ \ \ \ \ \ \ \ \ \ price\ =\ 0
\ \ \ \ \ \ \ \ \ \ \ \ price\ =\ SaleOrderLineNU\.majPrice\(self,\ res\)
\ \ \ \ \ \ \ \ \ \ \ \ self\.purchase_price\ =\ price\ \ \#\ Pousse\ le\ tarif\ dans\ le\ prix\ d'achat\ du\ devis
\ \ \ \ \ \ \ \ \ \ \ \ res\.product_id\.standard_price\ =\ price\ \ \#\ Pousse\ le\ tarif\ dans\ la\ fiche\ produit\ en\ coût\ pour\ calcul\ du\ prix\ de\ vente\ basé\ sur\ le\ coût

\ \ \ \ @api\.onchange\('product_id'\)
\ \ \ \ def\ recupBomInfoSale\(self\):
\ \ \ \ \ \ \ \ mrp_bom\ =\ self\.env\['mrp\.bom'\]\ \ \#\ recuperation\ fichier\ python
\ \ \ \ \ \ \ \ if\ self\.product_id\ and\ '5'\ in\ self\.product_id\.route_ids:\ \#\ a\ Verifier
\ \ \ \ \ \ \ \ \ \ \ \ bom\ =\ mrp_bom\._bom_find\(products=self\.product_id\)
\ \ \ \ \ \ \ \ \ \ \ \ if\ bom:
\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ len\(bom\[self\.product_id\]\.bom_line_ids\)\ ==\ 1:
\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ self\.length\ =\ bom\[self\.product_id\]\.bom_line_ids\.product_qty\ \*\ 1000\ \ \#\ ok

\ \ \ \ def\ cut_article\(self\):
\ \ \ \ \ \ \ \ DuplicateArticleNUprod\.createArticle\(self\)

class\ SaleOrder\(models\.Model\):

\ \ \ \ _inherit\ =\ "sale\.order"

\ \ \ \ @api\.onchange\('order_line'\)
\ \ \ \ def\ calculationQty1OnCreate\(self\):
\ \ \ \ \ \ \ \ sale_order_line\ =\ self\.env\['sale\.order\.line'\]\ \ \#\ recuperation\ fichier\ python
\ \ \ \ \ \ \ \ if\ self\.order_line\ !=\ 0:
\ \ \ \ \ \ \ \ \ \ \ \ for\ res\ in\ self\.order_line:
\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ res\.product_uom_qty\ ==\ 1:

\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ price\ =\ SaleOrderLineNU\.majPrice\(self\.order_line,\ res\)
\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ res\.purchase_price\ =\ price\ \ \#\ Pousse\ le\ tarif\ dans\ le\ prix\ d'achat\ du\ devis
\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ res\.product_id\.standard_price\ =\ price\ \ \#\ Pousse\ le\ tarif\ dans\ la\ fiche\ produit\ en\ coût\ pour\ calcul\ du\ prix\ de\ vente\ basé\ sur\ le\ coût
\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ sale_order_line\._onchange_discount\(\)\ \ \#\ MAJ\ du\ tarif

class\ DuplicateArticleNUprod\(models\.Model\):

\ \ \ \ _inherit\ =\ "product\.product"
\ \ \ \ \#\ \ Bug\ si\ order_line\ n'existe\ pas\ il\ faut\ donc\ ajouter\ un\ article\ au\ devis\ le\ sauvegarder\ et\ aprés\ modifier\ cet\ article
\ \ \ \ def\ createArticle\(self\):

\ \ \ \ \ \ \ \ productModule\ =\ self\.env\['product\.template'\]
\ \ \ \ \ \ \ \ newProduct\ =\ productModule\.create\(\[\{
\ \ \ \ \ \ \ \ \ \ \ \ 'name':\ _\('Coupe\ de\ %s\ L:%s',\ self\.product_id\.name,\ int\(self\.cutLength\)\),
\ \ \ \ \ \ \ \ \ \ \ \ 'sale_ok':\ True,
\ \ \ \ \ \ \ \ \ \ \ \ 'detailed_type':\ 'product',
\ \ \ \ \ \ \ \ \ \ \ \ 'default_code':\ self\.product_id\.default_code\ \+\ '/'\ \+\ str\(int\(self\.cutLength\)\),
\ \ \ \ \ \ \ \ \ \ \ \ 'route_ids':\ \[5\],
\ \ \ \ \ \ \ \ \ \ \ \ 'uom_id':\ 1,
\ \ \ \ \ \ \ \ \ \ \ \ 'purchase_ok':\ False,
\ \ \ \ \ \ \ \ \ \ \ \ 'categ_id':self\.product_id\.categ_id\.id,
\ \ \ \ \ \ \ \ \}\]\)

\ \ \ \ \ \ \ \ bomModule\ =\ self\.env\['mrp\.bom'\]
\ \ \ \ \ \ \ \ bomId\ =\ bomModule\.create\(\[\{
\ \ \ \ \ \ \ \ \ \ \ \ 'product_tmpl_id':\ newProduct\.id,
\ \ \ \ \ \ \ \ \ \ \ \ 'product_qty':\ 1,
\ \ \ \ \ \ \ \ \ \ \ \ 'code':\ newProduct\.name,
\ \ \ \ \ \ \ \ \ \ \ \ 'type':\ 'normal',
\ \ \ \ \ \ \ \ \ \ \ \ 'operation_ids':\ \[
\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(0,\ 0,\ \{
\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 'name':\ 'Sciage',
\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 'workcenter_id':\ 1,
\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 'time_cycle_manual':\ 3,
\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 'sequence':\ 1,
\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}
\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \),
\ \ \ \ \ \ \ \ \ \ \ \ \]
\ \ \ \ \ \ \ \ \}\]\)

\ \ \ \ \ \ \ \ bomLineModule\ =\ self\.env\['mrp\.bom\.line'\]
\ \ \ \ \ \ \ \ bomLineModule\.create\(\[\{
\ \ \ \ \ \ \ \ \ \ \ \ 'bom_id':\ bomId\.id,
\ \ \ \ \ \ \ \ \ \ \ \ 'product_id':\ self\.product_id\.id,
\ \ \ \ \ \ \ \ \ \ \ \ 'product_tmpl_id':\ self\.product_id\.product_tmpl_id\.id,
\ \ \ \ \ \ \ \ \ \ \ \ 'product_qty':\ self\.cutLength\ /\ 1000,
\ \ \ \ \ \ \ \ \}\]\)

\ \ \ \ \ \ \ \ return\ True


Error

2021\-12\-07\ 23:00:38,125\ 28644\ ERROR\ FMB011221\ odoo\.sql_db:\ bad\ query:\ INSERT\ INTO\ "sale_order_line"\ \("id",\ "create_date",\ "create_uid",\ "customer_lead",\ "cutLength",\ "discount",\ "display_type",\ "invoice_status",\ "is_delivery",\ "length",\ "name",\ "price_unit",\ "product_id",\ "product_packaging_id",\ "product_packaging_qty",\ "product_uom",\ "product_uom_qty",\ "purchase_price",\ "qty_delivered",\ "qty_delivered_manual",\ "route_id",\ "sequence",\ "write_date",\ "write_uid"\)\ VALUES\ \(nextval\('sale_order_line_id_seq'\),\ '2021\-12\-07\ 23:00:38\.114232',\ 7,\ 0\.0,\ '567',\ '0\.00',\ NULL,\ 'no',\ false,\ '0',\ '\[TGF0208\.8\]\ TIGE\ \ FILETEE\ \ M20\ CLASS\ 8\.8',\ '0\.00',\ 234,\ NULL,\ 0\.0,\ 6,\ '1\.00',\ '0\.00',\ '0\.00',\ '0\.00',\ NULL,\ 12,\ '2021\-12\-07\ 23:00:38\.114232',\ 7\)\ RETURNING\ id
ERROR:\ null\ value\ in\ column\ "order_id"\ of\ relation\ "sale_order_line"\ violates\ not\-null\ constraint
DETAIL:\ \ Failing\ row\ contains\ \(110,\ null,\ \[TGF0208\.8\]\ TIGE\ \ FILETEE\ \ M20\ CLASS\ 8\.8,\ 12,\ no,\ 0\.00,\ null,\ null,\ null,\ null,\ null,\ null,\ 0\.00,\ 234,\ 1\.00,\ 6,\ null,\ 0\.00,\ 0\.00,\ null,\ null,\ null,\ null,\ null,\ null,\ null,\ null,\ null,\ null,\ null,\ 0,\ null,\ null,\ 0,\ 7,\ 2021\-12\-07\ 23:00:38\.114232,\ 7,\ 2021\-12\-07\ 23:00:38\.114232,\ null,\ null,\ null,\ 0\.00,\ f,\ 567,\ 0\)\.
\
2021\-12\-07\ 23:00:38,150\ 28644\ WARNING\ FMB011221\ odoo\.http:\ L'opération\ ne\ peut\ pas\ être\ terminée:
\-\ Créer\ /\ mettre\ à\ jour:\ un\ champ\ obligatoire\ n'est\ pas\ défini\.
\-\ Supprimer:\ un\ autre\ modèle\ nécessite\ la\ suppression\ de\ l'enregistrement\.\ Si\ possible,\ archivez\-le\.

Modèle:\ Sales\ Order\ Line\ \(sale.order.line), Champ : Order Reference (order_id) 


Can you help me?


Sincerely

Avatar
Discard
Related Posts Replies Views Activity
0
Jul 24
327
1
Apr 23
11462
0
Dec 21
859
1
Mar 24
13164
13
Oct 17
16666