Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
T
third-party
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
261
Issues
261
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Paul
third-party
Commits
d969d7c1
Commit
d969d7c1
authored
Jun 30, 2021
by
Damien Moulard
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
AAC: linting
parent
8ee8712f
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
76 additions
and
35 deletions
+76
-35
orders_helper.js
orders/static/js/orders_helper.js
+76
-35
No files found.
orders/static/js/orders_helper.js
View file @
d969d7c1
...
...
@@ -123,7 +123,7 @@ function add_product() {
update_main_screen
({
'sort_order_dir'
:
'desc'
});
update_cdb_order
();
}
else
{
alert
(
"L'article n'a pas toutes les caractéristiques pour être ajouté."
)
alert
(
"L'article n'a pas toutes les caractéristiques pour être ajouté."
)
;
}
$
(
"#product_input"
).
val
(
''
);
},
...
...
@@ -145,13 +145,17 @@ function add_product() {
* Set the computed qty for the first supplier only.
*/
function
compute_products_coverage_qties
()
{
for
(
const
[
key
,
product
]
of
Object
.
entries
(
products
))
{
for
(
const
[
key
,
product
]
of
Object
.
entries
(
products
))
{
let
purchase_qty_for_coverage
=
null
;
// Durée couverture produit = (stock + qté entrante + qté commandée ) / conso quotidienne
const
stock
=
product
.
qty_available
;
const
incoming_qty
=
product
.
incoming_qty
;
const
daily_conso
=
product
.
daily_conso
;
purchase_qty_for_coverage
=
order_doc
.
coverage_days
*
daily_conso
-
stock
-
incoming_qty
;
purchase_qty_for_coverage
=
(
purchase_qty_for_coverage
<
0
)
?
0
:
purchase_qty_for_coverage
;
...
...
@@ -204,6 +208,7 @@ function add_supplier() {
selected_suppliers
.
push
(
supplier
);
let
url
=
"/orders/get_supplier_products"
;
url
+=
"?sid="
+
encodeURIComponent
(
supplier
.
id
);
// Fetch supplier products
...
...
@@ -276,7 +281,8 @@ function save_supplier_product_association(product, supplier, cell) {
// If value is a number
if
(
isNaN
(
package_qty
)
||
isNaN
(
price
))
{
closeModal
();
alert
(
`Les champs "Prix" et "Colisage" doivent être remplis et valides. L'association n'a pas été sauvegardée.`
)
alert
(
`Les champs "Prix" et "Colisage" doivent être remplis et valides. L'association n'a pas été sauvegardée.`
);
return
-
1
;
}
...
...
@@ -284,7 +290,7 @@ function save_supplier_product_association(product, supplier, cell) {
product_tmpl_id
:
product
.
id
,
supplier_id
:
supplier
.
id
,
package_qty
:
package_qty
,
price
:
price
,
price
:
price
};
// Send request to create association
...
...
@@ -297,15 +303,15 @@ function save_supplier_product_association(product, supplier, cell) {
data
:
JSON
.
stringify
(
data
),
success
:
()
=>
{
// Save supplierinfo in product
if
(
!
'suppliersinfo'
in
product
)
{
product
.
suppliersinfo
=
[]
if
(
!
(
'suppliersinfo'
in
product
)
)
{
product
.
suppliersinfo
=
[]
;
}
product
.
suppliersinfo
.
push
({
supplier_id
:
supplier
.
id
,
package_qty
:
package_qty
,
price
:
price
})
})
;
// Save relation locally
save_supplier_products
(
supplier
,
[
product
]);
...
...
@@ -335,6 +341,8 @@ function save_supplier_product_association(product, supplier, cell) {
alert
(
'Erreur lors de la sauvegarde de l
\'
association. Veuillez ré-essayer plus tard.'
);
}
});
return
0
;
}
/**
...
...
@@ -420,6 +428,7 @@ function set_product_npa(p_id, npa) {
data
:
JSON
.
stringify
(
data
),
success
:
()
=>
{
const
index
=
products
.
findIndex
(
p
=>
p
.
id
==
p_id
);
products
[
index
].
purchase_ok
=
data
[
"purchase_ok"
];
update_cdb_order
();
...
...
@@ -656,7 +665,7 @@ function create_orders() {
'price_unit'
:
p_supplierinfo
.
price
,
'supplier_taxes_id'
:
p
.
supplier_taxes_id
,
'product_variant_ids'
:
p
.
product_variant_ids
})
})
;
}
}
}
...
...
@@ -664,6 +673,7 @@ function create_orders() {
if
(
Object
.
keys
(
orders_data
.
suppliers_data
).
length
===
0
)
{
closeModal
();
alert
(
"Commande non créée : vous n'avez rentré aucune quantité !"
);
return
-
1
;
}
...
...
@@ -685,9 +695,10 @@ function create_orders() {
'id'
:
new_order
.
id_po
,
'supplier_id'
:
new_order
.
supplier_id
,
'supplier_name'
:
supplier_name
})
})
;
let
new_order_template
=
$
(
"#templates #new_order_item_template"
);
new_order_template
.
find
(
".new_order_supplier_name"
).
text
(
supplier_name
);
new_order_template
.
find
(
".new_order_po"
).
text
(
`PO
${
new_order
.
id_po
}
`
);
new_order_template
.
find
(
".download_order_file_button"
).
attr
(
'id'
,
`download_attachment_
${
new_order
.
id_po
}
`
);
...
...
@@ -708,7 +719,8 @@ function create_orders() {
closeModal
();
},
error
:
function
(
data
)
{
let
msg
=
"erreur serveur lors de la création des product orders"
let
msg
=
"erreur serveur lors de la création des product orders"
;
err
=
{
msg
:
msg
,
ctx
:
'save_supplier_product_association'
,
data
:
orders_data
};
if
(
typeof
data
.
responseJSON
!=
'undefined'
&&
typeof
data
.
responseJSON
.
error
!=
'undefined'
)
{
err
.
msg
+=
' : '
+
data
.
responseJSON
.
error
;
...
...
@@ -719,6 +731,8 @@ function create_orders() {
alert
(
'Erreur lors de la création des commandes. Veuillez ré-essayer plus tard.'
);
}
});
return
0
;
}
/**
...
...
@@ -741,11 +755,11 @@ function get_order_attachments() {
contentType
:
"application/json; charset=utf-8"
,
success
:
function
(
data
)
{
for
(
let
res_po
of
data
.
res
)
{
$
(
`#download_attachment_
${
res_po
.
id_po
}
`
).
attr
(
'href'
,
`
${
odoo_server
}
/web/content/
${
res_po
.
id_attachment
}
?download=true`
)
$
(
`#download_attachment_
${
res_po
.
id_po
}
`
).
attr
(
'href'
,
`
${
odoo_server
}
/web/content/
${
res_po
.
id_attachment
}
?download=true`
)
;
}
$
(
'#created_orders_area .download_order_file_loading'
).
hide
()
$
(
'#created_orders_area .download_order_file_button'
).
show
()
$
(
'#created_orders_area .download_order_file_loading'
).
hide
()
;
$
(
'#created_orders_area .download_order_file_button'
).
show
()
;
},
error
:
function
()
{
$
.
notify
(
...
...
@@ -787,8 +801,10 @@ function back() {
* Create a string to represent a supplier column in product data
* @returns String
*/
function
supplier_column_name
(
supplier
)
{
const
supplier_id
=
(
'supplier_id'
in
supplier
)
?
supplier
.
supplier_id
:
supplier
.
id
function
supplier_column_name
(
supplier
)
{
const
supplier_id
=
(
'supplier_id'
in
supplier
)
?
supplier
.
supplier_id
:
supplier
.
id
;
return
`qty_supplier_
${
supplier_id
}
`
;
}
...
...
@@ -839,6 +855,7 @@ function _compute_product_data(product) {
for
(
let
p_supplierinfo
of
product
.
suppliersinfo
)
{
// Preset qty for input if product related to supplier: existing qty or null (null -> qty to be set, display an empty input)
let
supplier_qty
=
(
"qty"
in
p_supplierinfo
)
?
p_supplierinfo
.
qty
:
null
;
item
[
supplier_column_name
(
p_supplierinfo
)]
=
supplier_qty
;
// Update product's total qty to buy if qty set for this supplier
...
...
@@ -859,7 +876,7 @@ function _compute_product_data(product) {
}
}
if
(
p_package_qties
.
length
==
0
||
!
p_package_qties
.
every
(
(
val
,
i
,
arr
)
=>
val
===
arr
[
0
]
))
{
if
(
p_package_qties
.
length
==
0
||
!
p_package_qties
.
every
(
(
val
,
i
,
arr
)
=>
val
===
arr
[
0
]
))
{
// Don't display package qty if no supplierinf or if not all package qties are equals,
item
.
package_qty
=
'X'
;
}
else
{
...
...
@@ -870,6 +887,7 @@ function _compute_product_data(product) {
/* Coverage related data */
if
(
order_doc
.
coverage_days
!==
null
)
{
let
unmet_needs
=
product
.
daily_conso
*
order_doc
.
coverage_days
-
product
.
qty_available
-
product
.
incoming_qty
-
purchase_qty
;
unmet_needs
=
-
Math
.
round
(
unmet_needs
);
unmet_needs
=
(
unmet_needs
>
0
)
?
0
:
unmet_needs
;
...
...
@@ -878,7 +896,7 @@ function _compute_product_data(product) {
item
.
unmet_needs
=
'X'
;
}
return
item
return
item
;
}
/**
...
...
@@ -995,13 +1013,16 @@ function prepare_datatable_columns() {
if
(
full
.
package_qty
===
'X'
)
{
let
product_data
=
products
.
find
(
p
=>
p
.
id
==
full
.
id
);
if
(
product_data
!==
undefined
)
{
let
supplierinfo
=
product_data
.
suppliersinfo
.
find
(
psi
=>
psi
.
supplier_id
==
supplier
.
id
);
content
+=
`<span class="supplier_package_qty">Colisage :
${
supplierinfo
.
package_qty
}
</span>`
;
}
}
content
+=
`</div>`
content
+=
`</div>`
;
return
content
;
}
}
...
...
@@ -1060,6 +1081,7 @@ function display_products(params) {
const
data
=
prepare_datatable_data
();
const
columns
=
prepare_datatable_columns
();
let
sort_order_dir
=
"asc"
;
if
(
params
!=
undefined
&&
typeof
params
.
sort_order_dir
!=
"undefined"
)
{
sort_order_dir
=
params
.
sort_order_dir
;
}
...
...
@@ -1097,6 +1119,7 @@ function display_products(params) {
// On inputs change
$
(
'#products_table'
).
on
(
'change'
,
'tbody td .product_qty_input'
,
function
()
{
let
val
=
(
$
(
this
).
val
()
==
''
)
?
0
:
$
(
this
).
val
();
val
=
parseFloat
(
val
);
// If value is a number
...
...
@@ -1112,7 +1135,9 @@ function display_products(params) {
// Update row
const
product
=
products
.
find
(
p
=>
p
.
id
==
prod_id
);
const
new_row_data
=
prepare_datatable_data
([
product
.
id
])[
0
];
products_table
.
row
(
$
(
this
).
closest
(
'tr'
)).
data
(
new_row_data
).
draw
();
products_table
.
row
(
$
(
this
).
closest
(
'tr'
)).
data
(
new_row_data
)
.
draw
();
update_cdb_order
();
}
else
{
...
...
@@ -1150,6 +1175,7 @@ function display_products(params) {
// Find existing price in another supplierinfo
let
default_price
=
null
;
let
default_package_qty
=
1
;
// Default package qty is 1
for
(
let
psi
of
product
.
suppliersinfo
)
{
if
(
'price'
in
psi
&&
psi
.
price
!==
null
)
{
default_price
=
psi
.
price
;
...
...
@@ -1166,7 +1192,7 @@ function display_products(params) {
new_product_supplier_association
=
{
package_qty
:
default_package_qty
,
price
:
default_price
}
}
;
$
(
'.new_product_supplier_price'
).
on
(
'input'
,
function
()
{
new_product_supplier_association
.
price
=
$
(
this
).
val
();
...
...
@@ -1201,6 +1227,7 @@ function display_products(params) {
// Save / unsave selected row
const
p_id
=
products_table
.
row
(
$
(
this
).
closest
(
'tr'
)).
data
().
id
;
if
(
this
.
checked
)
{
selected_rows
.
push
(
p_id
);
}
else
{
...
...
@@ -1290,7 +1317,9 @@ function update_main_screen(params) {
if
(
order_doc
.
date_planned
!==
null
)
{
// Switch format from yy-mm-dd hh:mm:ss to readable dd/mm/yy
let
date_to_format
=
order_doc
.
date_planned
.
split
(
' '
)[
0
];
let
readable_date
=
date_to_format
.
split
(
'-'
).
reverse
().
join
(
'/'
);
let
readable_date
=
date_to_format
.
split
(
'-'
).
reverse
()
.
join
(
'/'
);
$
(
"#date_planned_input"
).
val
(
readable_date
);
}
else
{
$
(
"#date_planned_input"
).
val
(
''
);
...
...
@@ -1429,6 +1458,7 @@ $(document).ready(function() {
$
(
"#coverage_form"
).
on
(
"submit"
,
function
(
e
)
{
e
.
preventDefault
();
let
val
=
$
(
"#coverage_days_input"
).
val
();
val
=
parseInt
(
val
);
if
(
!
isNaN
(
val
))
{
...
...
@@ -1438,7 +1468,7 @@ $(document).ready(function() {
update_main_screen
();
}
else
{
$
(
"#coverage_days_input"
).
val
(
order_doc
.
coverage_days
);
alert
(
`Valeur non valide pour le nombre de jours de couverture !`
)
alert
(
`Valeur non valide pour le nombre de jours de couverture !`
)
;
}
});
...
...
@@ -1462,8 +1492,9 @@ $(document).ready(function() {
$
(
'#create_orders'
).
on
(
'click'
,
function
()
{
if
(
order_doc
.
date_planned
===
null
)
{
alert
(
"Veuillez rentrer une date de livraison prévue."
)
return
-
1
alert
(
"Veuillez rentrer une date de livraison prévue."
);
return
-
1
;
}
let
modal_create_order
=
$
(
'#templates #modal_create_order'
);
...
...
@@ -1476,6 +1507,8 @@ $(document).ready(function() {
'Valider'
,
false
);
return
0
;
});
$
.
datepicker
.
regional
[
'fr'
]
=
{
...
...
@@ -1502,12 +1535,13 @@ $(document).ready(function() {
'Ve'
,
'Sa'
],
dateFormat
:
date_format
,
dateFormat
:
date_format
};
$
.
datepicker
.
setDefaults
(
$
.
datepicker
.
regional
[
'fr'
]);
const
tomorrow
=
new
Date
()
tomorrow
.
setDate
(
tomorrow
.
getDate
()
+
1
)
const
tomorrow
=
new
Date
();
tomorrow
.
setDate
(
tomorrow
.
getDate
()
+
1
);
$
(
"#date_planned_input"
)
.
datepicker
({
...
...
@@ -1521,7 +1555,10 @@ $(document).ready(function() {
// No exception raised: date is valid.
// Change format from readable (dd/mm/yy) to ISO (yy-mm-dd)
let
formatted_date
=
$
(
this
).
val
().
split
(
'/'
).
reverse
().
join
(
'-'
)
+
' 00:00:00'
;
let
formatted_date
=
$
(
this
).
val
()
.
split
(
'/'
)
.
reverse
()
.
join
(
'-'
)
+
' 00:00:00'
;
// Update doc if changed
if
(
formatted_date
!==
order_doc
.
date_planned
)
{
...
...
@@ -1593,11 +1630,13 @@ $(document).ready(function() {
"ö"
:
"o"
};
var
normalize
=
function
(
term
)
{
var
normalize
=
function
(
term
)
{
var
ret
=
""
;
for
(
var
i
=
0
;
i
<
term
.
length
;
i
++
)
{
for
(
var
i
=
0
;
i
<
term
.
length
;
i
++
)
{
ret
+=
accentMap
[
term
.
charAt
(
i
)
]
||
term
.
charAt
(
i
);
}
return
ret
;
};
...
...
@@ -1612,12 +1651,14 @@ $(document).ready(function() {
// Set up autocomplete on product input
$
(
"#product_input"
).
autocomplete
({
source
:
function
(
request
,
response
)
{
var
matcher
=
new
RegExp
(
$
.
ui
.
autocomplete
.
escapeRegex
(
request
.
term
),
"i"
);
response
(
$
.
grep
(
products_list
.
map
(
a
=>
a
.
display_name
),
function
(
value
)
{
source
:
function
(
request
,
response
)
{
var
matcher
=
new
RegExp
(
$
.
ui
.
autocomplete
.
escapeRegex
(
request
.
term
),
"i"
);
response
(
$
.
grep
(
products_list
.
map
(
a
=>
a
.
display_name
),
function
(
value
)
{
value
=
value
.
label
||
value
.
value
||
value
;
return
matcher
.
test
(
value
)
||
matcher
.
test
(
normalize
(
value
)
);
})
);
return
matcher
.
test
(
value
)
||
matcher
.
test
(
normalize
(
value
));
}));
},
position
:
{
collision
:
"flip"
}
});
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment