Ver código fonte

template no mensual copia proyecto

Roberto pineda 6 meses atrás
pai
commit
a3f9a87d8e
1 arquivos alterados com 38 adições e 22 exclusões
  1. 38 22
      sale_template_contract/models/sale_order_template.py

+ 38 - 22
sale_template_contract/models/sale_order_template.py

@@ -167,37 +167,28 @@ class SaleOrderTemplate(models.Model):
         """
         Calcula las fechas para las cuales se deben generar pedidos.
         Si monthly_invoice_project está activo, genera fechas mensuales.
-        Si no, solo genera una orden con fecha actual.
+        Si no, solo genera una orden con la fecha de inicio del contrato.
         """
         self.ensure_one()
         if not self.date_start or not self.date_end or self.date_start > self.date_end:
             return []
 
         if not self.monthly_invoice_project:
-            # Solo crear una orden con fecha actual
-            return [fields.Date.today()]
+            # Solo crear una orden con la fecha de inicio del contrato
+            return [self.date_start]
 
         # Lógica original para órdenes mensuales
         order_dates = []
         current_date = fields.Date.today()
-        
-        # Determinar la fecha de inicio real para la generación
-        # Debe ser el primer día del mes de self.date_start o el primer día del mes actual,
-        # lo que sea posterior.
         actual_start_date = self.date_start.replace(day=1)
-
-        # Asegurarse de que la fecha de inicio real no sea posterior a date_end
         if actual_start_date > self.date_end:
             return []
-
         ptr_date = actual_start_date
         while ptr_date <= self.date_end:
             order_dates.append(ptr_date)
             ptr_date += relativedelta(months=1)
-            # Asegurarse de que ptr_date siga siendo el primer día del mes
-            if ptr_date.day != 1: # Esto puede pasar si el mes original tenía más días
+            if ptr_date.day != 1:
                 ptr_date = ptr_date.replace(day=1)
-
         return order_dates
 
     def _configure_project_for_contract(self, template_line):
@@ -274,20 +265,45 @@ class SaleOrderTemplate(models.Model):
         """
         Obtiene el mapeo de proyectos según el modo de operación.
         Si monthly_invoice_project está activo, crea proyectos mensuales.
-        Si no, usa los proyectos originales de la plantilla.
+        Si no, crea una copia del proyecto original para el pedido (con el mismo nombre y fechas del contrato).
         """
         if self.monthly_invoice_project:
             return self._get_or_create_monthly_projects(order_datetime, sale_order)
         else:
-            # Usar los proyectos originales de la plantilla
+            # Crear una copia del proyecto original para el pedido (con el mismo nombre y fechas del contrato)
             project_map = {}
-            for line in self.sale_order_template_line_ids:
-                if line.project_id:
-                    project_map[line.project_id.id] = line.project_id
-            # --- Asignar partner de la cuenta analítica solo una vez por proyecto original ---
-            for project in set(project_map.values()):
-                if project.account_id and project.account_id.partner_id != self.contract_partner_id:
-                    project.account_id.write({'partner_id': self.contract_partner_id.id})
+            unique_projects = {line.project_id for line in self.sale_order_template_line_ids if line.project_id}
+            for project in unique_projects:
+                # Buscar si ya existe una copia para este pedido, nombre y fechas
+                domain = [
+                    ('name', '=', project.name),
+                    ('date_start', '=', self.date_start),
+                    ('date', '=', self.date_end),
+                ]
+                if sale_order:
+                    domain.append(('reinvoiced_sale_order_id', '=', sale_order.id))
+                project_copy = self.env['project.project'].search(domain, limit=1)
+                vals = {
+                    'name': project.name,
+                    'date_start': self.date_start,
+                    'date': self.date_end,
+                    'sale_line_id': False
+                }
+                # Asignar allow_billable y partner_id si corresponde
+                first_line = next((l for l in self.sale_order_template_line_ids if l.project_id and l.project_id.id == project.id and l.contract_partner_id), None)
+                if first_line:
+                    vals['allow_billable'] = True
+                    vals['partner_id'] = self.contract_partner_id.id
+                if sale_order:
+                    vals['reinvoiced_sale_order_id'] = sale_order.id
+                    vals['sale_line_id'] = False
+                if not project_copy:
+                    project_copy = project.copy(vals)
+                    project_copy.write({'sale_line_id': False})
+                else:
+                    project_copy.write(vals)
+                    project_copy.write({'sale_line_id': False})
+                project_map[project.id] = project_copy
             return project_map
 
     def _process_order_and_projects(self, order, project_map):