Browse Source

Initial Commit

pull/9/head
cybroodoo 8 years ago
parent
commit
d4ab06998b
  1. 2
      export_stockinfo_xls/__init__.py
  2. 22
      export_stockinfo_xls/__openerp__.py
  3. 2
      export_stockinfo_xls/models/__init__.py
  4. 24
      export_stockinfo_xls/models/res_partner.py
  5. 25
      export_stockinfo_xls/models/wizard.py
  6. 2
      export_stockinfo_xls/report/__init__.py
  7. 161
      export_stockinfo_xls/report/current_stock_xls.py
  8. BIN
      export_stockinfo_xls/static/description/icon.png
  9. BIN
      export_stockinfo_xls/static/description/image1.png
  10. BIN
      export_stockinfo_xls/static/description/image2.png
  11. BIN
      export_stockinfo_xls/static/description/image3.png
  12. 77
      export_stockinfo_xls/static/description/index.html
  13. 50
      export_stockinfo_xls/views/wizard_view.xml

2
export_stockinfo_xls/__init__.py

@ -0,0 +1,2 @@
import report
import models

22
export_stockinfo_xls/__openerp__.py

@ -0,0 +1,22 @@
{
'name': 'Export Product Stock in Excel',
'version': '0.2',
'category': 'Inventory',
'license': "AGPL-3",
'summary': "Current Stock Report for all Products in each Warehouse",
'author': 'Cybrosys Techno Solutions',
'company': 'Cybrosys Techno Solutions',
'website': 'http://www.cybrosys.com',
'depends': [
'base',
'stock',
'sale',
'purchase',
'report_xlsx'
],
'data': [
'views/wizard_view.xml',
],
'installable': True,
'auto_install': False,
}

2
export_stockinfo_xls/models/__init__.py

@ -0,0 +1,2 @@
import res_partner
import wizard

24
export_stockinfo_xls/models/res_partner.py

@ -0,0 +1,24 @@
from openerp import models, fields
class Partner(models.Model):
_inherit = 'res.partner'
supplier_id = fields.Many2many('wizard.stock.history', 'supp_wiz_rel', 'wiz', 'supp', invisible=True)
class Category(models.Model):
_inherit = 'product.category'
obj = fields.Many2many('wizard.stock.history', 'categ_wiz_rel', 'wiz', 'categ', invisible=True)
class Warehouse(models.Model):
_inherit = 'stock.warehouse'
obj = fields.Many2many('wizard.stock.history', 'wh_wiz_rel', 'wiz', 'wh', invisible=True)

25
export_stockinfo_xls/models/wizard.py

@ -0,0 +1,25 @@
from openerp import models, fields, api
class StockReport(models.TransientModel):
_name = "wizard.stock.history"
_description = "Current Stock History"
warehouse = fields.Many2many('stock.warehouse', 'wh_wiz_rel', 'wh', 'wiz', string='Warehouse', required=True)
category = fields.Many2many('product.category', 'categ_wiz_rel', 'categ', 'wiz', string='Warehouse')
@api.multi
def export_xls(self):
context = self._context
datas = {'ids': context.get('active_ids', [])}
datas['model'] = 'product.product'
datas['form'] = self.read()[0]
for field in datas['form'].keys():
if isinstance(datas['form'][field], tuple):
datas['form'][field] = datas['form'][field][0]
if context.get('xls_export'):
return {'type': 'ir.actions.report.xml',
'report_name': 'export_stockinfo_xls.stock_report_xls.xlsx',
'datas': datas,
'name': 'Current Stock'
}

2
export_stockinfo_xls/report/__init__.py

@ -0,0 +1,2 @@
import current_stock_xls

161
export_stockinfo_xls/report/current_stock_xls.py

