summaryrefslogtreecommitdiff
path: root/indoteknik_custom/models/requisition.py
diff options
context:
space:
mode:
Diffstat (limited to 'indoteknik_custom/models/requisition.py')
-rw-r--r--indoteknik_custom/models/requisition.py303
1 files changed, 150 insertions, 153 deletions
diff --git a/indoteknik_custom/models/requisition.py b/indoteknik_custom/models/requisition.py
index 7ceff6e5..2b148c96 100644
--- a/indoteknik_custom/models/requisition.py
+++ b/indoteknik_custom/models/requisition.py
@@ -1,6 +1,7 @@
-from odoo import models, fields, api
+from odoo import models, fields, api, _
from odoo.exceptions import UserError
from datetime import datetime
+import math
import logging
_logger = logging.getLogger(__name__)
@@ -28,121 +29,40 @@ class Requisition(models.Model):
result = super(Requisition, self).create(vals)
return result
- # def create_requisition_from_sales_with_price(self):
- # if self.requisition_lines:
- # raise UserError('Sudah digenerate sebelumnya, hapus line terlebih dahulu')
- # if not self.sale_order_id:
- # raise UserError('Sale Order harus diisi')
- # if self.is_po:
- # raise UserError('Sudah jadi PO, tidak bisa di create ulang PO nya')
-
- # count = 0
- # for order_line in self.sale_order_id.order_line:
- # # get purchase price altama, if nothing, then get other cheaper, if nothing then last po
- # purchase_price = order_line.purchase_price
- # vendor_id = order_line.vendor_id.id
-
- # # get qty available bandengan
- # qty_available = order_line.product_id.qty_onhand_bandengan + order_line.product_id.qty_incoming_bandengan - order_line.product_id.outgoing_qty
- # suggest = 'harus beli'
- # if qty_available > order_line.product_qty:
- # suggest = 'masih cukup'
-
- # self.env['requisition.line'].create([{
- # 'requisition_id': self.id,
- # 'partner_id': vendor_id,
- # 'brand_id': order_line.product_id.product_tmpl_id.x_manufacture.id,
- # 'product_id': order_line.product_id.id,
- # 'qty_purchase': order_line.product_uom_qty,
- # 'tax_id': order_line.purchase_tax_id.id,
- # 'price_unit': purchase_price,
- # 'subtotal': purchase_price * order_line.product_uom_qty,
- # 'source': 'sales',
- # 'qty_available_store': qty_available,
- # 'suggest': suggest,
- # }])
- # count+=1
- # _logger.info('Create Requisition %s' % order_line.product_id.name)
- # self.notification = "Requisition Created %s lines" % count
-
- # def create_requisition_from_sales(self):
- # if self.requisition_lines:
- # raise UserError('Sudah digenerate sebelumnya, hapus line terlebih dahulu')
- # if not self.sale_order_id:
- # raise UserError('Sale Order harus diisi')
- # if self.is_po:
- # raise UserError('Sudah jadi PO, tidak bisa di create ulang PO nya')
-
- # # old_requisition = self.env['requisition'].search([('sale_order_id', '=', self.sale_order_id.id)], limit=1)
- # # if old_requisition:
- # # raise UserError('Sudah pernah jadi Requisition')
-
- # count = 0
- # for order_line in self.sale_order_id.order_line:
- # # get purchase price altama, if nothing, then get other cheaper, if nothing then last po
- # purchase_price = 0
- # vendor_id = 0
-
- # # get qty available bandengan
- # qty_available = order_line.product_id.qty_onhand_bandengan + order_line.product_id.qty_incoming_bandengan - order_line.product_id.outgoing_qty
- # suggest = 'harus beli'
- # if qty_available > order_line.product_qty:
- # suggest = 'masih cukup'
-
- # purchase_pricelist = self.env['purchase.pricelist'].search([
- # ('product_id.id', '=', order_line.product_id.id),
- # ('vendor_id.id', '=', 5571)
- # ], order='product_price asc', limit=1)
- # purchase_price = purchase_pricelist.product_price
- # vendor_id = purchase_pricelist.vendor_id.id
- # source = 'PriceList'
-
- # if not purchase_price or purchase_price <= 0:
- # purchase_pricelist = self.env['purchase.pricelist'].search([('product_id', '=', order_line.product_id.id)], order='product_price asc', limit=1)
- # purchase_price = purchase_pricelist.product_price
- # vendor_id = purchase_pricelist.vendor_id.id
- # source = 'PriceList'
-
- # if not purchase_price or purchase_price <= 0:
- # last_po_line = self.env['purchase.order.line'].search([('product_id', '=', order_line.product_id.id), ('order_id.state', '=', 'done')], order='id desc', limit=1)
- # purchase_price = last_po_line.price_unit
- # vendor_id = last_po_line.order_id.partner_id.id
- # source = 'LastPO'
-
- # if not purchase_price or purchase_price <= 0:
- # purchase_price = 0
- # vendor_id = 5571
- # source = 'Nothing'
-
- # self.env['requisition.line'].create([{
- # 'requisition_id': self.id,
- # 'partner_id': vendor_id,
- # 'brand_id': order_line.product_id.product_tmpl_id.x_manufacture.id,
- # 'product_id': order_line.product_id.id,
- # 'qty_purchase': order_line.product_uom_qty,
- # 'tax_id': order_line.purchase_tax_id.id,
- # 'price_unit': purchase_price,
- # 'subtotal': purchase_price * order_line.product_uom_qty,
- # 'source': source,
- # 'qty_available_store': qty_available,
- # 'suggest': suggest,
- # }])
- # count+=1
- # _logger.info('Create Requisition %s' % order_line.product_id.name)
- # self.notification = "Requisition Created %s lines" % count
-
+
def create_po_from_requisition(self):
if not self.requisition_lines:
raise UserError('Tidak ada Lines, belum bisa create PO')
if self.is_po:
raise UserError('Sudah pernah di create PO')
- current_time = datetime.now()
- vendor_ids = self.env['requisition.line'].read_group([('requisition_id', '=', self.id), ('partner_id', '!=', False)], fields=['partner_id'], groupby=['partner_id'])
- counter_po_number = 0
+ vendor_ids = self.env['requisition.line'].read_group([
+ ('requisition_id', '=', self.id),
+ ('partner_id', '!=', False)
+ ], fields=['partner_id'], groupby=['partner_id'])
+
+ po_ids = []
for vendor in vendor_ids:
- param_header = {
- 'partner_id': vendor['partner_id'][0],
+ result_po = self.create_po_by_vendor(vendor['partner_id'][0])
+ po_ids += result_po
+ return {
+ 'name': _('Purchase Order'),
+ 'view_mode': 'tree,form',
+ 'res_model': 'purchase.order',
+ 'target': 'current',
+ 'type': 'ir.actions.act_window',
+ 'domain': [('id', 'in', po_ids)],
+ }
+
+ def create_po_by_vendor(self, vendor_id):
+ current_time = datetime.now()
+
+ PRODUCT_PER_PO = 20
+
+ requisition_line = self.env['requisition.line']
+
+ param_header = {
+ 'partner_id': vendor_id,
# 'partner_ref': self.sale_order_id.name,
'currency_id': 12,
'user_id': self.env.user.id,
@@ -152,54 +72,131 @@ class Requisition(models.Model):
'sale_order_id': self.sale_order_id.id,
'note_description': 'from Purchase Requisition'
}
- # new_po = self.env['purchase.order'].create([param_header])
- products_vendors = self.env['requisition.line'].search([
- ('requisition_id', '=', self.id),
- ('partner_id', '=', vendor['partner_id'][0]),
- ('qty_purchase', '>', 0)
- ], order='brand_id')
- count = brand_id = 0
-
- for product in products_vendors:
- if count == 200 or brand_id != product.brand_id.id:
- count = 0
- counter_po_number += 1
- new_po = self.env['purchase.order'].create([param_header])
- new_po.name = new_po.name + "/R/"+str(counter_po_number)
- self.env['requisition.purchase.match'].create([{
- 'requisition_id': self.id,
- 'order_id': new_po.id
- }])
- self.env.cr.commit()
- # else:
- # new_po = self.env['purchase.order'].create([param_header])
- brand_id = product.brand_id.id
- count += 10
-
- # qty_available = product.product_id.qty_onhand_bandengan + product.product_id.qty_incoming_bandengan - product.product_id.outgoing_qty
- # suggest = 'harus beli'
- # if qty_available > product.qty_purchase:
- # suggest = 'masih cukup'
-
- tax = [22]
+ domain = [
+ ('requisition_id', '=', self.id),
+ ('partner_id', '=', vendor_id),
+ ('qty_purchase', '>', 0)
+ ]
+
+ products_len = requisition_line.search_count(domain)
+ page = math.ceil(products_len / PRODUCT_PER_PO)
+ po_ids = []
+ # i start from zero (0)
+ for i in range(page):
+ new_po = self.env['purchase.order'].create([param_header])
+ new_po.name = new_po.name + "/R/" + str(i + 1)
+ po_ids.append(new_po.id)
+ lines = requisition_line.search(
+ domain,
+ offset=i * PRODUCT_PER_PO,
+ limit=PRODUCT_PER_PO
+ )
+ tax = [22]
+
+ for line in lines:
+ product = line.product_id
param_line = {
- 'order_id': new_po.id,
- 'sequence': count,
- 'product_id': product.product_id.id,
- 'product_qty': product.qty_purchase,
- 'product_uom_qty': product.qty_purchase,
- 'price_unit': product.price_unit,
+ 'order_id' : new_po.id,
+ 'product_id': product.id,
+ 'product_qty': line.qty_purchase,
+ 'product_uom_qty': line.qty_purchase,
+ 'name': product.name,
+ 'price_unit': line.price_unit,
'taxes_id': tax,
- # 'qty_available_store': qty_available,
- # 'suggest': suggest,
}
- new_line = self.env['purchase.order.line'].create([param_line])
- product.current_po_id = new_po.id
- product.current_po_line_id = new_line.id
- _logger.info('Create PO Line %s' % product.product_id.name)
- # self.notification = self.notification + ' %s' % new_po.name
- self.is_po = True
+ new_po_line = self.env['purchase.order.line'].create([param_line])
+ line.current_po_id = new_po.id
+ line.current_po_line_id = new_po_line.id
+ return po_ids
+
+ # def create_po_from_requisition(self):
+ # if not self.requisition_lines:
+ # raise UserError('Tidak ada Lines, belum bisa create PO')
+ # if self.is_po:
+ # raise UserError('Sudah pernah di create PO')
+ # current_time = datetime.now()
+ # vendor_ids = self.env['requisition.line'].read_group([('requisition_id', '=', self.id), ('partner_id', '!=', False)], fields=['partner_id'], groupby=['partner_id'])
+
+ # counter_po_number = 0
+ # po_ids = []
+ # for vendor in vendor_ids:
+ # param_header = {
+ # 'partner_id': vendor['partner_id'][0],
+ # # 'partner_ref': self.sale_order_id.name,
+ # 'currency_id': 12,
+ # 'user_id': self.env.user.id,
+ # 'company_id': 1, # indoteknik dotcom gemilang
+ # 'picking_type_id': 28, # indoteknik bandengan receipts
+ # 'date_order': current_time,
+ # 'sale_order_id': self.sale_order_id.id,
+ # 'note_description': 'from Purchase Requisition'
+ # }
+ # param_requisition_line = [
+ # ('requisition_id', '=', self.id),
+ # ('partner_id', '=', vendor['partner_id'][0]),
+ # ('qty_purchase', '>', 0)
+ # ]
+ # # new_po = self.env['purchase.order'].create([param_header])
+ # products_vendors = self.env['requisition.line'].search(, order='brand_id')
+ # count = brand_id = 0
+
+ # for product in products_vendors:
+ # if count > 200 or brand_id != product.brand_id.id:
+ # continue
+
+ # count = 0
+ # counter_po_number += 1
+ # new_po = self.env['purchase.order'].create([param_header])
+ # new_po.name = new_po.name + "/R/"+str(counter_po_number)
+ # self.env['requisition.purchase.match'].create([{
+ # 'requisition_id': self.id,
+ # 'order_id': new_po.id
+ # }])
+ # po_ids.append(new_po.id)
+ # self.env.cr.commit()
+ # # else:
+ # # new_po = self.env['purchase.order'].create([param_header])
+ # brand_id = product.brand_id.id
+ # count += 10
+
+ # # qty_available = product.product_id.qty_onhand_bandengan + product.product_id.qty_incoming_bandengan - product.product_id.outgoing_qty
+ # # suggest = 'harus beli'
+ # # if qty_available > product.qty_purchase:
+ # # suggest = 'masih cukup'
+
+ # tax = [22]
+
+ # param_line = {
+
+ # 'sequence': count,
+ # 'product_id': product.product_id.id,
+ # 'product_qty': product.qty_purchase,
+ # 'product_uom_qty': product.qty_purchase,
+ # 'price_unit': product.price_unit,
+ # 'taxes_id': tax,
+ # # 'qty_available_store': qty_available,
+ # # 'suggest': suggest,
+ # }
+ # new_line = self.env['purchase.order.line'].create([param_line])
+ # if new_po:
+ # new_line.write({
+ # 'order_id': new_po.id,
+ # })
+ # product.current_po_id = new_po.id
+ # product.current_po_line_id = new_line.id
+ # _logger.info('Create PO Line %s' % product.product_id.name)
+ # # self.notification = self.notification + ' %s' % new_po.name
+ # self.is_po = True
+ # if po_ids:
+ # return {
+ # 'name': _('Purchase Order'),
+ # 'view_mode': 'tree,form',
+ # 'res_model': 'purchase.order',
+ # 'target': 'current',
+ # 'type': 'ir.actions.act_window',
+ # 'domain': [('id', 'in', po_ids)],
+ # }
class RequisitionLine(models.Model):
_name = 'requisition.line'