From 6d620adac510c50be0f65950c75b7f5f7aabbf64 Mon Sep 17 00:00:00 2001 From: Sureerat Meepoo Date: Mon, 30 Sep 2019 09:52:18 +0700 Subject: [PATCH] =?UTF-8?q?#3659-Purchase=5FTracking=5FReport=20Module:=20?= =?UTF-8?q?pabi=5Fprocurement=5Freport=20https://mobileapp.nstda.or.th/red?= =?UTF-8?q?mine/issues/3659=20=E0=B9=81=E0=B8=81=E0=B9=89=E0=B9=84?= =?UTF-8?q?=E0=B8=82=20query=20=E0=B9=81=E0=B8=A5=E0=B8=B0=E0=B9=80?= =?UTF-8?q?=E0=B8=9E=E0=B8=B4=E0=B9=88=E0=B8=A1=20column=20=E0=B9=83?= =?UTF-8?q?=E0=B8=99=20Excel?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../xlsx_report_pabi_purchase_tracking.py | 372 +++++++----------- .../xlsx_report_pabi_purchase_tracking.xml | 28 +- .../xlsx_template/templates.xml | 20 +- .../xlsx_report_pabi_purchase_tracking.xlsx | Bin 13691 -> 19753 bytes 4 files changed, 179 insertions(+), 241 deletions(-) diff --git a/pabi_procurement_report/reports/xlsx_report_pabi_purchase_tracking.py b/pabi_procurement_report/reports/xlsx_report_pabi_purchase_tracking.py index 7fa9c1075..721ddfce0 100644 --- a/pabi_procurement_report/reports/xlsx_report_pabi_purchase_tracking.py +++ b/pabi_procurement_report/reports/xlsx_report_pabi_purchase_tracking.py @@ -213,110 +213,75 @@ def init(self, cr): tools.drop_view_if_exists(cr, self._table) cr.execute("""CREATE or REPLACE VIEW %s as ( SELECT row_number() over (order by pr.id) as id, - org.id as "org_id", pr.id as "pr_id", pr.date_start as "pr_date", pr.name as "pr_name", - (SELECT part.id FROM res_users uer left join res_partner part on part.id = uer.partner_id - WHERE uer.id = pr.requested_by) as "pr_requester_id", - (SELECT part.display_name2 FROM res_users uer left join res_partner part on part.id = uer.partner_id - WHERE uer.id = pr.requested_by) as "pr_requested", pr.date_approve as "pr_date_approve", - (SELECT part.id FROM res_users uer left join res_partner part on part.id = uer.partner_id - WHERE uer.id = pr.responsible_uid) as "pr_responsible_id", - (SELECT part.display_name2 FROM res_users uer left join res_partner part on part.id = uer.partner_id - WHERE uer.id = pr.responsible_uid) as "pr_responsible", pr.objective as "pr_objective", pr.amount_total as "pr_amount_total", - prl.id as "prl_id", - (CASE - WHEN prl.section_id is not null THEN ( - select chv.id --concat('[',chv.code, ']', chv.name_short) - from purchase_request_line - left join res_section sect on sect.id = prl.section_id - left join chartfield_view chv on chv.code = sect.code - left join res_costcenter cos on cos.id = chv.costcenter_id - LIMIT 1) - WHEN prl.invest_construction_phase_id is not null THEN ( - select chv.id --concat('[',chv.code, ']', chv.name_short) - from purchase_request_line - left join res_invest_construction_phase icp on icp.id = prl.invest_construction_phase_id - left join chartfield_view chv on chv.code = icp.code - left join res_costcenter cos on cos.id = chv.costcenter_id - LIMIT 1) - WHEN prl.project_id is not null THEN ( - select chv.id --concat('[',chv.code, ']', chv.name) - from purchase_request_line - left join res_project pro on pro.id = prl.project_id - left join chartfield_view chv on chv.code = pro.code - left join res_costcenter cos on cos.id = chv.costcenter_id - LIMIT 1) - WHEN prl.invest_asset_id is not null THEN ( - select chv.id --concat('[',chv.code, ']', chv.name) - from purchase_request_line - left join res_invest_asset iat on iat.id = prl.invest_asset_id - left join chartfield_view chv on chv.code = iat.code - left join res_costcenter cos on cos.id = chv.costcenter_id - LIMIT 1) - WHEN prl.personnel_costcenter_id is not null THEN ( - select chv.id --concat('[',chv.code, ']', chv.name) - from purchase_request_line - left join res_personnel_costcenter rpc on rpc.id = prl.personnel_costcenter_id - left join chartfield_view chv on chv.code = rpc.code - left join res_costcenter cos on cos.id = chv.costcenter_id - LIMIT 1) - END) as "prl_budget", pd.id as "pd_id", pd.name as "pd_name", pd.ordering_date as "pd_ordering_date", pd.date_doc_approve as "pd_date_doc_approve", - po.id as "po_id", po.name as "po_name", po.date_order as "po_date", po.date_contract_start as "po_date_contract_start", - po.date_contract_end as "po_date_contract_end", poc.id as "poc_id", poc.display_code as "po_display_code", poc.start_date as "poc_start_date", - poc.end_date as "po_end_date", - (SELECT part.id FROM res_users uer left join res_partner part on part.id = uer.partner_id - WHERE uer.id = po.responsible_uid) as "po_responsible_id", pol.id as "pol_id", - (SELECT part.display_name2 FROM res_partner part WHERE part.id = po.partner_id) as "po_partner", pol.docline_seq as "pol_docline_seq", - (SELECT prod.name_template FROM product_product prod WHERE prod.id = pol.product_id) as "pol_product", pol.name as "pol_name", - pol.date_planned as "pol_date_planned", - (CASE - WHEN pol.section_id is not null THEN ( - select chv.id --concat('[',chv.code, ']', chv.name_short) - from purchase_order_line - left join res_section sect on sect.id = pol.section_id - left join chartfield_view chv on chv.code = sect.code - left join res_costcenter cos on cos.id = chv.costcenter_id - LIMIT 1) - WHEN pol.invest_construction_phase_id is not null THEN ( - select chv.id --concat('[',chv.code, ']', chv.name_short) - from purchase_order_line - left join res_invest_construction_phase icp on icp.id = pol.invest_construction_phase_id - left join chartfield_view chv on chv.code = icp.code - left join res_costcenter cos on cos.id = chv.costcenter_id - LIMIT 1) - WHEN pol.project_id is not null THEN ( - select chv.id --concat('[',chv.code, ']', chv.name) - from purchase_order_line - left join res_project pro on pro.id = pol.project_id - left join chartfield_view chv on chv.code = pro.code - left join res_costcenter cos on cos.id = chv.costcenter_id - LIMIT 1) - WHEN pol.invest_asset_id is not null THEN ( - select chv.id --concat('[',chv.code, ']', chv.name) - from purchase_order_line - left join res_invest_asset iat on iat.id = pol.invest_asset_id - left join chartfield_view chv on chv.code = iat.code - left join res_costcenter cos on cos.id = chv.costcenter_id - LIMIT 1) - WHEN pol.personnel_costcenter_id is not null THEN ( - select chv.id --concat('[',chv.code, ']', chv.name) - from purchase_order_line - left join res_personnel_costcenter rpc on rpc.id = pol.personnel_costcenter_id - left join chartfield_view chv on chv.code = rpc.code - left join res_costcenter cos on cos.id = chv.costcenter_id - LIMIT 1) - END) as "pol_budget", (SELECT fund.name FROM res_fund fund WHERE fund.id = pol.fund_id) as "pol_fund", - (SELECT cct.name FROM cost_control cct WHERE cct.id = pol.cost_control_id) as "pol_cost_control", pol.product_qty as "pol_product_qty", - (SELECT uom.name FROM product_uom uom WHERE uom.id = pol.product_uom) as "pol_product_uom", - pol.price_unit as "pol_price_unit", pol.price_unit*pol.product_qty as "pol_sub_total", - (SELECT cur.name FROM res_currency cur WHERE cur.id = po.currency_id) as "pol_currency", - (SELECT fyear.name FROM account_fiscalyear fyear WHERE fyear.id = pol.fiscalyear_id) as "pol_fiscalyear", pol.state as "pol_state", - (SELECT part.display_name2 FROM res_partner part WHERE part.id = po.responsible_uid) as "po_responsible", - (SELECT payterm.name FROM account_payment_term payterm WHERE payterm.id = po.payment_term_id) as "po_payment_term", - pwa.id as "pwa_id", pwa.name as "pwa_name", sp.id as "sp_id", sp.name as "sp_name", pwa.date_accept as "pwq_date_accept", pb.id as "pb_id", pb.name as "pb_name", - pb.date_sent as "pb_date_sent", pb.date as "pb_date", inv.id as "inv_id", inv.number as "inv_name", inv.date_invoice as "inv_date_invoice", - (SELECT part.display_name2 FROM res_users uer left join res_partner part on part.id = uer.partner_id - WHERE uer.id = inv.user_id) as "inv_user", vou.id as "vou_id", vou.number as "vou_name", vou.date as "vou_date", vou.date_value as "vou_date_value" - + ou.id as org_id, pr.id as pr_id, cast(pr.date_start as date) as pr_date, + users.partner_id as pr_requester_id, pr_res.partner_id as pr_responsible_id, prl.id as prl_id, + (CASE + WHEN prl.section_id is not null THEN ( + select chv.id + from purchase_request_line + left join res_section sect on sect.id = prl.section_id + left join chartfield_view chv on chv.code = sect.code + LIMIT 1) + WHEN prl.invest_construction_phase_id is not null THEN ( + select chv.id + from purchase_request_line + left join res_invest_construction_phase icp on icp.id = prl.invest_construction_phase_id + left join chartfield_view chv on chv.code = icp.code + LIMIT 1) + WHEN prl.project_id is not null THEN ( + select chv.id + from purchase_request_line + left join res_project pro on pro.id = prl.project_id + left join chartfield_view chv on chv.code = pro.code + LIMIT 1) + WHEN prl.invest_asset_id is not null THEN ( + select chv.id + from purchase_request_line + left join res_invest_asset iat on iat.id = prl.invest_asset_id + left join chartfield_view chv on chv.code = iat.code + LIMIT 1) + WHEN prl.personnel_costcenter_id is not null THEN ( + select chv.id + from purchase_request_line + left join res_personnel_costcenter rpc on rpc.id = prl.personnel_costcenter_id + left join chartfield_view chv on chv.code = rpc.code + LIMIT 1) + END) as prl_budget, + pd.id as pd_id, po.id as po_id, po.name as po_name, cast(po.date_order as date) as po_date, + po_res.partner_id as po_responsible_id, pol.id as pol_id, + (CASE + WHEN pol.section_id is not null THEN ( + select chv.id + from purchase_order_line + left join res_section sect on sect.id = pol.section_id + left join chartfield_view chv on chv.code = sect.code + LIMIT 1) + WHEN pol.invest_construction_phase_id is not null THEN ( + select chv.id + from purchase_order_line + left join res_invest_construction_phase icp on icp.id = pol.invest_construction_phase_id + left join chartfield_view chv on chv.code = icp.code + LIMIT 1) + WHEN pol.project_id is not null THEN ( + select chv.id + from purchase_order_line + left join res_project pro on pro.id = pol.project_id + left join chartfield_view chv on chv.code = pro.code + LIMIT 1) + WHEN pol.invest_asset_id is not null THEN ( + select chv.id + from purchase_order_line + left join res_invest_asset iat on iat.id = pol.invest_asset_id + left join chartfield_view chv on chv.code = iat.code + LIMIT 1) + WHEN pol.personnel_costcenter_id is not null THEN ( + select chv.id + from purchase_order_line + left join res_personnel_costcenter rpc on rpc.id = pol.personnel_costcenter_id + left join chartfield_view chv on chv.code = rpc.code + LIMIT 1) + END) as pol_budget, + pol.state as pol_state, poc.id as poc_id, pwa.id as pwa_id, sp.id as sp_id, inv.id as inv_id, pb.id as pb_id, vou.id as vou_id FROM purchase_request pr LEFT join purchase_request_line prl ON prl.request_id = pr.id LEFT JOIN purchase_request_purchase_requisition_line_rel prpdrel ON prpdrel.purchase_request_line_id = prl.id @@ -326,13 +291,15 @@ def init(self, cr): LEFT JOIN purchase_order po ON po.requisition_id = pd.id LEFT JOIN purchase_order_line pol ON pol.requisition_line_id = pdl.id LEFT JOIN purchase_work_acceptance pwa ON pwa.order_id = po.id + LEFT JOIN res_users pr_res ON pr_res.id = pr.responsible_uid + LEFT JOIN res_users po_res ON po_res.id = po.responsible_uid + LEFT JOIN res_users users ON users.id = pr.requested_by LEFT JOIN stock_picking sp ON sp.acceptance_id = pwa.id LEFT JOIN account_invoice inv ON inv.source_document = po.name - LEFT JOIN account_invoice_line invl ON invl.invoice_id = inv.id LEFT JOIN purchase_billing pb ON pb.id = inv.purchase_billing_id - left join account_voucher_line voul on voul.invoice_id = inv.id + LEFT JOIN account_voucher_line voul ON voul.invoice_id = inv.id LEFT JOIN account_voucher vou ON vou.id = voul.voucher_id - LEFT JOIN operating_unit org ON org.id = pr.operating_unit_id or org.id = po.operating_unit_id + LEFT JOIN operating_unit ou ON ou.id = pr.operating_unit_id or ou.id = po.operating_unit_id where (pol.state != 'cancel' and po.name not like 'RFQ%%') or po.id is null order by pr.id, po.id, inv.name, vou.name )""" % (self._table, )) @@ -372,127 +339,94 @@ def init(self, cr): tools.drop_view_if_exists(cr, self._table) cr.execute("""CREATE or REPLACE VIEW %s as ( SELECT row_number() over (order by pr.id) as id, - org.id as "org_id", pr.id as "pr_id", pr.date_start as "pr_date", pr.name as "pr_name", - (SELECT part.id FROM res_users uer left join res_partner part on part.id = uer.partner_id - WHERE uer.id = pr.requested_by) as "pr_requester_id", - (SELECT part.display_name2 FROM res_users uer left join res_partner part on part.id = uer.partner_id - WHERE uer.id = pr.requested_by) as "pr_requested", pr.date_approve as "pr_date_approve", - (SELECT part.id FROM res_users uer left join res_partner part on part.id = uer.partner_id - WHERE uer.id = pr.responsible_uid) as "pr_responsible_id", - (SELECT part.display_name2 FROM res_users uer left join res_partner part on part.id = uer.partner_id - WHERE uer.id = pr.responsible_uid) as "pr_responsible", pr.objective as "pr_objective", pr.amount_total as "pr_amount_total", - prl.id as "prl_id", - (CASE - WHEN prl.section_id is not null THEN ( - select chv.id --concat('[',chv.code, ']', chv.name_short) - from purchase_request_line - left join res_section sect on sect.id = prl.section_id - left join chartfield_view chv on chv.code = sect.code - left join res_costcenter cos on cos.id = chv.costcenter_id - LIMIT 1) - WHEN prl.invest_construction_phase_id is not null THEN ( - select chv.id --concat('[',chv.code, ']', chv.name_short) - from purchase_request_line - left join res_invest_construction_phase icp on icp.id = prl.invest_construction_phase_id - left join chartfield_view chv on chv.code = icp.code - left join res_costcenter cos on cos.id = chv.costcenter_id - LIMIT 1) - WHEN prl.project_id is not null THEN ( - select chv.id --concat('[',chv.code, ']', chv.name) - from purchase_request_line - left join res_project pro on pro.id = prl.project_id - left join chartfield_view chv on chv.code = pro.code - left join res_costcenter cos on cos.id = chv.costcenter_id - LIMIT 1) - WHEN prl.invest_asset_id is not null THEN ( - select chv.id --concat('[',chv.code, ']', chv.name) - from purchase_request_line - left join res_invest_asset iat on iat.id = prl.invest_asset_id - left join chartfield_view chv on chv.code = iat.code - left join res_costcenter cos on cos.id = chv.costcenter_id - LIMIT 1) - WHEN prl.personnel_costcenter_id is not null THEN ( - select chv.id --concat('[',chv.code, ']', chv.name) - from purchase_request_line - left join res_personnel_costcenter rpc on rpc.id = prl.personnel_costcenter_id - left join chartfield_view chv on chv.code = rpc.code - left join res_costcenter cos on cos.id = chv.costcenter_id - LIMIT 1) - END) as "prl_budget", pd.id as "pd_id", pd.name as "pd_name", pd.ordering_date as "pd_ordering_date", pd.date_doc_approve as "pd_date_doc_approve", - po.id as "po_id", po.name as "po_name", po.date_order as "po_date", po.date_contract_start as "po_date_contract_start", - po.date_contract_end as "po_date_contract_end", poc.id as "poc_id", poc.display_code as "po_display_code", poc.start_date as "poc_start_date", - poc.end_date as "po_end_date", - (SELECT part.id FROM res_users uer left join res_partner part on part.id = uer.partner_id - WHERE uer.id = po.responsible_uid) as "po_responsible_id", pol.id as "pol_id", - (SELECT part.display_name2 FROM res_partner part WHERE part.id = po.partner_id) as "po_partner", pol.docline_seq as "pol_docline_seq", - (SELECT prod.name_template FROM product_product prod WHERE prod.id = pol.product_id) as "pol_product", pol.name as "pol_name", - pol.date_planned as "pol_date_planned", - (CASE - WHEN pol.section_id is not null THEN ( - select chv.id --concat('[',chv.code, ']', chv.name_short) - from purchase_order_line - left join res_section sect on sect.id = pol.section_id - left join chartfield_view chv on chv.code = sect.code - left join res_costcenter cos on cos.id = chv.costcenter_id - LIMIT 1) - WHEN pol.invest_construction_phase_id is not null THEN ( - select chv.id --concat('[',chv.code, ']', chv.name_short) - from purchase_order_line - left join res_invest_construction_phase icp on icp.id = pol.invest_construction_phase_id - left join chartfield_view chv on chv.code = icp.code - left join res_costcenter cos on cos.id = chv.costcenter_id - LIMIT 1) - WHEN pol.project_id is not null THEN ( - select chv.id --concat('[',chv.code, ']', chv.name) - from purchase_order_line - left join res_project pro on pro.id = pol.project_id - left join chartfield_view chv on chv.code = pro.code - left join res_costcenter cos on cos.id = chv.costcenter_id - LIMIT 1) - WHEN pol.invest_asset_id is not null THEN ( - select chv.id --concat('[',chv.code, ']', chv.name) - from purchase_order_line - left join res_invest_asset iat on iat.id = pol.invest_asset_id - left join chartfield_view chv on chv.code = iat.code - left join res_costcenter cos on cos.id = chv.costcenter_id - LIMIT 1) - WHEN pol.personnel_costcenter_id is not null THEN ( - select chv.id --concat('[',chv.code, ']', chv.name) - from purchase_order_line - left join res_personnel_costcenter rpc on rpc.id = pol.personnel_costcenter_id - left join chartfield_view chv on chv.code = rpc.code - left join res_costcenter cos on cos.id = chv.costcenter_id - LIMIT 1) - END) as "pol_budget", (SELECT fund.name FROM res_fund fund WHERE fund.id = pol.fund_id) as "pol_fund", - (SELECT cct.name FROM cost_control cct WHERE cct.id = pol.cost_control_id) as "pol_cost_control", pol.product_qty as "pol_product_qty", - (SELECT uom.name FROM product_uom uom WHERE uom.id = pol.product_uom) as "pol_product_uom", - pol.price_unit as "pol_price_unit", pol.price_unit*pol.product_qty as "pol_sub_total", - (SELECT cur.name FROM res_currency cur WHERE cur.id = po.currency_id) as "pol_currency", - (SELECT fyear.name FROM account_fiscalyear fyear WHERE fyear.id = pol.fiscalyear_id) as "pol_fiscalyear", pol.state as "pol_state", - (SELECT part.display_name2 FROM res_partner part WHERE part.id = po.responsible_uid) as "po_responsible", - (SELECT payterm.name FROM account_payment_term payterm WHERE payterm.id = po.payment_term_id) as "po_payment_term", - pwa.id as "pwa_id", pwa.name as "pwa_name", sp.id as "sp_id", sp.name as "sp_name", pwa.date_accept as "pwq_date_accept", pb.id as "pb_id", pb.name as "pb_name", - pb.date_sent as "pb_date_sent", pb.date as "pb_date", inv.id as "inv_id", inv.number as "inv_name", inv.date_invoice as "inv_date_invoice", - (SELECT part.display_name2 FROM res_users uer left join res_partner part on part.id = uer.partner_id - WHERE uer.id = inv.user_id) as "inv_user", vou.id as "vou_id", vou.number as "vou_name", vou.date as "vou_date", vou.date_value as "vou_date_value" - + ou.id as org_id, pr.id as pr_id, cast(pr.date_start as date) as pr_date, + users.partner_id as pr_requester_id, pr_res.partner_id as pr_responsible_id, prl.id as prl_id, + (CASE + WHEN prl.section_id is not null THEN ( + select chv.id + from purchase_request_line + left join res_section sect on sect.id = prl.section_id + left join chartfield_view chv on chv.code = sect.code + LIMIT 1) + WHEN prl.invest_construction_phase_id is not null THEN ( + select chv.id + from purchase_request_line + left join res_invest_construction_phase icp on icp.id = prl.invest_construction_phase_id + left join chartfield_view chv on chv.code = icp.code + LIMIT 1) + WHEN prl.project_id is not null THEN ( + select chv.id + from purchase_request_line + left join res_project pro on pro.id = prl.project_id + left join chartfield_view chv on chv.code = pro.code + LIMIT 1) + WHEN prl.invest_asset_id is not null THEN ( + select chv.id + from purchase_request_line + left join res_invest_asset iat on iat.id = prl.invest_asset_id + left join chartfield_view chv on chv.code = iat.code + LIMIT 1) + WHEN prl.personnel_costcenter_id is not null THEN ( + select chv.id + from purchase_request_line + left join res_personnel_costcenter rpc on rpc.id = prl.personnel_costcenter_id + left join chartfield_view chv on chv.code = rpc.code + LIMIT 1) + END) as prl_budget, + pd.id as pd_id, po.id as po_id, po.name as po_name, cast(po.date_order as date) as po_date, + po_res.partner_id as po_responsible_id, pol.id as pol_id, + (CASE + WHEN pol.section_id is not null THEN ( + select chv.id + from purchase_order_line + left join res_section sect on sect.id = pol.section_id + left join chartfield_view chv on chv.code = sect.code + LIMIT 1) + WHEN pol.invest_construction_phase_id is not null THEN ( + select chv.id + from purchase_order_line + left join res_invest_construction_phase icp on icp.id = pol.invest_construction_phase_id + left join chartfield_view chv on chv.code = icp.code + LIMIT 1) + WHEN pol.project_id is not null THEN ( + select chv.id + from purchase_order_line + left join res_project pro on pro.id = pol.project_id + left join chartfield_view chv on chv.code = pro.code + LIMIT 1) + WHEN pol.invest_asset_id is not null THEN ( + select chv.id + from purchase_order_line + left join res_invest_asset iat on iat.id = pol.invest_asset_id + left join chartfield_view chv on chv.code = iat.code + LIMIT 1) + WHEN pol.personnel_costcenter_id is not null THEN ( + select chv.id + from purchase_order_line + left join res_personnel_costcenter rpc on rpc.id = pol.personnel_costcenter_id + left join chartfield_view chv on chv.code = rpc.code + LIMIT 1) + END) as pol_budget, + pol.state as pol_state, poc.id as poc_id, pwa.id as pwa_id, sp.id as sp_id, inv.id as inv_id, pb.id as pb_id, vou.id as vou_id FROM purchase_order po LEFT JOIN purchase_requisition pd ON pd.id = po.requisition_id - LEFT JOIN purchase_requisition_line pdl ON pdl.requisition_id = pd.id + LEFT JOIN purchase_contract poc ON poc.requisition_id = pd.id + LEFT JOIN purchase_order_line pol ON pol.order_id = po.id + LEFT JOIN purchase_requisition_line pdl ON pdl.id = pol.requisition_line_id LEFT JOIN purchase_request_purchase_requisition_line_rel prpdrel ON prpdrel.purchase_requisition_line_id = pdl.id LEFT join purchase_request_line prl ON prl.id = prpdrel.purchase_request_line_id - LEFT join purchase_request pr ON pr.id = prl.request_id - LEFT JOIN purchase_order_line pol ON pol.order_id = po.id - LEFT JOIN purchase_contract poc ON poc.requisition_id = pd.id + LEFT join purchase_request pr ON pr.id = prl.request_id LEFT JOIN purchase_work_acceptance pwa ON pwa.order_id = po.id + LEFT JOIN res_users pr_res ON pr_res.id = pr.responsible_uid + LEFT JOIN res_users po_res ON po_res.id = po.responsible_uid + LEFT JOIN res_users users ON users.id = pr.requested_by LEFT JOIN stock_picking sp ON sp.acceptance_id = pwa.id LEFT JOIN account_invoice inv ON inv.source_document = po.name - LEFT JOIN account_invoice_line invl ON invl.invoice_id = inv.id LEFT JOIN purchase_billing pb ON pb.id = inv.purchase_billing_id - left join account_voucher_line voul on voul.invoice_id = inv.id + LEFT JOIN account_voucher_line voul ON voul.invoice_id = inv.id LEFT JOIN account_voucher vou ON vou.id = voul.voucher_id - LEFT JOIN operating_unit org ON org.id = pr.operating_unit_id or org.id = po.operating_unit_id + LEFT JOIN operating_unit ou ON ou.id = pr.operating_unit_id or ou.id = po.operating_unit_id + LEFT JOIN res_org org ON org.id = ou.org_id where (pol.state != 'cancel' and po.name not like 'RFQ%%') order by pr.id, po.id, inv.name, vou.name )""" % (self._table, )) - diff --git a/pabi_procurement_report/reports/xlsx_report_pabi_purchase_tracking.xml b/pabi_procurement_report/reports/xlsx_report_pabi_purchase_tracking.xml index ff2c448ed..19ead1f53 100644 --- a/pabi_procurement_report/reports/xlsx_report_pabi_purchase_tracking.xml +++ b/pabi_procurement_report/reports/xlsx_report_pabi_purchase_tracking.xml @@ -7,8 +7,8 @@ primary - - + + @@ -18,27 +18,27 @@ - + - - - - - + + + + + - + - - - - + + + + @@ -60,4 +60,4 @@ - + \ No newline at end of file diff --git a/pabi_procurement_report/xlsx_template/templates.xml b/pabi_procurement_report/xlsx_template/templates.xml index d9504adc6..e197348cf 100755 --- a/pabi_procurement_report/xlsx_template/templates.xml +++ b/pabi_procurement_report/xlsx_template/templates.xml @@ -574,14 +574,14 @@ 'A16': 'pr_id.date_start${value and value.strftime("%d-%m-%Y") or ""}', 'B16': 'pr_id.name${value or ""}', 'C16': 'pr_id.state${value or ""}', - 'D16': 'pr_id.requested_by.display_name2${value or ""}', + 'D16': 'pr_id.requested_by.partner_id.display_name2${value or ""}', 'E16': '', 'F16': 'pr_id.date_approve${value and value.strftime("%d-%m-%Y") or ""}', - 'G16': 'pr_id.responsible_uid.display_name2${value or ""}', + 'G16': 'pr_id.responsible_uid.partner_id.display_name2${value or ""}', 'H16': '', 'I16': 'pr_id.objective${value or ""}', 'J16': 'prl_id.price_subtotal${value or ""}', - 'K16': 'prl_budget${value and ("["+value.code+"]" or "")+(value.name_short or value.name or "") or ""}', + 'K16': 'prl_budget${value and ("["+value.code+"] " or "")+(value.name_short or value.name or "") or ""}', 'L16': 'prl_budget${value and value.name or ""}', 'M16': 'pd_id.name${value or ""}', 'N16': 'pd_id.ordering_date${value and value.strftime("%d-%m-%Y") or ""}', @@ -600,7 +600,7 @@ 'AA16': 'pol_id.product_id.name${value or ""}', 'AB16': 'pol_id.name${value or ""}', 'AC16': 'pol_id.date_planned${value and value.strftime("%d-%m-%Y") or ""}', - 'AD16': 'pol_budget${value and ("["+value.code+"]" or "")+(value.name_short or value.name or "") or ""}', + 'AD16': 'pol_budget${value and ("["+value.code+"] " or "")+(value.name_short or value.name or "") or ""}', 'AE16': 'pol_budget${value and value.name or ""}', 'AF16': 'pol_id.fund_id.name${value or ""}', 'AG16': 'pol_id.cost_control_id.name${value or ""}', @@ -629,19 +629,21 @@ 'BD16': 'vou_id.date${value and value.strftime("%d-%m-%Y") or ""}', 'BE16': 'inv_id.payment_type${value or ""}', 'BF16': 'vou_id.date_value${value and value.strftime("%d-%m-%Y") or ""}', + 'BG16': 'po_id.state${value and (value == "draft" and "Draft" or value == "confirmed" and "Waiting to Release" or value == "approved" and "PO Released"or value == "done" and "Done" or value) or ""}', + 'BH16': 'po_id.technical_closed${value and value is True and "X" or ""}', }, 'po_results': { 'A16': 'pr_id.date_start${value and value.strftime("%d-%m-%Y") or ""}', 'B16': 'pr_id.name${value or ""}', 'C16': 'pr_id.state${value or ""}', - 'D16': 'pr_id.requested_by.display_name2${value or ""}', + 'D16': 'pr_id.requested_by.partner_id.display_name2${value or ""}', 'E16': '', 'F16': 'pr_id.date_approve${value and value.strftime("%d-%m-%Y") or ""}', - 'G16': 'pr_id.responsible_uid.display_name2${value or ""}', + 'G16': 'pr_id.responsible_uid.partner_id.display_name2${value or ""}', 'H16': '', 'I16': 'pr_id.objective${value or ""}', 'J16': 'prl_id.price_subtotal${value or ""}', - 'K16': 'prl_budget${value and ("["+value.code+"]" or "")+(value.name_short or value.name or "") or ""}', + 'K16': 'prl_budget${value and ("["+value.code+"] " or "")+(value.name_short or value.name or "") or ""}', 'L16': 'prl_budget${value and value.name or ""}', 'M16': 'pd_id.name${value or ""}', 'N16': 'pd_id.ordering_date${value and value.strftime("%d-%m-%Y") or ""}', @@ -660,7 +662,7 @@ 'AA16': 'pol_id.product_id.name${value or ""}', 'AB16': 'pol_id.name${value or ""}', 'AC16': 'pol_id.date_planned${value and value.strftime("%d-%m-%Y") or ""}', - 'AD16': 'pol_budget${value and ("["+value.code+"]" or "")+(value.name_short or value.name or "") or ""}', + 'AD16': 'pol_budget${value and ("["+value.code+"] " or "")+(value.name_short or value.name or "") or ""}', 'AE16': 'pol_budget${value and value.name or ""}', 'AF16': 'pol_id.fund_id.name${value or ""}', 'AG16': 'pol_id.cost_control_id.name${value or ""}', @@ -689,6 +691,8 @@ 'BD16': 'vou_id.date${value and value.strftime("%d-%m-%Y") or ""}', 'BE16': 'inv_id.payment_type${value or ""}', 'BF16': 'vou_id.date_value${value and value.strftime("%d-%m-%Y") or ""}', + 'BG16': 'po_id.state${value and (value == "draft" and "Draft" or value == "confirmed" and "Waiting to Release" or value == "approved" and "PO Released"or value == "done" and "Done" or value) or ""}', + 'BH16': 'po_id.technical_closed${value and value is True and "X" or ""}', }, '_TAIL_0': { } diff --git a/pabi_procurement_report/xlsx_template/xlsx_report_pabi_purchase_tracking.xlsx b/pabi_procurement_report/xlsx_template/xlsx_report_pabi_purchase_tracking.xlsx index 10a40d5570dba4450221cac0757d0804256da06f..8b7c676e3c22aeb30cf9f6206df7d6d1c3500752 100644 GIT binary patch delta 13847 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 delta 7767 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