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

# -*- 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