flectra/addons/stock_ageing_report/report/stock_ageing_report.py
2018-08-21 12:24:37 +05:30

164 lines
7.6 KiB
Python

# Part of Flectra. See LICENSE file for full copyright and licensing details.
from flectra import api, models, _
from flectra.exceptions import UserError
from datetime import datetime, timedelta
from flectra.tools import DEFAULT_SERVER_DATETIME_FORMAT as DATETIME_FORMAT
class StockAgeingReport(models.AbstractModel):
_name = 'report.stock_ageing_report.stock_ageing_report_template'
@api.model
def get_report_values(self, docids, data=None):
if not data.get('form') or not self.env.context.get(
'active_model') or not self.env.context.get('active_id'):
raise UserError(
_("Form content is missing, this report cannot be printed."))
report = self.env['ir.actions.report']._get_report_from_name(
'stock_ageing_report.action_stock_ageing_report')
get_data = self._get_data(data)
return {
'doc_ids': docids,
'doc_model': report.model,
'docs': self,
'data': {
'company': [get_data['company_id']],
'branch': [get_data['branch_id']],
'warehouse': [get_data['warehouse_id']],
'location': [get_data['location_id']],
'product_category': [get_data['product_category_id']],
'product': [get_data['product_id']],
'period_length': [get_data['period_length']],
'date': [get_data['date']],
'period_list': get_data['period_list'],
'product_list': get_data['product_list']
}
}
def _get_product_wise_detail(self, product_ids, location_id, date,
period_length, branch_id, company_id):
product_list = []
date_1 = datetime.strftime(date, DATETIME_FORMAT)
date_2 = datetime.strftime(
date - timedelta(days=period_length), DATETIME_FORMAT)
date_3 = datetime.strftime(
date - timedelta(days=(period_length * 2)), DATETIME_FORMAT)
date_4 = datetime.strftime(
date - timedelta(days=(period_length * 3)), DATETIME_FORMAT)
date_5 = datetime.strftime(
date - timedelta(days=(period_length * 4)), DATETIME_FORMAT)
date_period = [date_1, date_2, date_3, date_4, date_5]
final_dates = [
(date, date_period[date_period.index(date) + 1] if
date_period.index(date) < 4 else date)
for date in date_period]
for product in product_ids:
qty_period_list = self.calculate_virtual_qty(
product, location_id, branch_id, company_id, final_dates)
product_dict = {'product_id': product.name_get()[0][1],
'qty_period_list': qty_period_list,
'qty_available': sum(qty_period_list),
'total_amount': sum(qty_period_list) *
product.list_price}
product_list.append(product_dict)
return product_list
def calculate_virtual_qty(self, product, location_id, branch_id,
company_id, date_range):
product_list = []
quant_obj = self.env['stock.quant']
move_obj = self.env['stock.move']
for date in date_range:
domain = []
to_date = False
from_date = date[0]
if date[0] != date[1]:
to_date = date[1]
domain += [('product_id', '=', product.id)]
if product.tracking != 'none':
domain += [('location_id', 'in', location_id.ids),
('in_date', '<=', from_date),
('branch_id', '=', branch_id.id),
('company_id', '=', company_id.id)]
if to_date:
domain += [('in_date', '>', to_date)]
virtual_available = sum(
[quant.quantity for quant in quant_obj.search(domain)])
print ("\n domain", domain)
else:
domain += ['|', ('location_id', 'in', location_id.ids),
('location_dest_id', 'in', location_id.ids),
('state', '=', 'done'), ('bal_qty', '>', 0),
('date', '<=', from_date),
('branch_dest_id', '=', branch_id.id),
('company_id', '=', company_id.id)]
if to_date:
domain += [('date', '>', to_date)]
virtual_available = sum(
[move.bal_qty for move in move_obj.search(domain)])
product_list.append(virtual_available)
return product_list
def _get_data(self, data):
domain = []
company_id = self.env['res.company'].browse(data['form']['company_id'])
branch_id = self.env['res.branch'].browse(data['form']['branch_id'])
warehouse_id = self.env['stock.warehouse'].browse(
data['form']['warehouse_id'])
location_id = self.env['stock.location'].browse(
data['form']['location_id'])
product_category_id = self.env['product.category'].browse(
data['form']['product_category_id'])
product_id = self.env['product.product'].browse(
data['form']['product_id'])
if not location_id:
location_id = self.env['stock.location'].search([
('company_id', '=', company_id.id),
('usage', '=', 'internal')])
period_length = data['form']['period_length']
date = datetime.strptime(data['form']['date'], DATETIME_FORMAT)
if product_id:
domain += [('id', 'in', product_id.ids)]
elif product_category_id:
domain += [('categ_id', 'in', product_category_id.ids),
('type', '=', 'product')]
else:
domain += [('qty_available', '>', 0)]
product_ids = self.env['product.product'].search(domain)
product_list = self._get_product_wise_detail(
product_ids, location_id, date, period_length, branch_id,
company_id)
warehouse = location = product_category = ''
if warehouse_id:
warehouse = ','.join(
wh.name_get()[0][1] for wh in
warehouse_id) if len(warehouse_id) > 1 else\
warehouse_id.name_get()[0][1]
if data['form']['location_id']:
location = ','.join(loc.name_get()[0][1] for loc in location_id) \
if len(location_id) > 1 else location_id.name_get()[0][1] or ''
if product_category_id:
product_category = ','.join(
categ.name_get()[0][1] for categ in product_category_id
) if len(product_category_id) > 1 else\
product_category_id.name_get()[0][1] or ''
period_list = ['0 - ' + str(period_length),
str(period_length) + ' - ' + str(period_length * 2),
str(period_length * 2) + ' - ' + str(period_length * 3),
str(period_length * 3) + ' - ' + str(period_length * 4),
' + ' + str(period_length * 4)]
data['form'].update({
'company_id': company_id,
'branch_id': branch_id,
'warehouse_id': warehouse or '',
'location_id': location or '',
'product_category_id': product_category or '',
'product_id': product_id or '',
'period_length': period_length,
'date': datetime.strftime(date, DATETIME_FORMAT),
'period_list': period_list,
'product_list': product_list})
return data['form']