Newer
Older
# Copyright 2020-2022 Le Filament (<https://le-filament.com>)
# License AGPL-3 or later (http://www.gnu.org/licenses/agpl.html).
import csv
from datetime import date, datetime
from io import BytesIO, StringIO
from odoo.addons.lefilament_export_journal_tool.controllers.main import JournalDatasExport
from odoo import http
from odoo.http import request
from odoo.tools.misc import xlwt
from odoo.tools.safe_eval import safe_eval
from odoo.addons.web.controllers.main import content_disposition, serialize_exception
class JournalDatasExport(JournalDatasExport):
# ------------------------------------------------------
# Routes
# ------------------------------------------------------
@http.route("/web/export_journal/", type="http", auth="user")
@serialize_exception
def export_journal(
self, export_format, export, export_type, date_start, date_end, **kwargs
):
"""
Sélectionne les account.move.line correspondants aux journaux
et à la plage de date définis
Crée le lignes de valeurs
:param export_format: xls/csv
:param export: id export.journal.type
:param export_type: empty (not already exported lines) / all
:param date_start: date
:param date_end: date
:return: file
"""
export_id = request.env["export.journal.type"].browse(int(export))
domain = [
("date", ">=", date_start),
("date", "<=", date_end),
("journal_id", "in", export_id.journal_ids.ids),
("company_id", "=", export_id.company_id.id),
]
if export_type == "empty":
domain += [("date_export", "=", False)]
if export_id.export_domain:
domain += safe_eval(export_id.export_domain)
export_line_ids = request.env["account.move.line"].search(domain)
export_line_grouped_by_invoice = {}
for el in export_line_ids:
if not export_line_grouped_by_invoice.get(el.move_id.name):
export_line_grouped_by_invoice[el.move_id.name] = []
export_line_grouped_by_invoice[el.move_id.name].append(el)
initial_sum_line = ['' for _ in range(len(export_id.fields_ids))]
sum_line = initial_sum_line[:]
big_sum_line = None
for invoice_name, move_lines in export_line_grouped_by_invoice.items():
for line in move_lines:
row = []
for key,field in enumerate(export_id.fields_ids):
if field.is_python:
value = safe_eval(field["field_name"], {"line": line}, mode="eval")
if field.is_sum and value:
if sum_line[key] == '':
sum_line[key] = 0
sum_line[key] += float(value)
else:
value = safe_eval(field["field_name"])
row.append(value)
lines_to_export.append(row)
line.write({"date_export": datetime.now()})
lines_to_export.append(sum_line)
if not big_sum_line:
# Initialise bigsum to the same size and value of the sum_line
# So it has not to be initialized with list of empty string
big_sum_line = sum_line[:]
else:
big_sum_line = [value + sum_line[i] for i, value in
enumerate(big_sum_line)]
sum_line = initial_sum_line[:]
else:
lines_to_export.append(big_sum_line)
filename_ = (
export_id.company_id.name.title().replace(" ", "")
+ date_start.replace("-", "")
+ "_"
+ date_end.replace("-", "")
)
if export_format == "csv":
return self.export_csv(export_id, lines_to_export, filename_)
elif export_format == "xls":
return self.export_xls(export_id, lines_to_export, filename_)
# ------------------------------------------------------
# Common function
# ------------------------------------------------------