From 32dac703919463c5ef400f4262a973ff0fd3f8b7 Mon Sep 17 00:00:00 2001 From: hardya Date: Mon, 21 Jan 2008 18:56:25 +0000 Subject: [PATCH] Updated 'mandatory' field checks. git-svn-id: http://locode01.ad.dom/svn/WEBMIP/trunk@3322 248e525c-4dfb-0310-94bc-949c084e9493 --- ...ItemToFunctionalSpecificationReference.xls | Bin 52224 -> 36352 bytes Modules/Modules.sql | 1 + Modules/gen_mandatory.prc | 14 +- Modules/mip_helper_special_cases.pck | 74 ++ Modules/mip_quotation.pck | 666 +++++++++++++----- Schema/mipExtTables.sql | 1 + 6 files changed, 557 insertions(+), 199 deletions(-) create mode 100644 Modules/mip_helper_special_cases.pck diff --git a/Documentation/Design/DatabaseItemToFunctionalSpecificationReference.xls b/Documentation/Design/DatabaseItemToFunctionalSpecificationReference.xls index 846e429ffaa69731507bab590d29164e3f918cc3..af6d4474b0d951ff268f95a546e44c12205527fe 100644 GIT binary patch literal 36352 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 bP7QbtvZ%JX4tdtVcUGU}zXJbN;M%7K literal 52224 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 l_rec, p_mandatory_checks=>l_mandatory_checks);'); add_sql(l_sql ,' '); diff --git a/Modules/mip_helper_special_cases.pck b/Modules/mip_helper_special_cases.pck new file mode 100644 index 0000000..b310c32 --- /dev/null +++ b/Modules/mip_helper_special_cases.pck @@ -0,0 +1,74 @@ +CREATE OR REPLACE PACKAGE mip_helper_special_cases IS + + -- Author : HARDYA + -- Created : 21/01/2008 11:40:25 + -- Purpose : helper package to support special cases not provided through mip_'tablename'_helper. + + PROCEDURE table_enquiries(p_rec IN enquiries%ROWTYPE + ,p_mandatory_checks IN OUT mip_mandatory.t_mandatory_checks); + +END mip_helper_special_cases; +/ +CREATE OR REPLACE PACKAGE BODY mip_helper_special_cases IS + + PROCEDURE table_enquiries(p_rec IN enquiries%ROWTYPE + ,p_mandatory_checks IN OUT mip_mandatory.t_mandatory_checks) IS + BEGIN + -- OM-1 + IF p_rec.install_building IS NULL + AND p_rec.install_sub_building IS NULL THEN + mip_mandatory.add_error(p_mandatory_checks => p_mandatory_checks + ,p_field_name => 'INSTALL_BUILDING' + ,p_error_message => 'At least one of Building or Sub-Building must be completed.'); + mip_mandatory.add_error(p_mandatory_checks => p_mandatory_checks + ,p_field_name => 'INSTALL_SUB_BUILDING' + ,p_error_message => 'At least one of Building or Sub-Building must be completed.'); + END IF; + + -- OM-2 + IF p_rec.enty_code IN ('STD INSTALL', 'STD EXCHANGE') + AND (p_rec.required_mesc_code IS NULL AND p_rec.qmax IS NULL) THEN + mip_mandatory.add_error(p_mandatory_checks => p_mandatory_checks + ,p_field_name => 'QMAX' + ,p_error_message => 'At least one of Qmax or Meter Size must be completed.'); + mip_mandatory.add_error(p_mandatory_checks => p_mandatory_checks + ,p_field_name => 'REQUIRED_MESC_CODE' + ,p_error_message => 'At least one of Qmax or Meter Size must be completed.'); + END IF; + + -- OM-3 + IF p_rec.enty_code IN + ('INSTALL', 'OFMAT', 'REMOVE', 'ADVERSARIAL', 'ALTERATION', + 'CAPACITY CHANGE', 'ADDON', 'OTHER') + AND p_rec.required_svcp_code = 'IP' + AND + (p_rec.required_ip_mbar IS NULL OR p_rec.required_ip_details IS NULL) THEN + mip_mandatory.add_error(p_mandatory_checks => p_mandatory_checks + ,p_field_name => 'REQUIRED_SVCP_CODE' + ,p_error_message => 'Required IP Details must be completed when a Service Pressure of ''IP'' is requested.'); + mip_mandatory.add_error(p_mandatory_checks => p_mandatory_checks + ,p_field_name => 'REQUIRED_IP_DETAILS' + ,p_error_message => 'Required IP Details must be completed when a Service Pressure of ''IP'' is requested.'); + END IF; + + -- OM-4 + IF p_rec.enty_code IN + ('INSTALL', 'STD INSTALL') + AND + (p_rec.required_ip_mbar IS NULL AND p_rec.required_ip_details IS NULL) THEN + mip_mandatory.add_error(p_mandatory_checks => p_mandatory_checks + ,p_field_name => 'MPRN' + ,p_error_message => 'Either MPRN or Additional Information must be completed.'); + mip_mandatory.add_error(p_mandatory_checks => p_mandatory_checks + ,p_field_name => 'MPRN_ALT' + ,p_error_message => 'Either MPRN or Additional Information must be completed.'); + END IF; + + + END table_enquiries; + +BEGIN + -- Initialization + NULL; +END mip_helper_special_cases; +/ diff --git a/Modules/mip_quotation.pck b/Modules/mip_quotation.pck index 7edf111..c23696a 100644 --- a/Modules/mip_quotation.pck +++ b/Modules/mip_quotation.pck @@ -7,29 +7,35 @@ CREATE OR REPLACE PACKAGE mip_quotation IS /** Determines whether the given enquiry is ready to quote for i.e. have all the mandatory fields been completed - %param p_id the id of the enquiry to be checked + %param p_enqu_id the id of the enquiry to be checked %return TRUE if the enquiry can be quoted for */ - FUNCTION ready_for_quote(p_id IN enquiries.id%TYPE) RETURN BOOLEAN; + FUNCTION ready_for_quote(p_enqu_id IN enquiries.id%TYPE) RETURN BOOLEAN; /** Determines whether the given enquiry is ready to quote for i.e. have all the mandatory fields been completed - %param p_id the id of the enquiry to be checked + %param p_enqu_id the id of the enquiry to be checked %p_mandatory_checks contains reasons for the enquiry *not* being ready to quote for %p_quote_is_ready TRUE if the enquiry can be quoted for */ - PROCEDURE ready_for_quote(p_id IN enquiries.id%TYPE + PROCEDURE ready_for_quote(p_enqu_id IN enquiries.id%TYPE ,p_mandatory_checks OUT mip_mandatory.t_mandatory_checks - ,p_quote_is_ready OUT BOOLEAN); + ,p_enquiry_is_ready OUT BOOLEAN); /** Generate quotes in response to a 'request for quote' against an enquiry - %param p_id the id of the enquiry to be checked + %param p_enqu_id the id of the enquiry to be checked + %param p_prty_id the id of the party that requested the quotes + %param p_owner_prty_id the id of party that owns the quotes (defaults to the requestor) */ PROCEDURE produce_quotes(p_enqu_id IN enquiries.id%TYPE ,p_rfq_prty_id IN parties.id%TYPE ,p_owner_prty_id IN parties.id%TYPE DEFAULT NULL); + + FUNCTION return_mandatory_messages(p_enqu_id IN enquiries.id%TYPE) + RETURN VARCHAR2; + /** Make quote available %param p_qute_id id of the quote to be marked as available */ @@ -193,8 +199,7 @@ CREATE OR REPLACE PACKAGE BODY mip_quotation IS END select_quote; PROCEDURE lapse_quotes_job IS - l_current_date DATE := trunc(SYSDATE); - l_quote_expiry_date DATE; + l_current_date DATE := trunc(SYSDATE); BEGIN FOR cur_quote IN (SELECT v.qute_id FROM v_current_quote_status v @@ -457,10 +462,10 @@ CREATE OR REPLACE PACKAGE BODY mip_quotation IS p_enqu_id || ' (' || get_enty_description(p_enqu_id) || ')'); FOR l_qute IN (SELECT id - FROM quotes, - v_quote_details v + FROM quotes + ,v_quote_details v WHERE enqu_id = p_enqu_id - AND v.QUOTE_ID = id + AND v.quote_id = id ORDER BY total_cost) LOOP produce_quote_summary(l_qute.id); @@ -536,25 +541,46 @@ CREATE OR REPLACE PACKAGE BODY mip_quotation IS END request_manual_quote; - PROCEDURE ready_for_quote(p_id IN enquiries.id%TYPE + PROCEDURE ready_for_quote(p_enqu_id IN enquiries.id%TYPE ,p_mandatory_checks OUT mip_mandatory.t_mandatory_checks - ,p_quote_is_ready OUT BOOLEAN) IS + ,p_enquiry_is_ready OUT BOOLEAN) IS l_mandatory_checks mip_mandatory.t_mandatory_checks; BEGIN - p_quote_is_ready := mip_enquiries_helper.check_mandatory(p_id => p_id - ,p_mandatory_checks => p_mandatory_checks); + p_enquiry_is_ready := mip_enquiries_helper.check_mandatory(p_id => p_enqu_id + ,p_mandatory_checks => p_mandatory_checks); END ready_for_quote; - FUNCTION ready_for_quote(p_id IN enquiries.id%TYPE) RETURN BOOLEAN IS + FUNCTION ready_for_quote(p_enqu_id IN enquiries.id%TYPE) RETURN BOOLEAN IS l_mandatory_checks mip_mandatory.t_mandatory_checks; - l_quote_is_ready BOOLEAN; + l_enquiry_is_ready BOOLEAN; BEGIN - ready_for_quote(p_id => p_id + ready_for_quote(p_enqu_id => p_enqu_id ,p_mandatory_checks => l_mandatory_checks - ,p_quote_is_ready => l_quote_is_ready); - RETURN l_quote_is_ready; + ,p_enquiry_is_ready => l_enquiry_is_ready); + RETURN l_enquiry_is_ready; END ready_for_quote; + FUNCTION return_mandatory_messages(p_enqu_id IN enquiries.id%TYPE) + RETURN VARCHAR2 IS + l_mandatory_messages VARCHAR2(4000); + l_mandatory_checks mip_mandatory.t_mandatory_checks; + l_enquiry_is_ready BOOLEAN; + BEGIN + + ready_for_quote(p_enqu_id => p_enqu_id + ,p_mandatory_checks => l_mandatory_checks + ,p_enquiry_is_ready => l_enquiry_is_ready); + + FOR l_idx IN l_mandatory_checks.LAST .. l_mandatory_checks.LAST LOOP + l_mandatory_messages := l_mandatory_checks(l_idx) + .field_name || ':' || + l_mandatory_checks(l_idx).error_message; + END LOOP; + + RETURN nvl(l_mandatory_messages + ,'All mandatory fields have been completed'); + END return_mandatory_messages; + PROCEDURE add_quote_reason(p_enqu_id IN enquiries.id%TYPE ,p_reason IN quote_reasoning.reason%TYPE ,p_internal_or_external IN quote_reasoning.internal_or_external%TYPE DEFAULT gc_external_reason) IS @@ -634,14 +660,14 @@ CREATE OR REPLACE PACKAGE BODY mip_quotation IS FROM service_pressures WHERE code = p_enqu.required_svcp_code; IF l_svcpt_code = 'LP' THEN - IF p_enqu.enty_code = 'RELOCATE' THEN + IF p_enqu.enty_code = 'ALTERATION' THEN p_manual_or_automatic_quote := gc_manual_quote; add_quote_reason(p_enqu.id - ,'Site Survey is required for relocation.'); + ,'Site Survey is required for alteration (relocation or reposition) of an existing meter.'); END IF; -- RELOCATE IF p_enqu.enty_code IN ('EXCHANGE', 'STD EXCHANGE') THEN l_existing_meter_size_code := p_enqu.existing_mesc_code; - l_required_meter_size_code := p_enqu.existing_mesc_code; + l_required_meter_size_code := p_enqu.required_mesc_code; IF l_required_meter_size_code IS NULL THEN l_required_meter_size_code := get_u_meter_size(p_enqu.qmax); END IF; @@ -662,6 +688,14 @@ CREATE OR REPLACE PACKAGE BODY mip_quotation IS ,p_manual_or_automatic_quote OUT t_manual_or_automatic_quote) IS BEGIN p_manual_or_automatic_quote := gc_automatic_quote; + + IF p_enqu.enty_code IN ('OTHER', 'CHANGE CAPACITY') THEN + p_manual_or_automatic_quote := gc_manual_quote; + add_quote_reason(p_enqu.id + ,'Enquiry type is ''' || + get_enty_description(p_enqu.id) || '''.'); + END IF; + survey_required(p_enqu => p_enqu ,p_manual_or_automatic_quote => p_manual_or_automatic_quote); @@ -701,6 +735,38 @@ CREATE OR REPLACE PACKAGE BODY mip_quotation IS ,'Required Annual Quantity is in excess of 732MWh.'); END IF; + /* IF p_enqu.enty_code IN ('EXCHANGE') + AND NOT (p_enqu.existing_mety_code = 'DIAPHRAGM' AND + p_enqu.required_svcp_code = 'LP') THEN + p_manual_or_automatic_quote := gc_manual_quote; + add_quote_reason(p_enqu.id + ,'Exhange of a meter that is not an LP Diaphragm.'); + END IF;*/ + + IF p_enqu.existing_convertor = 'YES' + AND p_enqu.enty_code NOT IN ('REMOVE', 'STD REMOVE', 'ADVERSARIAL') THEN + p_manual_or_automatic_quote := gc_manual_quote; + add_quote_reason(p_enqu.id + ,'Convertor is present.'); + END IF; + + IF p_enqu.existing_logger = 'YES' + AND p_enqu.enty_code IN ('EXCHANGE', 'STD EXCHANGE') THEN + p_manual_or_automatic_quote := gc_manual_quote; + add_quote_reason(p_enqu.id + ,'Logger is present.'); + END IF; + + IF p_enqu.enty_code IN ('OFMAT') + AND NOT (p_enqu.existing_mety_code = 'DIAPHRAGM') + AND (substr(nvl(p_enqu.required_mesc_code + ,get_u_meter_size(p_enqu.qmax)) + ,1) <> 'U') THEN + p_manual_or_automatic_quote := gc_manual_quote; + add_quote_reason(p_enqu.id + ,'OFMAT request for a non-''U''-sized Diaphragm meter.'); + END IF; + -- check postcode IF NOT mip_regions.valid_postcode_format(p_enqu.install_postcode) THEN p_manual_or_automatic_quote := gc_manual_quote; @@ -890,10 +956,10 @@ CREATE OR REPLACE PACKAGE BODY mip_quotation IS RETURN l_rec_costs; END get_laco; - PROCEDURE produce_inst_exch_quotes(p_enqu IN t_enqu - ,p_rfq_prty_id IN parties.id%TYPE - ,p_owner_prty_id IN parties.id%TYPE DEFAULT NULL - ,p_manual_or_automatic_quote IN OUT t_manual_or_automatic_quote) IS + PROCEDURE produce_module_quotes(p_enqu IN t_enqu + ,p_rfq_prty_id IN parties.id%TYPE + ,p_owner_prty_id IN parties.id%TYPE DEFAULT NULL + ,p_manual_or_automatic_quote IN OUT t_manual_or_automatic_quote) IS l_produced_automatic_quote BOOLEAN; l_this_is_automatic_quote BOOLEAN; l_regi_code regions.code%TYPE := mip_regions.get_region_for_postcode(p_enqu.install_postcode); @@ -901,13 +967,13 @@ CREATE OR REPLACE PACKAGE BODY mip_quotation IS l_additional_costs t_rec_additional_costs; l_quote_document VARCHAR2(240); BEGIN - cout_assert.istrue(p_enqu.enty_code IN - ('INSTALL', 'STD INSTALL', 'EXCHANGE') + cout_assert.istrue(p_enqu.enty_code IN ('INSTALL', 'STD INSTALL', + 'EXCHANGE', 'CAPACITY CHANGE') ,'Attempted to produce an install or exchange quote for enquiry of type ' || p_enqu.enty_code); cout_assert.isnotnull(l_regi_code - ,'Attempted to produce an install or exchange quote for enquiry for a installation postcode (' || + ,'Attempted to produce an install, exchange or change of capacity quote for enquiry for a installation postcode (' || p_enqu.install_postcode || ') without a region.'); IF p_enqu.enty_code IN ('INSTALL', 'STD INSTALL') THEN @@ -927,7 +993,18 @@ CREATE OR REPLACE PACKAGE BODY mip_quotation IS p_enqu.required_metering_pressure || '.' || 'Existing meter was a ' || p_enqu.existing_mesc_code || ' ' || - p_enqu.mety_code + p_enqu.existing_mety_code + ,p_internal_or_external => gc_internal_reason); + ELSIF p_enqu.enty_code IN ('CHANGE CAPACITY') THEN + add_quote_reason(p_enqu.id + ,p_reason => 'Attempting an automatic change capacity quote for ' || + p_enqu.id || '.' || ' Required SVCP ' || + p_enqu.required_svcp_code || ', QMAX=' || + p_enqu.qmax || ', Outlet Pressure=' || + p_enqu.required_metering_pressure || '.' || + 'Existing meter was a ' || + p_enqu.existing_mesc_code || ' ' || + p_enqu.existing_mety_code ,p_internal_or_external => gc_internal_reason); END IF; @@ -1431,7 +1508,7 @@ CREATE OR REPLACE PACKAGE BODY mip_quotation IS add_quote_reason(p_enqu_id => p_enqu.id ,p_reason => '-- Produced an automatic quote.' ,p_internal_or_external => gc_internal_reason); --- email_aq_generated(p_enqu.id); + -- email_aq_generated(p_enqu.id); ELSE p_manual_or_automatic_quote := gc_manual_quote; add_quote_reason(p_enqu_id => p_enqu.id @@ -1440,7 +1517,7 @@ CREATE OR REPLACE PACKAGE BODY mip_quotation IS END IF; - END produce_inst_exch_quotes; + END produce_module_quotes; /*PROCEDURE produce_install_quotes(p_enqu IN t_enqu ,p_rfq_prty_id IN parties.id%TYPE @@ -1993,10 +2070,10 @@ CREATE OR REPLACE PACKAGE BODY mip_quotation IS ,'Attempted to produce an installation quote for enquiry for a installation postcode (' || p_enqu.install_postcode || ') without a region.'); - produce_inst_exch_quotes(p_enqu => p_enqu - ,p_rfq_prty_id => p_rfq_prty_id - ,p_owner_prty_id => p_owner_prty_id - ,p_manual_or_automatic_quote => p_manual_or_automatic_quote); + produce_module_quotes(p_enqu => p_enqu + ,p_rfq_prty_id => p_rfq_prty_id + ,p_owner_prty_id => p_owner_prty_id + ,p_manual_or_automatic_quote => p_manual_or_automatic_quote); END produce_install_quotes; @@ -2014,133 +2091,168 @@ CREATE OR REPLACE PACKAGE BODY mip_quotation IS ,'Attempted to produce an exchange quote for enquiry for a installation postcode (' || p_enqu.install_postcode || ') without a region.'); - produce_inst_exch_quotes(p_enqu => p_enqu - ,p_rfq_prty_id => p_rfq_prty_id - ,p_owner_prty_id => p_owner_prty_id - ,p_manual_or_automatic_quote => p_manual_or_automatic_quote); + produce_module_quotes(p_enqu => p_enqu + ,p_rfq_prty_id => p_rfq_prty_id + ,p_owner_prty_id => p_owner_prty_id + ,p_manual_or_automatic_quote => p_manual_or_automatic_quote); END produce_exchange_quotes; + PROCEDURE produce_change_capacity_quotes(p_enqu IN t_enqu + ,p_rfq_prty_id IN parties.id%TYPE + ,p_owner_prty_id IN parties.id%TYPE DEFAULT NULL + ,p_manual_or_automatic_quote IN OUT t_manual_or_automatic_quote) IS + l_regi_code regions.code%TYPE := mip_regions.get_region_for_postcode(p_enqu.install_postcode); + BEGIN + cout_assert.istrue(p_enqu.enty_code IN ('CHANGE CAPACITY') + ,'Attempted to produce a change capacity quote for enquiry of type ' || + p_enqu.enty_code); + + cout_assert.isnotnull(l_regi_code + ,'Attempted to produce a change capacity quote for enquiry for a installation postcode (' || + p_enqu.install_postcode || ') without a region.'); + + produce_module_quotes(p_enqu => p_enqu + ,p_rfq_prty_id => p_rfq_prty_id + ,p_owner_prty_id => p_owner_prty_id + ,p_manual_or_automatic_quote => p_manual_or_automatic_quote); + + END produce_change_capacity_quotes; + + PROCEDURE produce_labour_only_quotes(p_enqu IN t_enqu + ,p_rfq_prty_id IN parties.id%TYPE + ,p_owner_prty_id IN parties.id%TYPE DEFAULT NULL + ,p_manual_or_automatic_quote IN OUT t_manual_or_automatic_quote) IS + l_produced_automatic_quote BOOLEAN; + l_this_is_automatic_quote BOOLEAN; + l_regi_code regions.code%TYPE := mip_regions.get_region_for_postcode(p_enqu.install_postcode); + l_qute_id quotes.id%TYPE; + l_additional_costs t_rec_additional_costs; + l_quote_document VARCHAR2(240); + BEGIN + cout_assert.istrue(p_enqu.enty_code IN + ('REMOVE', 'STD REMOVE', 'ADVERSARIAL', 'OFMAT', + 'ALTERATION') + ,'Attempted to produce a labour-only quote for enquiry of type ' || + p_enqu.enty_code); + + cout_assert.isnotnull(l_regi_code + ,'Attempted to produce quote for enquiry for a installation postcode (' || + p_enqu.install_postcode || ') without a region.'); + add_quote_reason(p_enqu.id + ,p_reason => 'Attempting an automatic labour quote for ' || + p_enqu.id || '.' || 'Enquiry Code=' || + p_enqu.enty_code || ', SVCP ' || + p_enqu.required_svcp_code || + ', Meter Type Code=' || + p_enqu.existing_mety_code || + ', Meter Size Code=' || + p_enqu.existing_mesc_code || '.' + ,p_internal_or_external => gc_internal_reason); + + l_this_is_automatic_quote := TRUE; + + l_additional_costs := get_laco(p_enty_code => p_enqu.enty_code + ,p_regi_code => l_regi_code + ,p_mety_code => p_enqu.existing_mety_code + ,p_mesc_code => p_enqu.existing_mesc_code + ,p_svcp_code => p_enqu.required_svcp_code); + IF l_additional_costs.selling_price IS NULL THEN + l_this_is_automatic_quote := FALSE; + add_quote_reason(p_enqu.id + ,p_reason => 'Unable to find Labour Cost (selling price) for this Enquiry Type Code: ' || + p_enqu.enty_code || ', Meter Type Code:' || + p_enqu.existing_mety_code || + ', Meter Size Code:' || + p_enqu.existing_mesc_code || + ', Service Pressure Code:' || + p_enqu.required_svcp_code || CASE + l_regi_code WHEN NULL THEN '' ELSE ' for region code ' || l_regi_code END || '.' + + ,p_internal_or_external => gc_internal_reason); + END IF; + + IF l_this_is_automatic_quote THEN + l_produced_automatic_quote := TRUE; + + add_quote_reason(p_enqu_id => p_enqu.id + ,p_reason => 'Producing an automatic quote.' + ,p_internal_or_external => gc_internal_reason); + + l_qute_id := start_quote(p_enqu_id => p_enqu.id + ,p_manual_or_automatic => gc_automatic_quote + ,p_rfq_prty_id => p_rfq_prty_id + ,p_owner_prty_id => p_owner_prty_id); + + INSERT INTO quote_items + (id + ,qute_id + ,enty_code + ,svcpt_code + ,mesc_code + ,mety_code + ,cost_price + ,selling_price + ,delivery_price + ,quit_type) + VALUES + (quit_seq.NEXTVAL + ,l_qute_id + ,p_enqu.enty_code + ,l_additional_costs.svcpt_code + ,p_enqu.existing_mesc_code + ,p_enqu.existing_mety_code + ,l_additional_costs.cost_price + ,l_additional_costs.selling_price + ,l_additional_costs.delivery_cost + ,'LQI'); + + -- Generate the quote PDF + l_quote_document := mip_quotation_document.generate_quote_pdf(p_quote_id => l_qute_id); + add_quote_reason(p_enqu_id => p_enqu.id + ,p_reason => 'Produced Quote Document ' || + l_quote_document || '.' + ,p_internal_or_external => gc_internal_reason); + + make_quote_available(l_qute_id); + + END IF; -- automatic quote + + IF l_produced_automatic_quote THEN + p_manual_or_automatic_quote := gc_automatic_quote; + add_quote_reason(p_enqu_id => p_enqu.id + ,p_reason => '-- Produced an automatic quote.' + ,p_internal_or_external => gc_internal_reason); + email_aq_generated(p_enqu.id); + ELSE + p_manual_or_automatic_quote := gc_manual_quote; + add_quote_reason(p_enqu_id => p_enqu.id + ,p_reason => '-- Automatic quote failed - Manual quote required.' + ,p_internal_or_external => gc_internal_reason); + + END IF; + + END produce_labour_only_quotes; + PROCEDURE produce_removal_quotes(p_enqu IN t_enqu ,p_rfq_prty_id IN parties.id%TYPE ,p_owner_prty_id IN parties.id%TYPE DEFAULT NULL ,p_manual_or_automatic_quote IN OUT t_manual_or_automatic_quote) IS - l_produced_automatic_quote BOOLEAN; - l_this_is_automatic_quote BOOLEAN; - l_regi_code regions.code%TYPE := mip_regions.get_region_for_postcode(p_enqu.install_postcode); - l_qute_id quotes.id%TYPE; - l_additional_costs t_rec_additional_costs; - l_quote_document VARCHAR2(240); BEGIN - cout_assert.istrue(p_enqu.enty_code IN ('REMOVE', 'STD REMOVE') + cout_assert.istrue(p_enqu.enty_code IN + ('REMOVE', 'STD REMOVE', 'ADVERSARIAL') ,'Attempted to produce a removal quote for enquiry of type ' || p_enqu.enty_code); - - cout_assert.isnotnull(l_regi_code - ,'Attempted to produce an removal quote for enquiry for a installation postcode (' || - p_enqu.install_postcode || ') without a region.'); - add_quote_reason(p_enqu.id - ,p_reason => 'Attempting an automatic removal quote for ' || - p_enqu.id || '.' || ' Required SVCP ' || - p_enqu.required_svcp_code || - ', Meter Type Code=' || p_enqu.mety_code || - ', Meter Size Code=' || - p_enqu.existing_mesc_code || '.' - ,p_internal_or_external => gc_internal_reason); - - l_this_is_automatic_quote := TRUE; - - l_additional_costs := get_laco(p_enty_code => p_enqu.enty_code - ,p_regi_code => l_regi_code - ,p_mety_code => p_enqu.mety_code - ,p_mesc_code => p_enqu.existing_mesc_code - ,p_svcp_code => p_enqu.required_svcp_code); - IF l_additional_costs.selling_price IS NULL THEN - l_this_is_automatic_quote := FALSE; - add_quote_reason(p_enqu.id - ,p_reason => 'Unable to find Labour Cost (selling price) for this Enquiry Type Code: ' || - p_enqu.enty_code || ', Meter Type Code:' || - p_enqu.mety_code || ', Meter Size Code:' || - p_enqu.existing_mesc_code || - ', Service Pressure Code:' || - p_enqu.required_svcp_code || CASE - l_regi_code WHEN NULL THEN '' ELSE ' for region code ' || l_regi_code END || '.' - - ,p_internal_or_external => gc_internal_reason); - END IF; - - IF l_this_is_automatic_quote THEN - l_produced_automatic_quote := TRUE; - - add_quote_reason(p_enqu_id => p_enqu.id - ,p_reason => 'Producing an automatic quote.' - ,p_internal_or_external => gc_internal_reason); - - l_qute_id := start_quote(p_enqu_id => p_enqu.id - ,p_manual_or_automatic => gc_automatic_quote - ,p_rfq_prty_id => p_rfq_prty_id - ,p_owner_prty_id => p_owner_prty_id); - - INSERT INTO quote_items - (id - ,qute_id - ,enty_code - ,svcpt_code - ,mesc_code - ,mety_code - ,cost_price - ,selling_price - ,delivery_price - ,quit_type) - VALUES - (quit_seq.NEXTVAL - ,l_qute_id - ,p_enqu.enty_code - ,l_additional_costs.svcpt_code - ,p_enqu.existing_mesc_code - ,p_enqu.mety_code - ,l_additional_costs.cost_price - ,l_additional_costs.selling_price - ,l_additional_costs.delivery_cost - ,'LQI'); - - -- Generate the quote PDF - /*BEGIN*/ - l_quote_document := mip_quotation_document.generate_quote_pdf(p_quote_id => l_qute_id); - /* EXCEPTION - WHEN OTHERS THEN - cout_err.report_and_stop; - END; - */ - add_quote_reason(p_enqu_id => p_enqu.id - ,p_reason => 'Produced Quote Document ' || - l_quote_document || '.' - ,p_internal_or_external => gc_internal_reason); - - make_quote_available(l_qute_id); - - END IF; -- automatic quote - - IF l_produced_automatic_quote THEN - p_manual_or_automatic_quote := gc_automatic_quote; - add_quote_reason(p_enqu_id => p_enqu.id - ,p_reason => '-- Produced an automatic quote.' - ,p_internal_or_external => gc_internal_reason); - email_aq_generated(p_enqu.id); - ELSE - p_manual_or_automatic_quote := gc_manual_quote; - add_quote_reason(p_enqu_id => p_enqu.id - ,p_reason => '-- Automatic quote failed - Manual quote required.' - ,p_internal_or_external => gc_internal_reason); - - END IF; - + produce_labour_only_quotes(p_enqu => p_enqu + ,p_rfq_prty_id => p_rfq_prty_id + ,p_owner_prty_id => p_owner_prty_id + ,p_manual_or_automatic_quote => p_manual_or_automatic_quote); END produce_removal_quotes; - PROCEDURE produce_gash_quotes(p_enqu IN t_enqu - ,p_rfq_prty_id IN parties.id%TYPE - ,p_owner_prty_id IN parties.id%TYPE DEFAULT NULL - ,p_manual_or_automatic_quote IN OUT t_manual_or_automatic_quote) IS + PROCEDURE produce_ofmat_quotes(p_enqu IN t_enqu + ,p_rfq_prty_id IN parties.id%TYPE + ,p_owner_prty_id IN parties.id%TYPE DEFAULT NULL + ,p_manual_or_automatic_quote IN OUT t_manual_or_automatic_quote) IS l_produced_automatic_quote BOOLEAN; l_this_is_automatic_quote BOOLEAN; l_regi_code regions.code%TYPE := mip_regions.get_region_for_postcode(p_enqu.install_postcode); @@ -2148,46 +2260,141 @@ CREATE OR REPLACE PACKAGE BODY mip_quotation IS l_additional_costs t_rec_additional_costs; l_quote_document VARCHAR2(240); BEGIN - cout_assert.istrue(p_enqu.enty_code IN ('REMOVE', 'STD REMOVE') - ,'Attempted to produce a removal quote for enquiry of type ' || + cout_assert.istrue(p_enqu.enty_code IN ('OFMAT') + ,'Attempted to produce an OFMAT quote for enquiry of type ' || + p_enqu.enty_code); + + produce_labour_only_quotes(p_enqu => p_enqu + ,p_rfq_prty_id => p_rfq_prty_id + ,p_owner_prty_id => p_owner_prty_id + ,p_manual_or_automatic_quote => p_manual_or_automatic_quote); + + END produce_ofmat_quotes; + + PROCEDURE produce_alteration_quotes(p_enqu IN t_enqu + ,p_rfq_prty_id IN parties.id%TYPE + ,p_owner_prty_id IN parties.id%TYPE DEFAULT NULL + ,p_manual_or_automatic_quote IN OUT t_manual_or_automatic_quote) IS + l_produced_automatic_quote BOOLEAN; + l_this_is_automatic_quote BOOLEAN; + l_regi_code regions.code%TYPE := mip_regions.get_region_for_postcode(p_enqu.install_postcode); + l_qute_id quotes.id%TYPE; + l_additional_costs t_rec_additional_costs; + l_quote_document VARCHAR2(240); + BEGIN + cout_assert.istrue(p_enqu.enty_code IN ('ALTERATION') + ,'Attempted to produce an ALTERATION quote for enquiry of type ' || + p_enqu.enty_code); + + produce_labour_only_quotes(p_enqu => p_enqu + ,p_rfq_prty_id => p_rfq_prty_id + ,p_owner_prty_id => p_owner_prty_id + ,p_manual_or_automatic_quote => p_manual_or_automatic_quote); + + END produce_alteration_quotes; + + PROCEDURE produce_addon_quotes(p_enqu IN t_enqu + ,p_rfq_prty_id IN parties.id%TYPE + ,p_owner_prty_id IN parties.id%TYPE DEFAULT NULL + ,p_manual_or_automatic_quote IN OUT t_manual_or_automatic_quote) IS + l_produced_automatic_quote BOOLEAN; + l_this_is_automatic_quote BOOLEAN; + l_regi_code regions.code%TYPE := mip_regions.get_region_for_postcode(p_enqu.install_postcode); + l_qute_id quotes.id%TYPE; + l_lifting_gear_costs t_rec_additional_costs; + l_amr_costs t_rec_additional_costs; + l_ems_costs t_rec_additional_costs; + l_bypass_costs t_rec_additional_costs; + l_quote_document VARCHAR2(240); + BEGIN + cout_assert.istrue(p_enqu.enty_code IN ('ADDON') + ,'Attempted to produce an ADDON quote for enquiry of type ' || p_enqu.enty_code); cout_assert.isnotnull(l_regi_code - ,'Attempted to produce an removal quote for enquiry for a installation postcode (' || + ,'Attempted to produce a quote for enquiry for a installation postcode (' || p_enqu.install_postcode || ') without a region.'); + add_quote_reason(p_enqu.id - ,p_reason => 'Attempting an automatic removal quote for ' || - p_enqu.id || '.' || ' Required SVCP ' || - p_enqu.required_svcp_code || - ', Meter Type Code=' || p_enqu.mety_code || - ', Meter Size Code=' || - p_enqu.existing_mesc_code || '.' + ,p_reason => 'Attempting an automatic addon quote for ' || + p_enqu.id || '.' || CASE + p_enqu.amr_required WHEN 'YES' THEN 'AMR is required. ' END || CASE p_enqu.ems_required WHEN 'YES' THEN 'EMS is required. ' END || CASE p_enqu.bypass_required WHEN 'YES' THEN 'Bypass is required. ' END ,p_internal_or_external => gc_internal_reason); l_this_is_automatic_quote := TRUE; - l_additional_costs := get_laco(p_enty_code => p_enqu.enty_code - ,p_regi_code => l_regi_code - ,p_mety_code => p_enqu.mety_code - ,p_mesc_code => p_enqu.existing_mesc_code - ,p_svcp_code => p_enqu.required_svcp_code); - IF l_additional_costs.selling_price IS NULL THEN + -- + -- check whether we have the required prices + -- if we do not, then we may need to produce a manual quote + -- + IF p_enqu.amr_required = 'YES' THEN + l_amr_costs := get_aico(p_adit_code => 'AMR' + ,p_regi_code => l_regi_code); + IF l_amr_costs.selling_price IS NULL THEN + l_this_is_automatic_quote := FALSE; + add_quote_reason(p_enqu.id + ,p_reason => 'Unable to find selling price for AMR.' + ,p_internal_or_external => gc_internal_reason); + END IF; + IF l_amr_costs.lead_time IS NULL THEN + l_this_is_automatic_quote := FALSE; + add_quote_reason(p_enqu.id + ,p_reason => 'Unable to find lead time for AMR.' + ,p_internal_or_external => gc_internal_reason); + END IF; + END IF; + IF p_enqu.ems_required = 'YES' THEN + l_ems_costs := get_aico(p_adit_code => 'EMS' + ,p_regi_code => l_regi_code); + IF l_ems_costs.selling_price IS NULL THEN + l_this_is_automatic_quote := FALSE; + add_quote_reason(p_enqu.id + ,p_reason => 'Unable to find selling price for EMS.' + ,p_internal_or_external => gc_internal_reason); + END IF; + IF l_ems_costs.lead_time IS NULL THEN + l_this_is_automatic_quote := FALSE; + add_quote_reason(p_enqu.id + ,p_reason => 'Unable to find lead time for EMS.' + ,p_internal_or_external => gc_internal_reason); + END IF; + END IF; + IF p_enqu.bypass_required = 'YES' THEN + l_bypass_costs := get_aico(p_adit_code => 'BYPASS' + ,p_regi_code => l_regi_code); + IF l_bypass_costs.selling_price IS NULL THEN + l_this_is_automatic_quote := FALSE; + add_quote_reason(p_enqu.id + ,p_reason => 'Unable to find selling price for BYPASS.' + ,p_internal_or_external => gc_internal_reason); + END IF; + IF l_bypass_costs.lead_time IS NULL THEN + l_this_is_automatic_quote := FALSE; + add_quote_reason(p_enqu.id + ,p_reason => 'Unable to find lead time for BYPASS.' + ,p_internal_or_external => gc_internal_reason); + END IF; + + END IF; + /* Always get costs for LIFTING GEAR */ + + l_lifting_gear_costs := get_aico(p_adit_code => 'LIFTING GEAR' + ,p_regi_code => l_regi_code); + IF l_lifting_gear_costs.selling_price IS NULL THEN l_this_is_automatic_quote := FALSE; add_quote_reason(p_enqu.id - ,p_reason => 'Unable to find Labour Cost (selling price) for this Enquiry Type Code: ' || - p_enqu.enty_code || ', Meter Type Code:' || - p_enqu.mety_code || ', Meter Size Code:' || - p_enqu.existing_mesc_code || - ', Service Pressure Code:' || - p_enqu.required_svcp_code || CASE - l_regi_code WHEN NULL THEN '' ELSE ' for region code ' || l_regi_code END || '.' - + ,p_reason => 'Unable to find selling price for LIFTING GEAR.' + ,p_internal_or_external => gc_internal_reason); + END IF; + IF l_lifting_gear_costs.lead_time IS NULL THEN + l_this_is_automatic_quote := FALSE; + add_quote_reason(p_enqu.id + ,p_reason => 'Unable to find lead time for LIFTING GEAR.' ,p_internal_or_external => gc_internal_reason); END IF; IF l_this_is_automatic_quote THEN l_produced_automatic_quote := TRUE; - add_quote_reason(p_enqu_id => p_enqu.id ,p_reason => 'Producing an automatic quote.' ,p_internal_or_external => gc_internal_reason); @@ -2197,28 +2404,87 @@ CREATE OR REPLACE PACKAGE BODY mip_quotation IS ,p_rfq_prty_id => p_rfq_prty_id ,p_owner_prty_id => p_owner_prty_id); + IF p_enqu.amr_required = 'YES' THEN + INSERT INTO quote_items + (id + ,qute_id + ,bas_code + ,cost_price + ,selling_price + ,delivery_price + ,quit_type) + VALUES + (quit_seq.NEXTVAL + ,l_qute_id + ,l_amr_costs.adit_code + ,l_amr_costs.cost_price + ,l_amr_costs.selling_price + ,l_amr_costs.delivery_cost + ,'AQI'); + END IF; + + IF p_enqu.ems_required = 'YES' THEN + INSERT INTO quote_items + (id + ,qute_id + ,adit_code + ,cost_price + ,selling_price + ,delivery_price + ,lead_time + ,quit_type) + VALUES + (quit_seq.NEXTVAL + ,l_qute_id + ,l_ems_costs.adit_code + ,l_ems_costs.cost_price + ,l_ems_costs.selling_price + ,l_ems_costs.delivery_cost + ,l_ems_costs.lead_time + ,'AQI'); + END IF; + + IF p_enqu.bypass_required = 'YES' THEN + INSERT INTO quote_items + (id + ,qute_id + ,adit_code + ,cost_price + ,selling_price + ,delivery_price + ,lead_time + ,quit_type) + VALUES + (quit_seq.NEXTVAL + ,l_qute_id + ,l_ems_costs.adit_code + ,l_ems_costs.cost_price + ,l_ems_costs.selling_price + ,l_ems_costs.delivery_cost + ,l_ems_costs.lead_time + ,'AQI'); + END IF; + + /* Always include LIFTING GEAR */ + INSERT INTO quote_items (id ,qute_id - ,enty_code - ,svcpt_code - ,mesc_code - ,mety_code + ,adit_code ,cost_price ,selling_price ,delivery_price + ,lead_time ,quit_type) VALUES (quit_seq.NEXTVAL ,l_qute_id - ,p_enqu.enty_code - ,l_additional_costs.svcpt_code - ,p_enqu.existing_mesc_code - ,p_enqu.mety_code - ,l_additional_costs.cost_price - ,l_additional_costs.selling_price - ,l_additional_costs.delivery_cost - ,'LQI'); + ,l_lifting_gear_costs.adit_code + ,l_lifting_gear_costs.cost_price + ,l_lifting_gear_costs.selling_price + ,l_lifting_gear_costs.delivery_cost + ,l_lifting_gear_costs.lead_time + ,'AQI'); -- Generate the quote PDF /*BEGIN*/ @@ -2242,7 +2508,7 @@ CREATE OR REPLACE PACKAGE BODY mip_quotation IS add_quote_reason(p_enqu_id => p_enqu.id ,p_reason => '-- Produced an automatic quote.' ,p_internal_or_external => gc_internal_reason); - email_aq_generated(p_enqu.id); + -- email_aq_generated(p_enqu.id); ELSE p_manual_or_automatic_quote := gc_manual_quote; add_quote_reason(p_enqu_id => p_enqu.id @@ -2251,7 +2517,7 @@ CREATE OR REPLACE PACKAGE BODY mip_quotation IS END IF; - END produce_gash_quotes; + END produce_addon_quotes; PROCEDURE produce_automatic_quotes(p_enqu IN t_enqu ,p_rfq_prty_id IN parties.id%TYPE @@ -2266,16 +2532,26 @@ CREATE OR REPLACE PACKAGE BODY mip_quotation IS ,p_rfq_prty_id => p_rfq_prty_id ,p_owner_prty_id => p_owner_prty_id ,p_manual_or_automatic_quote => p_manual_or_automatic_quote); - ELSIF p_enqu.enty_code IN ('EXCHANGE') THEN + ELSIF p_enqu.enty_code IN ('EXCHANGE', 'STD EXCHANGE') THEN produce_exchange_quotes(p_enqu => p_enqu - ,p_rfq_prty_id => p_rfq_prty_id - ,p_owner_prty_id => p_owner_prty_id - ,p_manual_or_automatic_quote => p_manual_or_automatic_quote); - ELSIF p_enqu.enty_code IN ('REMOVE', 'STD REMOVE') THEN + ,p_rfq_prty_id => p_rfq_prty_id + ,p_owner_prty_id => p_owner_prty_id + ,p_manual_or_automatic_quote => p_manual_or_automatic_quote); + ELSIF p_enqu.enty_code IN ('REMOVE', 'STD REMOVE', 'ADVERSARIAL') THEN produce_removal_quotes(p_enqu => p_enqu ,p_rfq_prty_id => p_rfq_prty_id ,p_owner_prty_id => p_owner_prty_id ,p_manual_or_automatic_quote => p_manual_or_automatic_quote); + ELSIF p_enqu.enty_code IN ('OFMAT') THEN + produce_ofmat_quotes(p_enqu => p_enqu + ,p_rfq_prty_id => p_rfq_prty_id + ,p_owner_prty_id => p_owner_prty_id + ,p_manual_or_automatic_quote => p_manual_or_automatic_quote); + ELSIF p_enqu.enty_code IN ('ALTERATION') THEN + produce_alteration_quotes(p_enqu => p_enqu + ,p_rfq_prty_id => p_rfq_prty_id + ,p_owner_prty_id => p_owner_prty_id + ,p_manual_or_automatic_quote => p_manual_or_automatic_quote); ELSE cout_err.report_and_stop(p_exception_message => 'Attempted to produce automatic quote for unexpected enquiry type of ' || p_enqu.enty_code); diff --git a/Schema/mipExtTables.sql b/Schema/mipExtTables.sql index ab38d69..bed1c73 100644 --- a/Schema/mipExtTables.sql +++ b/Schema/mipExtTables.sql @@ -5,6 +5,7 @@ @@ext_cost.pdc @@ext_caveat.pdc @@ext_postcode.pdc +@@ext_dataitem_role.pdc -- error logs used when merging data from the external tables to their final destinations exec dbms_errlog.create_error_log(dml_table_name => 'meters')