diff --git a/cor_custom/models/project.py b/cor_custom/models/project.py index b8db213..f08f0a0 100755 --- a/cor_custom/models/project.py +++ b/cor_custom/models/project.py @@ -465,7 +465,7 @@ class InheritProjectProductEmployeeMap(models.Model): # self.end_date = self.start_date + relativedelta.relativedelta(months=1) - relativedelta.relativedelta(days=1) if self.start_date and self.end_date and (self.start_date > self.end_date): raise AccessError('End date could not be greater than start date') - if self.project_id: + if self.project_id and self.project_id.date_start: if self.start_date and not self.project_id.date_start <= self.start_date <= self.project_id.date: raise AccessError(_('Allocation Start date must be between %s to %s') % ( self.project_id.date_start.strftime('%d-%b-%Y'), self.project_id.date.strftime('%d-%b-%Y'))) diff --git a/project_report/report/project_revenue_custom_report3.py b/project_report/report/project_revenue_custom_report3.py index 1bf618f..b194b4e 100644 --- a/project_report/report/project_revenue_custom_report3.py +++ b/project_report/report/project_revenue_custom_report3.py @@ -168,7 +168,8 @@ data1 as ( 0.0 AS profit_per FROM pro_data left join account_analytic_line AAL on AAL.project_id=pro_data.pproject_id - where pro_data.pricing_type = 'fixed_rate' and COALESCE(pro_data.is_sub_project, FALSE) = False + where pro_data.pricing_type = 'fixed_rate' AND AAL.sub_project is null + --and COALESCE(pro_data.is_sub_project, FALSE) = False group by pro_data.pproject_id, pro_data.project_active, @@ -182,6 +183,52 @@ data1 as ( AAL.id, AAL.start_datetime ), +sub_data1 as ( + SELECT + TO_CHAR(start_datetime, 'YYYY-MM-01')::date as start_date, + (date_trunc('month', end_datetime) + interval '1 month' - interval '1 day')::date as end_date, + sub_pro_data.parent_project as project_id, + sub_pro_data.project_active, + sub_pro_data.project_type, + sub_pro_data.pricing_type, + sub_pro_data.parent_project, + AAL.sub_project, + null::char as role, + sub_pro_data.tag_name, + sub_pro_data.partner_id, + AAL.employee_id, + AAL.id as timesheet_id, + AAL.start_datetime as timesheet_sdatetime, + 0 as overall_budgeted_revenue, + 0 as budgeted_revenue, + 0 as budgeted_hours, + 0 as overall_hourly_rate, + sum(AAL.unit_amount) as unit_amount, + 0 AS pro_hourly_rate, + ((sum(AAL.amount) * -1)/NULLIF(sum(AAL.unit_amount), 0)) as timesheet_cost, + 0.0 AS actual_revenue, + (sum(AAL.amount) * -1) as actual_cost, + 0.0 AS expenses_amt, + (0.0 - (sum(AAL.amount) * -1)) AS profit_amt, + 0.0 AS profit_per + FROM sub_pro_data + left join account_analytic_line AAL on AAL.sub_project=sub_pro_data.sub_project + where sub_pro_data.pricing_type = 'fixed_rate' + AND AAL.sub_project is not null + --and COALESCE(pro_data.is_sub_project, FALSE) = False + group by + sub_pro_data.parent_project, + sub_pro_data.project_active, + sub_pro_data.project_type, + sub_pro_data.pricing_type, + sub_pro_data.parent_project, + AAL.sub_project, + sub_pro_data.tag_name, + sub_pro_data.partner_id, + AAL.employee_id, + AAL.id, + AAL.start_datetime +), data2 as ( SELECT coalesce(min(pro_data.pro_sdate), min(AAL.start_datetime::date)) as start_date, @@ -255,7 +302,8 @@ SELECT ((AAL.unit_amount * pro_data.pro_hourly_rate) - (AAL.amount * -1))/NULLIF((AAL.unit_amount * pro_data.pro_hourly_rate),0) AS profit_per FROM pro_data left join account_analytic_line AAL on AAL.project_id=pro_data.pproject_id - WHERE pro_data.pricing_type='employee_rate' and pro_data.project_type='hours_no_limit' + WHERE pro_data.pricing_type='employee_rate' and pro_data.project_type='hours_no_limit' + AND AAL.sub_project is null --and COALESCE(pro_data.is_sub_project, FALSE) = False group by pro_data.pro_sdate, @@ -320,6 +368,58 @@ data2_sub_project as ( sub_pro_data.budgeted_revenue, sub_pro_data.budgeted_hours, sub_pro_data.expenses_amt +UNION +SELECT + TO_CHAR(start_datetime, 'YYYY-MM-01')::date as start_date, + (date_trunc('month', end_datetime) + interval '1 month' - interval '1 day')::date as end_date, + sub_pro_data.pproject_id as project_id, + sub_pro_data.project_active, + sub_pro_data.project_type, + sub_pro_data.pricing_type, + sub_pro_data.parent_project, + AAL.sub_project, + null::char as role, + sub_pro_data.tag_name, + sub_pro_data.partner_id, + AAL.employee_id, + AAL.id as timesheet_id, + AAL.start_datetime as timesheet_sdatetime, + 0 as overall_budgeted_revenue, + 0 as budgeted_revenue, + 0 as budgeted_hours, + 0 as overall_hourly_rate, + AAL.unit_amount as unit_amount, + sub_pro_data.pro_hourly_rate as pro_hourly_rate, + ((AAL.amount * -1)/NULLIF(AAL.unit_amount, 0)) as timesheet_cost, + (AAL.unit_amount * sub_pro_data.pro_hourly_rate) AS actual_revenue, + (AAL.amount * -1) as actual_cost, + 0 AS expenses_amt, + ((AAL.unit_amount * sub_pro_data.pro_hourly_rate) - (AAL.amount * -1)) AS profit_amt, + ((AAL.unit_amount * sub_pro_data.pro_hourly_rate) - (AAL.amount * -1))/NULLIF((AAL.unit_amount * sub_pro_data.pro_hourly_rate),0) AS profit_per + FROM sub_pro_data + left join account_analytic_line AAL on AAL.sub_project=sub_pro_data.sub_project + WHERE sub_pro_data.pricing_type='employee_rate' and sub_pro_data.project_type='hours_no_limit' + AND AAL.sub_project is not null + --and COALESCE(pro_data.is_sub_project, FALSE) = False + group by + sub_pro_data.pro_sdate, + sub_pro_data.pro_edate, + sub_pro_data.pproject_id, + sub_pro_data.project_active, + sub_pro_data.project_type, + sub_pro_data.pricing_type, + sub_pro_data.parent_project, + AAL.sub_project, + sub_pro_data.tag_name, + sub_pro_data.partner_id, + AAL.employee_id, + AAL.id, + AAL.start_datetime, + sub_pro_data.pro_hourly_rate, + AAL.unit_amount, + AAL.amount, + sub_pro_data.budgeted_hours, + sub_pro_data.expenses_amt ), data3 as ( SELECT @@ -395,7 +495,8 @@ SELECT left join pro_data on pro_data.pproject_id = drange_data2.project_id left join cons_data1 on cons_data1.project_id=drange_data2.project_id and cons_data1.employee_id=drange_data2.employee_id and drange_data2.start_date >= cons_data1.start_date and drange_data2.end_date <= cons_data1.end_date - where pro_data.pricing_type='employee_rate' and pro_data.project_type='hours_in_consultant' and COALESCE(pro_data.is_sub_project, FALSE) = False + where pro_data.pricing_type='employee_rate' and pro_data.project_type='hours_in_consultant' + and COALESCE(pro_data.is_sub_project, FALSE) = False group by drange_data2.start_date, drange_data2.end_date, @@ -452,7 +553,8 @@ SELECT and AAL.end_datetime --at time zone 'utc' at time zone (select tz from res_partner where id=3) <= cons_data1.end_date::date + '23:59:59'::time AT TIME ZONE 'UTC' where pro_data.pricing_type='employee_rate' and pro_data.project_type='hours_in_consultant' - --and COALESCE(pro_data.is_sub_project, FALSE) = False + AND AAL.sub_project is null + --AND COALESCE(pro_data.is_sub_project, FALSE) = False group by pro_data.pproject_id, AAL.employee_id, @@ -570,6 +672,67 @@ SELECT sub_pro_data.tag_name, sub_pro_data.pricing_type, sub_pro_data.partner_id +UNION +SELECT + TO_CHAR(start_datetime, 'YYYY-MM-01')::date as start_date, + (date_trunc('month', end_datetime) + interval '1 month' - interval '1 day')::date as end_date, + sub_pro_data.pproject_id as project_id, + sub_pro_data.project_active, + sub_pro_data.project_type, + sub_pro_data.pricing_type, + sub_pro_data.parent_project, + sub_pro_data.sub_project, + cons_data1.role, + sub_pro_data.tag_name, + sub_pro_data.partner_id, + AAL.employee_id, + AAL.id as timesheet_id, + AAL.start_datetime as timesheet_sdatetime, + 0 as overall_budgeted_revenue, + 0 as budgeted_revenue, + 0 as budgeted_hours, + 0 as overall_hourly_rate, + AAL.unit_amount as unit_amount, + COALESCE(cons_data1.cons_hourly_cost, 0) as pro_hourly_rate, + case when cons_data1.cons_timesheet_cost is null then ((AAL.amount * -1)/NULLIF(AAL.unit_amount, 0)) else cons_data1.cons_timesheet_cost + end as timesheet_cost, + --coalesce(((AAL.amount * -1)/NULLIF(AAL.unit_amount, 0)), cons_data1.cons_timesheet_cost) as timesheet_cost, + (AAL.unit_amount * COALESCE(cons_data1.cons_hourly_cost, 0)) as actual_revenue, + case when cons_data1.cons_timesheet_cost is null then (AAL.amount * -1) else (AAL.unit_amount * cons_data1.cons_timesheet_cost) + end as actual_cost, + 0 as expenses_amt, + (AAL.unit_amount * COALESCE(cons_data1.cons_hourly_cost, 0)) - case when cons_data1.cons_timesheet_cost is null + then (AAL.amount * -1) else (AAL.unit_amount * cons_data1.cons_timesheet_cost) end as profit_amt, + (((AAL.unit_amount * COALESCE(cons_data1.cons_hourly_cost, 0)) - case when cons_data1.cons_timesheet_cost is null then (AAL.amount * -1) + else (AAL.unit_amount * cons_data1.cons_timesheet_cost) end) / NULLIF((AAL.unit_amount * COALESCE(cons_data1.cons_hourly_cost, 0)), 0)) * 100 as profit_per + FROM sub_pro_data + left join account_analytic_line AAL on AAL.sub_project=sub_pro_data.sub_project + left join cons_data1 on cons_data1.project_id=AAL.sub_project and cons_data1.employee_id=AAL.employee_id + --and (AAL.start_datetime, AAL.end_datetime) OVERLAPS (cons_data1.start_date::date, cons_data1.end_date::date) + and AAL.start_datetime --at time zone 'utc' at time zone (select tz from res_partner where id=3) + >= cons_data1.start_date::date + '00:00:00'::time AT TIME ZONE 'UTC' + and AAL.end_datetime --at time zone 'utc' at time zone (select tz from res_partner where id=3) + <= cons_data1.end_date::date + '23:59:59'::time AT TIME ZONE 'UTC' + where sub_pro_data.pricing_type='employee_rate' and sub_pro_data.project_type='hours_in_consultant' + AND AAL.sub_project is not null + --AND sub_pro_data.is_sub_project = True + group by + sub_pro_data.pproject_id, + AAL.employee_id, + AAL.id, + AAL.start_datetime, + sub_pro_data.project_active, + sub_pro_data.project_type, + sub_pro_data.parent_project, + sub_pro_data.sub_project, + cons_data1.role, + sub_pro_data.tag_name, + sub_pro_data.pricing_type, + sub_pro_data.partner_id, + AAL.unit_amount, + AAL.amount, + cons_data1.cons_timesheet_cost, + cons_data1.cons_hourly_cost ), invoice_data as (SELECT invoice_date.date as start_date,