You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							249 lines
						
					
					
						
							9.1 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							249 lines
						
					
					
						
							9.1 KiB
						
					
					
				| # -*- coding: utf-8 -*- | |
| ############################################################################## | |
| # | |
| #    Cybrosys Technologies Pvt. Ltd. | |
| # | |
| #    Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) | |
| #    Author: Mohammed Irfan T (odoo@cybrosys.com) | |
| # | |
| #    You can modify it under the terms of the GNU AFFERO | |
| #    GENERAL PUBLIC LICENSE (AGPL v3), Version 3. | |
| # | |
| #    This program is distributed in the hope that it will be useful, | |
| #    but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | |
| #    GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details. | |
| # | |
| #    You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE | |
| #    (AGPL v3) along with this program. | |
| #    If not, see <http://www.gnu.org/licenses/>. | |
| # | |
| ############################################################################## | |
| import datetime | |
| from odoo import api, fields, models, _ | |
| from odoo.addons.stock.models.stock_move import PROCUREMENT_PRIORITIES | |
| 
 | |
| 
 | |
| class WaterSupplyRequest(models.Model): | |
|     """Model for water supply request form.""" | |
| 
 | |
|     _name = "water.supply.request" | |
|     _description = "Water Supply Request" | |
|     _inherit = ["mail.thread", "mail.activity.mixin"] | |
|     _date_name = "date_planned_start" | |
|     _order = "priority desc, date_planned_start asc,id" | |
|     _rec_name = "reference_no" | |
| 
 | |
|     @api.model | |
|     def _get_default_date_planned_start(self): | |
|         """Method returns the specified deadline date as a datetime object.""" | |
|         if self.env.context.get("default_date_deadline"): | |
|             return fields.Datetime.to_datetime( | |
|                 self.env.context.get("default_date_deadline") | |
|             ) | |
|         return datetime.datetime.now() | |
| 
 | |
|     reference_no = fields.Char( | |
|         string="Sequence", readonly=True, default="New", help="Reference number" | |
|     ) | |
|     responsible_user_id = fields.Many2one( | |
|         "res.users", | |
|         string="Responsible User", | |
|         default=lambda self: self.env.user, | |
|         help="Responsible person", | |
|     ) | |
|     customer_name_id = fields.Many2one( | |
|         "res.partner", | |
|         string="Customer Name", | |
|         help="Name of the customer", | |
|         required=True, | |
|     ) | |
|     customer_email = fields.Char( | |
|         related="customer_name_id.email", string="Customer Email", help="Customer email" | |
|     ) | |
|     customer_phone = fields.Char( | |
|         related="customer_name_id.phone", | |
|         string="Customer Phone", | |
|         help="Phone number of" " the customer.", | |
|     ) | |
|     customer_address = fields.Char( | |
|         related="customer_name_id.street", | |
|         string="Customer Address", | |
|         help="Customer address", | |
|     ) | |
|     pickup_date = fields.Date( | |
|         string="Pickup Date", help="Date of the pickup", required=True | |
|     ) | |
|     request_date = fields.Date( | |
|         string="Request Date", help="Date of the " "product request." | |
|     ) | |
|     state = fields.Selection( | |
|         [("draft", "draft"), ("created", "created"), ("supplied", "supplied")], | |
|         default="draft", | |
|         string="State", | |
|         help="State of the supply request.", | |
|     ) | |
|     create_date = fields.Date( | |
|         string="Create Date", | |
|         default=fields.Date.today(), | |
|         help="Create date of water supply request", | |
|     ) | |
|     is_closed = fields.Boolean( | |
|         string="Is Closed", | |
|         help="Boolean field for to check the " "current request is closed or not", | |
|     ) | |
|     date_planned_start = fields.Datetime( | |
|         string="Scheduled Date", | |
|         copy=False, | |
|         default=_get_default_date_planned_start, | |
|         help="Date at which you plan to start the production.", | |
|         index=True, | |
|         required=True, | |
|     ) | |
|     supply_method_ids = fields.Many2many( | |
|         "water.supply.methods", | |
|         string="Supply Methods", | |
|         help="Supply methods", | |
|         required=True, | |
|     ) | |
|     usage_categories_ids = fields.Many2many( | |
|         "water.usage.categories", | |
|         string="Usage Categories", | |
|         help="Usage categories", | |
|         required=True, | |
|     ) | |
|     usage_place_id = fields.Many2one( | |
|         "water.usage.places", string="Usage Place", help="Usage place", required=True | |
|     ) | |
|     create_mo_ids = fields.One2many( | |
|         "manufacturing.order.creation", | |
|         "supply_request_id", | |
|         string="Creation Manufacturing Order", | |
|         help="Created manufacturing orders.", | |
|     ) | |
|     mo_count = fields.Integer( | |
|         string="Manufacture Order Count", | |
|         compute="compute_mo_count", | |
|         help="For storing manufacturing order count.", | |
|     ) | |
|     stock_move_count = fields.Integer( | |
|         string="Stock Move Count", | |
|         compute="compute_stock_move_count", | |
|         help="Store the stock move count.", | |
|     ) | |
|     priority = fields.Selection( | |
|         PROCUREMENT_PRIORITIES, | |
|         string="Priority", | |
|         default="0", | |
|         help="Components will be reserved first for the MO " | |
|         "with the highest priorities.", | |
|     ) | |
| 
 | |
