Skip to content
Snippets Groups Projects
Commit a2776655 authored by Benjamin - Le Filament's avatar Benjamin - Le Filament
Browse files

[add] export PCA lines

parent 7f433786
No related branches found
No related tags found
No related merge requests found
......@@ -3,3 +3,4 @@
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from . import models
from . import wizard
......@@ -17,6 +17,7 @@
'views/account_invoice_pcafae_line.xml',
'views/sale_order.xml',
'views/sale_order_pcafae_line.xml',
'views/menus.xml'
'views/menus.xml',
'wizard/pca_fae_export_wizard.xml',
],
}
......@@ -28,6 +28,8 @@ class AccountInvoicePcaFae(models.Model):
store=True,
default=False
)
pca_is_exported = fields.Boolean("PCA exporté ?", default=False)
pca_export_date = fields.Datetime("Date export PCA")
# ------------------------------------------------------
# Constrains function
......
......@@ -13,8 +13,12 @@
<group>
<field name="fiscal_year" readonly="1"/>
</group>
<group>
<field name="pca_is_exported" readonly="1"/>
<field name="pca_export_date" readonly="1"/>
</group>
</group>
<field name="invoice_pcafae_line_ids">
<field name="invoice_pcafae_line_ids" attrs="{'readonly': [('pca_export_date', '=', True)]}">
<tree editable="bottom">
<field name="year"/>
<field name="year_percent"/>
......@@ -46,6 +50,9 @@
<filter name="late" position="after">
<separator/>
<filter string="Non ventilé" name="is_weighted" domain="[('is_weighted','=',False)]"/>
<separator/>
<filter string="PCA exporté" name="pca_is_exported" domain="[('pca_is_exported','=',True)]"/>
<filter string="PCA non exporté" name="pca_is_not_exported" domain="[('is_weighted','=',False)]"/>
</filter>
</field>
</record>
......
# -*- coding: utf-8 -*-
# © 2020 Le Filament (<http://www.le-filament.com>)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from . import pca_fae_export_wizard
# -*- coding: utf-8 -*-
# Copyright 2019 Le Filament (<http://www.le-filament.com>)
# License GPL-3 or later (http://www.gnu.org/licenses/gpl.html).
from datetime import datetime
import csv
import re
from cStringIO import StringIO
from odoo import models, fields, api, http
from odoo.addons.web.controllers.main import serialize_exception
from odoo.addons.web.controllers.main import content_disposition
from odoo.http import request
from odoo.tools.misc import xlwt
HEADER_DEFAULT = [
'date',
'journal',
'compte',
'debit',
'credit',
'libelle',
'piece',
'echeance',
'ref_piece'
]
class PCAExportWizard(models.TransientModel):
_name = "pca.export.wizard"
_description = "Export des lignes PCA"
date_start = fields.Date('Date de début', required=True)
date_end = fields.Date(
string='Date de fin',
required=True,
default=datetime.today().strftime('%Y-%m-%d')
)
export_format = fields.Selection(
[('csv', 'CSV'), ('xls', 'Excel')],
string='Format', default="csv")
export_type = fields.Selection(
[('empty', 'Factures non exportées'), ('all', 'Toutes les factures')],
string='Factures à exporter', default="empty"
)
@api.multi
def get_data_file(self):
return {
'type': 'ir.actions.act_url',
'url': '/web/export_pca?format=%s&type=%s' %
(self.export_format, self.export_type) +
'&date_start=%s&date_end=%s' %
(self.date_start, self.date_end),
'target': 'new',
}
class PCAExportController(http.Controller):
def export_csv(self, lignes_export, header, filename_):
fp = StringIO()
export_file = csv.writer(fp, delimiter=';', quoting=csv.QUOTE_ALL)
# export_file.writerow(header)
row = []
for line in lignes_export:
row = []
for h in header:
if isinstance(line[h], unicode):
try:
value = line[h].encode('utf-8')
except UnicodeError:
pass
else:
if (h == 'date') or (h == 'echeance'):
if line[h]:
value = datetime.strptime(line[h], '%Y-%m-%d')\
.strftime('%d/%m/%Y')
else:
value = line[h]
elif (h == 'credit') or (h == 'debit'):
value = str(line[h]).replace('.', ',')
else:
value = line[h]
row.append(value)
export_file.writerow(row)
fp.seek(0)
data = fp.read()
fp.close()
filename = filename_ + '.csv'
csvhttpheaders = [
('Content-Type', 'text/csv;charset=utf8'),
('Content-Disposition', content_disposition(filename)),
]
return request.make_response(data, headers=csvhttpheaders)
def export_xls(self, lignes_export, header, filename_):
workbook = xlwt.Workbook()
worksheet = workbook.add_sheet(filename_)
header_file = header
for i, fieldname in enumerate(header_file):
worksheet.write(0, i, fieldname)
worksheet.col(i).width = 8000 # around 220 pixels
base_style = xlwt.easyxf('align: wrap yes')
for row_index, line in enumerate(lignes_export):
for cell_index, h in enumerate(header):
cell_style = base_style
if (h == 'date') or (h == 'echeance'):
if line[h]:
cell_value = datetime.strptime(line[h], '%Y-%m-%d')\
.strftime('%d/%m/%Y')
else:
cell_value = line[h]
elif (h == 'credit') or (h == 'debit'):
cell_value = line[h]
elif isinstance(line[h], basestring):
cell_value = re.sub("\r", " ", line[h])
else:
cell_value = line[h]
worksheet.write(row_index + 1, cell_index,
cell_value, cell_style)
fp = StringIO()
workbook.save(fp)
fp.seek(0)
data = fp.read()
fp.close()
filename = filename_ + '.xls'
csvhttpheaders = [
('Content-Type', 'text/csv;charset=utf8'),
('Content-Disposition', content_disposition(filename)),
]
return request.make_response(data, headers=csvhttpheaders)
def datas_export_ventes(self, format, type, date_start, date_end,):
header = HEADER_DEFAULT
lignes_export = []
# requete
domain = [
('date_invoice', '>=', date_start),
('date_invoice', '<=', date_end),
('state', 'in', ['open', 'paid']),
]
if type == 'empty':
domain += [('pca_is_exported', '!=', True)]
invoice_ids = request.env['account.invoice'].search(domain)
for invoice in invoice_ids:
for line in invoice.invoice_line_ids:
for pca in invoice.invoice_pcafae_line_ids:
if pca.year > invoice.fiscal_year:
lignes_export.append({
'date': invoice.date_invoice,
'journal': 'OD',
'compte': line.account_id.code,
'debit': line.price_subtotal_signed * pca.year_percent * 0.01,
'credit': 0.0,
'libelle': invoice.partner_id.name + ' - Facture ' + invoice.number + ' - ' + line.name,
'piece': invoice.number,
'echeance': invoice.date_due,
'ref_piece': invoice.number
})
lignes_export.append({
'date': invoice.date_invoice,
'journal': 'OD',
'compte': '487000',
'debit': 0.0,
'credit': line.price_subtotal_signed * pca.year_percent * 0.01,
'libelle': invoice.partner_id.name + ' - Facture ' + invoice.number + ' - ' + line.name,
'piece': invoice.number,
'echeance': invoice.date_due,
'ref_piece': invoice.number
})
invoice.update({
'pca_is_exported': True,
'pca_export_date': fields.Datetime.now()
})
company_name = request.env['res.company'].search([('id', '=', 1)]).name
filename_ = (company_name.title().replace(' ', '')
+ 'ExportPCA_' + date_start.replace('-', '')
+ '_' + date_end.replace('-', ''))
if format == 'csv':
return self.export_csv(lignes_export, header, filename_)
return self.export_xls(lignes_export, header, filename_)
@http.route('/web/export_pca/', type='http', auth="user")
@serialize_exception
def export_pca(self, format, type, date_start, date_end, **kw):
return self.datas_export_ventes(format, type, date_start, date_end,)
<?xml version="1.0" encoding="UTF-8"?>
<odoo>
<record id="pca_export_wizard_view_form" model="ir.ui.view">
<field name="name">pca.export.wizard.form</field>
<field name="model">pca.export.wizard</field>
<field name="arch" type="xml">
<form string="Export des données">
<group>
<group>
<field name="export_format" widget="radio" />
</group>
<group>
<field name="export_type" widget="radio" />
</group>
</group>
<group>
<group>
<field name="date_start"/>
</group>
<group>
<field name="date_end"/>
</group>
</group>
<footer>
<button class="btn btn-sm btn-primary" name="get_data_file" string="Télécharger" type="object"/>
<button class="btn btn-sm btn-default" special="cancel" string="Fermer"/>
</footer>
</form>
</field>
</record>
<record id="pca_export_wizard_action" model="ir.actions.act_window">
<field name="name">Export écritures PCA</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">pca.export.wizard</field>
<field name="view_mode">form</field>
<field name="view_id" ref="pca_export_wizard_view_form"/>
<field name="target">new</field>
</record>
<menuitem action="pca_export_wizard_action"
id="menu_pca_export_wizardt"
name="Export écritures PCA"
parent="lefilament_pca_fae.pca_fae_root_menu"
sequence="30" />
</odoo>
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment