views.py
10.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
from outils.common_imports import *
from outils.for_view_imports import *
from outils.common import OdooAPI
from orders.models import Order, Orders, CagetteSuppliers
from products.models import CagetteProduct, CagetteProducts
from openpyxl import Workbook
from openpyxl.writer.excel import save_virtual_workbook
import datetime
def as_text(value): return str(value) if value is not None else ""
def index(request):
return HttpResponse('Orders')
def helper(request):
context = {
'title': 'Aide à la commande',
'couchdb_server': settings.COUCHDB['url'],
'db': settings.COUCHDB['dbs']['orders'],
'odoo_server': getattr(settings, 'ODOO_PUBLIC_URL', settings.ODOO['url']),
'metabase_url': getattr(settings, 'ORDERS_HELPER_METABASE_URL', ''),
'nb_past_days_to_compute_sales_average': OdooAPI().get_system_param('lacagette_products.nb_past_days_to_compute_sales_average'),
'nb_of_consecutive_non_sale_days_considered_as_break': OdooAPI().get_system_param('lacagette_products.nb_of_consecutive_non_sale_days_considered_as_break')
}
template = loader.get_template('orders/helper.html')
return HttpResponse(template.render(context, request))
def get_suppliers(request):
""" Get suppliers list """
res = {}
try:
res = CagetteSuppliers.get_suppliers()
except Exception as e:
res["error"] = str(e)
return JsonResponse(res, status=500)
return JsonResponse({'res': res})
def get_supplier_products(request):
""" Get supplier products """
suppliers_id = request.GET.getlist('sids', '')
stats_from = request.GET.get('stats_from')
res = CagetteProducts.get_products_for_order_helper(suppliers_id, [], stats_from)
if 'error' in res:
return JsonResponse(res, status=500)
else:
return JsonResponse({'res': res})
def associate_supplier_to_product(request):
""" This product is now supplied by this supplier """
res = {}
data = json.loads(request.body.decode())
res = CagetteProduct.associate_supplier_to_product(data)
if 'error' in res:
return JsonResponse(res, status=500)
else:
return JsonResponse({'res': res})
return JsonResponse({'res': res})
def end_supplier_product_association(request):
""" This product is now unavailable from this supplier """
res = {}
data = json.loads(request.body.decode())
res = CagetteProduct.end_supplier_product_association(data)
if 'error' in res:
return JsonResponse(res, status=500)
else:
return JsonResponse({'res': res})
def create_orders(request):
""" Create products orders """
res = { "created": [] }
try:
data = json.loads(request.body.decode())
# suppliers id are keys in request data
for supplier_id in data["suppliers_data"].keys():
supplier_data = data["suppliers_data"][supplier_id]
res_created = Order.create(
supplier_id,
supplier_data["date_planned"],
supplier_data["lines"]
)
res["created"].append(res_created)
except Exception as e:
res["error"] = str(e)
return JsonResponse(res, status=500)
return JsonResponse({'res': res})
def get_orders_attachment(request):
""" Get order attachment: order file created after PO is finalized """
res = []
po_ids = request.GET.getlist('po_ids')
for id_po in po_ids:
m = Order(int(id_po))
attachment = m.get_order_attachment_id()
if 'error' in attachment:
res.append(attachment)
else:
res.append({
'id_po': id_po,
'id_attachment': attachment["id"]
})
for item in res:
if 'error' in item:
return JsonResponse(res, status=500, safe=False)
return JsonResponse({'res': res})
def export_one(request, oid):
msg = ''
try:
oid = int(oid)
order = Order(oid)
order_data = order.export()
if ('success' in order_data) and (order_data['success'] is True):
now = datetime.datetime.now()
taxes = 0
company_name = ''
if hasattr(settings, 'COMPANY_NAME'):
company_name = settings.COMPANY_NAME
wb = Workbook()
ws1 = wb.create_sheet("Commande " + order_data['order']['name'], 0)
ws1.merge_cells('A1:I1')
ws1.merge_cells('A2:I2')
ws1.merge_cells('A3:I3')
ws1['A1'].value = 'Date : ' + now.strftime("%d/%m/%Y")
ws1['A2'].value = 'Commande ' + company_name + ' / ' + order_data['order']['partner_id'][1]
ws1['A3'].value = 'Ref : ' + order_data['order']['name']
ws1.append([])
ws1.append(['Produit', 'Nb. colis', 'Colisage',
'Qté', 'Référence', 'code-barre','Prix Unitaire', 'Remise', 'Sous-total'])
for line in order_data['lines']:
taxes += line['price_tax']
ws1.append([line['product_id'][1], line['product_qty_package'], line['package_qty'],
line['product_qty'], line['supplier_code'], line['barcode'], line['price_unit'], line['discount'], line['price_subtotal']])
ws1.append([])
ws1.append(['', '', '', '', '', '', '', 'Montant HT', order_data['order']['amount_untaxed'], 'euros'])
ws1.append(['', '', '', '', '', '', '', 'Taxes', taxes, 'euros'])
ws1.append(['', '', '', '', '', '', '', 'Montant TTC', order_data['order']['amount_total'], 'euros'])
# "Auto fit" columns width to content
for column_cells in ws1.columns:
length = max(len(as_text(cell.value)) for cell in column_cells)
ws1.column_dimensions[column_cells[3].column_letter].width = length
partner_name = order_data['order']['partner_id'][1]
partner_name = partner_name.replace("/", "-").replace(" ", "-")
wb_name = 'commande_' + order_data['order']['name'] + "_" + partner_name + now.strftime("_%Y_%m_%d") + '.xlsx'
file_path = 'temp/' + wb_name
wb.save(filename=file_path)
order.attach_file(file_path)
msg = 'done'
# response = HttpResponse(content=save_virtual_workbook(wb),content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
# response['Content-Disposition'] = 'attachment; filename=' + wb_name
# return response
except Exception as e:
msg = str(e)
coop_logger.error("Order export error : %s", msg)
return JsonResponse({"msg": msg}, safe=False)
def export_regex(request, string):
return HttpResponse(string + '???')
# Get labels to print for each order (ids received in GET parameter separated by comas)
def get_pdf_labels(request):
import math
import io
from django.http import FileResponse
msg = ''
LABELS_PER_SHEET = 65 # 13 rows of 5
l_data = {'total': 0, 'details': []}
# Concatenate labels to print for each order received
order_ids = request.GET['oids'].split(",")
for id in order_ids:
order_l_data = Order(id).get_custom_barcode_labels_to_print()
if order_l_data['total'] > 0:
l_data['total'] += order_l_data['total']
l_data['details'] += order_l_data['details']
if l_data['total'] > 0:
try:
from .labels_pdf_generation import pdf_generate
sheets = []
labels = 0
for i in range(0, math.ceil((l_data['total']/LABELS_PER_SHEET))):
sheets.append([])
for l in l_data['details']:
if len(str(l['barcode'])) > 0:
# Dispatch all labels to print into sheets
nb_before_insert = labels
labels += l['product_qty']
first_sheet_2_insert = int(nb_before_insert / LABELS_PER_SHEET)
first_sheet_places_available = (first_sheet_2_insert + 1) * LABELS_PER_SHEET - nb_before_insert
left_to_insert = l['product_qty']
ean13 = l['barcode']
name = l['product_id'][1]
if first_sheet_places_available >= left_to_insert:
sheets[first_sheet_2_insert].append({"qty": left_to_insert, "ean13": ean13, "name": name})
else:
left_to_insert -= first_sheet_places_available
sheets[first_sheet_2_insert].append({"qty": first_sheet_places_available, "ean13": ean13, "name": name })
sheet_idx = first_sheet_2_insert + 1
while left_to_insert > 0:
if left_to_insert > 65:
qty = 65
else:
qty = left_to_insert
sheets[sheet_idx].append({"qty": qty, "ean13": ean13, "name": name })
left_to_insert -= 65
sheet_idx += 1
pdf = pdf_generate(sheets)
return FileResponse(pdf, as_attachment=True, filename='codebarres.pdf')
except Exception as e:
msg = str(e)
else:
msg = "Nothing to do !"
return JsonResponse({"msg": msg}, safe=False)
def print_product_labels(request):
"""Orders ids are given as parameters, to print "own" product labels."""
res = {}
oids = []
try:
for oid in request.GET['oids'].split(","):
try:
oids.append(int(oid))
except:
pass # was not an int
if len(oids) >= 1:
ldatas = Orders.get_custom_barcode_labels_to_print(oids)
for tmpl_id, nb in ldatas.items():
pres = CagetteProduct.generate_label_for_printing(str(tmpl_id), '/product_labels/' , '0', str(nb))
if 'error' in pres:
if not ('errors' in res):
res['errors'] = []
res['errors'].append(pres)
except Exception as e:
res['error_ext'] = str(e)
return JsonResponse({'res': res}, safe=False)