summaryrefslogtreecommitdiff
path: root/indoteknik_custom/models
diff options
context:
space:
mode:
authorit-fixcomart <it@fixcomart.co.id>2024-11-29 10:53:34 +0700
committerit-fixcomart <it@fixcomart.co.id>2024-11-29 10:53:34 +0700
commit57ea4bce8d785ba47a12ce0b3808a7d45e4add54 (patch)
tree292e1d78e935145b7d9a555a6512a963fcf323a5 /indoteknik_custom/models
parentc5d2edf1a1e905d270e5cd1e5b6ed0cb5fa0bba1 (diff)
parent301ad8d828e5ff43515b9f1ab467c9082fccd6f7 (diff)
Merge branch 'production' into iman/pengajuan-tempo
# Conflicts: # indoteknik_custom/__manifest__.py # indoteknik_custom/models/res_partner.py # indoteknik_custom/security/ir.model.access.csv
Diffstat (limited to 'indoteknik_custom/models')
-rwxr-xr-xindoteknik_custom/models/__init__.py2
-rwxr-xr-xindoteknik_custom/models/product_template.py2
-rw-r--r--indoteknik_custom/models/promotion/sale_order.py11
-rwxr-xr-xindoteknik_custom/models/purchase_order.py34
-rw-r--r--indoteknik_custom/models/purchasing_job.py2
-rw-r--r--indoteknik_custom/models/res_partner.py34
-rwxr-xr-xindoteknik_custom/models/sale_order.py56
-rw-r--r--indoteknik_custom/models/stock_picking.py8
-rw-r--r--indoteknik_custom/models/va_multi_approve.py22
-rw-r--r--indoteknik_custom/models/va_multi_reject.py22
-rw-r--r--indoteknik_custom/models/vendor_approval.py103
11 files changed, 211 insertions, 85 deletions
diff --git a/indoteknik_custom/models/__init__.py b/indoteknik_custom/models/__init__.py
index e98d0d41..c0b32e18 100755
--- a/indoteknik_custom/models/__init__.py
+++ b/indoteknik_custom/models/__init__.py
@@ -135,3 +135,5 @@ from . import find_page
from . import user_pengajuan_tempo_line
from . import user_pengajuan_tempo
from . import approval_retur_picking
+from . import va_multi_approve
+from . import va_multi_reject
diff --git a/indoteknik_custom/models/product_template.py b/indoteknik_custom/models/product_template.py
index 25473ab8..2e80beec 100755
--- a/indoteknik_custom/models/product_template.py
+++ b/indoteknik_custom/models/product_template.py
@@ -61,6 +61,7 @@ class ProductTemplate(models.Model):
sni = fields.Boolean(string='SNI')
tkdn = fields.Boolean(string='TKDN')
short_spesification = fields.Char(string='Short Spesification')
+ merchandise_ok = fields.Boolean(string='Product Promotion')
@api.constrains('name', 'internal_reference', 'x_manufacture')
def required_public_categ_ids(self):
@@ -377,6 +378,7 @@ class ProductProduct(models.Model):
max_qty_reorder = fields.Float(string='Max Qty Reorder', compute='_get_max_qty_reordering_rule')
qty_rpo = fields.Float(string='Qty RPO', compute='_get_qty_rpo')
plafon_qty = fields.Float(string='Max Plafon', compute='_get_plafon_qty_product')
+ merchandise_ok = fields.Boolean(string='Product Promotion')
def _get_clean_website_description(self):
for rec in self:
diff --git a/indoteknik_custom/models/promotion/sale_order.py b/indoteknik_custom/models/promotion/sale_order.py
index be820c6f..1c31d060 100644
--- a/indoteknik_custom/models/promotion/sale_order.py
+++ b/indoteknik_custom/models/promotion/sale_order.py
@@ -10,11 +10,12 @@ class SaleOrder(models.Model):
for promotion in promotions:
program_line = self.env['promotion.program.line'].browse(promotion['program_line_id'])
for free_product in program_line.free_product_ids:
- self.env['sale.order.line'].create({
- 'order_id': self.id,
- 'name': "Free Product " + free_product.product_id.display_name,
- 'display_type': 'line_note'
- })
+ if free_product.product_id.merchandise_ok:
+ self.env['sale.order.line'].create({
+ 'order_id': self.id,
+ 'name': f"Free Product {free_product.product_id.display_name} Quantity ({free_product.qty})",
+ 'display_type': 'line_note'
+ })
def apply_promotion_program(self):
userdata = {
diff --git a/indoteknik_custom/models/purchase_order.py b/indoteknik_custom/models/purchase_order.py
index 3397616d..9388ae4c 100755
--- a/indoteknik_custom/models/purchase_order.py
+++ b/indoteknik_custom/models/purchase_order.py
@@ -595,10 +595,19 @@ class PurchaseOrder(models.Model):
if line.product_uom_qty > line.product_id.plafon_qty + line.product_uom_qty and not self.env.user.has_group('indoteknik_custom.group_role_merchandiser'):
raise UserError('Product '+line.product_id.name+' melebihi plafon, harus Approval MD')
+ def check_different_vendor_so_po(self):
+ vendor_po = self.partner_id.id
+ for line in self.order_line:
+ if not line.so_line_id:
+ continue
+ if line.so_line_id.vendor_id.id != vendor_po and not self.env.user.has_group('indoteknik_custom.group_role_merchandiser'):
+ raise UserError("Produk "+line.product_id.name+" memiliki vendor berbeda dengan SO (Vendor PO: "+str(self.partner_id.name)+", Vendor SO: "+str(line.so_line_id.vendor_id.name)+")")
+
def button_confirm(self):
res = super(PurchaseOrder, self).button_confirm()
current_time = datetime.now()
self.check_ppn_mix()
+ self.check_different_vendor_so_po()
# self.check_data_vendor()
if self.amount_untaxed >= 50000000 and not self.env.user.has_group('indoteknik_custom.group_role_merchandiser'):
@@ -736,12 +745,12 @@ class PurchaseOrder(models.Model):
template.send_mail(self.id, force_send=True)
def po_approve(self):
- # if self.amount_untaxed >= 50000000 and not self.env.user.has_group('indoteknik_custom.group_role_merchandiser'):
- # raise UserError("Hanya Merchandiser yang bisa approve")
greater_than_plafon, message = self._get_msg_plafon_qty()
+ different_vendor_message = self.check_different_vendor_so() # Panggil fungsi check_different_vendor_so
+
if self.env.user.is_leader or self.env.user.has_group('indoteknik_custom.group_role_merchandiser'):
raise UserError("Bisa langsung Confirm")
- elif self.total_percent_margin == self.total_so_percent_margin and self.matches_so and not greater_than_plafon:
+ elif self.total_percent_margin == self.total_so_percent_margin and self.matches_so and not greater_than_plafon and not different_vendor_message:
raise UserError("Bisa langsung Confirm")
else:
reason = ''
@@ -757,13 +766,30 @@ class PurchaseOrder(models.Model):
# Check Plafon Qty and Get Message every Line Product
if greater_than_plafon:
reason += message
+ # Check for Different Vendor Message
+ if different_vendor_message:
+ reason += different_vendor_message
+
# Post a highlighted message to lognote
self.message_post(
body=f"<div style='background-color: #fdf2e9; border: 1px solid #f5c6cb; padding: 10px;'>"
- f"<b>Note (Pinned):</b><br>{reason}</div>",
+ f"<b>Note (Pinned):</b><br>{reason}</div>",
subtype_id=self.env.ref("mail.mt_note").id
)
+
+ def check_different_vendor_so(self):
+ vendor_po = self.partner_id.id
+ message = ''
+ for line in self.order_line:
+ if not line.so_line_id:
+ continue
+ if line.so_line_id.vendor_id.id != vendor_po:
+ product_code = line.product_id.display_name or 'Unknown'
+ message += (f"Produk {product_code} memiliki vendor berbeda dengan SO "
+ f"(Vendor PO: {self.partner_id.name}, Vendor SO: {line.so_line_id.vendor_id.name}), ")
+ return message if message else None
+
def _get_msg_plafon_qty(self):
message = ''
greater_than_plafon = False
diff --git a/indoteknik_custom/models/purchasing_job.py b/indoteknik_custom/models/purchasing_job.py
index bf5ed8c4..4efb0cd4 100644
--- a/indoteknik_custom/models/purchasing_job.py
+++ b/indoteknik_custom/models/purchasing_job.py
@@ -57,7 +57,7 @@ class PurchasingJob(models.Model):
max(pjs.status_apo::text) AS status_apo,
max(pjs.note::text) AS note,
CASE
- WHEN sub.vendor_id = 5571 THEN 27
+ WHEN pmp.brand IN ('Tekiro', 'RYU', 'Rexco') THEN 27
WHEN sub.vendor_id = 9688 THEN 397
WHEN sub.vendor_id = 35475 THEN 397
WHEN sub.vendor_id = 29712 THEN 397
diff --git a/indoteknik_custom/models/res_partner.py b/indoteknik_custom/models/res_partner.py
index 9d1b70f8..f01ea481 100644
--- a/indoteknik_custom/models/res_partner.py
+++ b/indoteknik_custom/models/res_partner.py
@@ -1,8 +1,7 @@
from odoo import models, fields, api
from odoo.exceptions import UserError, ValidationError
from datetime import datetime
-
-
+from odoo.http import request
class GroupPartner(models.Model):
_name = 'group.partner'
@@ -97,7 +96,7 @@ class ResPartner(models.Model):
digital_invoice_tax = fields.Boolean(string="Digital Invoice & Faktur Pajak")
is_not_potential = fields.Boolean(string='Not Potential')
pakta_integritas = fields.Boolean(string='Pakta Integritas')
-
+
use_so_approval = fields.Boolean(string='Use SO Approval')
use_only_ready_stock = fields.Boolean(string='Use Only Ready Stock')
web_role = fields.Selection([
@@ -344,7 +343,7 @@ class ResPartner(models.Model):
for rec in self:
rec.user_payment_terms_sales = self.env.user.id
rec.date_payment_terms_sales = datetime.utcnow()
-
+
@api.constrains('property_supplier_payment_term_id')
def updated_by_payment_term(self):
for rec in self:
@@ -363,15 +362,15 @@ class ResPartner(models.Model):
rec.state_id = site.state_id
rec.country_id = site.country_id
rec.zip = site.zip
-
+
def get_main_parent(self):
partner = self
-
+
while partner.parent_id:
partner = partner.parent_id
-
+
return partner
-
+
def _compute_main_parent_id(self):
for partner in self:
partner.main_parent_id = partner.get_main_parent()
@@ -383,14 +382,14 @@ class ResPartner(models.Model):
partner_child_ids += [x['id'] for x in partner.parent_id.child_ids]
partner_child_ids += [partner.parent_id.id]
return partner_child_ids
-
+
def get_approve_partner_ids(self, type=False):
parent = self.parent_id or self
partners = self.search([('parent_id', '=', parent.id), ('web_role', '!=', False)])
-
+
if type == 'email_comma_sep':
return ",".join([x.email for x in partners])
-
+
return partners
@api.constrains('kota_id')
@@ -401,8 +400,19 @@ class ResPartner(models.Model):
def unlink(self):
if self._name == 'res.partner':
raise UserError('Maaf anda tidak bisa delete contact')
-
+
@api.onchange('customer_type')
def _onchange_customer_type(self):
if self.customer_type == 'nonpkp':
self.npwp = '00.000.000.0-000.000'
+
+ def get_check_tempo_partner(self):
+ self.ensure_one()
+
+ partner = self.parent_id or self
+
+ if not partner.property_payment_term_id or 'Tempo' not in partner.property_payment_term_id.name:
+ return False
+ else:
+ return True
+
diff --git a/indoteknik_custom/models/sale_order.py b/indoteknik_custom/models/sale_order.py
index 5e868edd..7fc6d96a 100755
--- a/indoteknik_custom/models/sale_order.py
+++ b/indoteknik_custom/models/sale_order.py
@@ -79,7 +79,7 @@ class SaleOrder(models.Model):
payment_link_midtrans = fields.Char(string='Payment Link', help='Url payment yg digenerate oleh midtrans, harap diserahkan ke customer agar dapat dilakukan pembayaran secara mandiri')
payment_qr_code = fields.Binary("Payment QR Code")
due_id = fields.Many2one('due.extension', string="Due Extension", readonly=True, tracking=True)
- vendor_approval_id = fields.Many2one('vendor.approval', string="Vendor Approval", readonly=True, tracking=True, copy=False)
+ vendor_approval_id = fields.Many2many('vendor.approval', string="Vendor Approval", readonly=True, tracking=True, copy=False)
customer_type = fields.Selection([
('pkp', 'PKP'),
('nonpkp', 'Non PKP')
@@ -99,6 +99,7 @@ class SaleOrder(models.Model):
helper_by_id = fields.Many2one('res.users', 'Helper By')
eta_date = fields.Datetime(string='ETA Date', copy=False, compute='_compute_eta_date')
flash_sale = fields.Boolean(string='Flash Sale', help='Data dari web')
+ is_continue_transaction = fields.Boolean(string='Button Transaction', help='Data dari web')
web_approval = fields.Selection([
('company', 'Company'),
('cust_manager', 'Customer Manager'),
@@ -144,6 +145,14 @@ class SaleOrder(models.Model):
('NP', 'Non Pareto')
])
+ @api.onchange('payment_status')
+ def _is_continue_transaction(self):
+ if not self.is_continue_transaction:
+ if self.payment_status == 'settlement':
+ self.is_continue_transaction = True
+ else:
+ self.is_continue_transaction = False
+
def _compute_total_weight(self):
total_weight = 0
missing_weight_products = []
@@ -882,29 +891,26 @@ class SaleOrder(models.Model):
}).send()
def validate_different_vendor(self):
- if self.vendor_approval_id and self.vendor_approval_id.state == 'draft':
- raise UserError('SO ini sedang dalam review Vendor Approval')
-
- if self.vendor_approval_id and self.vendor_approval_id.state == 'cancel':
- raise UserError('Vendor Approval SO ini Di Reject')
-
- if self.vendor_approval_id and self.vendor_approval_id.state == 'done':
+ if self.vendor_approval_id.filtered(lambda v: v.state == 'draft'):
+ draft_names = ", ".join(self.vendor_approval_id.filtered(lambda v: v.state == 'draft').mapped('number'))
+ raise UserError(f"SO ini sedang dalam review Vendor Approval: {draft_names}")
+
+ if self.vendor_approval_id and all(v.state != 'draft' for v in self.vendor_approval_id):
return False
- different_vendor = self.order_line.filtered(lambda l: l.vendor_id and l.vendor_md_id and l.vendor_id.id != l.vendor_md_id.id)
+ different_vendor = self.order_line.filtered(
+ lambda l: l.vendor_id and l.vendor_md_id and l.vendor_id.id != l.vendor_md_id.id
+ )
+
if different_vendor:
- vendor_approval = self.env['vendor.approval'].create({
- 'order_id': self.id,
- 'create_date_so': self.create_date,
- 'partner_id': self.partner_id.id,
- 'state': 'draft',
- })
-
- self.vendor_approval_id = vendor_approval.id
-
+ vendor_approvals = []
for line in different_vendor:
- self.env['vendor.approval.line'].create({
- 'vendor_approval_id': vendor_approval.id,
+ vendor_approval = self.env['vendor.approval'].create({
+ 'order_id': self.id,
+ 'order_line_id': line.id,
+ 'create_date_so': self.create_date,
+ 'partner_id': self.partner_id.id,
+ 'state': 'draft',
'product_id': line.product_id.id,
'product_uom_qty': line.product_uom_qty,
'vendor_id': line.vendor_id.id,
@@ -916,9 +922,15 @@ class SaleOrder(models.Model):
'margin_after': line.item_percent_margin,
'purchase_tax_id': line.purchase_tax_id.id,
'sales_tax_id': line.tax_id[0].id if line.tax_id else False,
- 'percent_margin_difference': (line.price_unit - line.purchase_price_md) / line.purchase_price_md if line.purchase_price_md else False,
+ 'percent_margin_difference': (
+ (line.price_unit - line.purchase_price_md) / line.purchase_price_md
+ if line.purchase_price_md else False
+ ),
})
-
+
+ vendor_approvals.append(vendor_approval.id)
+
+ self.vendor_approval_id = [(4, vid) for vid in vendor_approvals]
return True
else:
return False
diff --git a/indoteknik_custom/models/stock_picking.py b/indoteknik_custom/models/stock_picking.py
index 10b26711..17dd5766 100644
--- a/indoteknik_custom/models/stock_picking.py
+++ b/indoteknik_custom/models/stock_picking.py
@@ -570,10 +570,10 @@ class StockPicking(models.Model):
if self.location_dest_id.id == 47 and not self.env.user.is_purchasing_manager:
raise UserError("Transfer ke gudang selisih harus di approve Rafly Hanggara")
- if self.group_id.sale_id:
- if self.group_id.sale_id.payment_link_midtrans:
- if self.group_id.sale_id.payment_status != 'settlement':
- raise UserError('Uang belum masuk (settlement), mohon konfirmasi ke sales atau finance')
+ # if self.group_id.sale_id:
+ # if self.group_id.sale_id.payment_link_midtrans:
+ # if self.group_id.sale_id.payment_status != 'settlement' and self.group_id.sale_id.state == 'draft':
+ # raise UserError('Uang belum masuk (settlement), mohon konfirmasi ke sales atau finance')
if self.is_internal_use:
self.approval_status = 'approved'
diff --git a/indoteknik_custom/models/va_multi_approve.py b/indoteknik_custom/models/va_multi_approve.py
new file mode 100644
index 00000000..028358c2
--- /dev/null
+++ b/indoteknik_custom/models/va_multi_approve.py
@@ -0,0 +1,22 @@
+from odoo import models, fields
+import logging
+
+_logger = logging.getLogger(__name__)
+
+
+class VaMultiApprove(models.TransientModel):
+ _name = 'va.multi.approve'
+
+ def save_multi_approve_va(self):
+ va_ids = self._context['va_ids']
+ vendor_approval = self.env['vendor.approval'].browse(va_ids)
+ vendor_approval.action_approve()
+ return {
+ 'type': 'ir.actions.client',
+ 'tag': 'display_notification',
+ 'params': {
+ 'title': 'Notification',
+ 'message': 'Berhasil Di Approve',
+ 'next': {'type': 'ir.actions.act_window_close'},
+ }
+ } \ No newline at end of file
diff --git a/indoteknik_custom/models/va_multi_reject.py b/indoteknik_custom/models/va_multi_reject.py
new file mode 100644
index 00000000..c05581bf
--- /dev/null
+++ b/indoteknik_custom/models/va_multi_reject.py
@@ -0,0 +1,22 @@
+from odoo import models, fields
+import logging
+
+_logger = logging.getLogger(__name__)
+
+
+class VaMultiReject(models.TransientModel):
+ _name = 'va.multi.reject'
+
+ def save_multi_reject_va(self):
+ va_ids = self._context['va_ids']
+ vendor_approval = self.env['vendor.approval'].browse(va_ids)
+ vendor_approval.action_reject()
+ return {
+ 'type': 'ir.actions.client',
+ 'tag': 'display_notification',
+ 'params': {
+ 'title': 'Notification',
+ 'message': 'Berhasil Di Reject',
+ 'next': {'type': 'ir.actions.act_window_close'},
+ }
+ } \ No newline at end of file
diff --git a/indoteknik_custom/models/vendor_approval.py b/indoteknik_custom/models/vendor_approval.py
index 56b81a37..01d2e6a2 100644
--- a/indoteknik_custom/models/vendor_approval.py
+++ b/indoteknik_custom/models/vendor_approval.py
@@ -13,61 +13,90 @@ class VendorApproval(models.Model):
number = fields.Char(string='Document No', index=True, copy=False, readonly=True, tracking=True)
partner_id = fields.Many2one('res.partner', string="Customer", readonly=True)
+ order_line_id = fields.Many2one('sale.order.line', string="SO Line", readonly=True)
order_id = fields.Many2one('sale.order', string="SO", readonly=True)
- vendor_approval_line = fields.One2many('vendor.approval.line', 'vendor_approval_id', string='Vendor Approval Lines', auto_join=True)
state = fields.Selection([('draft', 'Draft'), ('done', 'Done'), ('cancel', 'Reject')], string='State', tracking=True)
create_date_so = fields.Datetime(string='Create Date SO', readonly=True)
+ product_id = fields.Many2one('product.product', string='Product')
+ product_uom_qty = fields.Float(string='Quantity')
+ vendor_id = fields.Many2one('res.partner', string='Vendor')
+ vendor_md_id = fields.Many2one('res.partner', string='Vendor MD')
+ sales_price = fields.Float(string='Sales Price')
+ margin_before = fields.Float(string='Margin Before')
+ margin_after = fields.Float(string='Margin After')
+ purchase_price = fields.Float(string='Purchase Price')
+ purchase_price_md= fields.Float(string='Purchase Price MD')
+ purchase_tax_id = fields.Many2one('account.tax', string='Purchase Tax', domain=['|', ('active', '=', False), ('active', '=', True)])
+ sales_tax_id = fields.Many2one('account.tax', string='Sales Tax', domain=['|', ('active', '=', False), ('active', '=', True)])
+ percent_margin_difference = fields.Float(string='Percent Margin Difference')
@api.model
def create(self, vals):
vals['number'] = self.env['ir.sequence'].next_by_code('vendor.approval') or '0'
result = super(VendorApproval, self).create(vals)
return result
+
+ def check_state_so(self):
+ for rec in self:
+ if rec.order_id.state != 'draft':
+ raise UserError(f"SO {rec.order_id.name} sudah tidak bisa diubah")
+
def action_approve(self):
- if not self.env.user.has_group('indoteknik_custom.group_role_merchandiser'):
- raise UserError('Hanya Merchandiser yang bisa approve')
-
- self.state = 'done'
- self.order_id.vendor_approval = True
- message = "Vendor Approval approved by %s" % (self.env.user.name)
- self.order_id.message_post(body=message)
- if not self.order_id.due_id and self.order_id.state == 'draft':
- self.order_id.action_confirm()
+ for rec in self:
+ self.check_state_so()
+ if not self.env.user.has_group('indoteknik_custom.group_role_merchandiser'):
+ raise UserError('Hanya Merchandiser yang bisa approve')
+
+ # Set state menjadi 'done'
+ rec.state = 'done'
+ rec.order_id.vendor_approval = True
+ message = f"Vendor Approval approved by {self.env.user.name}"
+ rec.order_id.message_post(body=message)
+
+ # Cek semua vendor.approval dengan order_id yang sama
+ related_approvals = self.env['vendor.approval'].search([('order_id', '=', rec.order_id.id)])
+ if all(approval.state != 'draft' for approval in related_approvals):
+ # Jalankan action_confirm hanya jika semua state bukan draft
+ if not rec.order_id.due_id and rec.order_id.state == 'draft':
+ rec.order_id.action_confirm()
+
def action_reject(self):
- if not self.env.user.has_group('indoteknik_custom.group_role_merchandiser'):
- raise UserError('Hanya Merchandiser yang bisa cancel')
-
- self.state = 'cancel'
+ for rec in self:
+ self.check_state_so()
+ if not self.env.user.has_group('indoteknik_custom.group_role_merchandiser'):
+ raise UserError('Hanya Merchandiser yang bisa cancel')
+
+ rec.state = 'cancel'
+
+ rec.order_line_id.vendor_id = rec.vendor_md_id.id
+ rec.order_line_id.purchase_price = rec.purchase_price_md
- message = "Vendor Approval rejected by %s" % (self.env.user.name)
- self.order_id.message_post(body=message)
+ message = "Vendor Approval rejected by %s" % (self.env.user.name)
+ self.order_id.message_post(body=message)
+
+ related_approvals = self.env['vendor.approval'].search([('order_id', '=', rec.order_id.id)])
+ if all(approval.state != 'draft' for approval in related_approvals):
+ # Jalankan action_confirm hanya jika semua state bukan draft
+ if not rec.order_id.due_id and rec.order_id.state == 'draft':
+ rec.order_id.action_confirm()
def unlink(self):
res = super(VendorApproval, self).unlink()
if not self._name == 'vendor.approval':
raise UserError('Vendor Approval tidak bisa didelete')
return res
-
-
-class VendorApprovalLine(models.Model):
- _name = 'vendor.approval.line'
- _description = 'Vendor Approval Line'
- _order = 'vendor_approval_id, id'
-
- vendor_approval_id = fields.Many2one('vendor.approval', string='Vendor Approval Ref', required=True, ondelete='cascade', index=True, copy=False)
- product_id = fields.Many2one('product.product', string='Product')
- product_uom_qty = fields.Float(string='Quantity')
- vendor_id = fields.Many2one('res.partner', string='Vendor')
- vendor_md_id = fields.Many2one('res.partner', string='Vendor MD')
- sales_price = fields.Float(string='Sales Price')
- margin_before = fields.Float(string='Margin Before')
- margin_after = fields.Float(string='Margin After')
- purchase_price = fields.Float(string='Purchase Price')
- purchase_price_md= fields.Float(string='Purchase Price MD')
- purchase_tax_id = fields.Many2one('account.tax', string='Purchase Tax', domain=['|', ('active', '=', False), ('active', '=', True)])
- sales_tax_id = fields.Many2one('account.tax', string='Sales Tax', domain=['|', ('active', '=', False), ('active', '=', True)])
- percent_margin_difference = fields.Float(string='Percent Margin Difference')
-
+ def open_form_multi_approve(self):
+ action = self.env['ir.actions.act_window']._for_xml_id('indoteknik_custom.action_va_multi_approve')
+ action['context'] = {
+ 'va_ids': [x.id for x in self]
+ }
+ return action
+ def open_form_multi_reject(self):
+ action = self.env['ir.actions.act_window']._for_xml_id('indoteknik_custom.action_va_multi_reject')
+ action['context'] = {
+ 'va_ids': [x.id for x in self]
+ }
+ return action \ No newline at end of file