diff options
| author | it-fixcomart <it@fixcomart.co.id> | 2024-10-02 10:40:24 +0700 |
|---|---|---|
| committer | it-fixcomart <it@fixcomart.co.id> | 2024-10-02 10:40:24 +0700 |
| commit | 705f51eed8a817fe6ea3ef514402786d25f7c356 (patch) | |
| tree | b756a2ed1a1ef106739e935ce0ac47df12df473a | |
| parent | 37ee561ff633776ef984d4d9e441981aecbca762 (diff) | |
| parent | 1754a77d402af8c9fccb896e0b0745eb6e591c0b (diff) | |
Merge branch 'production' into iman/switch-account
| -rw-r--r-- | indoteknik_api/controllers/api_v1/user.py | 1 | ||||
| -rw-r--r-- | indoteknik_custom/models/account_move_due_extension.py | 2 | ||||
| -rw-r--r-- | indoteknik_custom/models/res_partner.py | 53 | ||||
| -rw-r--r-- | indoteknik_custom/models/stock_picking.py | 4 | ||||
| -rw-r--r-- | indoteknik_custom/models/website_user_cart.py | 22 | ||||
| -rw-r--r-- | indoteknik_custom/views/account_move_views.xml | 248 | ||||
| -rwxr-xr-x | indoteknik_custom/views/website_user_cart.xml | 7 |
7 files changed, 225 insertions, 112 deletions
diff --git a/indoteknik_api/controllers/api_v1/user.py b/indoteknik_api/controllers/api_v1/user.py index 8a9d8f68..bcced998 100644 --- a/indoteknik_api/controllers/api_v1/user.py +++ b/indoteknik_api/controllers/api_v1/user.py @@ -93,6 +93,7 @@ class User(controller.Controller): } user = request.env['res.users'].create(user_data) + user.partner_id.email = email data = { 'is_auth': True, diff --git a/indoteknik_custom/models/account_move_due_extension.py b/indoteknik_custom/models/account_move_due_extension.py index 0399c6a2..23f8888c 100644 --- a/indoteknik_custom/models/account_move_due_extension.py +++ b/indoteknik_custom/models/account_move_due_extension.py @@ -96,6 +96,8 @@ class DueExtension(models.Model): sales.action_confirm() self.order_id.due_id = self.id + template = self.env.ref('indoteknik_custom.mail_template_due_extension_approve') + template.send_mail(self.id, force_send=True) def generate_due_line(self): partners = self.partner_id.get_child_ids() diff --git a/indoteknik_custom/models/res_partner.py b/indoteknik_custom/models/res_partner.py index ef857c55..2846c14b 100644 --- a/indoteknik_custom/models/res_partner.py +++ b/indoteknik_custom/models/res_partner.py @@ -85,15 +85,54 @@ class ResPartner(models.Model): # return res - # def write(self, vals): - # if self.company_type == 'person': + def write(self, vals): + # Fungsi rekursif untuk meng-update semua child, termasuk child dari child + def update_children_recursively(partner, vals_for_child): + # Lakukan update pada partner saat ini hanya dengan field yang diizinkan + partner.write(vals_for_child) + + # Untuk setiap child dari partner ini, update juga child-nya + for child in partner.child_ids: + update_children_recursively(child, vals_for_child) + + # Jika self tidak memiliki parent_id, artinya self adalah parent + if not self.parent_id: + # Ambil semua child dari parent ini + children = self.child_ids + + # Perbarui vals dengan nilai dari parent jika tidak ada dalam vals + vals['customer_type'] = vals.get('customer_type', self.customer_type) + vals['nama_wajib_pajak'] = vals.get('nama_wajib_pajak', self.nama_wajib_pajak) + vals['npwp'] = vals.get('npwp', self.npwp) + vals['sppkp'] = vals.get('sppkp', self.sppkp) + vals['alamat_lengkap_text'] = vals.get('alamat_lengkap_text', self.alamat_lengkap_text) + vals['industry_id'] = vals.get('industry_id', self.industry_id.id if self.industry_id else None) + vals['company_type_id'] = vals.get('company_type_id', + self.company_type_id.id if self.company_type_id else None) + + # Simpan hanya field yang perlu di-update pada child + vals_for_child = { + 'customer_type': vals.get('customer_type'), + 'nama_wajib_pajak': vals.get('nama_wajib_pajak'), + 'npwp': vals.get('npwp'), + 'sppkp': vals.get('sppkp'), + 'alamat_lengkap_text': vals.get('alamat_lengkap_text'), + 'industry_id': vals.get('industry_id'), + 'company_type_id': vals.get('company_type_id') + } + + # Lakukan update pada semua child secara rekursif + for child in children: + update_children_recursively(child, vals_for_child) + + # Lakukan write untuk parent dengan vals asli + res = super(ResPartner, self).write(vals) + + return res + + # if self.company_type == 'person' and not partner.parent_id: # if self.parent_id: # parent = self.parent_id - # vals['customer_type'] = parent.customer_type - # vals['nama_wajib_pajak'] = parent.nama_wajib_pajak - # vals['npwp'] = parent.npwp - # vals['sppkp'] = parent.sppkp - # vals['alamat_lengkap_text'] = parent.alamat_lengkap_text # vals['industry_id'] = parent.industry_id.id # vals['company_type_id'] = parent.company_type_id.id # diff --git a/indoteknik_custom/models/stock_picking.py b/indoteknik_custom/models/stock_picking.py index 66a326ff..6f038386 100644 --- a/indoteknik_custom/models/stock_picking.py +++ b/indoteknik_custom/models/stock_picking.py @@ -406,6 +406,10 @@ class StockPicking(models.Model): if product: product.product_tmpl_id._create_solr_queue('_sync_product_stock_to_solr') + for move_line in self.move_line_ids_without_package: + if move_line.product_id: + move_line.product_id.product_tmpl_id._create_solr_queue('_sync_product_stock_to_solr') + if not self.date_reserved: current_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') self.date_reserved = current_time diff --git a/indoteknik_custom/models/website_user_cart.py b/indoteknik_custom/models/website_user_cart.py index b0cf47f7..169f4a6b 100644 --- a/indoteknik_custom/models/website_user_cart.py +++ b/indoteknik_custom/models/website_user_cart.py @@ -1,4 +1,4 @@ -from odoo import fields, models +from odoo import fields, models, api from datetime import datetime, timedelta class WebsiteUserCart(models.Model): @@ -16,6 +16,26 @@ class WebsiteUserCart(models.Model): ], 'Source', default='add_to_cart') user_other_carts = fields.One2many('website.user.cart', 'id', 'Other Products', compute='_compute_user_other_carts') is_reminder = fields.Boolean(string='Reminder?') + phone_user = fields.Char(string='Phone', related='user_id.mobile') + price = fields.Float(string='Price', compute='_compute_price') + program_product_id = fields.Many2one('product.product', string='Program Products', compute='_compute_program_product_ids') + + @api.depends('program_line_id') + def _compute_program_product_ids(self): + for record in self: + if record.program_line_id and record.program_line_id.product_ids: + product = record.program_line_id.product_ids[0] + record.program_product_id = product.product_id + record.product_id = product.product_id + else: + # Handle case where there are no product_ids + record.program_product_id = False + + def _compute_price(self): + for record in self: + record.price = record.get_price_website(record.product_id.id)['price'] + if record.program_line_id: + record.price = record.get_price_coret(record.program_line_id.id) def _compute_user_other_carts(self): for record in self: diff --git a/indoteknik_custom/views/account_move_views.xml b/indoteknik_custom/views/account_move_views.xml index 1c70cc7b..4acafb14 100644 --- a/indoteknik_custom/views/account_move_views.xml +++ b/indoteknik_custom/views/account_move_views.xml @@ -1,117 +1,157 @@ <?xml version="1.0" encoding="UTF-8"?> <odoo> - <record id="due_extension_tree" model="ir.ui.view"> - <field name="name">due.extension.tree</field> - <field name="model">due.extension</field> - <field name="arch" type="xml"> - <tree default_order="create_date desc" create="0"> - <field name="number"/> - <field name="partner_id"/> - <field name="day_extension"/> - <field name="description"/> - <field name="approval_status"/> - <field name="is_approve"/> - </tree> - </field> - </record> + <data> + <record id="due_extension_tree" model="ir.ui.view"> + <field name="name">due.extension.tree</field> + <field name="model">due.extension</field> + <field name="arch" type="xml"> + <tree default_order="create_date desc" create="0"> + <field name="number"/> + <field name="partner_id"/> + <field name="day_extension"/> + <field name="description"/> + <field name="approval_status"/> + <field name="is_approve"/> + </tree> + </field> + </record> - <record id="due_extension_line_tree" model="ir.ui.view"> - <field name="name">due.extension.line.tree</field> - <field name="model">due.extension.line</field> - <field name="arch" type="xml"> - <tree> - <field name="partner_id"/> - <field name="invoice_id"/> - <field name="date_invoice"/> - <field name="due_date"/> - <field name="day_to_due"/> - <field name="efaktur_id"/> - <field name="reference"/> - <field name="total_amt"/> - <field name="open_amt"/> - </tree> - </field> - </record> + <record id="due_extension_line_tree" model="ir.ui.view"> + <field name="name">due.extension.line.tree</field> + <field name="model">due.extension.line</field> + <field name="arch" type="xml"> + <tree> + <field name="partner_id"/> + <field name="invoice_id"/> + <field name="date_invoice"/> + <field name="due_date"/> + <field name="day_to_due"/> + <field name="efaktur_id"/> + <field name="reference"/> + <field name="total_amt"/> + <field name="open_amt"/> + </tree> + </field> + </record> - <record id="due_extension_form" model="ir.ui.view"> - <field name="name">due.extension.form</field> - <field name="model">due.extension</field> - <field name="arch" type="xml"> - <form create="false"> - <header> - <button name="approve_new_due" - string="Approve" - type="object" - /> - <button name="due_extension_approval" - string="Ask Approval" + <record id="due_extension_form" model="ir.ui.view"> + <field name="name">due.extension.form</field> + <field name="model">due.extension</field> + <field name="arch" type="xml"> + <form create="false"> + <header> + <button name="approve_new_due" + string="Approve" type="object" - /> - <button name="due_extension_cancel" - string="Cancel" - type="object" - /> - </header> - <sheet> - <group> + /> + <button name="due_extension_approval" + string="Ask Approval" + type="object" + /> + <button name="due_extension_cancel" + string="Cancel" + type="object" + /> + </header> + <sheet> <group> - <field name="partner_id" readonly="1"/> - <field name="day_extension" attrs="{'readonly': [('is_approve', '=', True)]}"/> + <group> + <field name="partner_id" readonly="1"/> + <field name="day_extension" attrs="{'readonly': [('is_approve', '=', True)]}"/> + </group> + <group> + <field name="is_approve" readonly="1"/> + <field name="order_id" readonly="1"/> + <field name="counter" readonly="1"/> + <field name="approval_status" readonly="1"/> + </group> </group> <group> - <field name="is_approve" readonly="1"/> - <field name="order_id" readonly="1"/> - <field name="counter" readonly="1"/> - <field name="approval_status" readonly="1"/> + <field name="description" attrs="{'readonly': [('approval_status', '=', 'approved')]}"/> </group> - </group> - <group> - <field name="description" attrs="{'readonly': [('approval_status', '=', 'approved')]}"/> - </group> - <notebook> - <page string="Invoices"> - <field name="due_line" attrs="{'readonly': [('is_approve', '=', True)]}"/> - </page> - </notebook> - </sheet> - <div class="oe_chatter"> - <field name="message_follower_ids" widget="mail_followers"/> - <field name="message_ids" widget="mail_thread"/> - </div> - </form> - </field> - </record> + <notebook> + <page string="Invoices"> + <field name="due_line" attrs="{'readonly': [('is_approve', '=', True)]}"/> + </page> + </notebook> + </sheet> + <div class="oe_chatter"> + <field name="message_follower_ids" widget="mail_followers"/> + <field name="message_ids" widget="mail_thread"/> + </div> + </form> + </field> + </record> - <record id="due_extension_view_search" model="ir.ui.view"> - <field name="name">due.extension.search.view</field> <!-- Made the name more descriptive --> - <field name="model">due.extension</field> - <field name="arch" type="xml"> - <search string="Search Due Extension"> - <field name="number"/> - <field name="partner_id"/> - <field name="invoice_id"/> - <field name="order_id"/> - </search> - </field> - </record> + <record id="due_extension_view_search" model="ir.ui.view"> + <field name="name">due.extension.search.view</field> <!-- Made the name more descriptive --> + <field name="model">due.extension</field> + <field name="arch" type="xml"> + <search string="Search Due Extension"> + <field name="number"/> + <field name="partner_id"/> + <field name="invoice_id"/> + <field name="order_id"/> + </search> + </field> + </record> - <record id="due_extension_action" model="ir.actions.act_window"> - <field name="name">Due Extension</field> - <field name="type">ir.actions.act_window</field> - <field name="res_model">due.extension</field> - <field name="view_mode">tree,form</field> - </record> + <record id="due_extension_action" model="ir.actions.act_window"> + <field name="name">Due Extension</field> + <field name="type">ir.actions.act_window</field> + <field name="res_model">due.extension</field> + <field name="view_mode">tree,form</field> + </record> - <menuitem - id="menu_due_extension" - name="Due Extension" - parent="sale.product_menu_catalog" - sequence="4" - action="due_extension_action" - /> - <menuitem id="menu_due_extension" name="Due Extension" - parent="account.menu_finance_receivables" - action="due_extension_action" - sequence="100" - /> + <menuitem + id="menu_due_extension" + name="Due Extension" + parent="sale.product_menu_catalog" + sequence="4" + action="due_extension_action" + /> + <menuitem id="menu_due_extension" name="Due Extension" + parent="account.menu_finance_receivables" + action="due_extension_action" + sequence="100" + /> + + <record id="mail_template_due_extension_approve" model="mail.template"> + <field name="name">Due Extension: Approve</field> + <field name="model_id" ref="indoteknik_custom.model_due_extension"/> + <field name="subject">Approval for Due Extension: DE ${object.name}</field> + <field name="email_from">"PT. Indoteknik Dotcom Gemilang" <noreply@indoteknik.com></field> + <field name="reply_to">anto@indoteknik.co.id</field> + <field name="email_to"> ${object.order_id.user_id.login | safe}</field> + <field name="body_html" type="html"> + <p>Dear Anto,</p> + + <p>We would like to inform you that the due extension for the following document has been approved:</p> + + <table border="0" cellpadding="5" cellspacing="0" width="15%"> + <tr> + <td><strong>DE Number:</strong></td> + <td>${object.number}</td> + </tr> + <tr> + <td><strong>SO Number:</strong></td> + <td>${object.order_id.name}</td> + </tr> + <tr> + <td><strong>New Due Date:</strong></td> + <td>${object.due_line[0].invoice_id.new_due_date}</td> + </tr> + <tr> + <td><strong>Extension (days):</strong></td> + <td>${object.day_extension}</td> + </tr> + </table> + + <p>If you have any further questions or need additional information, please feel free to contact us.</p> + + <p>Best regards,</p> + <p><strong>PT. Indoteknik Dotcom Gemilang</strong></p> + </field> + </record> + </data> </odoo> diff --git a/indoteknik_custom/views/website_user_cart.xml b/indoteknik_custom/views/website_user_cart.xml index 11573121..b4fb02be 100755 --- a/indoteknik_custom/views/website_user_cart.xml +++ b/indoteknik_custom/views/website_user_cart.xml @@ -11,13 +11,17 @@ <field name="model">website.user.cart</field> <field name="arch" type="xml"> <tree> + <field name="create_date"/> <field name="user_id"/> <field name="product_id"/> + <field name="phone_user"/> + <field name="price"/> <field name="program_line_id"/> <field name="qty"/> <field name="is_selected"/> <field name="is_reminder"/> <field name="source"/> + <field name="program_product_id" optional="hide"/> </tree> </field> </record> @@ -37,6 +41,9 @@ <field name="is_selected" /> <field name="is_reminder" /> <field name="source" /> + <field name="phone_user"/> + <field name="program_product_id"/> + <field name="price"/> </group> <group></group> </group> |