@ -0,0 +1,161 @@
from openerp.addons.report_xlsx.report.report_xlsx import ReportXlsx
import datetime
class StockReportXls(ReportXlsx):
def get_warehouse(self, data):
if data.get('form', False) and data['form'].get('warehouse', False):
l1 = []
l2 = []
obj = self.env['stock.warehouse'].search([('id', 'in', data['form']['warehouse'])])
for j in obj:
l1.append(j.name)
l2.append(j.id)
return l1, l2
def get_category(self, data):
if data.get('form', False) and data['form'].get('category', False):
l2 = []
obj = self.env['product.category'].search([('id', 'in', data['form']['category'])])
for j in obj:
l2.append(j.id)
return l2
return ''
def get_lines(self, data, warehouse):
lines = []
categ = self.get_category(data)
if categ:
stock_history = self.env['product.product'].search([('categ_id', 'in', categ)])
else:
stock_history = self.env['product.product'].search([])
for obj in stock_history:
sale_value = 0
purchase_value = 0
product = self.env['product.product'].browse(obj.id)
sale_obj = self.env['sale.order.line'].search([('order_id.state', '=', 'done'),
('product_id', '=', product.id),
('order_id.warehouse_id', '=', warehouse)])
for i in sale_obj:
sale_value = sale_value + i.product_uom_qty
purchase_obj = self.env['purchase.order.line'].search([('order_id.state', '=', 'done'),
('product_id', '=', product.id),
('order_id.picking_type_id', '=', warehouse)])
for i in purchase_obj:
purchase_value = purchase_value + i.product_qty
available_qty = product.with_context({'warehouse': warehouse}).virtual_available + \
product.with_context({'warehouse': warehouse}).outgoing_qty - \
product.with_context({'warehouse': warehouse}).incoming_qty
value = available_qty * product.standard_price
vals = {
'sku': product.default_code,
'name': product.name,
'category': product.categ_id.name,
'cost_price': product.standard_price,
'available': available_qty,
'virtual': product.with_context({'warehouse': warehouse}).virtual_available,
'incoming': product.with_context({'warehouse': warehouse}).incoming_qty,
'outgoing': product.with_context({'warehouse': warehouse}).outgoing_qty,
'net_on_hand': product.with_context({'warehouse': warehouse}).qty_available,
'total_value': value,
'sale_value': sale_value,
'purchase_value': purchase_value,
}
lines.append(vals)
return lines
def generate_xlsx_report(self, workbook, data, lines):
get_warehouse = self.get_warehouse(data)
count = len(get_warehouse[0]) * 11 + 6
sheet = workbook.add_worksheet()
format1 = workbook.add_format({'font_size': 14, 'bottom': True, 'right': True, 'left': True, 'top': True, 'align': 'vcenter', 'bold': True})
format11 = workbook.add_format({'font_size': 12, 'align': 'center', 'right': True, 'left': True, 'bottom': True, 'top': True, 'bold': True})
format21 = workbook.add_format({'font_size': 10, 'align': 'center', 'right': True, 'left': True,'bottom': True, 'top': True, 'bold': True})
format3 = workbook.add_format({'bottom': True, 'top': True, 'font_size': 12})
font_size_8 = workbook.add_format({'bottom': True, 'top': True, 'right': True, 'left': True, 'font_size': 8})
red_mark = workbook.add_format({'bottom': True, 'top': True, 'right': True, 'left': True, 'font_size': 8,
'bg_color': 'red'})
justify = workbook.add_format({'bottom': True, 'top': True, 'right': True, 'left': True, 'font_size': 12})
format3.set_align('center')
font_size_8.set_align('center')
justify.set_align('justify')
format1.set_align('center')
red_mark.set_align('center')
sheet.merge_range('A3:G3', 'Report Date: ' + str(datetime.datetime.now().strftime("%Y-%m-%d %H:%M %p")), format1)
sheet.merge_range(2, 7, 2, count, 'Warehouses', format1)
sheet.merge_range('A4:G4', 'Product Information', format11)
w_col_no = 6
w_col_no1 = 7
for i in get_warehouse[0]:
w_col_no = w_col_no + 11
sheet.merge_range(3, w_col_no1, 3, w_col_no, i, format11)
w_col_no1 = w_col_no1 + 11
sheet.write(4, 0, 'SKU', format21)
sheet.merge_range(4, 1, 4, 3, 'Name', format21)
sheet.merge_range(4, 4, 4, 5, 'Category', format21)
sheet.write(4, 6, 'Cost Price', format21)
p_col_no1 = 7
for i in get_warehouse[0]:
sheet.write(4, p_col_no1, 'Available', format21)
sheet.write(4, p_col_no1 + 1, 'Virtual', format21)
sheet.write(4, p_col_no1 + 2, 'Incoming', format21)
sheet.write(4, p_col_no1 + 3, 'Outgoing', format21)
sheet.merge_range(4, p_col_no1 + 4, 4, p_col_no1 + 5, 'Net On Hand', format21)
sheet.merge_range(4, p_col_no1 + 6, 4, p_col_no1 + 7, 'Total Sold', format21)
sheet.merge_range(4, p_col_no1 + 8, 4, p_col_no1 + 9, 'Total Purchased', format21)
sheet.write(4, p_col_no1 + 10, 'Valuation', format21)
p_col_no1 = p_col_no1 + 11
prod_row = 5
prod_col = 0
for i in get_warehouse[1]:
get_line = self.get_lines(data, i)
for each in get_line:
sheet.write(prod_row, prod_col, each['sku'], font_size_8)
sheet.merge_range(prod_row, prod_col + 1, prod_row, prod_col + 3, each['name'], font_size_8)
sheet.merge_range(prod_row, prod_col + 4, prod_row, prod_col + 5, each['category'], font_size_8)
sheet.write(prod_row, prod_col + 6, each['cost_price'], font_size_8)
prod_row = prod_row + 1
break
prod_row = 5
prod_col = 7
for i in get_warehouse[1]:
get_line = self.get_lines(data, i)
for each in get_line:
if each['available'] < 0:
sheet.write(prod_row, prod_col, each['available'], red_mark)
else:
sheet.write(prod_row, prod_col, each['available'], font_size_8)
if each['virtual'] < 0:
sheet.write(prod_row, prod_col + 1, each['virtual'], red_mark)
else:
sheet.write(prod_row, prod_col + 1, each['virtual'], font_size_8)
if each['incoming'] < 0:
sheet.write(prod_row, prod_col + 2, each['incoming'], red_mark)
else:
sheet.write(prod_row, prod_col + 2, each['incoming'], font_size_8)
if each['outgoing'] < 0:
sheet.write(prod_row, prod_col + 3, each['outgoing'], red_mark)
else:
sheet.write(prod_row, prod_col + 3, each['outgoing'], font_size_8)
if each['net_on_hand'] < 0:
sheet.merge_range(prod_row, prod_col + 4, prod_row, prod_col + 5, each['net_on_hand'], red_mark)
else:
sheet.merge_range(prod_row, prod_col + 4, prod_row, prod_col + 5, each['net_on_hand'], font_size_8)
if each['sale_value'] < 0:
sheet.merge_range(prod_row, prod_col + 6, prod_row, prod_col + 7, each['sale_value'], red_mark)
else:
sheet.merge_range(prod_row, prod_col + 6, prod_row, prod_col + 7, each['sale_value'], font_size_8)
if each['purchase_value'] < 0:
sheet.merge_range(prod_row, prod_col + 8, prod_row, prod_col + 9, each['purchase_value'], red_mark)
else:
sheet.merge_range(prod_row, prod_col + 8, prod_row, prod_col + 9, each['purchase_value'], font_size_8)
if each['total_value'] < 0:
sheet.write(prod_row, prod_col + 10, each['total_value'], red_mark)
else:
sheet.write(prod_row, prod_col + 10, each['total_value'], font_size_8)
prod_row = prod_row + 1
prod_row = 5
prod_col = prod_col + 11
StockReportXls('report.export_stockinfo_xls.stock_report_xls.xlsx', 'product.product')

