1
0
forked from Mapan/odoo17e
odoo17e-kedaikipas58/addons/pos_blackbox_be/models/report_sale_details.py
2024-12-10 09:04:09 +07:00

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