From 60fffef5ee0c91ba58a056823fc2feff6241a303 Mon Sep 17 00:00:00 2001 From: stephanchrst Date: Thu, 22 Sep 2022 13:46:48 +0700 Subject: add calculate margin including delivery fee in purchase order --- indoteknik_custom/models/sale_order.py | 115 +++++++++++++++++++-------------- 1 file changed, 67 insertions(+), 48 deletions(-) (limited to 'indoteknik_custom/models/sale_order.py') diff --git a/indoteknik_custom/models/sale_order.py b/indoteknik_custom/models/sale_order.py index 1db8a445..7366d67a 100755 --- a/indoteknik_custom/models/sale_order.py +++ b/indoteknik_custom/models/sale_order.py @@ -19,6 +19,9 @@ class SaleOrder(models.Model): ], string='Approval Status', readonly=True, copy=False, index=True, tracking=3) carrier_id = fields.Many2one('delivery.carrier', string='Shipping Method') have_visit_service = fields.Boolean(string='Have Visit Service', help='To compute is customer get visit service', compute='_compute_have_visit_service') + count_line_product = fields.Float('Count Line Product', compute='compute_count_line_product') + delivery_amount = fields.Float('Delivery Amount', compute='compute_delivery_amount') + def _compute_have_visit_service(self): limit = 20000000 @@ -26,39 +29,56 @@ class SaleOrder(models.Model): if self.amount_total > limit: self.have_visit_service = True - # def sale_order_approve(self): - # for order in self: - # if order.state == 'cancel' or order.state == 'done' or order.state == 'sale': - # raise UserError("Status harus draft atau sent") - # approval1 = approval2 = 0 - # for line in order.order_line: - # if not line.product_id: - # continue - # if (line.item_percent_margin <= 15 or line.item_percent_margin == 100) and ( - # self.env.user.id != 6 and self.env.user.id != 7): - # approval2 += 1 - # # order.approval_status = "pengajuan2" - # # break - # elif line.item_percent_margin <= 40 and (self.env.user.id != 8 and self.env.user.id != 6 and self.env.user.id != 7): - # approval1 += 1 - # # order.approval_status = 'pengajuan1' - # # break - # if approval2 > 0: - # order.approval_status = 'pengajuan2' - # elif approval1 > 0: - # order.approval_status = 'pengajuan1' - # else: - # raise UserError("Bisa langsung Confirm") + def sale_order_approve(self): + raise UserError("Bisa langsung Confirm") + # for order in self: + # if order.state == 'cancel' or order.state == 'done' or order.state == 'sale': + # raise UserError("Status harus draft atau sent") + # approval1 = approval2 = 0 + # for line in order.order_line: + # if not line.product_id: + # continue + # if (line.item_percent_margin <= 15 or line.item_percent_margin == 100) and ( + # self.env.user.id != 6 and self.env.user.id != 7): + # approval2 += 1 + # # order.approval_status = "pengajuan2" + # # break + # elif line.item_percent_margin <= 40 and (self.env.user.id != 8 and self.env.user.id != 6 and self.env.user.id != 7): + # approval1 += 1 + # # order.approval_status = 'pengajuan1' + # # break + # if approval2 > 0: + # order.approval_status = 'pengajuan2' + # elif approval1 > 0: + # order.approval_status = 'pengajuan1' + # else: + # raise UserError("Bisa langsung Confirm") - # def action_cancel(self): - # self.approval_status = False - # return super(SaleOrder, self).action_cancel() + def action_cancel(self): + # self.approval_status = False + return super(SaleOrder, self).action_cancel() def action_confirm(self): - for line in self.order_line: - if line.product_id.id == 232383: - raise UserError(_('Tidak bisa Confirm menggunakan Produk Sementara')) res = super(SaleOrder, self).action_confirm() + # for line in self.order_line: + # if line.product_id.id == 232383: + # raise UserError(_('Tidak bisa Confirm menggunakan Produk Sementara')) + # for order in self: + # approval1 = approval2 = 0 + # for line in order.order_line: + # if not line.product_id: + # continue + # if (line.item_percent_margin <= 15 or line.item_percent_margin == 100) and ( + # self.env.user.id != 6 and self.env.user.id != 7): + # approval2 += 1 + # elif line.item_percent_margin <= 40 and ( + # self.env.user.id != 8 and self.env.user.id != 6 and self.env.user.id != 7): + # approval1 += 1 + # if approval2 > 0: + # raise UserError("Need Tyas / Akbar Approval, atau Approval manual dan lampirkan di Log Internal") + # elif approval1 > 0: + # raise UserError("Need Adela Approval") + # order.approval_status = 'approved' return res def compute_total_margin(self): @@ -75,25 +95,24 @@ class SaleOrder(models.Model): total_percent_margin = round((total_margin / order.amount_untaxed), 4) * 100 order.total_percent_margin = total_percent_margin - # def action_confirm(self): - # res = super(SaleOrder, self).action_confirm() - # for order in self: - # approval1 = approval2 = 0 - # for line in order.order_line: - # if not line.product_id: - # continue - # if (line.item_percent_margin <= 15 or line.item_percent_margin == 100) and ( - # self.env.user.id != 6 and self.env.user.id != 7): - # approval2 += 1 - # elif line.item_percent_margin <= 40 and ( - # self.env.user.id != 8 and self.env.user.id != 6 and self.env.user.id != 7): - # approval1 += 1 - # if approval2 > 0: - # raise UserError("Need Tyas / Akbar Approval, atau Approval manual dan lampirkan di Log Internal") - # elif approval1 > 0: - # raise UserError("Need Adela Approval") - # order.approval_status = 'approved' - # return res + def compute_count_line_product(self): + for order in self: + count = 0 + for line in order.order_line: + if line.product_id.type == 'product': + count += 1 + if count == 0: + order.count_line_product = 1 + else: + order.count_line_product = count + + def compute_delivery_amount(self): + for order in self: + amount = 0 + for line in order.order_line: + if line.product_id.type == 'service': + amount += line.price_total + order.delivery_amount = amount class SaleOrderLine(models.Model): -- cgit v1.2.3 From 248fd7cb0c93e60bdfccaf095cdb601a3319b65e Mon Sep 17 00:00:00 2001 From: stephanchrst Date: Sat, 24 Sep 2022 11:11:49 +0700 Subject: add several column in sales order and order line --- indoteknik_custom/models/sale_order.py | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) (limited to 'indoteknik_custom/models/sale_order.py') diff --git a/indoteknik_custom/models/sale_order.py b/indoteknik_custom/models/sale_order.py index 7366d67a..30ac2058 100755 --- a/indoteknik_custom/models/sale_order.py +++ b/indoteknik_custom/models/sale_order.py @@ -21,6 +21,9 @@ class SaleOrder(models.Model): have_visit_service = fields.Boolean(string='Have Visit Service', help='To compute is customer get visit service', compute='_compute_have_visit_service') count_line_product = fields.Float('Count Line Product', compute='compute_count_line_product') delivery_amount = fields.Float('Delivery Amount', compute='compute_delivery_amount') + shipping_cost_covered = fields.Boolean('Shipping Cost Covered', help='Centang jika Shipping Cost ditanggung oleh ' + 'Indoteknik, jika dicentang akan ' + 'mempengaruhi margin') def _compute_have_visit_service(self): @@ -118,11 +121,24 @@ class SaleOrder(models.Model): class SaleOrderLine(models.Model): _inherit = 'sale.order.line' item_margin = fields.Float( - 'Total Margin', compute='compute_item_margin', + 'Margin', compute='compute_item_margin', help="Total Margin in Sales Order Header") item_percent_margin = fields.Float( - 'Total Percent Margin', compute='compute_item_margin', + '%Margin', compute='compute_item_margin', help="Total % Margin in Sales Order Header") + vendor = fields.Many2one( + 'res.partner', string='Vendor', readonly=True, + states={'draft': [('readonly', False)], 'sent': [('readonly', False)]}, + required=True, change_default=True, index=True, tracking=1, + domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]",) + vendor = fields.Many2one( + 'res.partner', string='Vendor', readonly=True, + states={'draft': [('readonly', False)], 'sent': [('readonly', False)]}, + change_default=True, index=True, tracking=1, + domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]", ) + purchase_price = fields.Float('Purchase', required=True, digits='Product Price', default=0.0) + tax_id = fields.Many2one('account.tax', string='Tax', + domain=['|', ('active', '=', False), ('active', '=', True)]) def compute_item_margin(self): for line in self: -- cgit v1.2.3 From 01b658ddbb6ed4e5c493da2c9cae92ce80a7e135 Mon Sep 17 00:00:00 2001 From: stephanchrst Date: Sat, 24 Sep 2022 11:39:41 +0700 Subject: fix error column sale order --- indoteknik_custom/models/sale_order.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'indoteknik_custom/models/sale_order.py') diff --git a/indoteknik_custom/models/sale_order.py b/indoteknik_custom/models/sale_order.py index 30ac2058..08e7281e 100755 --- a/indoteknik_custom/models/sale_order.py +++ b/indoteknik_custom/models/sale_order.py @@ -137,7 +137,7 @@ class SaleOrderLine(models.Model): change_default=True, index=True, tracking=1, domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]", ) purchase_price = fields.Float('Purchase', required=True, digits='Product Price', default=0.0) - tax_id = fields.Many2one('account.tax', string='Tax', + purchase_tax_id = fields.Many2one('account.tax', string='Tax', domain=['|', ('active', '=', False), ('active', '=', True)]) def compute_item_margin(self): -- cgit v1.2.3 From 18a08e93126100d572a56e4deced21434082bd72 Mon Sep 17 00:00:00 2001 From: stephanchrst Date: Mon, 26 Sep 2022 13:29:17 +0700 Subject: Update sale_order.py and sale_order.xml - calculate margin with input purchase price --- indoteknik_custom/models/sale_order.py | 36 ++++++++++++++++++---------------- 1 file changed, 19 insertions(+), 17 deletions(-) (limited to 'indoteknik_custom/models/sale_order.py') diff --git a/indoteknik_custom/models/sale_order.py b/indoteknik_custom/models/sale_order.py index 08e7281e..4d1550aa 100755 --- a/indoteknik_custom/models/sale_order.py +++ b/indoteknik_custom/models/sale_order.py @@ -95,7 +95,7 @@ class SaleOrder(models.Model): total_margin += line.item_margin order.total_margin = total_margin if order.amount_untaxed > 0: - total_percent_margin = round((total_margin / order.amount_untaxed), 4) * 100 + total_percent_margin = round((total_margin / order.amount_untaxed), 2) * 100 order.total_percent_margin = total_percent_margin def compute_count_line_product(self): @@ -126,12 +126,7 @@ class SaleOrderLine(models.Model): item_percent_margin = fields.Float( '%Margin', compute='compute_item_margin', help="Total % Margin in Sales Order Header") - vendor = fields.Many2one( - 'res.partner', string='Vendor', readonly=True, - states={'draft': [('readonly', False)], 'sent': [('readonly', False)]}, - required=True, change_default=True, index=True, tracking=1, - domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]",) - vendor = fields.Many2one( + vendor_id = fields.Many2one( 'res.partner', string='Vendor', readonly=True, states={'draft': [('readonly', False)], 'sent': [('readonly', False)]}, change_default=True, index=True, tracking=1, @@ -142,17 +137,24 @@ class SaleOrderLine(models.Model): def compute_item_margin(self): for line in self: - if not line.product_id or line.price_unit <= 0 or line.product_uom_qty <= 0: + if not line.product_id or line.product_id.type == 'service' \ + or line.price_unit <= 0 or line.product_uom_qty <= 0 \ + or not line.vendor_id or not line.purchase_tax_id: line.item_margin = 0 line.item_percent_margin = 0 continue - subtotal_untaxed = line.price_subtotal - purchase_pricelist = self.env['purchase.pricelist'].search( - [('product_id', '=', line.product_id.id)], limit=1, order='product_price') - purchase_pricelist_untaxed = 0 - if purchase_pricelist.product_price > 0: - purchase_pricelist_untaxed = purchase_pricelist.product_price / 1.11 - margin_per_item = subtotal_untaxed - (purchase_pricelist_untaxed * line.product_uom_qty) + # calculate margin without tax + sales_price = line.price_reduce_taxexcl * line.product_uom_qty + # minus with delivery if covered by indoteknik + if line.order_id.shipping_cost_covered: + sales_price -= round((line.order_id.delivery_amount / line.order_id.count_line_product), 2) + + purchase_price = line.purchase_price + if line.purchase_tax_id.price_include: + purchase_price = line.purchase_price / 1.11 + + purchase_price = purchase_price * line.product_uom_qty + margin_per_item = sales_price - purchase_price line.item_margin = margin_per_item - if subtotal_untaxed > 0: - line.item_percent_margin = round((margin_per_item / subtotal_untaxed), 4) * 100 + # if sales_price > 0: + line.item_percent_margin = round((margin_per_item / sales_price), 2) * 100 -- cgit v1.2.3 From 300b62f3ca9898d31254c53dda267a6cc8feaaef Mon Sep 17 00:00:00 2001 From: stephanchrst Date: Mon, 26 Sep 2022 14:17:54 +0700 Subject: Update sale_order.py - add approval process for sales order TODO change approval to Sales Manager --- indoteknik_custom/models/sale_order.py | 84 ++++++++++++++++------------------ 1 file changed, 39 insertions(+), 45 deletions(-) (limited to 'indoteknik_custom/models/sale_order.py') diff --git a/indoteknik_custom/models/sale_order.py b/indoteknik_custom/models/sale_order.py index 4d1550aa..c643aa6d 100755 --- a/indoteknik_custom/models/sale_order.py +++ b/indoteknik_custom/models/sale_order.py @@ -13,8 +13,8 @@ class SaleOrder(models.Model): 'Total Percent Margin', compute='compute_total_margin', help="Total % Margin in Sales Order Header") approval_status = fields.Selection([ - ('pengajuan1', 'Approval Adela'), - ('pengajuan2', 'Approval Tyas'), + ('pengajuan1', 'Approval Manager'), + ('pengajuan2', 'Approval Pimpinan'), ('approved', 'Approved'), ], string='Approval Status', readonly=True, copy=False, index=True, tracking=3) carrier_id = fields.Many2one('delivery.carrier', string='Shipping Method') @@ -33,55 +33,49 @@ class SaleOrder(models.Model): self.have_visit_service = True def sale_order_approve(self): - raise UserError("Bisa langsung Confirm") - # for order in self: - # if order.state == 'cancel' or order.state == 'done' or order.state == 'sale': - # raise UserError("Status harus draft atau sent") - # approval1 = approval2 = 0 - # for line in order.order_line: - # if not line.product_id: - # continue - # if (line.item_percent_margin <= 15 or line.item_percent_margin == 100) and ( - # self.env.user.id != 6 and self.env.user.id != 7): - # approval2 += 1 - # # order.approval_status = "pengajuan2" - # # break - # elif line.item_percent_margin <= 40 and (self.env.user.id != 8 and self.env.user.id != 6 and self.env.user.id != 7): - # approval1 += 1 - # # order.approval_status = 'pengajuan1' - # # break - # if approval2 > 0: - # order.approval_status = 'pengajuan2' - # elif approval1 > 0: - # order.approval_status = 'pengajuan1' - # else: - # raise UserError("Bisa langsung Confirm") + # raise UserError("Bisa langsung Confirm") + for order in self: + if order.state == 'cancel' or order.state == 'done' or order.state == 'sale': + raise UserError("Status harus draft atau sent") + approval1 = approval2 = 0 + for line in order.order_line: + if not line.product_id or line.product_id.type == 'service': + continue + if (line.item_percent_margin <= 15) and (self.env.user.id != 6 and self.env.user.id != 7): # akbar or tyas + approval2 += 1 + elif line.item_percent_margin <= 25 and (self.env.user.id != 19 and self.env.user.id != 6 and self.env.user.id != 7): + approval1 += 1 + if approval2 > 0: + order.approval_status = 'pengajuan2' + elif approval1 > 0: + order.approval_status = 'pengajuan1' + else: + raise UserError("Bisa langsung Confirm") def action_cancel(self): - # self.approval_status = False + self.approval_status = False return super(SaleOrder, self).action_cancel() def action_confirm(self): res = super(SaleOrder, self).action_confirm() - # for line in self.order_line: - # if line.product_id.id == 232383: - # raise UserError(_('Tidak bisa Confirm menggunakan Produk Sementara')) - # for order in self: - # approval1 = approval2 = 0 - # for line in order.order_line: - # if not line.product_id: - # continue - # if (line.item_percent_margin <= 15 or line.item_percent_margin == 100) and ( - # self.env.user.id != 6 and self.env.user.id != 7): - # approval2 += 1 - # elif line.item_percent_margin <= 40 and ( - # self.env.user.id != 8 and self.env.user.id != 6 and self.env.user.id != 7): - # approval1 += 1 - # if approval2 > 0: - # raise UserError("Need Tyas / Akbar Approval, atau Approval manual dan lampirkan di Log Internal") - # elif approval1 > 0: - # raise UserError("Need Adela Approval") - # order.approval_status = 'approved' + for line in self.order_line: + if line.product_id.id == 232383: + raise UserError(_('Tidak bisa Confirm menggunakan Produk Sementara')) + + for order in self: + approval1 = approval2 = 0 + for line in order.order_line: + if not line.product_id or line.product_id.type == 'service': + continue + if (line.item_percent_margin <= 15) and (self.env.user.id != 6 and self.env.user.id != 7): # akbar or tyas will approve + approval2 += 1 + elif line.item_percent_margin <= 25 and (self.env.user.id != 6 and self.env.user.id != 7 and self.env.user.id != 19): # darren? + approval1 += 1 + if approval2 > 0: + raise UserError("Harus diapprove oleh Pimpinan (Akbar / Tyas)") + elif approval1 > 0: + raise UserError("Harus diapprove oleh Manager (?)") + order.approval_status = 'approved' return res def compute_total_margin(self): -- cgit v1.2.3 From 0b48304775255b09de9c2aeba55cd958a860954c Mon Sep 17 00:00:00 2001 From: stephanchrst Date: Mon, 26 Sep 2022 14:18:59 +0700 Subject: Update sale_order.py --- indoteknik_custom/models/sale_order.py | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) (limited to 'indoteknik_custom/models/sale_order.py') diff --git a/indoteknik_custom/models/sale_order.py b/indoteknik_custom/models/sale_order.py index c643aa6d..ad50712f 100755 --- a/indoteknik_custom/models/sale_order.py +++ b/indoteknik_custom/models/sale_order.py @@ -18,14 +18,14 @@ class SaleOrder(models.Model): ('approved', 'Approved'), ], string='Approval Status', readonly=True, copy=False, index=True, tracking=3) carrier_id = fields.Many2one('delivery.carrier', string='Shipping Method') - have_visit_service = fields.Boolean(string='Have Visit Service', help='To compute is customer get visit service', compute='_compute_have_visit_service') + have_visit_service = fields.Boolean(string='Have Visit Service', help='To compute is customer get visit service', + compute='_compute_have_visit_service') count_line_product = fields.Float('Count Line Product', compute='compute_count_line_product') delivery_amount = fields.Float('Delivery Amount', compute='compute_delivery_amount') shipping_cost_covered = fields.Boolean('Shipping Cost Covered', help='Centang jika Shipping Cost ditanggung oleh ' 'Indoteknik, jika dicentang akan ' 'mempengaruhi margin') - def _compute_have_visit_service(self): limit = 20000000 self.have_visit_service = False @@ -41,9 +41,11 @@ class SaleOrder(models.Model): for line in order.order_line: if not line.product_id or line.product_id.type == 'service': continue - if (line.item_percent_margin <= 15) and (self.env.user.id != 6 and self.env.user.id != 7): # akbar or tyas + if (line.item_percent_margin <= 15) and ( + self.env.user.id != 6 and self.env.user.id != 7): # akbar or tyas approval2 += 1 - elif line.item_percent_margin <= 25 and (self.env.user.id != 19 and self.env.user.id != 6 and self.env.user.id != 7): + elif line.item_percent_margin <= 25 and ( + self.env.user.id != 19 and self.env.user.id != 6 and self.env.user.id != 7): approval1 += 1 if approval2 > 0: order.approval_status = 'pengajuan2' @@ -67,9 +69,11 @@ class SaleOrder(models.Model): for line in order.order_line: if not line.product_id or line.product_id.type == 'service': continue - if (line.item_percent_margin <= 15) and (self.env.user.id != 6 and self.env.user.id != 7): # akbar or tyas will approve + if (line.item_percent_margin <= 15) and ( + self.env.user.id != 6 and self.env.user.id != 7): # akbar or tyas will approve approval2 += 1 - elif line.item_percent_margin <= 25 and (self.env.user.id != 6 and self.env.user.id != 7 and self.env.user.id != 19): # darren? + elif line.item_percent_margin <= 25 and ( + self.env.user.id != 6 and self.env.user.id != 7 and self.env.user.id != 19): # darren? approval1 += 1 if approval2 > 0: raise UserError("Harus diapprove oleh Pimpinan (Akbar / Tyas)") @@ -127,7 +131,7 @@ class SaleOrderLine(models.Model): domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]", ) purchase_price = fields.Float('Purchase', required=True, digits='Product Price', default=0.0) purchase_tax_id = fields.Many2one('account.tax', string='Tax', - domain=['|', ('active', '=', False), ('active', '=', True)]) + domain=['|', ('active', '=', False), ('active', '=', True)]) def compute_item_margin(self): for line in self: -- cgit v1.2.3 From 98d8bb612184f5354c076f52143afcfad4e05e6f Mon Sep 17 00:00:00 2001 From: stephanchrst Date: Mon, 26 Sep 2022 14:37:00 +0700 Subject: Update sale_order.py --- indoteknik_custom/models/sale_order.py | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'indoteknik_custom/models/sale_order.py') diff --git a/indoteknik_custom/models/sale_order.py b/indoteknik_custom/models/sale_order.py index ad50712f..e317fb8e 100755 --- a/indoteknik_custom/models/sale_order.py +++ b/indoteknik_custom/models/sale_order.py @@ -156,3 +156,13 @@ class SaleOrderLine(models.Model): line.item_margin = margin_per_item # if sales_price > 0: line.item_percent_margin = round((margin_per_item / sales_price), 2) * 100 + + @api.onchange('vendor_id') + def onchange_vendor_id(self): + if not self.product_id or self.product_id.type == 'service': + return + test1 = self.vendor_id.id + test2 = self.product_id.id + purchase_price = self.env['purchase.pricelist'].search( + [('vendor_id', '=', self.vendor_id.id), ('product_id', '=', self.product_id.id)], limit=1) + self.purchase_price = purchase_price.product_price -- cgit v1.2.3 From 7ae5b8b7baafb9ed302c3c3e54f3f44664651c06 Mon Sep 17 00:00:00 2001 From: stephanchrst Date: Mon, 26 Sep 2022 18:25:41 +0700 Subject: Update purchase_order.py, purchase_order_line.py, and 2 more files... --- indoteknik_custom/models/sale_order.py | 2 -- 1 file changed, 2 deletions(-) (limited to 'indoteknik_custom/models/sale_order.py') diff --git a/indoteknik_custom/models/sale_order.py b/indoteknik_custom/models/sale_order.py index e317fb8e..1fb88495 100755 --- a/indoteknik_custom/models/sale_order.py +++ b/indoteknik_custom/models/sale_order.py @@ -161,8 +161,6 @@ class SaleOrderLine(models.Model): def onchange_vendor_id(self): if not self.product_id or self.product_id.type == 'service': return - test1 = self.vendor_id.id - test2 = self.product_id.id purchase_price = self.env['purchase.pricelist'].search( [('vendor_id', '=', self.vendor_id.id), ('product_id', '=', self.product_id.id)], limit=1) self.purchase_price = purchase_price.product_price -- cgit v1.2.3 From 90ee21e0c1b2179b53d1dbadd6232bf22a3eea5a Mon Sep 17 00:00:00 2001 From: stephanchrst Date: Tue, 27 Sep 2022 11:36:23 +0700 Subject: Update purchase_order.py and sale_order.py --- indoteknik_custom/models/sale_order.py | 2 ++ 1 file changed, 2 insertions(+) (limited to 'indoteknik_custom/models/sale_order.py') diff --git a/indoteknik_custom/models/sale_order.py b/indoteknik_custom/models/sale_order.py index 1fb88495..73047171 100755 --- a/indoteknik_custom/models/sale_order.py +++ b/indoteknik_custom/models/sale_order.py @@ -39,6 +39,8 @@ class SaleOrder(models.Model): raise UserError("Status harus draft atau sent") approval1 = approval2 = 0 for line in order.order_line: + if line.product_id.id == 232383: + raise UserError(_('Tidak bisa Confirm menggunakan Produk Sementara')) if not line.product_id or line.product_id.type == 'service': continue if (line.item_percent_margin <= 15) and ( -- cgit v1.2.3 From 3a8710d164ced77e532b0b96988d84bb08515602 Mon Sep 17 00:00:00 2001 From: stephanchrst Date: Tue, 27 Sep 2022 14:42:59 +0700 Subject: Update purchase_order.py, sale_order.py, and sale_order.xml --- indoteknik_custom/models/sale_order.py | 32 ++++++++++++++++++++------------ 1 file changed, 20 insertions(+), 12 deletions(-) (limited to 'indoteknik_custom/models/sale_order.py') diff --git a/indoteknik_custom/models/sale_order.py b/indoteknik_custom/models/sale_order.py index 73047171..70e2d63e 100755 --- a/indoteknik_custom/models/sale_order.py +++ b/indoteknik_custom/models/sale_order.py @@ -21,10 +21,15 @@ class SaleOrder(models.Model): have_visit_service = fields.Boolean(string='Have Visit Service', help='To compute is customer get visit service', compute='_compute_have_visit_service') count_line_product = fields.Float('Count Line Product', compute='compute_count_line_product') - delivery_amount = fields.Float('Delivery Amount', compute='compute_delivery_amount') + # delivery_amount = fields.Float('Delivery Amount', compute='compute_delivery_amount') + delivery_amt = fields.Float('Delivery Amt') shipping_cost_covered = fields.Boolean('Shipping Cost Covered', help='Centang jika Shipping Cost ditanggung oleh ' - 'Indoteknik, jika dicentang akan ' + 'Indoteknik (Finance), jika dicentang akan ' 'mempengaruhi margin') + shipping_paid_by = fields.Selection([ + ('indoteknik', 'Indoteknik'), + ('customer', 'Customer') + ], string='Shipping Paid by', help='Siapa yang talangin Biaya kirim?',copy=False) def _compute_have_visit_service(self): limit = 20000000 @@ -39,10 +44,12 @@ class SaleOrder(models.Model): raise UserError("Status harus draft atau sent") approval1 = approval2 = 0 for line in order.order_line: - if line.product_id.id == 232383: - raise UserError(_('Tidak bisa Confirm menggunakan Produk Sementara')) if not line.product_id or line.product_id.type == 'service': continue + if line.product_id.id == 232383: + raise UserError(_('Tidak bisa Confirm menggunakan Produk Sementara')) + if not line.vendor_id or not line.purchase_price or not line.purchase_tax_id: + raise UserError(_('Isi Vendor, Harga Beli, dan Tax sebelum Request Approval')) if (line.item_percent_margin <= 15) and ( self.env.user.id != 6 and self.env.user.id != 7): # akbar or tyas approval2 += 1 @@ -109,13 +116,14 @@ class SaleOrder(models.Model): else: order.count_line_product = count - def compute_delivery_amount(self): - for order in self: - amount = 0 - for line in order.order_line: - if line.product_id.type == 'service': - amount += line.price_total - order.delivery_amount = amount + # def compute_delivery_amount(self): + # for order in self: + # amount = 0 + # for line in order.order_line: + # if line.product_id.type == 'service': + # amount += line.price_total + # order.delivery_amount = amount + # order.delivery_amt = amount class SaleOrderLine(models.Model): @@ -147,7 +155,7 @@ class SaleOrderLine(models.Model): sales_price = line.price_reduce_taxexcl * line.product_uom_qty # minus with delivery if covered by indoteknik if line.order_id.shipping_cost_covered: - sales_price -= round((line.order_id.delivery_amount / line.order_id.count_line_product), 2) + sales_price -= round((line.order_id.delivery_amt / line.order_id.count_line_product), 2) purchase_price = line.purchase_price if line.purchase_tax_id.price_include: -- cgit v1.2.3 From d023b4f2564c7d2fbe3d61a2348250569f182dc4 Mon Sep 17 00:00:00 2001 From: stephanchrst Date: Wed, 28 Sep 2022 10:59:19 +0700 Subject: Update sale_order.py and sale_order.xml --- indoteknik_custom/models/sale_order.py | 36 +++++++++++++++++++++------------- 1 file changed, 22 insertions(+), 14 deletions(-) (limited to 'indoteknik_custom/models/sale_order.py') diff --git a/indoteknik_custom/models/sale_order.py b/indoteknik_custom/models/sale_order.py index 70e2d63e..1cd358ab 100755 --- a/indoteknik_custom/models/sale_order.py +++ b/indoteknik_custom/models/sale_order.py @@ -21,15 +21,17 @@ class SaleOrder(models.Model): have_visit_service = fields.Boolean(string='Have Visit Service', help='To compute is customer get visit service', compute='_compute_have_visit_service') count_line_product = fields.Float('Count Line Product', compute='compute_count_line_product') - # delivery_amount = fields.Float('Delivery Amount', compute='compute_delivery_amount') delivery_amt = fields.Float('Delivery Amt') - shipping_cost_covered = fields.Boolean('Shipping Cost Covered', help='Centang jika Shipping Cost ditanggung oleh ' - 'Indoteknik (Finance), jika dicentang akan ' - 'mempengaruhi margin') + shipping_cost_covered = fields.Selection([ + ('indoteknik', 'Indoteknik'), + ('customer', 'Customer') + ], string='Shipping Paid by', help='Siapa yang menanggung biaya ekspedisi?', copy=False) shipping_paid_by = fields.Selection([ ('indoteknik', 'Indoteknik'), ('customer', 'Customer') - ], string='Shipping Paid by', help='Siapa yang talangin Biaya kirim?',copy=False) + ], string='Shipping Paid by', help='Siapa yang talangin dulu Biaya ekspedisi-nya?', copy=False) + sales_tax_id = fields.Many2one('account.tax', string='Tax', + domain=['|', ('active', '=', False), ('active', '=', True)]) def _compute_have_visit_service(self): limit = 20000000 @@ -116,14 +118,11 @@ class SaleOrder(models.Model): else: order.count_line_product = count - # def compute_delivery_amount(self): - # for order in self: - # amount = 0 - # for line in order.order_line: - # if line.product_id.type == 'service': - # amount += line.price_total - # order.delivery_amount = amount - # order.delivery_amt = amount + @api.onchange('sales_tax_id') + def onchange_sales_tax_id(self): + for line in self.order_line: + # line.tax_id = self.sales_tax_id + line.product_id_change() class SaleOrderLine(models.Model): @@ -154,7 +153,7 @@ class SaleOrderLine(models.Model): # calculate margin without tax sales_price = line.price_reduce_taxexcl * line.product_uom_qty # minus with delivery if covered by indoteknik - if line.order_id.shipping_cost_covered: + if line.order_id.shipping_cost_covered == 'indoteknik': sales_price -= round((line.order_id.delivery_amt / line.order_id.count_line_product), 2) purchase_price = line.purchase_price @@ -174,3 +173,12 @@ class SaleOrderLine(models.Model): purchase_price = self.env['purchase.pricelist'].search( [('vendor_id', '=', self.vendor_id.id), ('product_id', '=', self.product_id.id)], limit=1) self.purchase_price = purchase_price.product_price + self.purchase_tax_id = 22 + + @api.onchange('product_id') + def product_id_change(self): + for line in self: + super(SaleOrderLine, self).product_id_change() + if line.product_id: + line.tax_id = line.order_id.sales_tax_id + -- cgit v1.2.3 From 7e27706cca01443b8476afeaa856fa2cc3c12deb Mon Sep 17 00:00:00 2001 From: stephanchrst Date: Wed, 28 Sep 2022 11:14:28 +0700 Subject: change approval sales to vita and po to akbar and tyas --- indoteknik_custom/models/sale_order.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) (limited to 'indoteknik_custom/models/sale_order.py') diff --git a/indoteknik_custom/models/sale_order.py b/indoteknik_custom/models/sale_order.py index 1cd358ab..d1200de2 100755 --- a/indoteknik_custom/models/sale_order.py +++ b/indoteknik_custom/models/sale_order.py @@ -44,6 +44,8 @@ class SaleOrder(models.Model): for order in self: if order.state == 'cancel' or order.state == 'done' or order.state == 'sale': raise UserError("Status harus draft atau sent") + if not order.sales_tax_id: + raise UserError("Tax di Header harus diisi") approval1 = approval2 = 0 for line in order.order_line: if not line.product_id or line.product_id.type == 'service': @@ -71,20 +73,22 @@ class SaleOrder(models.Model): def action_confirm(self): res = super(SaleOrder, self).action_confirm() - for line in self.order_line: - if line.product_id.id == 232383: - raise UserError(_('Tidak bisa Confirm menggunakan Produk Sementara')) - for order in self: + if not order.sales_tax_id: + raise UserError("Tax di Header harus diisi") approval1 = approval2 = 0 for line in order.order_line: + if line.product_id.id == 232383: + raise UserError(_('Tidak bisa Confirm menggunakan Produk Sementara')) + if not line.vendor_id or not line.purchase_price or not line.purchase_tax_id: + raise UserError(_('Isi Vendor, Harga Beli, dan Tax sebelum Request Approval')) if not line.product_id or line.product_id.type == 'service': continue if (line.item_percent_margin <= 15) and ( self.env.user.id != 6 and self.env.user.id != 7): # akbar or tyas will approve approval2 += 1 elif line.item_percent_margin <= 25 and ( - self.env.user.id != 6 and self.env.user.id != 7 and self.env.user.id != 19): # darren? + self.env.user.id != 6 and self.env.user.id != 7 and self.env.user.id != 377): # vita approval1 += 1 if approval2 > 0: raise UserError("Harus diapprove oleh Pimpinan (Akbar / Tyas)") -- cgit v1.2.3 From 597d6458234a14bd20e7fba8a0ceb07168423d2a Mon Sep 17 00:00:00 2001 From: stephanchrst Date: Wed, 28 Sep 2022 16:25:01 +0700 Subject: Update purchase_order.py, purchase_order_line.py, and 3 more files... --- indoteknik_custom/models/sale_order.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) (limited to 'indoteknik_custom/models/sale_order.py') diff --git a/indoteknik_custom/models/sale_order.py b/indoteknik_custom/models/sale_order.py index d1200de2..1442b432 100755 --- a/indoteknik_custom/models/sale_order.py +++ b/indoteknik_custom/models/sale_order.py @@ -25,7 +25,7 @@ class SaleOrder(models.Model): shipping_cost_covered = fields.Selection([ ('indoteknik', 'Indoteknik'), ('customer', 'Customer') - ], string='Shipping Paid by', help='Siapa yang menanggung biaya ekspedisi?', copy=False) + ], string='Shipping Covered by', help='Siapa yang menanggung biaya ekspedisi?', copy=False) shipping_paid_by = fields.Selection([ ('indoteknik', 'Indoteknik'), ('customer', 'Customer') @@ -91,9 +91,9 @@ class SaleOrder(models.Model): self.env.user.id != 6 and self.env.user.id != 7 and self.env.user.id != 377): # vita approval1 += 1 if approval2 > 0: - raise UserError("Harus diapprove oleh Pimpinan (Akbar / Tyas)") + raise UserError("Harus diapprove oleh Pimpinan") elif approval1 > 0: - raise UserError("Harus diapprove oleh Manager (?)") + raise UserError("Harus diapprove oleh Manager") order.approval_status = 'approved' return res @@ -125,7 +125,6 @@ class SaleOrder(models.Model): @api.onchange('sales_tax_id') def onchange_sales_tax_id(self): for line in self.order_line: - # line.tax_id = self.sales_tax_id line.product_id_change() @@ -183,6 +182,6 @@ class SaleOrderLine(models.Model): def product_id_change(self): for line in self: super(SaleOrderLine, self).product_id_change() - if line.product_id: + if line.product_id and line.product_id.type == 'product': line.tax_id = line.order_id.sales_tax_id -- cgit v1.2.3 From 4eff0ccadaade5964fec515a90bb0fc4c915b917 Mon Sep 17 00:00:00 2001 From: stephanchrst Date: Thu, 29 Sep 2022 09:00:56 +0700 Subject: Update sale_order.py --- indoteknik_custom/models/sale_order.py | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) (limited to 'indoteknik_custom/models/sale_order.py') diff --git a/indoteknik_custom/models/sale_order.py b/indoteknik_custom/models/sale_order.py index 1442b432..9f70f05b 100755 --- a/indoteknik_custom/models/sale_order.py +++ b/indoteknik_custom/models/sale_order.py @@ -54,11 +54,9 @@ class SaleOrder(models.Model): raise UserError(_('Tidak bisa Confirm menggunakan Produk Sementara')) if not line.vendor_id or not line.purchase_price or not line.purchase_tax_id: raise UserError(_('Isi Vendor, Harga Beli, dan Tax sebelum Request Approval')) - if (line.item_percent_margin <= 15) and ( - self.env.user.id != 6 and self.env.user.id != 7): # akbar or tyas + if line.item_percent_margin <= 15 and not self.env.user.is_leader: # akbar or tyas approval2 += 1 - elif line.item_percent_margin <= 25 and ( - self.env.user.id != 19 and self.env.user.id != 6 and self.env.user.id != 7): + elif line.item_percent_margin <= 25 and not self.env.user.is_leader and not self.env.user.is_sales_manager: approval1 += 1 if approval2 > 0: order.approval_status = 'pengajuan2' @@ -84,11 +82,9 @@ class SaleOrder(models.Model): raise UserError(_('Isi Vendor, Harga Beli, dan Tax sebelum Request Approval')) if not line.product_id or line.product_id.type == 'service': continue - if (line.item_percent_margin <= 15) and ( - self.env.user.id != 6 and self.env.user.id != 7): # akbar or tyas will approve + if line.item_percent_margin <= 15 and not self.env.user.is_pimpinan: approval2 += 1 - elif line.item_percent_margin <= 25 and ( - self.env.user.id != 6 and self.env.user.id != 7 and self.env.user.id != 377): # vita + elif line.item_percent_margin <= 25 and not self.env.user.is_pimpinan and not self.env.user.is_sales_manager: approval1 += 1 if approval2 > 0: raise UserError("Harus diapprove oleh Pimpinan") -- cgit v1.2.3 From c8295772706a8e27d4633706b357ade5c4a8bba8 Mon Sep 17 00:00:00 2001 From: stephanchrst Date: Thu, 29 Sep 2022 10:58:52 +0700 Subject: Update purchase_order.py and sale_order.py --- indoteknik_custom/models/sale_order.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'indoteknik_custom/models/sale_order.py') diff --git a/indoteknik_custom/models/sale_order.py b/indoteknik_custom/models/sale_order.py index 9f70f05b..4ab8aa17 100755 --- a/indoteknik_custom/models/sale_order.py +++ b/indoteknik_custom/models/sale_order.py @@ -95,16 +95,20 @@ class SaleOrder(models.Model): def compute_total_margin(self): for order in self: - total_margin = total_percent_margin = 0 + total_margin = total_percent_margin = sum_sales_price = 0 for line in order.order_line: if not line.product_id: order.total_margin = 0 order.total_percent_margin = 0 continue total_margin += line.item_margin + sales_price = line.price_reduce_taxexcl * line.product_uom_qty + if line.order_id.shipping_cost_covered == 'indoteknik': + sales_price -= round((line.order_id.delivery_amt / line.order_id.count_line_product), 2) + sum_sales_price += sales_price order.total_margin = total_margin if order.amount_untaxed > 0: - total_percent_margin = round((total_margin / order.amount_untaxed), 2) * 100 + total_percent_margin = round((total_margin / sum_sales_price), 2) * 100 order.total_percent_margin = total_percent_margin def compute_count_line_product(self): -- cgit v1.2.3 From c76003a8551021113c05ac35b9bc86fb598a0a87 Mon Sep 17 00:00:00 2001 From: stephanchrst Date: Thu, 29 Sep 2022 11:37:43 +0700 Subject: Update purchase_order.py and sale_order.py --- indoteknik_custom/models/sale_order.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'indoteknik_custom/models/sale_order.py') diff --git a/indoteknik_custom/models/sale_order.py b/indoteknik_custom/models/sale_order.py index 4ab8aa17..f1f281a8 100755 --- a/indoteknik_custom/models/sale_order.py +++ b/indoteknik_custom/models/sale_order.py @@ -76,15 +76,15 @@ class SaleOrder(models.Model): raise UserError("Tax di Header harus diisi") approval1 = approval2 = 0 for line in order.order_line: + if not line.product_id or line.product_id.type == 'service': + continue if line.product_id.id == 232383: raise UserError(_('Tidak bisa Confirm menggunakan Produk Sementara')) if not line.vendor_id or not line.purchase_price or not line.purchase_tax_id: raise UserError(_('Isi Vendor, Harga Beli, dan Tax sebelum Request Approval')) - if not line.product_id or line.product_id.type == 'service': - continue - if line.item_percent_margin <= 15 and not self.env.user.is_pimpinan: + if line.item_percent_margin <= 15 and not self.env.user.is_leader: approval2 += 1 - elif line.item_percent_margin <= 25 and not self.env.user.is_pimpinan and not self.env.user.is_sales_manager: + elif line.item_percent_margin <= 25 and not self.env.user.is_leader and not self.env.user.is_sales_manager: approval1 += 1 if approval2 > 0: raise UserError("Harus diapprove oleh Pimpinan") -- cgit v1.2.3 From fca62b9b9a56f92abffd624067ee75c64f1c84fa Mon Sep 17 00:00:00 2001 From: stephanchrst Date: Thu, 29 Sep 2022 11:42:31 +0700 Subject: Update sale_order.py and sale_order.xml --- indoteknik_custom/models/sale_order.py | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'indoteknik_custom/models/sale_order.py') diff --git a/indoteknik_custom/models/sale_order.py b/indoteknik_custom/models/sale_order.py index f1f281a8..6410c150 100755 --- a/indoteknik_custom/models/sale_order.py +++ b/indoteknik_custom/models/sale_order.py @@ -46,6 +46,8 @@ class SaleOrder(models.Model): raise UserError("Status harus draft atau sent") if not order.sales_tax_id: raise UserError("Tax di Header harus diisi") + if not order.carrier_id: + raise UserError("Shipping Method harus diisi") approval1 = approval2 = 0 for line in order.order_line: if not line.product_id or line.product_id.type == 'service': @@ -74,6 +76,8 @@ class SaleOrder(models.Model): for order in self: if not order.sales_tax_id: raise UserError("Tax di Header harus diisi") + if not order.carrier_id: + raise UserError("Shipping Method harus diisi") approval1 = approval2 = 0 for line in order.order_line: if not line.product_id or line.product_id.type == 'service': -- cgit v1.2.3 From 78811641ffa04c7930fe450f9222d21b5dfceb62 Mon Sep 17 00:00:00 2001 From: stephanchrst Date: Thu, 29 Sep 2022 16:21:52 +0700 Subject: Update sale_order.py --- indoteknik_custom/models/sale_order.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'indoteknik_custom/models/sale_order.py') diff --git a/indoteknik_custom/models/sale_order.py b/indoteknik_custom/models/sale_order.py index 6410c150..6e16c63e 100755 --- a/indoteknik_custom/models/sale_order.py +++ b/indoteknik_custom/models/sale_order.py @@ -1,5 +1,6 @@ from odoo import fields, models, api, _ from odoo.exceptions import AccessError, UserError, ValidationError +from odoo.tools.misc import formatLang, get_lang import warnings @@ -184,8 +185,7 @@ class SaleOrderLine(models.Model): @api.onchange('product_id') def product_id_change(self): + super(SaleOrderLine, self).product_id_change() for line in self: - super(SaleOrderLine, self).product_id_change() if line.product_id and line.product_id.type == 'product': line.tax_id = line.order_id.sales_tax_id - -- cgit v1.2.3 From 156507bd6de73802ae9ef32d344c59184e6f923a Mon Sep 17 00:00:00 2001 From: stephanchrst Date: Thu, 29 Sep 2022 17:59:26 +0700 Subject: Update sale_order.py --- indoteknik_custom/models/sale_order.py | 46 +++++++++++++++++++++++----------- 1 file changed, 31 insertions(+), 15 deletions(-) (limited to 'indoteknik_custom/models/sale_order.py') diff --git a/indoteknik_custom/models/sale_order.py b/indoteknik_custom/models/sale_order.py index 6e16c63e..5c868c67 100755 --- a/indoteknik_custom/models/sale_order.py +++ b/indoteknik_custom/models/sale_order.py @@ -49,7 +49,7 @@ class SaleOrder(models.Model): raise UserError("Tax di Header harus diisi") if not order.carrier_id: raise UserError("Shipping Method harus diisi") - approval1 = approval2 = 0 + # approval1 = approval2 = 0 for line in order.order_line: if not line.product_id or line.product_id.type == 'service': continue @@ -57,13 +57,19 @@ class SaleOrder(models.Model): raise UserError(_('Tidak bisa Confirm menggunakan Produk Sementara')) if not line.vendor_id or not line.purchase_price or not line.purchase_tax_id: raise UserError(_('Isi Vendor, Harga Beli, dan Tax sebelum Request Approval')) - if line.item_percent_margin <= 15 and not self.env.user.is_leader: # akbar or tyas - approval2 += 1 - elif line.item_percent_margin <= 25 and not self.env.user.is_leader and not self.env.user.is_sales_manager: - approval1 += 1 - if approval2 > 0: + # if line.item_percent_margin <= 15 and not self.env.user.is_leader: # akbar or tyas + # approval2 += 1 + # elif line.item_percent_margin <= 25 and not self.env.user.is_leader and not self.env.user.is_sales_manager: + # approval1 += 1 + # if approval2 > 0: + # order.approval_status = 'pengajuan2' + # elif approval1 > 0: + # order.approval_status = 'pengajuan1' + # else: + # raise UserError("Bisa langsung Confirm") + if order.total_percent_margin <= 15 and not self.env.user.is_leader: order.approval_status = 'pengajuan2' - elif approval1 > 0: + elif order.total_percent_margin <= 25 and not self.env.user.is_leader and not self.env.user.is_sales_manager: order.approval_status = 'pengajuan1' else: raise UserError("Bisa langsung Confirm") @@ -79,7 +85,7 @@ class SaleOrder(models.Model): raise UserError("Tax di Header harus diisi") if not order.carrier_id: raise UserError("Shipping Method harus diisi") - approval1 = approval2 = 0 + # approval1 = approval2 = 0 for line in order.order_line: if not line.product_id or line.product_id.type == 'service': continue @@ -87,15 +93,22 @@ class SaleOrder(models.Model): raise UserError(_('Tidak bisa Confirm menggunakan Produk Sementara')) if not line.vendor_id or not line.purchase_price or not line.purchase_tax_id: raise UserError(_('Isi Vendor, Harga Beli, dan Tax sebelum Request Approval')) - if line.item_percent_margin <= 15 and not self.env.user.is_leader: - approval2 += 1 - elif line.item_percent_margin <= 25 and not self.env.user.is_leader and not self.env.user.is_sales_manager: - approval1 += 1 - if approval2 > 0: + # if line.item_percent_margin <= 15 and not self.env.user.is_leader: + # approval2 += 1 + # elif line.item_percent_margin <= 25 and not self.env.user.is_leader and not self.env.user.is_sales_manager: + # approval1 += 1 + # if approval2 > 0: + # raise UserError("Harus diapprove oleh Pimpinan") + # elif approval1 > 0: + # raise UserError("Harus diapprove oleh Manager") + # order.approval_status = 'approved' + if order.total_percent_margin <= 15 and not self.env.user.is_leader: raise UserError("Harus diapprove oleh Pimpinan") - elif approval1 > 0: + elif order.total_percent_margin <= 25 and not self.env.user.is_leader and not self.env.user.is_sales_manager: raise UserError("Harus diapprove oleh Manager") - order.approval_status = 'approved' + else: + order.approval_status = 'approved' + return res def compute_total_margin(self): @@ -188,4 +201,7 @@ class SaleOrderLine(models.Model): super(SaleOrderLine, self).product_id_change() for line in self: if line.product_id and line.product_id.type == 'product': + purchase_price = self.env['purchase.pricelist'].search( + [('product_id', '=', self.product_id.id)], limit=1, order='product_price ASC') + line.vendor_id = purchase_price.vendor_id line.tax_id = line.order_id.sales_tax_id -- cgit v1.2.3 From 1e40f3b647d6825779503858bb2ed2d0f8a4b184 Mon Sep 17 00:00:00 2001 From: stephanchrst Date: Thu, 29 Sep 2022 19:06:49 +0700 Subject: Update purchase_order.py, purchase_order_line.py, and 2 more files... --- indoteknik_custom/models/sale_order.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) (limited to 'indoteknik_custom/models/sale_order.py') diff --git a/indoteknik_custom/models/sale_order.py b/indoteknik_custom/models/sale_order.py index 5c868c67..fda76ebb 100755 --- a/indoteknik_custom/models/sale_order.py +++ b/indoteknik_custom/models/sale_order.py @@ -21,7 +21,6 @@ class SaleOrder(models.Model): carrier_id = fields.Many2one('delivery.carrier', string='Shipping Method') have_visit_service = fields.Boolean(string='Have Visit Service', help='To compute is customer get visit service', compute='_compute_have_visit_service') - count_line_product = fields.Float('Count Line Product', compute='compute_count_line_product') delivery_amt = fields.Float('Delivery Amt') shipping_cost_covered = fields.Selection([ ('indoteknik', 'Indoteknik'), @@ -162,6 +161,7 @@ class SaleOrderLine(models.Model): purchase_price = fields.Float('Purchase', required=True, digits='Product Price', default=0.0) purchase_tax_id = fields.Many2one('account.tax', string='Tax', domain=['|', ('active', '=', False), ('active', '=', True)]) + delivery_amt_line = fields.Float('DeliveryAmtLine', compute='compute_delivery_amt_line') def compute_item_margin(self): for line in self: @@ -175,7 +175,8 @@ class SaleOrderLine(models.Model): sales_price = line.price_reduce_taxexcl * line.product_uom_qty # minus with delivery if covered by indoteknik if line.order_id.shipping_cost_covered == 'indoteknik': - sales_price -= round((line.order_id.delivery_amt / line.order_id.count_line_product), 2) + sales_price -= line.delivery_amt_line + # sales_price -= round((line.order_id.delivery_amt / line.order_id.count_line_product), 2) purchase_price = line.purchase_price if line.purchase_tax_id.price_include: @@ -205,3 +206,9 @@ class SaleOrderLine(models.Model): [('product_id', '=', self.product_id.id)], limit=1, order='product_price ASC') line.vendor_id = purchase_price.vendor_id line.tax_id = line.order_id.sales_tax_id + + def compute_delivery_amt_line(self): + for line in self: + contribution = round((line.price_total / line.order_id.amount_total), 2) + delivery_amt = line.order_id.delivery_amt + line.delivery_amt_line = delivery_amt * contribution -- cgit v1.2.3 From 1125688c0ce2708ef50a252c0aa0e31a1b0cea25 Mon Sep 17 00:00:00 2001 From: stephanchrst Date: Sat, 1 Oct 2022 09:23:06 +0700 Subject: Update sale_order.py --- indoteknik_custom/models/sale_order.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'indoteknik_custom/models/sale_order.py') diff --git a/indoteknik_custom/models/sale_order.py b/indoteknik_custom/models/sale_order.py index fda76ebb..5933e1ae 100755 --- a/indoteknik_custom/models/sale_order.py +++ b/indoteknik_custom/models/sale_order.py @@ -121,7 +121,7 @@ class SaleOrder(models.Model): total_margin += line.item_margin sales_price = line.price_reduce_taxexcl * line.product_uom_qty if line.order_id.shipping_cost_covered == 'indoteknik': - sales_price -= round((line.order_id.delivery_amt / line.order_id.count_line_product), 2) + sales_price -= line.delivery_amt_line sum_sales_price += sales_price order.total_margin = total_margin if order.amount_untaxed > 0: -- cgit v1.2.3 From 1d6351cbab4df3a5f5ceff92c53560437d7b40a4 Mon Sep 17 00:00:00 2001 From: stephanchrst Date: Mon, 3 Oct 2022 18:25:08 +0700 Subject: Update sale_order.py --- indoteknik_custom/models/sale_order.py | 74 ++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) (limited to 'indoteknik_custom/models/sale_order.py') diff --git a/indoteknik_custom/models/sale_order.py b/indoteknik_custom/models/sale_order.py index 5933e1ae..87ed0047 100755 --- a/indoteknik_custom/models/sale_order.py +++ b/indoteknik_custom/models/sale_order.py @@ -212,3 +212,77 @@ class SaleOrderLine(models.Model): contribution = round((line.price_total / line.order_id.amount_total), 2) delivery_amt = line.order_id.delivery_amt line.delivery_amt_line = delivery_amt * contribution + + @api.onchange('product_id', 'price_unit', 'product_uom', 'product_uom_qty', 'tax_id') + def _onchange_discount(self): + if not (self.product_id and self.product_uom and + self.order_id.partner_id and self.order_id.pricelist_id and + self.order_id.pricelist_id.discount_policy == 'without_discount' and + self.env.user.has_group('product.group_discount_per_so_line')): + return + + self.discount = 0.0 + product = self.product_id.with_context( + lang=self.order_id.partner_id.lang, + partner=self.order_id.partner_id, + quantity=self.product_uom_qty, + date=self.order_id.date_order, + pricelist=self.order_id.pricelist_id.id, + uom=self.product_uom.id, + fiscal_position=self.env.context.get('fiscal_position') + ) + + product_context = dict(self.env.context, partner_id=self.order_id.partner_id.id, date=self.order_id.date_order, + uom=self.product_uom.id) + + price, rule_id = self.order_id.pricelist_id.with_context(product_context).get_product_price_rule( + self.product_id, self.product_uom_qty or 1.0, self.order_id.partner_id) + new_list_price, currency = self.with_context(product_context)._get_real_price_currency(product, rule_id, + self.product_uom_qty, + self.product_uom, + self.order_id.pricelist_id.id) + new_list_price = product.web_price + + if new_list_price != 0: + if self.order_id.pricelist_id.currency_id != currency: + # we need new_list_price in the same currency as price, which is in the SO's pricelist's currency + new_list_price = currency._convert( + new_list_price, self.order_id.pricelist_id.currency_id, + self.order_id.company_id or self.env.company, self.order_id.date_order or fields.Date.today()) + discount = (new_list_price - price) / new_list_price * 100 + if (discount > 0 and new_list_price > 0) or (discount < 0 and new_list_price < 0): + self.discount = discount + + def _get_display_price(self, product): + # TO DO: move me in master/saas-16 on sale.order + # awa: don't know if it's still the case since we need the "product_no_variant_attribute_value_ids" field now + # to be able to compute the full price + + # it is possible that a no_variant attribute is still in a variant if + # the type of the attribute has been changed after creation. + no_variant_attributes_price_extra = [ + ptav.price_extra for ptav in self.product_no_variant_attribute_value_ids.filtered( + lambda ptav: + ptav.price_extra and + ptav not in product.product_template_attribute_value_ids + ) + ] + if no_variant_attributes_price_extra: + product = product.with_context( + no_variant_attributes_price_extra=tuple(no_variant_attributes_price_extra) + ) + + if self.order_id.pricelist_id.discount_policy == 'with_discount': + return product.with_context(pricelist=self.order_id.pricelist_id.id, uom=self.product_uom.id).price + product_context = dict(self.env.context, partner_id=self.order_id.partner_id.id, date=self.order_id.date_order, uom=self.product_uom.id) + + final_price, rule_id = self.order_id.pricelist_id.with_context(product_context).get_product_price_rule(product or self.product_id, self.product_uom_qty or 1.0, self.order_id.partner_id) + base_price, currency = self.with_context(product_context)._get_real_price_currency(product, rule_id, self.product_uom_qty, self.product_uom, self.order_id.pricelist_id.id) + base_price = product.web_price + if currency != self.order_id.pricelist_id.currency_id: + base_price = currency._convert( + base_price, self.order_id.pricelist_id.currency_id, + self.order_id.company_id or self.env.company, self.order_id.date_order or fields.Date.today()) + # negative discounts (= surcharge) are included in the display price + + return max(base_price, final_price) -- cgit v1.2.3