BIN
export_stockinfo_xls/static/description/icon.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

BIN
export_stockinfo_xls/static/description/image1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

BIN
export_stockinfo_xls/static/description/image2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

BIN
export_stockinfo_xls/static/description/image3.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

77
export_stockinfo_xls/static/description/index.html

@ -0,0 +1,77 @@
<section class="oe_container">
<div class="oe_row oe_spaced">
<h2 class="oe_slogan">Current Stock XLS</h2>
<h3 class="oe_slogan">Current Stock Report for all Products in each Warehouse</h3>
<h4 class="oe_slogan">Author : Cybrosys Techno Solutions , www.cybrosys.com</h4>
</div>
<div class="oe_row oe_spaced">
<div>
This module helps to print Current Stock Report for all Products in each Warehouse with XLS.
</div>
</div>
<div class="oe_row oe_spaced">
<div>
&#x261B; Installation : To install this module, you need also the report_xlsx module.
</div>
</div>
<div class="oe_row oe_spaced">
<div class="oe_span6">
<div class="oe_demo oe_picture oe_screenshot">
<img src="image1.png">
</div>
</div>
<div class="oe_span6">
<p class='oe_mt32'>
Go to Reporting -> Warehouse -> Current stock in Excel. Now a wizard will appear on your screen.
Please enter the warehouses which you want to take the report. You can also select category for products(It is Optional).
Then Click "Export Product with Stock Info" button. Then You will get the corresponding report in XLS.
</p>
</div>
</div>
</section>
<section class="oe_container oe_dark">
<div class="oe_row oe_padded">
<div class="oe_span12">
<div class="oe_row_img oe_centered">
<img class="oe_picture oe_screenshot" src="image2.png">
</div>
</div>
</div>
</section>
<section>
<div class="oe_row oe_spaced">
<div class="oe_span12">
<p class='oe_mt32'>
Per warehouse you can get Available Qty, Virtual Qty, Incoming Qty, Outgoing Qty, Net On Hand Qty,
Total Sold & Total Purchased Qty. You can get your stock valuation details too. In below screen-shot you
can see stock details of 2 warehouse exported in single spreadsheet. Negative stock will be highlighted
in "red" cells.
</p>
</div>
<div class="oe_span12">
<div class="oe_demo oe_picture oe_screenshot">
<img src="image3.png">
</div>
</div>
</div>
</section>
<section class="oe_container oe_dark">
<h2 class="oe_slogan">Need Any Help?</h2>
<div class="oe_slogan">
<a class="btn btn-primary btn-lg mt8"
style="color: #FFFFFF !important;" href="http://www.cybrosys.com/contact/"><i
class="fa fa-envelope"></i> Email </a> <a
class="btn btn-primary btn-lg mt8" style="color: #FFFFFF !important;"
href="http://www.cybrosys.com/contact/"><i
class="fa fa-phone"></i> Contact Us </a> <a
class="btn btn-primary btn-lg mt8" style="color: #FFFFFF !important;"
href="http://www.cybrosys.com/contact/"><i
class="fa fa-check-square"></i> Request Customization </a>
</div>
</section>

