From e80c00df53e8a1fab4801cda74258123961f3153 Mon Sep 17 00:00:00 2001 From: PriestJ Date: Fri, 21 Dec 2007 18:29:30 +0000 Subject: [PATCH] now gathers all information for the quotation, but have not tested this. Currently has a collection error on one of my varray types. git-svn-id: http://locode01.ad.dom/svn/WEBMIP/trunk@3062 248e525c-4dfb-0310-94bc-949c084e9493 --- Modules/mip_quotation_document.pck | 360 +++++++++++++++-------------- 1 file changed, 191 insertions(+), 169 deletions(-) diff --git a/Modules/mip_quotation_document.pck b/Modules/mip_quotation_document.pck index 7515dde..b2f0f04 100644 --- a/Modules/mip_quotation_document.pck +++ b/Modules/mip_quotation_document.pck @@ -44,6 +44,7 @@ CREATE OR REPLACE PACKAGE mip_quotation_document IS house_dimensions dimensions, house_diagram number, module_dimensions dimensions, + module_reference varchar2(80), module_diagram number, requested_qmax number, module_qmax number, @@ -67,21 +68,66 @@ CREATE OR REPLACE PACKAGE mip_quotation_document IS -- Public function and procedure declarations -- function ( ) return ; - function get_module_row(p_id number) return modules%ROWTYPE; - function get_max_lead_time(p_id number) return number; + function get_mam(p_region_code varchar2) return varchar2; + function get_module_row(p_code number) return modules%ROWTYPE; + function get_max_lead_time(p_quoteid number) return number; FUNCTION determine_caveats(p_enquiryid in number) RETURN BOOLEAN; procedure set_quote_items_data (p_quote_data in out quote_data, p_quoteid number, p_enqu_row enquiries%ROWTYPE); - - FUNCTION determine_caveats(p_enquiry in number) RETURN BOOLEAN; - FUNCTION get_detailed_quote_data(data_for_quote in number) RETURN BOOLEAN; + FUNCTION get_detailed_quote_data(p_quoteid in number) RETURN quote_data; FUNCTION generate_detailed_quote_pdf(get_detailed_quote_data in number) RETURN BOOLEAN; - FUNCTION build_detailed_quote(p_enquiry_id in number) RETURN BOOLEAN; - - PROCEDURE produce_quotes(p_id IN enquiries.id%TYPE); + FUNCTION build_detailed_quote(p_enquiryid in number) RETURN BOOLEAN; END mip_quotation_document; / CREATE OR REPLACE PACKAGE BODY mip_quotation_document IS - function get_module_row(p_id number) return modules%ROWTYPE is + /* + FUNCTION get_mam + --The get_mam function returns a meter asset manager description for the supplied region code. + %param p_region_code - the code of the region you want to get the mam description of. + %return varchar(80)description of the supplied regions code mam + */ + function get_mam(p_region_code varchar2) return varchar2 is + l_mam_desc varchar2(80); + CURSOR c_get_mam(cp_region_code varchar2) IS + SELECT description + FROM regions + WHERE code = cp_region_code; + begin + IF NOT c_get_mam%ISOPEN THEN + OPEN c_get_mam(p_region_code); + END IF; + FETCH c_get_mam + INTO l_mam_desc; + CLOSE c_get_mam; + return l_mam_desc; + end get_mam; + /* + FUNCTION get_meter_row + --The get_meter_row function returns a meter record for the supplied meter code. + %param p_code - the code of the meter you want to get a record of. + %return meters row of the supplied meter code + */ + function get_meter_row(p_code varchar2) return meters%ROWTYPE is + l_meter_row meters%ROWTYPE; + CURSOR c_get_meter(cp_meter_code varchar2) IS + SELECT * + FROM meters + WHERE code = cp_meter_code; + begin + IF NOT c_get_meter%ISOPEN THEN + OPEN c_get_meter(p_code); + END IF; + FETCH c_get_meter + INTO l_meter_row; + CLOSE c_get_meter; + return l_meter_row; + end get_meter_row; + /* + FUNCTION get_module_row + --The get_module_row function returns a module record for the supplied module code. + %param p_code - the code of the module you want to get a record of. + %return modules row of the supplied module code + */ + function get_module_row(p_code number) return modules%ROWTYPE is l_module_row modules%ROWTYPE; CURSOR c_get_module(cp_module_code varchar2) IS SELECT * @@ -89,14 +135,19 @@ CREATE OR REPLACE PACKAGE BODY mip_quotation_document IS WHERE code = cp_module_code; begin IF NOT c_get_module%ISOPEN THEN - OPEN c_get_module(p_id); + OPEN c_get_module(p_code); END IF; FETCH c_get_module INTO l_module_row; CLOSE c_get_module; return l_module_row; end get_module_row; - + /* + FUNCTION get_housing_row + --The get_housing_row function returns a housing record for the supplied housing code. + %param p_code - the code of the housing you want to get a record of. + %return housings row of the supplied housing code + */ function get_housing_row(p_code varchar2) return housings%ROWTYPE is l_housing_row housings%ROWTYPE; CURSOR c_get_housing(cp_housing_code varchar2) IS @@ -112,7 +163,12 @@ CREATE OR REPLACE PACKAGE BODY mip_quotation_document IS CLOSE c_get_housing; return l_housing_row; end get_housing_row; - + /* + FUNCTION get_base_row + --The get_base_row function returns a base record for the supplied base code. + %param p_code - the code of the base you want to get a record of. + %return bases row of the supplied base code + */ function get_base_row(p_code varchar2) return bases%ROWTYPE is l_base_row bases%ROWTYPE; CURSOR c_get_base(cp_base_code varchar2) IS @@ -128,8 +184,13 @@ CREATE OR REPLACE PACKAGE BODY mip_quotation_document IS CLOSE c_get_base; return l_base_row; end get_base_row; - - + /* + FUNCTION get_additional_item + --The get_additional_item function returns an additional_item record for the supplied additional + --item code. + %param p_code - the code of the additional item you want to get a record of. + %return additional_items row of the supplied item code + */ function get_additional_item(p_code varchar2) return additional_items%ROWTYPE is --Additional Items l_add_item_row additional_items%ROWTYPE; @@ -148,9 +209,15 @@ CREATE OR REPLACE PACKAGE BODY mip_quotation_document IS CLOSE c_get_add_item; return l_add_item_row; end get_additional_item; - - - function get_max_lead_time(p_id number) return number is + /* + FUNCTION get_max_lead_time + --The get_max lead_time function returns the contracted lead time for the provided quotation. + --It takes the largest lead time of all the quotation items (modules, addons, housings bases) + --hence the max bit + %param p_quoteid - the id of the quote you want to get the lead time. + %return number the maximum contacted lead time for the supplied quotation + */ + function get_max_lead_time(p_quoteid number) return number is l_quote_item_maxlt number; CURSOR c_get_max_lead_time (cp_id number) is SELECT MAX(lead_time) @@ -158,15 +225,20 @@ CREATE OR REPLACE PACKAGE BODY mip_quotation_document IS WHERE qute_id = cp_id; begin IF NOT c_get_max_lead_time%ISOPEN THEN - OPEN c_get_max_lead_time(p_id); + OPEN c_get_max_lead_time(p_quoteid); END IF; FETCH c_get_max_lead_time INTO l_quote_item_maxlt; CLOSE c_get_max_lead_time; return l_quote_item_maxlt; end get_max_lead_time; - - function get_total_cost(p_id number) return number is + /* + FUNCTION get_total_cost + --The get_total_cost function returns the total cost for a quotation (excluding lifting gear) + %param p_quoteid - the id of the quote you want to get the total cost for. + %return number the total cost + */ + function get_total_cost(p_quoteid number) return number is l_quote_total_cost number; CURSOR c_get_total_cost (cp_id number) is SELECT SUM(selling_price + delivery_price) @@ -174,7 +246,7 @@ CREATE OR REPLACE PACKAGE BODY mip_quotation_document IS WHERE qute_id = cp_id; begin IF NOT c_get_total_cost%ISOPEN THEN - OPEN c_get_total_cost(p_id); + OPEN c_get_total_cost(p_quoteid); END IF; FETCH c_get_total_cost INTO l_quote_total_cost; @@ -182,141 +254,6 @@ CREATE OR REPLACE PACKAGE BODY mip_quotation_document IS return l_quote_total_cost; end get_total_cost; - function get_quote_costs(p_id number) return costs is - CURSOR c_get_quote_costs(cp_id number) is - SELECT * - FROM quote_items - WHERE qute_id = cp_id; - l_costs costs; - l_counter number; - l_add_item_row additional_items%ROWTYPE; - l_module_row modules%ROWTYPE; - begin - l_counter := 0; - FOR quote_item_rec IN c_get_quote_costs(p_id) LOOP - l_counter := l_counter + 1; - case quote_item_rec.quit_type - when 'BQI' then --base item - l_costs(l_counter).cost_description := 'Base Materials cost'; - l_costs(l_counter).cost_price := quote_item_rec.selling_price; - if not (quote_item_rec.delivery_price is null) then - l_costs(l_counter).cost_description := 'Base Labour cost'; - l_costs(l_counter).cost_price := quote_item_rec.delivery_price; - end if; - when 'HQI' then --housing item - l_costs(l_counter).cost_description := 'Housing Materials cost'; - l_costs(l_counter).cost_price := quote_item_rec.selling_price; - if not (quote_item_rec.delivery_price is null) then - l_costs(l_counter).cost_description := 'Housing Labour cost'; - l_costs(l_counter).cost_price := quote_item_rec.delivery_price; - end if; - when 'AQI' then --add-on item - --If we get time add an if statement round this that checks if the - --Additional Item is lifting gear that it only appears for - --LP Diaphgram install/std install jobs - l_add_item_row := get_additional_item(quote_item_rec.adit_code); - l_costs(l_counter).cost_description := l_add_item_row.description||' Materials cost'; - l_costs(l_counter).cost_price := quote_item_rec.selling_price; - if not(quote_item_rec.delivery_price is null) then - l_costs(l_counter).cost_description := l_add_item_row.description||' Labour cost'; - l_costs(l_counter).cost_price := quote_item_rec.delivery_price; - end if; - - when 'MQI' then --module item - l_costs(l_counter).cost_description := 'Module Materials cost'; - l_costs(l_counter).cost_price := quote_item_rec.selling_price; - if not(quote_item_rec.delivery_price is null) then - l_costs(l_counter).cost_description := 'Module Labour cost'; - l_costs(l_counter).cost_price := quote_item_rec.delivery_price; - end if; - end case; - - END LOOP; - - return l_costs; - end get_quote_costs; - - /* - FUNCTION determine_works - --This function should return a list of works, probably in an array, required for - --the quotation. It will need to be passed relevent data so that it can make the - --determinations - %param p_enqu_row - the current enquiry row to make determinations against. - %param possibly a few more params to get the required data in - */ - /* FUNCTION determine_works(p_quoteid number, p_enqu_row enquiries%ROWTYPE) RETURN works is - - --Enquiry type - l_enqu_type_row enquiry_types%ROWTYPE; - CURSOR c_get_enquiry_type(cp_enty_code varchar2) IS - SELECT * - FROM enquiry_types - WHERE code = cp_enty_code; - --Quote Items - l_quote_item_row quote_items%ROWTYPE; - CURSOR c_get_quote_item(cp_quoteid number) IS - SELECT * - FROM quote_items - WHERE qute_id = cp_quoteid; - --Module data - l_module_row modules%ROWTYPE; - CURSOR c_get_module(cp_module_code varchar2) IS - SELECT * - FROM modules - WHERE code = cp_module_code; - --Costs - -- l_cost_row costs%ROWTYPE; - -- CURSOR c_get_cost(cp_costid number) IS - -- SELECT * - -- FROM costs - -- WHERE id = cp_costid; - --Additional Items - l_add_item_row additional_items%ROWTYPE; - l_works works; --list of works for the quote - l_addons varchar(300); --list of addons for the quote - begin - --cycle through the quote items picking up each item to display on the - --description of works section - FOR quote_item_rec IN c_get_quote_item(p_quoteid) LOOP - case quote_item_rec.quit_type - when 'BQI' then --base item - l_addons := l_addons || ', Base'; - when 'HQI' then --housing item - l_addons := l_addons || ', Housing'; - when 'AQI' then --add-on item - l_add_item_row := get_additional_item(quote_item_rec.adit_code); - l_addons := l_addons || ', '||l_add_item_row.description; - when 'MQI' then --module item - l_module_row := get_module_row (quote_item_rec.modu_code); - l_works(3) := 'Meter Type: '|| l_module_row.svcp_code || ' ' || l_module_row.metr_code; - when 'LQI' then --labour item (job type) - --get type of enquiry to display as works type - IF NOT c_get_enquiry_type%ISOPEN THEN - OPEN c_get_enquiry_type(quote_item_rec.enty_code); - END IF; - - FETCH c_get_enquiry_type - INTO l_enqu_type_row; - CLOSE c_get_enquiry_type; - - l_works(1) := 'Works Type: '||l_enqu_type_row.description; - --get service pressure - l_works(2) := 'Service Pressure: '|| quote_item_rec.svcpt_code; - --get existing meter if appropriate - if l_quote_item_row.enty_code <>'INSTALL' or l_quote_item_row.enty_code <>'STD INSTALL' then - l_works(4) := 'Existing Meter Type: '|| p_enqu_row.existing_mesc_code ||', '|| p_enqu_row.existing_meter_model; - end if; - end case; - - - END LOOP; - -- - --add up all the addons and format the string - l_works(5) := 'Add-Ons: '|| l_addons; - - return l_works; - end determine_works; */ - /* FUNCTION determine_caveats --This function should return a list of caveats, probably in an array, required for @@ -330,7 +267,15 @@ CREATE OR REPLACE PACKAGE BODY mip_quotation_document IS begin null; end determine_caveats; - + /* + PROCEDURE set_quote_items + --This procedure sets the data for each of the items associated with the quotation. + --may want to break it up a bit using individual functions for each type of items + --just to make it more legible(it's rather a large procedure) + %param p_quote_data in out - The current data for this enquiry(what write our data values to) + %param p_quoteid - used to list all the quote items. + %param p_enqu_row - the current enquiry row to get data only available in the enquiry. + */ procedure set_quote_items_data (p_quote_data in out quote_data, p_quoteid number, p_enqu_row enquiries%ROWTYPE) is --Enquiry type l_enqu_type_row enquiry_types%ROWTYPE; @@ -352,36 +297,112 @@ CREATE OR REPLACE PACKAGE BODY mip_quotation_document IS l_addons varchar(300); --list of addons for the quote l_housing_row housings%ROWTYPE; l_base_row bases%ROWTYPE; + l_meter_row meters%ROWTYPE; -- used to get the qmax and qmin of the meter l_total_cost number; --used to figure out the liquidated damages costs + l_counter number; begin --cycle through the quote items picking up each item to display on the --description of works section + l_counter := 0; FOR quote_item_rec IN c_get_quote_item(p_quoteid) LOOP + l_counter := l_counter + 1; case quote_item_rec.quit_type when 'BQI' then --base item l_addons := l_addons || ', Base'; + --Set the costs + p_quote_data.quote_costs(l_counter).cost_description := 'Base Materials cost'; + p_quote_data.quote_costs(l_counter).cost_price := quote_item_rec.selling_price; + if not (quote_item_rec.delivery_price is null) then + p_quote_data.quote_costs(l_counter).cost_description := 'Base Labour cost'; + p_quote_data.quote_costs(l_counter).cost_price := quote_item_rec.delivery_price; + end if; --get the base details l_base_row := get_base_row(quote_item_rec.bas_code); p_quote_data.base_length := l_base_row.dim_a; p_quote_data.base_depth := l_base_row.dim_b; - p_quote_data.base_height := 1; -- need to reference the bases table after AH has added the column - + p_quote_data.base_height := l_base_row.depth; + --get base technical details + p_quote_data.base_dimensions(1) := l_base_row.depth; + p_quote_data.base_dimensions(2) := l_base_row.dim_a; + p_quote_data.base_dimensions(3) := l_base_row.dim_b; + p_quote_data.base_dimensions(4) := l_base_row.dim_c; + p_quote_data.base_dimensions(5) := l_base_row.dim_d; + p_quote_data.base_dimensions(6) := l_base_row.dim_e; + p_quote_data.base_dimensions(7) := l_base_row.dim_f; + p_quote_data.base_dimensions(8) := l_base_row.dim_g; + p_quote_data.base_dimensions(9) := l_base_row.dim_h; + p_quote_data.base_dimensions(10) := l_base_row.dim_i; when 'HQI' then --housing item l_addons := l_addons || ', Housing'; + --Set up the costs + p_quote_data.quote_costs(l_counter).cost_description := 'Housing Materials cost'; + p_quote_data.quote_costs(l_counter).cost_price := quote_item_rec.selling_price; + if not (quote_item_rec.delivery_price is null) then + p_quote_data.quote_costs(l_counter).cost_description := 'Housing Labour cost'; + p_quote_data.quote_costs(l_counter).cost_price := quote_item_rec.delivery_price; + end if; --get the housing code and return the housing details into p_quote_data l_housing_row := get_housing_row(quote_item_rec.hou_code); p_quote_data.house_length := l_housing_row.dim_l; p_quote_data.house_depth := l_housing_row.dim_w; p_quote_data.house_height := l_housing_row.dim_h; p_quote_data.house_ventilation := ((l_housing_row.dim_l*l_housing_row.dim_w)/100)*3; + --get housing technical details + p_quote_data.house_dimensions(1) := l_housing_row.dim_l; + p_quote_data.house_dimensions(2) := l_housing_row.dim_w; + p_quote_data.house_dimensions(3) := l_housing_row.dim_h; + p_quote_data.house_dimensions(4) := l_housing_row.weight; + when 'AQI' then --add-on item + --If we get time add an if statement round this that checks if the + --Additional Item is lifting gear that it only appears for + --LP Diaphgram install/std install jobs + --Get costs l_add_item_row := get_additional_item(quote_item_rec.adit_code); + p_quote_data.quote_costs(l_counter).cost_description := l_add_item_row.description||' Materials cost'; + p_quote_data.quote_costs(l_counter).cost_price := quote_item_rec.selling_price; + if not(quote_item_rec.delivery_price is null) then + p_quote_data.quote_costs(l_counter).cost_description := l_add_item_row.description||' Labour cost'; + p_quote_data.quote_costs(l_counter).cost_price := quote_item_rec.delivery_price; + end if; + --set the list of add-ons for this quote l_addons := l_addons || ', '||l_add_item_row.description; when 'MQI' then --module item + --get costs + p_quote_data.quote_costs(l_counter).cost_description := 'Module Materials cost'; + p_quote_data.quote_costs(l_counter).cost_price := quote_item_rec.selling_price; + if not(quote_item_rec.delivery_price is null) then + p_quote_data.quote_costs(l_counter).cost_description := 'Module Labour cost'; + p_quote_data.quote_costs(l_counter).cost_price := quote_item_rec.delivery_price; + end if; + --other module details l_module_row := get_module_row (quote_item_rec.modu_code); l_works(3) := 'Meter Type: '|| l_module_row.svcp_code || ' ' || l_module_row.metr_code; p_quote_data.outlet_termninal_size := l_module_row.outlet_size; + --module technical details + p_quote_data.module_dimensions(1) := l_module_row.dim_a; + p_quote_data.module_dimensions(2) := l_module_row.dim_b; + p_quote_data.module_dimensions(3) := l_module_row.dim_c; + p_quote_data.module_dimensions(4) := l_module_row.dim_d; + p_quote_data.module_dimensions(5) := l_module_row.dim_e; + p_quote_data.module_dimensions(6) := l_module_row.dim_h; + p_quote_data.module_dimensions(7) := l_module_row.inlet_height; + p_quote_data.module_dimensions(8) := l_module_row.outlet_height; + p_quote_data.module_dimensions(9) := l_module_row.weight; + p_quote_data.module_reference := l_module_row.code; + p_quote_data.module_inlet_height := l_module_row.inlet_height; + p_quote_data.module_outlet_height := l_module_row.outlet_height; + p_quote_data.module_inlet_size := l_module_row.inlet_size; + p_quote_data.module_outlet_size := l_module_row.outlet_size; + p_quote_data.module_inlet_type := l_module_row.inlet_cnty_code; + p_quote_data.module_outlet_type := l_module_row.outlet_cnty_code; + p_quote_data.module_inlet_orientation := l_module_row.inlet_cnor_code; + p_quote_data.module_outlet_orientation := l_module_row.outlet_cnor_code; + --get meters qmax/qmin + l_meter_row := get_meter_row(l_module_row.metr_code); + p_quote_data.module_qmax := l_meter_row.qmax; + p_quote_data.module_qmin := l_meter_row.qmin; when 'LQI' then --labour item (job type) --get type of enquiry to display as works type IF NOT c_get_enquiry_type%ISOPEN THEN @@ -450,7 +471,7 @@ CREATE OR REPLACE PACKAGE BODY mip_quotation_document IS WHERE id = cp_party_id and rt_code=cp_rt_type; l_supplier_id number; l_agent_id number; - l_address_id number; + --l_address_id number; --Party name l_party_row parties%ROWTYPE; CURSOR c_get_party(cp_party_id number) IS @@ -469,7 +490,7 @@ CREATE OR REPLACE PACKAGE BODY mip_quotation_document IS -- FROM meters -- WHERE id = cp_meter_id; --housing data - l_housing_row housings%ROWTYPE; + --l_housing_row housings%ROWTYPE; begin --probably call determine caveats here @@ -525,8 +546,6 @@ CREATE OR REPLACE PACKAGE BODY mip_quotation_document IS FETCH c_get_party INTO l_party_row; CLOSE c_get_party; - l_agent_first_name := l_party_row.first_name; - l_agent_last_name := l_party_row.last_name; l_agent_first_name := l_party_row.first_name; @@ -549,15 +568,17 @@ CREATE OR REPLACE PACKAGE BODY mip_quotation_document IS l_quote_data.site_address(3) := l_enqu_row.install_street; l_quote_data.site_address(4) := l_enqu_row.install_city; l_quote_data.site_address(5) := l_enqu_row.install_postcode; + --need to find out how to get the mam + l_quote_data.mam := get_mam(mip_regions.get_region_for_postcode(l_enqu_row.install_postcode)); l_quote_data.mam := ''; - set_quote_items_data(l_quote_data, l_quote_row.id,l_enqu_row); - -- l_quote_data.quote_works := determine_works(l_quote_row.id, l_enqu_row); l_quote_data.lead_time := get_max_lead_time(l_quote_row.id); l_quote_data.total_cost := get_total_cost(l_quote_row.id); - l_quote_data.quote_costs := get_quote_costs(l_quote_row.id); - --if - --l_housing_row := get_housing_row(l_quo - --l_quote_data.house_length := l_housing_row + l_quote_data.requested_qmax := l_enqu_row.qmax; + --get individual quote item details + set_quote_items_data(l_quote_data, l_quote_row.id,l_enqu_row); + --get caveats + --determine_caveats call (this could be a procedure, depends on what GW gives us) + --phew, lets return all that lovely data we captured then... return l_quote_data; end get_detailed_quote_data; @@ -572,6 +593,7 @@ CREATE OR REPLACE PACKAGE BODY mip_quotation_document IS begin null; end generate_detailed_quote_pdf; + FUNCTION build_detailed_quote(p_enquiryid in number) RETURN BOOLEAN is begin null;