Skip to content

Commit

Permalink
[Karthi] | BAH-3552 | Added. Active Product Statement reports has bee… (
Browse files Browse the repository at this point in the history
#92)

* [Karthi] | BAH-3552 | Added. Active Product Statement reports has been added.

* [Karthi] | BAH-3552 | Refactor. Drugs name has been changed to Product
  • Loading branch information
karthikeyansp91 authored Mar 15, 2024
1 parent 1939adb commit 9b2bcbc
Show file tree
Hide file tree
Showing 2 changed files with 208 additions and 0 deletions.
151 changes: 151 additions & 0 deletions bahmni_reports/report/active_product_statement.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,151 @@
from odoo import models, fields, api
import time
from datetime import datetime,date, timedelta
from odoo import api, fields, models, _
from odoo.exceptions import UserError
try:
from odoo.tools.misc import xlsxwriter
except ImportError:
import xlsxwriter
import io
import json
from odoo.tools import date_utils
from datetime import datetime,date, timedelta
from odoo import api, fields, models, _
from odoo.exceptions import UserError

class ActiveProductStatement(models.Model):
_name = 'active.product.statement'

name = fields.Char(string="Report Name" , default='Active Product Statement')
from_date = fields.Date('From Date',default=lambda * a: time.strftime('%Y-%m-%d'))
to_date = fields.Date('To Date',default=lambda * a: time.strftime('%Y-%m-%d'))
product_id = fields.Many2many('product.product','active_product_statement_product_reports','reports_id','product_id','Product Name',domain=[('active', '=', True),('type','=','product')])

generate_date = fields.Datetime('Generate Date', default=time.strftime('%Y-%m-%d %H:%M:%S'), readonly=True)
generate_user_id = fields.Many2one('res.users', 'Generate By', default=lambda self: self.env.user.id, readonly=True)


@api.onchange('from_date', 'to_date')
def onchange_date_validations(self):
if self.from_date < fields.Date.today() or self.to_date < fields.Date.today():
raise UserError(_("From date and to date should not be less than today's date."))
if self.from_date > self.to_date:
raise UserError(_("Kindly choose correct from & to date."))


def print_report(self):
for rec in self:
data = {
'self_rec': rec.id,
}
return {
'type': 'ir.actions.report',
'data': {'model': 'active.product.statement',
'options': json.dumps(data,
default=date_utils.json_default),
'output_format': 'xlsx',
'report_name': 'Active_Product_Statement',
},
'report_type': 'stock_xlsx',
}

def get_xlsx_report(self, data, response):
"""this is used to print the report of all records"""

rec_obj = self.env['active.product.statement'].search([('id', '=', data['self_rec'])])
current_datetime = datetime.now() + timedelta(hours=5, minutes=30)

output = io.BytesIO()
workbook = xlsxwriter.Workbook(output, {'in_memory': True})
sheet = workbook.add_worksheet()


# Formats
format1 = workbook.add_format({'font_size': 14, 'align': 'center', 'bold': True, 'border': 1})
format2 = workbook.add_format({'font_size': 11, 'bold': True, 'border': 1, 'bg_color': '#a5f9f7'})
format2.set_align('center')
format11 = workbook.add_format({'font_size': 11, 'bold': True, 'border': 1, 'font_name': 'Calibri',})
format11_a = workbook.add_format({'font_size': 11,'align': 'center', 'bold': True, 'border': 1, 'font_name': 'Calibri',})
format11_b = workbook.add_format({'font_size': 11,'align': 'right', 'bold': True, 'border': 1, 'font_name': 'Calibri',})
format12 = workbook.add_format({'font_size': 10, 'font_name': 'Calibri', 'border': 1})
format12_a = workbook.add_format({'font_size': 10, 'align': 'center','font_name': 'Calibri', 'border': 1})
format12_b = workbook.add_format({'font_size': 10, 'align': 'right', 'border': 1,'font_name': 'Calibri'})


product_list = []
if len(rec_obj.product_id) == 0:
product_names = 'All'
elif len(rec_obj.product_id) <= 3:
for product in rec_obj.product_id:
product_list.append(product.name)
product_names = ', '.join(product_list)
else:
product_names = 'Limited'

sheet.merge_range(0, 0, 0, 8,(rec_obj.env.user.company_id.name +", "+ rec_obj.env.user.company_id.street + rec_obj.env.user.company_id.state_id.name +"."), format1)
sheet.merge_range(1, 0, 1, 8,'Active Product Statement', format1)
sheet.merge_range(2, 0, 2, 4,"From Date : "+ str(rec_obj.from_date.strftime("%d/%m/%Y")), format11)
sheet.merge_range(2, 5, 2, 8,"To Date : "+ str(rec_obj.to_date.strftime("%d/%m/%Y")), format11)

sheet.merge_range(3, 0, 3, 8,"Product : "+product_names, format11)

sheet.merge_range(4, 0, 4, 4,"Report Taken By : "+ str(self.env.user.partner_id.name), format11)
sheet.merge_range(4, 5, 4, 8,"Taken Date & Time : "+ str(current_datetime.strftime("%d/%m/%Y %H:%M:%S")), format11)


sheet.write(6, 0, "S.No", format2)
sheet.set_column('A:A', 5)
sheet.write(6, 1, "Product Name", format2)
sheet.set_column('B:B', 25)
sheet.write(6, 2, "Product Category", format2)
sheet.set_column('C:C', 20)
sheet.write(6, 3, "UOM", format2)
sheet.set_column('D:D', 10)
sheet.write(6, 4, "Serial Number", format2)
sheet.set_column('E:E', 18)
sheet.write(6, 5, "Stock Qty", format2)
sheet.set_column('F:F', 12)
sheet.write(6, 6, "Cost Price", format2)
sheet.set_column('G:G', 12)
sheet.write(6, 7, "Total", format2)
sheet.set_column('H:H', 15)
sheet.write(6, 8, "Expiration Date", format2)
sheet.set_column('I:I', 16)


lot_obj = self.env['stock.lot'].search([
('expiration_date', '>=', rec_obj.from_date),
('expiration_date', '<=', rec_obj.to_date),
('product_id', 'in', [i.id for i in rec_obj.product_id] if rec_obj.product_id else self.env['product.product'].search([]).ids),
], order='product_id desc')

print("lot_objlot_objlot_obj",lot_obj)
row_num = 7
s_no = 1
total_val =0

for data in sorted(lot_obj, key=lambda x: x.expiration_date,reverse=False):

sheet.write(row_num, 0, s_no, format12_a)
sheet.write(row_num, 1, data.product_id.product_tmpl_id.name, format12)
sheet.write(row_num, 2, data.product_id.categ_id.name, format12)
sheet.write(row_num, 3, data.product_id.uom_id.name, format12)
sheet.write(row_num, 4, data.name if data.name else '-', format12)
sheet.write(row_num, 5, "{:.2f}".format(data.product_qty), format12_b)
sheet.write(row_num, 6, "{:.2f}".format(data.cost_price), format12_b)
sheet.write(row_num, 7, "{:.2f}".format((data.product_qty * data.cost_price)), format12_b)
sheet.write(row_num, 8, ((data.expiration_date + timedelta(hours=5, minutes=30)).strftime("%d/%m/%Y")), format12)
row_num += 1
total_val += (data.product_qty * data.cost_price)
s_no += 1


sheet.merge_range(row_num+2, 0, row_num+2, 6,"Grand Total", format11_a)
sheet.write(row_num+2, 7, "{:.2f}".format(total_val), format11_b)

workbook.close()
output.seek(0)
response.stream.write(output.read())
output.close()

57 changes: 57 additions & 0 deletions bahmni_reports/report/active_product_statement_view.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
<?xml version="1.0" encoding="UTF-8"?>
<odoo>

<record id="active_product_statement_report_form_view_new" model="ir.ui.view">
<field name="name">Active Product Statement</field>
<field name="model">active.product.statement</field>
<field name="type">form</field>
<field name="arch" type="xml">
<form string="Active Product Statement">
<header>
<h5 style="text-align:center;font-size: 1.5em;"> Active Product Statement </h5>
</header>
<group>
<group>
<field name="from_date" style="background-color: #D2D2FF;border-top-left-radius: 5px;border-top-right-radius: 5px;
border-bottom-left-radius: 5px;border-bottom-right-radius: 5px;" required="1" />
<field name="product_id" widget="many2many_tags"/>

</group>
<group>
<field name="to_date" style="background-color: #D2D2FF;border-top-left-radius: 5px;border-top-right-radius: 5px;
border-bottom-left-radius: 5px;border-bottom-right-radius: 5px;" widget="date" required="1" />

</group>
<group>
</group>
<group>
<button name="print_report" type="object" string="Generate" class="oe_highlight"/>
</group>
</group>

<notebook>

<page string="Entry Info">
<group>
<group>
<field name="generate_user_id"/>
</group>
<group>
<field name="generate_date"/>
</group>
</group>
</page>
</notebook>
</form>
</field>
</record>

<record id="action_active_product_statement_report" model="ir.actions.act_window">
<field name="name">Active Product Statement List</field>
<field name="res_model">active.product.statement</field>
<field name="view_mode">form</field>
</record>

<menuitem id="menu_active_product_statement" name="Active Product Statement" parent="bahmni_reports.menu_expiry_config" action="action_active_product_statement_report" sequence="3"/>

</odoo>

0 comments on commit 9b2bcbc

Please sign in to comment.