50
export_stockinfo_xls/views/wizard_view.xml

@ -0,0 +1,50 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<record model='ir.ui.view' id='wizard_form'>
<field name="name">wizard.stock.history.form</field>
<field name="model">wizard.stock.history</field>
<field name="arch" type="xml">
<form string="Wizard">
<group string="Warehouse">
<field name="warehouse" widget="many2many_tags"/>
</group>
<notebook>
<page string="Category">
<field name="category">
<tree>
<field name="name"/>
</tree>
</field>
</page>
</notebook>
<footer>
<button name="export_xls" type="object" default_focus="1"
string="Export Product with Stock Info" class="oe_highlight"
context="{'xls_export':1}" icon="gtk-print"/>
or
<button string="Cancel" class="oe_link" special="cancel" />
</footer>
</form>
</field>
</record>
<record model='ir.actions.act_window' id='wizard_act'>
<field name="name">Export product stock in Excel</field>
<field name="res_model">wizard.stock.history</field>
<field name="view_type">form</field>
<field name="view_mode">form</field>
<field name="view_id" ref="wizard_form"/>
<field name="target">new</field>
</record>
<report
id="stock_xlsx"
model="product.product"
string=" "
report_type="xlsx"
name="export_stockinfo_xls.stock_report_xls.xlsx"
file="export_stockinfo_xls.stock_report_xls.xlsx"
attachment_use="False"
/>
<menuitem name="Current stock in Excel" parent="stock.next_id_61" id="export_excel" action="wizard_act" sequence="3"/>
</data>
</openerp>
Loading…
Cancel
Save