|     @api.model_create_multi | |
|     def create(self, vals): | |
|         """Creating sequence number.""" | |
|         records = super(WaterSupplyRequest, self).create(vals) | |
|         for record in records: | |
|             if record.reference_no == _("New"): | |
|                 reference_no = self.env["ir.sequence"].next_by_code( | |
|                     "water_supply_request" | |
|                 ) or _("New") | |
|                 record.write({"reference_no": reference_no}) | |
|         return records | |
| 
 | |
|     @api.onchange("supply_method_ids") | |
|     def _onchange_supply_method_ids(self): | |
|         """This method is triggered when the 'supply_method_ids' field is | |
|         changed. It fills the 'create_mo_ids' many2many field with | |
|         manufacturing order data based on the selected supply method's | |
|         information.""" | |
|         self.create_mo_ids = False | |
|         for record in self.supply_method_ids: | |
|             product = self.env["product.product"].browse(record.created_product_id.id) | |
|             bom = self.env["mrp.bom"].search([("product_id", "=", product.id)], limit=1) | |
|             self.create_mo_ids = [ | |
|                 fields.Command.create( | |
|                     { | |
|                         "product_id": product.id, | |
|                         "quantity": bom.product_qty, | |
|                         "uom_id": product.uom_id.id, | |
|                         "bom_id": bom, | |
|                     } | |
|                 ) | |
|             ] | |
| 
 | |
|     def action_apply(self): | |
|         """Stock move will occur when supply the product to the customer.""" | |
|         self.write({"state": "created"}) | |
|         src_location = self.env["stock.location"].search( | |
|             [("usage", "=", "internal"), ("name", "=", "Stock")], limit=1 | |
|         ) | |
|         dest_location = self.env["stock.location"].search( | |
|             [("usage", "=", "customer")], limit=1 | |
|         ) | |
|         for rec in self.create_mo_ids: | |
|             move = self.env["stock.move"].create( | |
|                 { | |
|                     "name": self.reference_no, | |
|                     "origin": self.reference_no, | |
|                     "location_id": src_location.id, | |
|                     "location_dest_id": dest_location.id, | |
|                     "product_id": rec.product_id.id, | |
|                     "product_uom": rec.product_id.uom_id.id, | |
|                     "product_uom_qty": rec.quantity, | |
|                     "supply_id": self.id, | |
|                 } | |
|             ) | |
|             move.write({"state": "done"}) | |
|             manufacturing_order = self.env["mrp.production"].search( | |
|                 [("name", "=", self.create_mo_ids.mrp_id.mapped("name"))] | |
|             ) | |
|             manufacturing_order.write({"supply_id": self}) | |
| 
 | |
|     def action_supply(self): | |
|         """Enabling the boolean field if the request is supplied.""" | |
|         self.write({"state": "supplied"}) | |
|         if self.state == "supplied": | |
|             self.is_closed = True | |
| 
 | |
|     def action_stock_move(self): | |
|         """Opens a window displaying stock moves related to the current | |
|         record.""" | |
|         self.ensure_one() | |
|         return { | |
|             "type": "ir.actions.act_window", | |
|             "name": "Stock Move", | |
|             "view_mode": "tree,form", | |
|             "res_model": "stock.move", | |
|             "domain": [("supply_id", "=", self.id)], | |
|         } | |
| 
 | |
|     def action_mrp_production(self): | |
|         """Display the production records associated with the current supply | |
|         order.""" | |
|         self.ensure_one() | |
|         return { | |
|             "type": "ir.actions.act_window", | |
|             "name": "Manufacturing Order", | |
|             "view_mode": "tree,form", | |
|             "res_model": "mrp.production", | |
|             "domain": [("supply_id", "=", self.id)], | |
|         } | |
| 
 | |
|     def compute_mo_count(self): | |
|         """This method calculates the number of manufacturing orders | |
|         associated with the current record and updates the 'mo_count' | |
|         field on each record accordingly.""" | |
|         for record in self: | |
|             record.mo_count = self.env["mrp.production"].search_count( | |
|                 [("supply_id", "=", self.id)] | |
|             ) | |
| 
 | |
|     def compute_stock_move_count(self): | |
|         """This method iterates through the records in `self` and calculates | |
|         the number of stock moves associated with each record. It sets the | |
|         `stock_move_count` field of each record to the corresponding count.""" | |
|         for record in self: | |
|             record.stock_move_count = self.env["stock.move"].search_count( | |
|                 [("supply_id", "=", self.id)] | |
|             )
 | |
| 
 |