You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
107 lines
4.4 KiB
107 lines
4.4 KiB
# -*- coding: utf-8 -*-
|
|
|
|
import logging
|
|
from datetime import timedelta
|
|
from functools import partial
|
|
from itertools import groupby
|
|
|
|
import psycopg2
|
|
import pytz
|
|
import re
|
|
|
|
from odoo import api, fields, models, tools, _
|
|
from odoo.tools import float_is_zero, float_round, float_repr, float_compare
|
|
from odoo.exceptions import ValidationError, UserError
|
|
from odoo.http import request
|
|
from odoo.osv.expression import AND
|
|
import base64
|
|
|
|
_logger = logging.getLogger(__name__)
|
|
|
|
|
|
class ReportSaleDetails(models.AbstractModel):
|
|
_name = 'report.advanced_pos_reports.report_pos_saledetails'
|
|
_description = 'Point of Sale Details'
|
|
|
|
@api.model
|
|
def get_sale_details(self, date_start=False, date_stop=False, user_ids=False):
|
|
domain = [('state', 'in', ['paid', 'invoiced', 'done'])]
|
|
|
|
if date_start:
|
|
date_start = fields.Datetime.from_string(date_start)
|
|
else:
|
|
user_tz = pytz.timezone(self.env.context.get('tz') or self.env.user.tz or 'UTC')
|
|
today = user_tz.localize(fields.Datetime.from_string(fields.Date.context_today(self)))
|
|
date_start = today.astimezone(pytz.timezone('UTC'))
|
|
|
|
if date_stop:
|
|
date_stop = fields.Datetime.from_string(date_stop)
|
|
if (date_stop < date_start):
|
|
date_stop = date_start + timedelta(days=1, seconds=-1)
|
|
else:
|
|
date_stop = date_start + timedelta(days=1, seconds=-1)
|
|
|
|
domain = AND([domain,
|
|
[('date_order', '>=', fields.Datetime.to_string(date_start)),
|
|
('date_order', '<=', fields.Datetime.to_string(date_stop))]
|
|
])
|
|
|
|
orders = self.env['pos.order'].search(domain)
|
|
orders_summary = []
|
|
amount_total = 0
|
|
amount_tax = 0
|
|
for user in user_ids:
|
|
total_sales = 0
|
|
total_tax = 0
|
|
orders_list = []
|
|
payments = []
|
|
categories = []
|
|
for order in orders.filtered(lambda x:x.user_id.id == user.id):
|
|
total_sales += order.amount_total
|
|
total_tax += order.amount_tax
|
|
amount_total += order.amount_total
|
|
amount_tax += order.amount_tax
|
|
orders_list.append(order.id)
|
|
if orders_list:
|
|
payment_ids = self.env["pos.payment"].search([('pos_order_id', 'in', orders_list)]).ids
|
|
if payment_ids:
|
|
self.env.cr.execute("""
|
|
SELECT method.name, sum(amount) total
|
|
FROM pos_payment AS payment,
|
|
pos_payment_method AS method
|
|
WHERE payment.payment_method_id = method.id
|
|
AND payment.id IN %s
|
|
GROUP BY method.name
|
|
""", (tuple(payment_ids),))
|
|
payments = self.env.cr.dictfetchall()
|
|
else:
|
|
payments = []
|
|
categ = self.env.cr.execute("""SELECT category.name,
|
|
sum(price_subtotal_incl) as amount FROM pos_order_line AS line,
|
|
pos_category AS category, product_product AS product INNER JOIN
|
|
product_template AS template ON product.product_tmpl_id = template.id
|
|
WHERE line.product_id = product.id
|
|
AND template.pos_categ_id = category.id
|
|
AND line.order_id IN %s
|
|
GROUP BY category.name ORDER BY amount DESC
|
|
""", (tuple(orders_list),))
|
|
categories = self.env.cr.dictfetchall()
|
|
orders_summary.append({'user': user.name, 'total_sales': total_sales, 'tax': total_tax,
|
|
'gross_total': total_sales, 'payments': payments, 'categories': categories})
|
|
user_currency = self.env.company.currency_id
|
|
|
|
return {
|
|
'currency_precision': user_currency.decimal_places,
|
|
'order_summary': orders_summary,
|
|
'users': user_ids,
|
|
'company_name': self.env.company.name,
|
|
'amount_total_without_tax': amount_total - amount_tax,
|
|
'amount_tax': amount_tax
|
|
}
|
|
|
|
@api.model
|
|
def _get_report_values(self, docids, data=None):
|
|
data = dict(data or {})
|
|
users = self.env['res.users'].browse(data['user_ids'])
|
|
data.update(self.get_sale_details(data['date_start'], data['date_stop'], users))
|
|
return data
|
|
|