Sélectionner une révision Git
main.py 10,40 Kio
# Copyright 2021 Le Filament (<http://www.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 StringIO
import unidecode
from odoo import http
from odoo.http import request
from odoo.addons.web.controllers.main import content_disposition, serialize_exception
class ExportJournalCg(http.Controller):
# ------------------------------------------------------
# Routes
# ------------------------------------------------------
@http.route("/web/export_journal_cg/", type="http", auth="user")
@serialize_exception
def export_journal_cg(
self,
company_id,
date_start=False,
date_end=False,
date_creation_start=False,
date_creation_end=False,
partner_ids=False,
export_type="empty",
**kwargs
):
"""
Sélectionne les account.move.line correspondants aux journaux
et à la plage de date définis
Crée le lignes de valeurs
:param company_id: int
:param date_start: date
:param date_end: date
:param date_end: date
:param date_creation_start: date
:param date_creation_end: date
:param partner_ids: list
:param export_type: string
:return: file
"""
# Get accounts variables
company_id = request.env["res.company"].browse(int(company_id))
default_receivable_account_id = request.env.ref("l10n_fr.1_fr_pcg_recv")
contribution_cg_id = company_id.contribution_cg_id
# Journaux des UR et Fédé
# TODO: vérifier l'export des comptes de banque en sortie pour UR et Fédé
journal_fede_com_id = company_id.journal_fede_com_id
journal_fede_cae_id = company_id.journal_fede_cae_id
journal_ur_hdf_id = company_id.journal_ur_hdf_id
journal_ur_med_id = company_id.journal_ur_med_id
journal_ids = [
journal_fede_com_id.id,
journal_fede_cae_id.id,
journal_ur_hdf_id.id,
journal_ur_med_id.id,
]
product_adhesion_id = company_id.product_adhesion_id
journal_adhesion_id = company_id.journal_adhesion_id
# Selection des dates + pas d'export du journal UR / FEDE
domain = [
("partner_id", "!=", False),
("company_id", "=", company_id.id),
("parent_state", "=", "posted"),
]
if date_start and date_end:
domain += [
("date", ">=", date_start),
("date", "<=", date_end),
]
if date_creation_start and date_creation_end:
domain += [
("create_date", ">=", date_creation_start),
("create_date", "<=", date_creation_end),
]
if export_type == "empty":
domain += [("date_export", "=", False)]
# adds partner in domain
if partner_ids:
domain += [("partner_id", "in", list(map(int, partner_ids.split(","))))]
export_line_ids = request.env["account.move.line"].search(domain)
lines_to_export = []
for line in export_line_ids:
amount = self._move_amount(line)
direction = self._move_direction(line)
# Produit cotisation CG + Analytique
if line.product_id == contribution_cg_id:
amount_analytic = round(1 / 3 * amount, 2)
# Compte général
lines_to_export.append(
self._export_row(
line=line,
amount=amount,
direction=direction,
account=("7060" + line.partner_id.ur_id.code_ur),
)
)
# Lignes analytiques
lines_to_export.append(
self._export_row(
line=line,
amount=amount_analytic,
direction=direction,
account=("7060" + line.partner_id.ur_id.code_ur),
a_type="A",
analytic="010000",
)
)
# Produit Adhésion CG + Analytique + OD
elif line.product_id == product_adhesion_id:
# Compte général
lines_to_export.append(
self._export_row(
line=line,
amount=amount,
direction=direction,
journal="VE",
account="756200",
)
)
# Lignes analytiques
lines_to_export.append(
self._export_row(
line=line,
amount=amount,
direction=direction,
account="756200",
journal="VE",
a_type="A",
analytic="010000",
)
)
# OD Adhésion
lines_to_export.append(
self._export_row(
line=line,
amount=amount / 2,
direction=direction,
account=("4660" + line.partner_id.ur_id.code_ur),
journal="OD",
)
)
od_direction = "D" if direction == "C" else "C"
lines_to_export.append(
self._export_row(
line=line,
amount=amount / 2,
direction=od_direction,
account=("6581" + line.partner_id.ur_id.code_ur),
journal="OD",
)
)
lines_to_export.append(
self._export_row(
line=line,
amount=amount / 2,
direction=od_direction,
account=("6581" + line.partner_id.ur_id.code_ur),
journal="OD",
a_type="A",
analytic="010000",
)
)
# Compte client CG Scop - Adhésion & Cotisation journaux de vente
else:
if line.journal_id == journal_adhesion_id:
journal = "VE"
elif line.journal_id.type == "sale":
journal = line.journal_id.code
else:
journal = "EF"
if line.account_id == default_receivable_account_id:
account = ("4112" + line.partner_id.ur_id.code_ur)
adh_account = self._get_partner_number(line.partner_id)
else:
account = line.account_id.code
adh_account = ""
# Compte général
lines_to_export.append(
self._export_row(
line=line,
amount=amount,
direction=direction,
account=account,
adh_account=adh_account,
journal=journal,
)
)
line.write({"date_export": datetime.now()})
filename_ = "Export CG Scop - " + datetime.strftime(
datetime.now(), "%Y-%m-%d_%Hh%M"
)
return self.export_cg_csv(lines_to_export, filename_)
# ------------------------------------------------------
# Common function
# ------------------------------------------------------
def _export_row(
self,
line,
amount,
direction,
account=None,
adh_account=None,
a_type="G",
journal=None,
analytic=None,
):
# Sanitize N° Bordereau
reconciled_inv_ids = line.full_reconcile_id.reconciled_line_ids.mapped(
"move_id").filtered(lambda i: i.is_contribution)
if line.move_id.bordereau_id.name:
inv_num = line.move_id.bordereau_id.name
elif reconciled_inv_ids:
inv_num = reconciled_inv_ids[0].bordereau_id.name
else:
inv_num = ""
# Libellé
description = line.partner_id.name.upper()
if line.name:
description += " - " + line.name.upper()
description = unidecode.unidecode(description)
if journal:
journal_code = journal
else:
journal_code = line.journal_id.code
return [
line.move_id.name, # N° pièce
line.date, # Date pièce
line.date_maturity, # Date échéance
journal_code, # Journal
a_type, # Type d'écriture (général/analytique)
account, # Compte comptable
adh_account, # Num adh
description, # Libellé
direction, # Sens
amount, # Montant
inv_num, # N° Bordereau
analytic, # Code analytique
]
def _move_direction(self, line):
if line.credit > 0.0:
return "C"
else:
return "D"
def _move_amount(self, line):
if line.credit > 0:
return line.credit
else:
return line.debit
def _get_partner_number(self, partner):
if partner.member_number:
number = partner.member_number + "00"
prefix = 8 - len(number)
return (prefix * "0") + number
else:
return ""
def export_cg_csv(self, lines_to_export, filename_):
fp = StringIO()
export_file = csv.writer(
fp,
delimiter=";",
dialect="excel",
)
# Add header line
for line in lines_to_export:
# Format date value
line_values = [
value if not isinstance(value, date) else value.strftime("%d/%m/%Y")
for value in line
]
export_file.writerow(line_values)
fp.seek(0)
data = fp.read()
fp.close()
filename = filename_ + ".txt"
csvhttpheaders = [
("Content-Type", "text/plain;charset=iso-8859-1"),
("Content-Disposition", content_disposition(filename)),
]
return request.make_response(data, headers=csvhttpheaders)