forked from Mapan/odoo17e
142 lines
6.7 KiB
Python
142 lines
6.7 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
from odoo import models, api
|
|
|
|
|
|
class ReportSaleDetails(models.AbstractModel):
|
|
_inherit = "report.point_of_sale.report_saledetails"
|
|
|
|
@api.model
|
|
def get_sale_details(
|
|
self, date_start=False, date_stop=False, config_ids=False, session_ids=False
|
|
):
|
|
data = super().get_sale_details(
|
|
date_start, date_stop, config_ids, session_ids
|
|
)
|
|
sessions = []
|
|
configs = []
|
|
if config_ids:
|
|
configs = self.env['pos.config'].search([('id', 'in', config_ids)])
|
|
if session_ids:
|
|
sessions = self.env['pos.session'].search([('id', 'in', session_ids)])
|
|
else:
|
|
sessions = self.env['pos.session'].search(
|
|
[('config_id', 'in', configs.ids), ('start_at', '>=', date_start), ('stop_at', '<=', date_stop)])
|
|
else:
|
|
sessions = self.env['pos.session'].search([('id', 'in', session_ids)])
|
|
for session in sessions:
|
|
configs.append(session.config_id)
|
|
|
|
totalPaymentsAmount = 0
|
|
for session in sessions:
|
|
totalPaymentsAmount += session.total_payments_amount
|
|
|
|
if len(sessions) == 1:
|
|
session = sessions[0]
|
|
if session.config_id.iface_fiscal_data_module:
|
|
data = self._set_default_belgian_taxes_if_empty(data, "taxes")
|
|
data = self._set_default_belgian_taxes_if_empty(data, "refund_taxes")
|
|
report_update = {
|
|
"isBelgium": session.config_id.iface_fiscal_data_module.id,
|
|
"cashier_name": session.user_id.name,
|
|
"insz_or_bis_number": session.user_id.insz_or_bis_number,
|
|
"NS_number": len(
|
|
self.env["pos.order"].search(
|
|
[("session_id", "=", session.id), ("amount_total", ">=", 0)]
|
|
)
|
|
),
|
|
"NR_number": len(
|
|
self.env["pos.order"].search(
|
|
[("session_id", "=", session.id), ("amount_total", "<", 0)]
|
|
)
|
|
),
|
|
"PS_number": session.pro_forma_sales_number,
|
|
"PS_amount": session.pro_forma_sales_amount,
|
|
"PR_number": session.pro_forma_refund_number,
|
|
"PR_amount": session.pro_forma_refund_amount,
|
|
"Positive_discount_number": len(
|
|
self.env["pos.order"]
|
|
.search(
|
|
[("session_id", "=", session.id), ("amount_total", ">=", 0)]
|
|
)
|
|
.filtered(lambda o: o.lines.filtered(lambda l: l.discount > 0))
|
|
),
|
|
"Negative_discount_number": len(
|
|
self.env["pos.order"]
|
|
.search(
|
|
[("session_id", "=", session.id), ("amount_total", "<", 0)]
|
|
)
|
|
.filtered(lambda o: o.lines.filtered(lambda l: l.discount > 0))
|
|
),
|
|
"Positive_discount_amount": session.get_total_discount_positive_negative(
|
|
True
|
|
),
|
|
"Negative_discount_amount": session.get_total_discount_positive_negative(
|
|
False
|
|
),
|
|
"Correction_number": len(
|
|
session.order_ids.filtered(
|
|
lambda o: o.amount_total > 0
|
|
).filtered(lambda o: o.lines.filtered(lambda l: l.qty < 0))
|
|
),
|
|
"Correction_amount": session._get_total_correction(),
|
|
"CashBoxStartAmount": session.cash_register_balance_start,
|
|
"CashBoxEndAmount": session.cash_register_balance_end_real,
|
|
"cashRegisterID": session.config_id.name,
|
|
"sequence": self.env["ir.sequence"].next_by_code(
|
|
"report.point_of_sale.report_saledetails.sequenceZ"
|
|
)
|
|
if session.state == "closed"
|
|
else self.env["ir.sequence"].next_by_code(
|
|
"report.point_of_sale.report_saledetails.sequenceX"
|
|
),
|
|
"CompanyVAT": session.company_id.vat,
|
|
"fdmID": session.config_id.certified_blackbox_identifier,
|
|
"CashBoxOpening": session.cash_box_opening_number,
|
|
}
|
|
data.update(report_update)
|
|
data["total_paid"] = totalPaymentsAmount
|
|
return data
|
|
|
|
def _get_product_total_amount(self, line):
|
|
return line.price_subtotal_incl
|
|
|
|
def _get_total_and_qty_per_category(self, categories):
|
|
res_cat, res_total = super()._get_total_and_qty_per_category(categories)
|
|
for cat in res_cat:
|
|
total_cat = 0
|
|
for product in cat['products']:
|
|
total_cat += product['total_paid']
|
|
cat['total'] = total_cat
|
|
unique_products = list({tuple(sorted(product.items())): product for category in categories for product in category['products']}.values())
|
|
res_total['total'] = sum(product['total_paid'] for product in unique_products)
|
|
return res_cat, res_total
|
|
|
|
def _set_default_belgian_taxes_if_empty(self, data, taxes_name):
|
|
for tax in data[taxes_name]:
|
|
tax_used = self.env['account.tax'].search([('name', '=', tax['name'])])
|
|
tax['identification_letter'] = tax_used.identification_letter
|
|
|
|
letter_set = ['A', 'B', 'C', 'D']
|
|
for tax in data[taxes_name]:
|
|
if tax['identification_letter'] in letter_set:
|
|
letter_set.remove(tax['identification_letter'])
|
|
|
|
for letter in letter_set:
|
|
if letter == 'A':
|
|
data[taxes_name].append({'name': '21%', 'tax_amount': 0.0, 'base_amount': 0.0,
|
|
'identification_letter': letter})
|
|
if letter == 'B':
|
|
data[taxes_name].append({'name': '12%', 'tax_amount': 0.0, 'base_amount': 0.0,
|
|
'identification_letter': letter})
|
|
if letter == 'C':
|
|
data[taxes_name].append({'name': '6%', 'tax_amount': 0.0, 'base_amount': 0.0,
|
|
'identification_letter': letter})
|
|
if letter == 'D':
|
|
data[taxes_name].append({'name': '0%', 'tax_amount': 0.0, 'base_amount': 0.0,
|
|
'identification_letter': letter})
|
|
data[taxes_name] = sorted(data[taxes_name], key=lambda d: d['identification_letter'], reverse=True)
|
|
|
|
return data
|