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.5 KiB

# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
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