diff options
| author | Rafi Zadanly <zadanlyr@gmail.com> | 2024-02-26 09:18:48 +0700 |
|---|---|---|
| committer | Rafi Zadanly <zadanlyr@gmail.com> | 2024-02-26 09:18:48 +0700 |
| commit | e24d74a1ca5af90086060374dddc309e102579ea (patch) | |
| tree | df345eae2f13877ff8c56036a00ccafb70b0f486 | |
| parent | ddf1dda97c1f502cbcfeb310ba106c2774b9f484 (diff) | |
| parent | 6887a85d0e5aa30b6274360480eeac544a97248b (diff) | |
Merge branch 'production' of bitbucket.org:altafixco/indoteknik-addons into production
# Conflicts:
# indoteknik_custom/security/ir.model.access.csv
| -rwxr-xr-x | indoteknik_custom/__manifest__.py | 1 | ||||
| -rwxr-xr-x | indoteknik_custom/models/__init__.py | 2 | ||||
| -rw-r--r-- | indoteknik_custom/models/commision.py | 19 | ||||
| -rw-r--r-- | indoteknik_custom/models/cust_commision.py | 25 | ||||
| -rw-r--r-- | indoteknik_custom/models/report_stock_forecasted.py | 45 | ||||
| -rwxr-xr-x | indoteknik_custom/models/sale_order.py | 1 | ||||
| -rw-r--r-- | indoteknik_custom/models/sale_order_line.py | 36 | ||||
| -rwxr-xr-x | indoteknik_custom/security/ir.model.access.csv | 2 | ||||
| -rw-r--r-- | indoteknik_custom/views/cust_commision.xml | 44 | ||||
| -rwxr-xr-x | indoteknik_custom/views/sale_order.xml | 7 |
10 files changed, 176 insertions, 6 deletions
diff --git a/indoteknik_custom/__manifest__.py b/indoteknik_custom/__manifest__.py index 27617099..dc03d138 100755 --- a/indoteknik_custom/__manifest__.py +++ b/indoteknik_custom/__manifest__.py @@ -114,6 +114,7 @@ 'views/report_logbook_sj.xml', 'views/role_permission/ir_model_access.xml', 'views/role_permission/res_groups.xml', + 'views/cust_commision.xml', 'report/report.xml', 'report/report_banner_banner.xml', 'report/report_banner_banner2.xml', diff --git a/indoteknik_custom/models/__init__.py b/indoteknik_custom/models/__init__.py index 327da2d5..f8ff34d9 100755 --- a/indoteknik_custom/models/__init__.py +++ b/indoteknik_custom/models/__init__.py @@ -102,3 +102,5 @@ from . import po_multi_cancel from . import logbook_sj from . import report_logbook_sj from . import role_permission +from . import cust_commision +from . import report_stock_forecasted diff --git a/indoteknik_custom/models/commision.py b/indoteknik_custom/models/commision.py index 955d1634..fe65de84 100644 --- a/indoteknik_custom/models/commision.py +++ b/indoteknik_custom/models/commision.py @@ -156,7 +156,17 @@ class CustomerCommision(models.Model): # add status for type of commision, fee, rebate / cashback # include child or not? - @api.constrains('commision_percent') + @api.constrains('partner_ids') + def _onchange_partner_ids(self): + commision = self.env['cust.commision'].search([ + ('partner_id', 'in', [rec.id for rec in self.partner_ids]), + ]) + + if commision: + max_commision = max(commision.mapped('commision_percent')) + self.commision_percent = max_commision + + # @api.constrains('commision_percent', 'partner_ids') def _onchange_commision_percent(self): print('masuk onchange commision percent') if self.commision_amt == 0: @@ -165,8 +175,8 @@ class CustomerCommision(models.Model): @api.constrains('commision_amt') def _onchange_commision_amt(self): print('masuk onchange commision amt') - if self.commision_percent == 0: - self.commision_percent = (self.commision_amt / self.total_dpp * 100) + if self.total_dpp > 0: + self.commision_percent = (self.commision_amt / self.total_dpp) * 100 def _compute_total_dpp(self): for data in self: @@ -208,6 +218,9 @@ class CustomerCommision(models.Model): else: self._generate_customer_commision_rebate() + self._onchange_commision_percent() + self._onchange_commision_amt() + def _generate_customer_commision_rebate(self): for rec in self: # partners = rec.partner_ids.child_ids + rec.partner_ids diff --git a/indoteknik_custom/models/cust_commision.py b/indoteknik_custom/models/cust_commision.py new file mode 100644 index 00000000..eeb255cd --- /dev/null +++ b/indoteknik_custom/models/cust_commision.py @@ -0,0 +1,25 @@ +from odoo import models, api, fields +from odoo.exceptions import UserError +from datetime import datetime +import logging + +_logger = logging.getLogger(__name__) + + +class CustCommision(models.Model): + _name = 'cust.commision' + _order = 'id desc' + + partner_id = fields.Many2one('res.partner', String='Customer', required=True) + commision_percent = fields.Float(string='Commision %', tracking=3) + + @api.constrains('partner_id') + def _check_partner_id(self): + for rec in self: + duplicate_partner = self.search([ + ('partner_id', '=', rec.partner_id.id), + ('id', '!=', rec.id) + ]) + if duplicate_partner: + raise UserError('Partner already exists') +
\ No newline at end of file diff --git a/indoteknik_custom/models/report_stock_forecasted.py b/indoteknik_custom/models/report_stock_forecasted.py new file mode 100644 index 00000000..48a17095 --- /dev/null +++ b/indoteknik_custom/models/report_stock_forecasted.py @@ -0,0 +1,45 @@ +from odoo import api, models + +class ReplenishmentReport(models.AbstractModel): + _inherit = 'report.stock.report_product_product_replenishment' + + @api.model + def _get_report_lines(self, product_template_ids, product_variant_ids, wh_location_ids): + lines = super(ReplenishmentReport, self)._get_report_lines(product_template_ids, product_variant_ids, wh_location_ids) + + result_dict = {} + + for line in lines: + product_id = line.get('product', {}).get('id') + query = [('product_id', '=', product_id)] + document_out = line.get('document_out') + order_id = document_out.id if document_out else None + + if order_id: + result = self._calculate_result(line) + result_dict.setdefault(order_id, []).append(result) + + for order_id, results in result_dict.items(): + sale_order_lines = self.env['sale.order.line'].search([('order_id', '=', order_id)]) + + concatenated_result = ' ,'.join(results) + + for sale_order_line in sale_order_lines: + sale_order_line.reserved_from = concatenated_result + + return lines + + def _calculate_result(self, line): + if line['document_in']: + return str(line["document_in"].name) + elif line['reservation'] and not line['document_in']: + return 'Reserved from stock' + elif line['replenishment_filled']: + if line['document_out']: + return 'Inventory On Hand' + else: + return 'Free Stock' + else: + return 'Not Available' + + diff --git a/indoteknik_custom/models/sale_order.py b/indoteknik_custom/models/sale_order.py index 24c642d9..4176a464 100755 --- a/indoteknik_custom/models/sale_order.py +++ b/indoteknik_custom/models/sale_order.py @@ -451,6 +451,7 @@ class SaleOrder(models.Model): order.approval_status = 'approved' order._set_sppkp_npwp_contact() order.calculate_line_no() + # order.order_line.get_reserved_from() res = super(SaleOrder, self).action_confirm() return res diff --git a/indoteknik_custom/models/sale_order_line.py b/indoteknik_custom/models/sale_order_line.py index 62f4a6b4..a140468c 100644 --- a/indoteknik_custom/models/sale_order_line.py +++ b/indoteknik_custom/models/sale_order_line.py @@ -29,6 +29,32 @@ class SaleOrderLine(models.Model): vendor_subtotal = fields.Float(string='Vendor Subtotal', compute="_compute_vendor_subtotal") amount_voucher_disc = fields.Float(string='Voucher Discount') qty_reserved = fields.Float(string='Qty Reserved', compute='_compute_qty_reserved') + reserved_from = fields.Char(string='Reserved From', copy=False) + + # def get_reserved_from(self): + # for line in self: + # current_stock = self.env['stock.quant'].search([ + # ('product_id', '=', line.product_id.id), + # ('location_id', '=', line.order_id.warehouse_id.lot_stock_id.id) + # ]) + + # po_stock = self.env['purchase.order.line'].search([ + # ('product_id', '=', line.product_id.id), + # ('order_id.sale_order_id', '=', line.order_id.id), + # ('state', '=', 'done') + # ]) + + # available_quantity = current_stock.available_quantity if current_stock else 0 + # product_qty = po_stock.product_qty if po_stock else 0 + + # if available_quantity >= line.product_uom_qty: + # line.reserved_from = 'From Stock' + # elif product_qty >= line.product_uom_qty: + # line.reserved_from = 'From PO' + # elif (available_quantity + product_qty) >= line.product_uom_qty: + # line.reserved_from = 'From Stock and PO' + # else: + # line.reserved_from = None def _compute_qty_reserved(self): for line in self: @@ -41,6 +67,16 @@ class SaleOrderLine(models.Model): reserved_qty = sum(move.product_uom_qty for move in stock_moves) line.qty_reserved = reserved_qty + if reserved_qty > 0: + line._compute_reserved_from() + + + def _compute_reserved_from(self): + for line in self: + # continue + report_stock_forecasted = self.env['report.stock.report_product_product_replenishment'] + report_stock_forecasted._get_report_data(False, [line.product_id.id]) + def _compute_vendor_subtotal(self): for line in self: if line.purchase_price > 0 and line.product_uom_qty > 0: diff --git a/indoteknik_custom/security/ir.model.access.csv b/indoteknik_custom/security/ir.model.access.csv index 1d2b696c..5af34c11 100755 --- a/indoteknik_custom/security/ir.model.access.csv +++ b/indoteknik_custom/security/ir.model.access.csv @@ -96,3 +96,5 @@ access_logbook_sj_line,access.logbook.sj.line,model_logbook_sj_line,,1,1,1,1 access_report_logbook_sj,access.report.logbook.sj,model_report_logbook_sj,,1,1,1,1 access_report_logbook_sj_line,access.report.logbook.sj.line,model_report_logbook_sj_line,,1,1,1,1 access_report_logbook_sj_line,access.report.logbook.sj.line,model_report_logbook_sj_line,,1,1,1,1 +access_cust_commision,access.cust.commision,model_cust_commision,,1,1,1,1 +access_report_stock_report_product_product_replenishment,access.report.stock.report_product_product_replenishment,model_report_stock_report_product_product_replenishment,,1,1,1,1 diff --git a/indoteknik_custom/views/cust_commision.xml b/indoteknik_custom/views/cust_commision.xml new file mode 100644 index 00000000..dfa4adfb --- /dev/null +++ b/indoteknik_custom/views/cust_commision.xml @@ -0,0 +1,44 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<odoo> + <record id="cust_commision_tree" model="ir.ui.view"> + <field name="name">cust.commision.tree</field> + <field name="model">cust.commision</field> + <field name="arch" type="xml"> + <tree editable="bottom"> + <field name="partner_id"/> + <field name="commision_percent"/> + </tree> + </field> + </record> + + <record id="cust_commision_form" model="ir.ui.view"> + <field name="name">cust.commision.form</field> + <field name="model">cust.commision</field> + <field name="arch" type="xml"> + <form> + <sheet string="Commision"> + <group> + <group> + <field name="partner_id"/> + <field name="commision_percent"/> + </group> + </group> + </sheet> + </form> + </field> + </record> + + <record id="cust_commision_action" model="ir.actions.act_window"> + <field name="name">Commision</field> + <field name="type">ir.actions.act_window</field> + <field name="res_model">cust.commision</field> + <field name="view_mode">tree,form</field> + </record> + + <menuitem id="menu_cust_commision_sales" + name="Commision" + action="cust_commision_action" + parent="sale.product_menu_catalog" + sequence="101" + /> +</odoo>
\ No newline at end of file diff --git a/indoteknik_custom/views/sale_order.xml b/indoteknik_custom/views/sale_order.xml index 4c4ac281..2f800e34 100755 --- a/indoteknik_custom/views/sale_order.xml +++ b/indoteknik_custom/views/sale_order.xml @@ -109,14 +109,15 @@ <field name="line_no" readonly="1" optional="hide"/> </xpath> <xpath expr="//form/sheet/notebook/page/field[@name='order_line']/tree/field[@name='qty_delivered']" position="before"> - <field name="qty_reserved" readonly="1"/> + <field name="qty_reserved" invisible="1"/> + <field name="reserved_from" readonly="1" optional="hide"/> </xpath> <xpath expr="//form/sheet/notebook/page/field[@name='order_line']/tree/field[@name='product_id']" position="attributes"> <attribute name="options">{'no_create': True}</attribute> </xpath> - <xpath expr="//form/sheet/notebook/page/field[@name='order_line']/tree/field[@name='tax_id']" position="attributes"> + <!-- <xpath expr="//form/sheet/notebook/page/field[@name='order_line']/tree/field[@name='tax_id']" position="attributes"> <attribute name="required">1</attribute> - </xpath> + </xpath> --> <field name="amount_total" position="after"> <field name="grand_total"/> <label for="amount_voucher_disc" string="Voucher" /> |
