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
0
Issues
0
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
Alexis AOUN
third-party
Commits
301b9756
Commit
301b9756
authored
3 years ago
by
François
Committed by
Alexis Aoun
3 years ago
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Allow Special FTOP to easy validate shift (and eslint auto fix)
parent
96403dcd
Show whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
128 additions
and
34 deletions
+128
-34
models.py
members/models.py
+38
-0
members.js
members/static/js/members.js
+28
-18
views.py
members/views.py
+14
-1
orders_helper.js
orders/static/js/orders_helper.js
+43
-12
config.md
outils/config.md
+4
-1
all_common.js
outils/static/js/all_common.js
+1
-2
No files found.
members/models.py
View file @
301b9756
...
...
@@ -1176,6 +1176,44 @@ class CagetteServices(models.Model):
result
[
'service_found'
]
=
False
return
result
@staticmethod
def
easy_validate_shift_presence
(
coop_id
):
"""Add a presence point if the request is valid."""
res
=
{}
try
:
api
=
OdooAPI
()
# let verify coop_id is corresponding to a ftop subscriber
cond
=
[[
'id'
,
'='
,
coop_id
]]
fields
=
[
'shift_type'
]
coop
=
api
.
search_read
(
'res.partner'
,
cond
,
fields
)
if
coop
:
if
coop
[
0
][
'shift_type'
]
==
'ftop'
:
evt_name
=
getattr
(
settings
,
'ENTRANCE_ADD_PT_EVENT_NAME'
,
'Validation service comité'
)
c
=
[[
'partner_id'
,
'='
,
coop_id
],
[
'name'
,
'='
,
evt_name
]]
f
=
[
'create_date'
]
last_point_mvts
=
api
.
search_read
(
'shift.counter.event'
,
c
,
f
,
order
=
"create_date DESC"
,
limit
=
1
)
ok_for_adding_pt
=
False
if
len
(
last_point_mvts
):
now
=
datetime
.
datetime
.
now
()
past
=
datetime
.
datetime
.
strptime
(
last_point_mvts
[
0
][
'create_date'
],
'
%
Y-
%
m-
%
d
%
H:
%
M:
%
S'
)
if
(
now
-
past
)
.
total_seconds
()
>=
3600
*
24
:
ok_for_adding_pt
=
True
else
:
ok_for_adding_pt
=
True
if
ok_for_adding_pt
is
True
:
res
[
'evt_id'
]
=
CagetteMember
(
coop_id
)
.
add_pts
(
'ftop'
,
1
,
evt_name
)
else
:
res
[
'error'
]
=
"One point has been added less then 24 hours ago"
else
:
res
[
'error'
]
=
"Unallowed coop"
else
:
res
[
'error'
]
=
"Invalid coop id"
except
Exception
as
e
:
coop_logger
.
error
(
"easy_validate_shift_presence :
%
s
%
s"
,
str
(
coop_id
),
str
(
e
))
return
res
class
CagetteUser
(
models
.
Model
):
@staticmethod
...
...
This diff is collapsed.
Click to expand it.
members/static/js/members.js
View file @
301b9756
...
...
@@ -24,6 +24,8 @@ var current_displayed_member = null,
rattrapage_ou_volant
=
null
,
timeout_counter
=
null
;
var
search_button
=
$
(
'.btn--primary.search'
);
var
sm_search_member_button
=
$
(
'#sm_search_member_button'
),
sm_search_member_input
=
$
(
'#sm_search_member_input'
);
var
loading2
=
$
(
'.loading2'
);
var
search_field
=
$
(
'input[name="search_string"]'
);
var
shift_title
=
$
(
'#current_shift_title'
);
...
...
@@ -163,7 +165,7 @@ function canSearch() {
function
search_member
(
force_search
=
false
)
{
chars
=
[];
// to prevent false "as barcode-reader" input
operator
=
null
operator
=
null
;
if
(
canSearch
()
||
force_search
)
{
html_elts
.
member_slide
.
hide
();
...
...
@@ -281,11 +283,15 @@ function fill_service_entry(s) {
rattrapage_wanted
.
show
();
}
function
clean_se
rvice_entry
()
{
function
clean_se
arch_for_easy_validate_zone
()
{
$
(
'.search_member_results_area'
).
hide
();
$
(
'.search_member_results'
).
empty
();
$
(
'#sm_search_member_input'
).
val
(
''
);
operator
=
null
sm_search_member_input
.
val
(
''
);
operator
=
null
;
}
function
clean_service_entry
()
{
clean_search_for_easy_validate_zone
();
rattrapage_wanted
.
hide
();
shift_title
.
text
(
''
);
shift_members
.
html
(
''
);
...
...
@@ -681,20 +687,20 @@ function ask_for_easy_shift_validation() {
post_form
(
'/members/easy_validate_shift_presence'
,
{
coop_id
:
operator
.
id
,
coop_id
:
operator
.
id
},
function
(
err
,
result
)
{
console
.
log
(
result
);
if
(
!
err
)
{
if
(
typeof
(
result
.
msg
)
!=
"undefined"
)
{
alert
(
result
.
msg
);
}
else
if
(
result
.
action
===
null
)
{
console
.
log
(
'ok'
)
}
alert
(
"1 point volant vient d'être ajouté."
);
clean_search_for_easy_validate_zone
();
closeModal
();
}
else
{
console
.
log
(
err
)
if
(
typeof
(
err
.
responseJSON
)
!=
"undefined"
&&
typeof
(
err
.
responseJSON
.
error
)
!=
"undefined"
)
{
alert
(
err
.
responseJSON
.
error
);
}
else
{
console
.
log
(
err
);
}
}
}
);
...
...
@@ -723,13 +729,11 @@ function display_possible_members() {
+
'</button>'
;
$
(
'.search_member_results'
).
append
(
member_button
);
// Set action on click on a member button
$
(
'.btn_member'
).
on
(
'click'
,
function
()
{
for
(
member
of
members_search_results
)
{
if
(
member
.
id
==
$
(
this
).
attr
(
'member_id'
))
{
operator
=
member
;
// Enable validation button when operator is selected
ask_for_easy_shift_validation
();
break
;
...
...
@@ -784,7 +788,10 @@ $(document).ready(function() {
});
$
(
'#sm_search_member_form'
).
submit
(
function
()
{
let
search_str
=
$
(
'#sm_search_member_input'
).
val
();
if
(
is_time_to
(
'search_member'
,
1000
))
{
sm_search_member_button
.
empty
().
append
(
`<i class="fas fa-spinner fa-spin"></i>`
);
let
search_str
=
sm_search_member_input
.
val
();
$
.
ajax
({
url
:
'/members/search/'
+
search_str
,
dataType
:
'json'
,
...
...
@@ -792,7 +799,6 @@ $(document).ready(function() {
members_search_results
=
[];
for
(
member
of
data
.
res
)
{
console
.
log
(
member
)
if
(
member
.
shift_type
==
'ftop'
)
{
members_search_results
.
push
(
member
);
}
...
...
@@ -811,9 +817,13 @@ $(document).ready(function() {
globalPosition
:
"top right"
,
className
:
"error"
});
},
complete
:
function
()
{
sm_search_member_button
.
empty
().
append
(
`Recherche`
);
}
});
}
});
})
});
...
...
This diff is collapsed.
Click to expand it.
members/views.py
View file @
301b9756
...
...
@@ -286,7 +286,20 @@ def record_service_presence(request):
return
JsonResponse
({
'res'
:
res
})
def
easy_validate_shift_presence
(
request
):
return
JsonResponse
({})
"""Add a presence point if the request is valid."""
res
=
{}
try
:
coop_id
=
int
(
request
.
POST
.
get
(
"coop_id"
,
"nan"
))
res
=
CagetteServices
.
easy_validate_shift_presence
(
coop_id
)
except
Exception
as
e
:
res
[
'error'
]
=
str
(
e
)
if
'error'
in
res
:
if
res
[
'error'
]
==
"One point has been added less then 24 hours ago"
:
# TODO : use translation (all project wide)
res
[
'error'
]
=
"Vous ne pouvez pas valider plus d'un service par 24h"
return
JsonResponse
(
res
,
status
=
500
)
else
:
return
JsonResponse
(
res
,
safe
=
False
)
def
record_absences
(
request
):
return
JsonResponse
({
'res'
:
CagetteServices
.
record_absences
()})
...
...
This diff is collapsed.
Click to expand it.
orders/static/js/orders_helper.js
View file @
301b9756
...
...
@@ -119,6 +119,7 @@ function add_product() {
contentType
:
"application/json; charset=utf-8"
,
success
:
function
(
data
)
{
let
res
=
data
.
products
[
0
];
if
(
typeof
res
.
id
!=
"undefined"
)
{
res
.
suppliersinfo
=
[];
res
.
default_code
=
' '
;
...
...
@@ -190,7 +191,8 @@ function check_products_data() {
}
);
clicked_order_pill
.
find
(
'.pill_order_name'
).
empty
().
append
(
`<i class="fas fa-spinner fa-spin"></i>`
);
clicked_order_pill
.
find
(
'.pill_order_name'
).
empty
()
.
append
(
`<i class="fas fa-spinner fa-spin"></i>`
);
$
.
ajax
({
type
:
'GET'
,
...
...
@@ -207,12 +209,14 @@ function check_products_data() {
// Override products data with new data (without suppliersinfo so we don't override qty)
const
updated_suppliersinfo
=
product
.
suppliersinfo
;
delete
product
.
suppliersinfo
;
products
[
p_index
]
=
{
...
products
[
p_index
],
...
product
};
// Update suppliers info
for
(
let
psi_index
in
products
[
p_index
].
suppliersinfo
)
{
const
updated_psi
=
updated_suppliersinfo
.
find
(
psi
=>
psi
.
supplier_id
==
products
[
p_index
].
suppliersinfo
[
psi_index
].
supplier_id
);
if
(
updated_psi
!==
undefined
)
{
products
[
p_index
].
suppliersinfo
[
psi_index
].
package_qty
=
updated_psi
.
package_qty
;
products
[
p_index
].
suppliersinfo
[
psi_index
].
price
=
updated_psi
.
price
;
...
...
@@ -278,6 +282,7 @@ function add_supplier() {
selected_suppliers
.
push
(
supplier
);
let
url
=
"/orders/get_supplier_products"
;
url
+=
"?sids="
+
encodeURIComponent
(
supplier
.
id
);
// Fetch supplier products
...
...
@@ -485,6 +490,7 @@ function _compute_total_values_by_supplier() {
let
supplier_index
=
selected_suppliers
.
findIndex
(
s
=>
s
.
id
==
supinfo
.
supplier_id
);
let
product_supplier_value
=
(
'qty'
in
supinfo
)
?
supinfo
.
qty
*
supinfo
.
package_qty
*
supinfo
.
price
:
0
;
selected_suppliers
[
supplier_index
].
total_value
+=
product_supplier_value
;
}
}
...
...
@@ -589,7 +595,8 @@ function generate_inventory() {
modal_create_inventory
.
html
(),
()
=>
{
if
(
is_time_to
(
'validate_generate_inventory'
))
{
$
(
'#do_inventory'
).
empty
().
append
(
`<i class="fas fa-spinner fa-spin"></i>`
);
$
(
'#do_inventory'
).
empty
()
.
append
(
`<i class="fas fa-spinner fa-spin"></i>`
);
$
.
ajax
({
type
:
"POST"
,
url
:
"/inventory/generate_inventory_list"
,
...
...
@@ -602,7 +609,8 @@ function generate_inventory() {
// Give time for modal to fade
setTimeout
(
function
()
{
$
(
'#do_inventory'
).
empty
().
append
(
`Faire un inventaire`
);
$
(
'#do_inventory'
).
empty
()
.
append
(
`Faire un inventaire`
);
$
(
'#do_inventory'
).
notify
(
"Inventaire créé !"
,
{
...
...
@@ -613,7 +621,8 @@ function generate_inventory() {
},
200
);
},
error
:
function
(
data
)
{
$
(
'#do_inventory'
).
empty
().
append
(
`Faire un inventaire`
);
$
(
'#do_inventory'
).
empty
()
.
append
(
`Faire un inventaire`
);
let
msg
=
"erreur serveur lors de la création de l'inventaire"
.
err
=
{
msg
:
msg
,
ctx
:
'generate_inventory'
};
...
...
@@ -777,17 +786,19 @@ function create_orders() {
}
else
{
// Default date : tomorrow
let
date_object
=
new
Date
();
date_object
.
setDate
(
date_object
.
getDate
()
+
1
);
// Get ISO format bare string
formatted_date
=
date_object
.
toISOString
().
replace
(
'T'
,
' '
).
split
(
'.'
)[
0
];
formatted_date
=
date_object
.
toISOString
().
replace
(
'T'
,
' '
)
.
split
(
'.'
)[
0
];
}
// Create an entry for this supplier
orders_data
.
suppliers_data
[
supplier
.
id
]
=
{
date_planned
:
formatted_date
,
lines
:
[]
}
}
;
}
openModal
();
...
...
@@ -857,7 +868,7 @@ function create_orders() {
order_doc
.
_deleted
=
true
;
update_cdb_order
().
then
(()
=>
{
update_order_selection_screen
();
})
})
;
reset_data
();
switch_screen
(
'orders_created'
);
closeModal
();
...
...
@@ -933,7 +944,7 @@ function goto_main_screen(doc) {
update_cdb_order
();
update_main_screen
();
switch_screen
();
})
})
;
}
function
back
()
{
...
...
@@ -979,6 +990,7 @@ function display_suppliers() {
const
clicked_supplier
=
selected_suppliers
.
find
(
s
=>
s
.
id
==
supplier_id
);
let
modal_remove_supplier
=
$
(
'#templates #modal_remove_supplier'
);
modal_remove_supplier
.
find
(
".supplier_name"
).
text
(
clicked_supplier
.
display_name
);
openModal
(
...
...
@@ -1036,6 +1048,7 @@ function _compute_product_data(product) {
if
(
order_doc
.
coverage_days
!==
null
)
{
let
qty_not_covered
=
0
;
let
days_covered
=
0
;
if
(
product
.
daily_conso
!==
0
)
{
qty_not_covered
=
product
.
daily_conso
*
order_doc
.
coverage_days
-
product
.
qty_available
-
product
.
incoming_qty
-
purchase_qty
;
qty_not_covered
=
-
Math
.
ceil
(
qty_not_covered
);
// round up, so if a value is not fully covered display it
...
...
@@ -1265,8 +1278,20 @@ function display_products(params) {
stripeClasses
:
[],
// Remove datatable cells coloring
orderClasses
:
false
,
aLengthMenu
:
[
[
25
,
50
,
100
,
200
,
-
1
],
[
25
,
50
,
100
,
200
,
"Tout"
]
[
25
,
50
,
100
,
200
,
-
1
],
[
25
,
50
,
100
,
200
,
"Tout"
]
],
iDisplayLength
:
-
1
,
scrollX
:
true
,
...
...
@@ -1468,8 +1493,10 @@ function display_total_values() {
_compute_total_values_by_supplier
();
let
order_total_value
=
0
;
for
(
let
supplier
of
selected_suppliers
)
{
$
(
`#pill_supplier_
${
supplier
.
id
}
`
).
find
(
'.supplier_total_value'
).
text
(
parseFloat
(
supplier
.
total_value
).
toFixed
(
2
));
$
(
`#pill_supplier_
${
supplier
.
id
}
`
).
find
(
'.supplier_total_value'
)
.
text
(
parseFloat
(
supplier
.
total_value
).
toFixed
(
2
));
order_total_value
+=
supplier
.
total_value
;
}
...
...
@@ -1527,6 +1554,7 @@ function update_order_selection_screen() {
$
(
".order_pill"
).
off
();
let
existing_orders_container
=
$
(
"#existing_orders"
);
existing_orders_container
.
empty
();
$
(
'#new_order_name'
).
val
(
''
);
...
...
@@ -1535,6 +1563,7 @@ function update_order_selection_screen() {
}
else
{
for
(
let
row
of
result
.
rows
)
{
let
template
=
$
(
"#templates #order_pill_template"
);
template
.
find
(
".pill_order_name"
).
text
(
row
.
id
);
existing_orders_container
.
append
(
template
.
html
());
...
...
@@ -1698,6 +1727,7 @@ $(document).ready(function() {
$
(
'#create_orders'
).
on
(
'click'
,
function
()
{
if
(
is_time_to
(
'create_orders'
,
1000
))
{
let
modal_create_order
=
$
(
'#templates #modal_create_order'
);
modal_create_order
.
find
(
'.suppliers_date_planned_area'
).
empty
();
for
(
let
supplier
of
selected_suppliers
)
{
...
...
@@ -1723,7 +1753,8 @@ $(document).ready(function() {
// Add id to input once modal is displayed
for
(
let
supplier
of
selected_suppliers
)
{
$
(
`#modal #container_date_planned_supplier_
${
supplier
.
id
}
`
).
find
(
".supplier_date_planned"
).
attr
(
'id'
,
`date_planned_supplier_
${
supplier
.
id
}
`
);
$
(
`#modal #container_date_planned_supplier_
${
supplier
.
id
}
`
).
find
(
".supplier_date_planned"
)
.
attr
(
'id'
,
`date_planned_supplier_
${
supplier
.
id
}
`
);
}
$
(
"#modal .supplier_date_planned"
)
...
...
This diff is collapsed.
Click to expand it.
outils/config.md
View file @
301b9756
...
...
@@ -230,8 +230,11 @@
-
ENTRANCE_EXTRA_BUTTONS_DISPLAY = False (no button is shown above shift coop. list) (True if not set)
-
ENTRANCE_EASY_SHIFT_VALIDATE = False (default value)
When set to True allow coop to identify and have 1 point (only if FTOP)
-
ENTRANCE_EASY_SHIFT_VALIDATE = False (default value)
When set to True allow coop to identify and have 1 point (only if FTOP)
-
ENTRANCE_ADD_PT_EVENT_NAME = 'Add 1 point name throught easy validate' (default : 'Validation service comité'')
### Member space
-
EM_URL = ''
...
...
This diff is collapsed.
Click to expand it.
outils/static/js/all_common.js
View file @
301b9756
...
...
@@ -59,10 +59,9 @@ function post_form(url, data, callback) {
$
.
post
(
ajax_params
)
.
done
(
function
(
rData
)
{
callback
(
null
,
rData
);
})
.
fail
(
function
(
err
)
{
c
onsole
.
log
(
err
);
c
allback
(
err
,
{}
);
});
}
...
...
This diff is collapsed.
Click to expand it.
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