diff --git a/Modules/mip_quotation_document.pck b/Modules/mip_quotation_document.pck new file mode 100644 index 0000000..7515dde --- /dev/null +++ b/Modules/mip_quotation_document.pck @@ -0,0 +1,584 @@ +CREATE OR REPLACE PACKAGE mip_quotation_document IS + + -- Author : HARDYA + -- Created : 15/11/2007 11:27:58 + -- Purpose : Handle life-cycle of quotations + + -- Public type declarations + --type is ; + type cost_line is record( + cost_description varchar2(80), + cost_price number); + + type address is varray(7) of varchar2(160); + type works is varray(20) of varchar2(160); + type costs is varray(20) of cost_line; + type caveats is varray(20) of varchar2(2000); + type dimensions is varray(10) of number; + type quote_data is record + (quote_ref NUMBER, + transaction_ref VARCHAR2(80), + mprn number(30), + supplier_address address, + current_date DATE, + agent_first_name varchar2(80), + site_address address, + mam varchar2(80), + quote_works works, + lead_time number, + total_cost number, + quote_costs costs, + house_length number, + house_depth number, + house_height number, + house_ventilation number, + base_length number, + base_depth number, + base_height number, + outlet_termninal_size number, + quote_caveats caveats, + liquid_damage_day number, + liquid_damage_cap number, + base_dimensions dimensions, + base_diagram number, + house_dimensions dimensions, + house_diagram number, + module_dimensions dimensions, + module_diagram number, + requested_qmax number, + module_qmax number, + module_qmin number, + module_inlet_height number, + module_outlet_height number, + module_inlet_size number, + module_outlet_size number, + module_inlet_type varchar2(80), + module_outlet_type varchar2(80), + module_inlet_orientation varchar2(80), + module_outlet_orientation varchar2(80) + ); + + -- Public constant declarations + -- constant := ; + + -- Public variable declarations + -- ; + + + -- 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 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 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); +END mip_quotation_document; +/ +CREATE OR REPLACE PACKAGE BODY mip_quotation_document IS + function get_module_row(p_id number) return modules%ROWTYPE is + l_module_row modules%ROWTYPE; + CURSOR c_get_module(cp_module_code varchar2) IS + SELECT * + FROM modules + WHERE code = cp_module_code; + begin + IF NOT c_get_module%ISOPEN THEN + OPEN c_get_module(p_id); + 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(p_code varchar2) return housings%ROWTYPE is + l_housing_row housings%ROWTYPE; + CURSOR c_get_housing(cp_housing_code varchar2) IS + SELECT * + FROM housings + WHERE code = cp_housing_code; + begin + IF NOT c_get_housing%ISOPEN THEN + OPEN c_get_housing(p_code); + END IF; + FETCH c_get_housing + INTO l_housing_row; + CLOSE c_get_housing; + return l_housing_row; + end get_housing_row; + + 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 + SELECT * + FROM bases + WHERE code = cp_base_code; + begin + IF NOT c_get_base%ISOPEN THEN + OPEN c_get_base(p_code); + END IF; + FETCH c_get_base + INTO l_base_row; + CLOSE c_get_base; + return l_base_row; + end get_base_row; + + + function get_additional_item(p_code varchar2) return additional_items%ROWTYPE is + --Additional Items + l_add_item_row additional_items%ROWTYPE; + CURSOR c_get_add_item(cp_additid varchar2) IS + SELECT * + FROM additional_items + WHERE code = cp_additid; + begin + --get additional item + IF NOT c_get_add_item%ISOPEN THEN + OPEN c_get_add_item(p_code); + END IF; + + FETCH c_get_add_item + INTO l_add_item_row; + 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 + l_quote_item_maxlt number; + CURSOR c_get_max_lead_time (cp_id number) is + SELECT MAX(lead_time) + FROM quote_items + WHERE qute_id = cp_id; + begin + IF NOT c_get_max_lead_time%ISOPEN THEN + OPEN c_get_max_lead_time(p_id); + 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 + l_quote_total_cost number; + CURSOR c_get_total_cost (cp_id number) is + SELECT SUM(selling_price + delivery_price) + FROM quote_items + WHERE qute_id = cp_id; + begin + IF NOT c_get_total_cost%ISOPEN THEN + OPEN c_get_total_cost(p_id); + END IF; + FETCH c_get_total_cost + INTO l_quote_total_cost; + CLOSE c_get_total_cost; + 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 + --the quotation. It will need to be passed relevent data so that it can make the + --determinations + %param p_enquiryid - the current enquiry to make determinations against. + %param possibly a few more params to get the required data in + */ + FUNCTION determine_caveats(p_enquiryid in number) RETURN BOOLEAN is + + begin + null; + end determine_caveats; + + 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; + 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; + --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 + l_housing_row housings%ROWTYPE; + l_base_row bases%ROWTYPE; + l_total_cost number; --used to figure out the liquidated damages costs + 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'; + --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 + + when 'HQI' then --housing item + l_addons := l_addons || ', Housing'; + --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; + 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; + p_quote_data.outlet_termninal_size := l_module_row.outlet_size; + + 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; + if l_quote_item_row.enty_code <> 'OFMAT' or l_quote_item_row.enty_code <> 'ADVERSARIAL'then + l_total_cost := p_quote_data.total_cost; + if l_total_cost <= 1000 then + p_quote_data.liquid_damage_day := 20; + p_quote_data.liquid_damage_cap := 200; + else + p_quote_data.liquid_damage_day := (l_total_cost/100)*2.5; + p_quote_data.liquid_damage_cap := (l_total_cost/100)*25; + end if; + end if; + end case; + + + END LOOP; + -- + --add up all the addons and format the string + l_works(5) := 'Add-Ons: '|| l_addons; + p_quote_data.quote_works := l_works; + end set_quote_items_data; + + /* + FUNCTION get_detailed_quote_data + --This function should return all required data for the quotation. + --The return value could be a type variable or perhaps an array? + %param p_quoteid - the quotation we want to build a pdf for. + %param possibly a few more params to get the required data in or change format of pdf + %return return the quote data in the quote_data reocrd type + */ + FUNCTION get_detailed_quote_data(p_quoteid in number) RETURN quote_data is + --Quote data + l_quote_data quote_data; + l_quote_row quotes%ROWTYPE; + CURSOR c_get_quote(cp_quote_id number) IS + SELECT * + FROM quotes + WHERE id = cp_quote_id; + --Enquiry data + l_enquiry_id number; + l_enqu_row enquiries%ROWTYPE; + CURSOR c_get_enquiry(cp_enqu_id number) IS + SELECT * + FROM enquiries + WHERE id = cp_enqu_id; + --supplier address data + l_addr_row v_current_party_addresses%ROWTYPE; + CURSOR c_get_address(cp_party_id number, cp_rt_type varchar2) IS + SELECT * + FROM v_current_party_addresses + WHERE id = cp_party_id and rt_code=cp_rt_type; + l_supplier_id number; + l_agent_id number; + l_address_id number; + --Party name + l_party_row parties%ROWTYPE; + CURSOR c_get_party(cp_party_id number) IS + SELECT * + FROM parties + WHERE id = cp_party_id; + --Agent Name + l_agent_first_name varchar2(80); + l_agent_last_name varchar2(80); + --suppler name + l_supplier_name varchar2(80); + --Meter data + --l_meter_row meters%ROWTYPE; + --CURSOR c_get_meter(cp_meter_id number) IS + -- SELECT * + -- FROM meters + -- WHERE id = cp_meter_id; + --housing data + l_housing_row housings%ROWTYPE; + + begin + --probably call determine caveats here + --we can start filling all the data for the quotation + --will need data from the following tables + --quotes + --enquiries + --parties + --get the quote's data record + IF NOT c_get_quote%ISOPEN THEN + OPEN c_get_quote(p_quoteid); + END IF; + + FETCH c_get_quote + INTO l_quote_row; + CLOSE c_get_quote; + + --get the enquiry data + l_enquiry_id := l_quote_row.enqu_id; + + IF NOT c_get_enquiry%ISOPEN THEN + OPEN c_get_enquiry(l_enquiry_id); + END IF; + + FETCH c_get_enquiry + INTO l_enqu_row; + CLOSE c_get_enquiry; + --get the latest supplier address + IF NOT c_get_address%ISOPEN THEN + OPEN c_get_address(l_supplier_id,'OFFICE'); + END IF; + + FETCH c_get_address + INTO l_addr_row; + CLOSE c_get_address; + --get current supplier and agent ids for enquiry + l_supplier_id := mip_enquiry.get_enquiry_role(l_enqu_row.id,'ENQ SUPP'); + l_agent_id := mip_enquiry.get_enquiry_role(l_enqu_row.id,'ENQ OWN'); + --supplier + IF NOT c_get_party%ISOPEN THEN + OPEN c_get_party(l_supplier_id); + END IF; + + FETCH c_get_party + INTO l_party_row; + CLOSE c_get_party; + l_supplier_name := l_party_row.name; + --agent + IF NOT c_get_party%ISOPEN THEN + OPEN c_get_party(l_agent_id); + END IF; + + 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; + l_agent_last_name := l_party_row.last_name; + + l_quote_data.quote_ref := l_quote_row.id; + l_quote_data.transaction_ref := l_enqu_row.transaction_reference; + l_quote_data.mprn := l_enqu_row.mprn; + l_quote_data.supplier_address(1) := l_agent_first_name||' '||l_agent_last_name; + l_quote_data.supplier_address(2) := l_supplier_name; + l_quote_data.supplier_address(3) := l_addr_row.sub_building; + l_quote_data.supplier_address(4) := l_addr_row.building; + l_quote_data.supplier_address(5) := l_addr_row.street; + l_quote_data.supplier_address(6) := l_addr_row.city; + l_quote_data.supplier_address(7) := l_addr_row.postcode; + l_quote_data.current_date := sysdate; + l_quote_data.agent_first_name := l_agent_first_name; + l_quote_data.site_address(1) := l_enqu_row.install_sub_building; + l_quote_data.site_address(2) := l_enqu_row.install_building; + 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; + 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 + return l_quote_data; + end get_detailed_quote_data; + + /* + FUNCTION generate_detailed_quote_pdf + --This function should return a data populated pdf of the detailed quotation. + --The return value could be a pdf or reference to a pdf that it has stored in the system? + %param p_quote_data - the data to build into the quote. + %param possibly a few more params to get the required data in + */ + FUNCTION generate_detailed_quote_pdf(get_detailed_quote_data in number) RETURN BOOLEAN is + begin + null; + end generate_detailed_quote_pdf; + FUNCTION build_detailed_quote(p_enquiryid in number) RETURN BOOLEAN is + begin + null; + end build_detailed_quote; + +BEGIN + -- Initialization + NULL; +END mip_quotation_document; +/