tried to get caveats in, having troubles so code is broken until monday sorry...

git-svn-id: http://locode01.ad.dom/svn/WEBMIP/trunk@3208 248e525c-4dfb-0310-94bc-949c084e9493
This commit is contained in:
PriestJ
2008-01-11 18:55:01 +00:00
parent f29afedb1e
commit e96ef7e20d

View File

@@ -6,6 +6,7 @@ CREATE OR REPLACE PACKAGE mip_quotation_document IS
-- Public type declarations -- Public type declarations
--type <TypeName> is <Datatype>; --type <TypeName> is <Datatype>;
type caveat_texts_array is varray(20) of varchar2(4000);
type img_props is record(width number, type img_props is record(width number,
height number); height number);
type cost_line is record( type cost_line is record(
@@ -59,7 +60,9 @@ CREATE OR REPLACE PACKAGE mip_quotation_document IS
module_outlet_type varchar2(80), module_outlet_type varchar2(80),
module_inlet_orientation varchar2(80), module_inlet_orientation varchar2(80),
module_outlet_orientation varchar2(80), module_outlet_orientation varchar2(80),
meter_reference varchar(80) meter_reference varchar(80),
mety_code varchar(80),
svcpt_code varchar(10)
); );
FUNCTION generate_quote_pdf(p_quote_id in number) RETURN VARCHAR2; FUNCTION generate_quote_pdf(p_quote_id in number) RETURN VARCHAR2;
@@ -110,6 +113,7 @@ CREATE OR REPLACE PACKAGE BODY mip_quotation_document IS
l_new_dimensions.height := l_new_height; l_new_dimensions.height := l_new_height;
return l_new_dimensions; return l_new_dimensions;
end scale_image_dimensions; end scale_image_dimensions;
/* /*
FUNCTION get_drawing FUNCTION get_drawing
--The get_drawing function returns a blob of the drawing code --The get_drawing function returns a blob of the drawing code
@@ -156,6 +160,57 @@ CREATE OR REPLACE PACKAGE BODY mip_quotation_document IS
CLOSE c_get_mam; CLOSE c_get_mam;
return l_mam_desc; return l_mam_desc;
end get_mam; end get_mam;
/*
FUNCTION get_enquiry_row
--The get_enquiry_row function returns an enquiry record for the supplied enquiry id.
%param p_enquiry_id - the id of the enquiry you want to get a record of.
%return enquiry row of the supplied enquiry id
*/
function get_enquiry_row(p_enquiry_id number) return enquiries%ROWTYPE is
--Enquiry data
l_enqu_row enquiries%ROWTYPE;
CURSOR c_get_enquiry(cp_enqu_id number) IS
SELECT *
FROM enquiries
WHERE id = cp_enqu_id;
begin
--get the enquiry data
IF NOT c_get_enquiry%ISOPEN THEN
OPEN c_get_enquiry(p_enquiry_id);
END IF;
FETCH c_get_enquiry
INTO l_enqu_row;
CLOSE c_get_enquiry;
return l_enqu_row;
end get_enquiry_row;
/*
FUNCTION get_quote_row
--The get_quote_row funcdsf sdfsdfsd fsdfsdfsdftion returns an enquiry record for the supplied enquiry id.
%param p_enquiry_id - the id of the enquiry you want to get a record of.
%return enquiry row of the supplied enquiry id
*/
function get_quote_row(p_quote_id number) return quotes%ROWTYPE is
--Quote data
l_quote_row quotes%ROWTYPE;
CURSOR c_get_quote(cp_quote_id number) IS
SELECT *
FROM quotes
WHERE id = cp_quote_id;
begin
--get the quote data
IF NOT c_get_quote%ISOPEN THEN
OPEN c_get_quote(p_quote_id);
END IF;
FETCH c_get_quote
INTO l_quote_row;
CLOSE c_get_quote;
return l_quote_row;
end get_quote_row;
/* /*
FUNCTION get_meter_row FUNCTION get_meter_row
--The get_meter_row function returns a meter record for the supplied meter code. --The get_meter_row function returns a meter record for the supplied meter code.
@@ -302,7 +357,7 @@ CREATE OR REPLACE PACKAGE BODY mip_quotation_document IS
SELECT SUM(selling_price + nvl(delivery_price,0)) SELECT SUM(selling_price + nvl(delivery_price,0))
into l_quote_total_cost into l_quote_total_cost
FROM quote_items FROM quote_items
WHERE qute_id = p_quoteid and not (quit_type = 'AQI' and adit_code <> 'LIFTING GEAR'); WHERE qute_id = p_quoteid and not (quit_type = 'AQI' and adit_code in ('LIFTING GEAR','PURGING'));
return l_quote_total_cost; return l_quote_total_cost;
end get_total_cost; end get_total_cost;
@@ -476,10 +531,11 @@ CREATE OR REPLACE PACKAGE BODY mip_quotation_document IS
p_quote_data.module_inlet_orientation := l_module_row.inlet_cnor_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; p_quote_data.module_outlet_orientation := l_module_row.outlet_cnor_code;
p_quote_data.module_diagram := l_module_row.drwg_code; p_quote_data.module_diagram := l_module_row.drwg_code;
--get meters qmax/qmin --get meters qmax/qmin tech specs
l_meter_row := get_meter_row(l_module_row.metr_code); l_meter_row := get_meter_row(l_module_row.metr_code);
p_quote_data.module_qmax := l_meter_row.qmax; p_quote_data.module_qmax := l_meter_row.qmax;
p_quote_data.module_qmin := l_meter_row.qmin; p_quote_data.module_qmin := l_meter_row.qmin;
p_quote_data.mety_code := l_meter_row.mety_code;
--get the min base details for this module --get the min base details for this module
l_base_row := get_base_row(l_module_row.bas_code); l_base_row := get_base_row(l_module_row.bas_code);
p_quote_data.base_length := l_base_row.dim_a; p_quote_data.base_length := l_base_row.dim_a;
@@ -509,6 +565,11 @@ CREATE OR REPLACE PACKAGE BODY mip_quotation_document IS
if quote_item_rec.enty_code <>'INSTALL' and quote_item_rec.enty_code <>'STD INSTALL' then if quote_item_rec.enty_code <>'INSTALL' and quote_item_rec.enty_code <>'STD INSTALL' then
l_works(5) := 'Existing Meter Type: '|| p_enqu_row.existing_mesc_code ||' '||p_enqu_row.mety_code||', '|| p_enqu_row.existing_meter_model ||', MSN: '||p_enqu_row.existing_meter_serial_no ; l_works(5) := 'Existing Meter Type: '|| p_enqu_row.existing_mesc_code ||' '||p_enqu_row.mety_code||', '|| p_enqu_row.existing_meter_model ||', MSN: '||p_enqu_row.existing_meter_serial_no ;
end if; end if;
--if it's not an install or exchange get the existing meter type (will overwrite
--current value if already set in the code above)
if quote_item_rec.enty_code not in('STD EXCHANGE','EXCHANGE','INSTALL','STD INSTALL') then
p_quote_data.mety_code := p_enqu_row.mety_code;
end if;
if quote_item_rec.enty_code <> 'OFMAT' and quote_item_rec.enty_code <> 'ADVERSARIAL' then if quote_item_rec.enty_code <> 'OFMAT' and quote_item_rec.enty_code <> 'ADVERSARIAL' then
l_total_cost := p_quote_data.total_cost; l_total_cost := p_quote_data.total_cost;
if l_total_cost <= 1000 then if l_total_cost <= 1000 then
@@ -552,17 +613,17 @@ CREATE OR REPLACE PACKAGE BODY mip_quotation_document IS
--Quote data --Quote data
l_quote_data quote_data; l_quote_data quote_data;
l_quote_row quotes%ROWTYPE; l_quote_row quotes%ROWTYPE;
CURSOR c_get_quote(cp_quote_id number) IS --CURSOR c_get_quote(cp_quote_id number) IS
SELECT * -- SELECT *
FROM quotes -- FROM quotes
WHERE id = cp_quote_id; -- WHERE id = cp_quote_id;
--Enquiry data --Enquiry data
l_enquiry_id number; l_enquiry_id number;
l_enqu_row enquiries%ROWTYPE; l_enqu_row enquiries%ROWTYPE;
CURSOR c_get_enquiry(cp_enqu_id number) IS --CURSOR c_get_enquiry(cp_enqu_id number) IS
SELECT * -- SELECT *
FROM enquiries -- FROM enquiries
WHERE id = cp_enqu_id; -- WHERE id = cp_enqu_id;
--supplier address data --supplier address data
l_addr_row v_current_party_addresses%ROWTYPE; l_addr_row v_current_party_addresses%ROWTYPE;
CURSOR c_get_address(cp_party_id number, cp_rt_type varchar2) IS CURSOR c_get_address(cp_party_id number, cp_rt_type varchar2) IS
@@ -583,41 +644,22 @@ CREATE OR REPLACE PACKAGE BODY mip_quotation_document IS
l_agent_last_name varchar2(80); l_agent_last_name varchar2(80);
--suppler name --suppler name
l_supplier_name varchar2(80); 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 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 --get the quote's data record
IF NOT c_get_quote%ISOPEN THEN l_quote_row := get_quote_row(p_quoteid);
/* IF NOT c_get_quote%ISOPEN THEN
OPEN c_get_quote(p_quoteid); OPEN c_get_quote(p_quoteid);
END IF; END IF;
FETCH c_get_quote FETCH c_get_quote
INTO l_quote_row; INTO l_quote_row;
CLOSE c_get_quote; CLOSE c_get_quote;*/
--get the enquiry data --get the enquiry data
l_enquiry_id := l_quote_row.enqu_id; l_enquiry_id := l_quote_row.enqu_id;
l_enqu_row := get_enquiry_row(l_enquiry_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 --get the latest supplier address
IF NOT c_get_address%ISOPEN THEN IF NOT c_get_address%ISOPEN THEN
OPEN c_get_address(l_supplier_id,'OFFICE'); OPEN c_get_address(l_supplier_id,'OFFICE');
@@ -668,12 +710,16 @@ 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(3) := l_enqu_row.install_street;
l_quote_data.site_address(4) := l_enqu_row.install_city; 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.site_address(5) := l_enqu_row.install_postcode;
--need to find out how to get the mam --need get the mam
l_quote_data.mam := get_mam(mip_regions.get_region_for_postcode(l_enqu_row.install_postcode)); l_quote_data.mam := get_mam(mip_regions.get_region_for_postcode(l_enqu_row.install_postcode));
--l_quote_data.mam := '<need to write routine to get mam>';
l_quote_data.lead_time := get_max_lead_time(l_quote_row.id); 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.total_cost := get_total_cost(l_quote_row.id);
l_quote_data.requested_qmax := l_enqu_row.qmax; l_quote_data.requested_qmax := l_enqu_row.qmax;
if l_enqu_row.required_svcp_code = 'LP' then
l_quote_data.svcpt_code := 'LP';
else
l_quote_data.svcpt_code := 'MP';
end if;
--get individual quote item details --get individual quote item details
set_quote_items_data(l_quote_data, l_quote_row.id,l_enqu_row); set_quote_items_data(l_quote_data, l_quote_row.id,l_enqu_row);
--get caveats --get caveats
@@ -776,12 +822,14 @@ CREATE OR REPLACE PACKAGE BODY mip_quotation_document IS
%param p_indent - the left margin measurement. %param p_indent - the left margin measurement.
%param p_vertical_offset - the top margin measurement. %param p_vertical_offset - the top margin measurement.
*/ */
PROCEDURE build_costs_page(p_quote_data in quote_data, p_font in varchar2, p_indent in number, p_vertical_offset in number) is PROCEDURE build_costs_page(p_quote_data in quote_data, p_font in varchar2, p_indent in number, p_vertical_offset in number,p_caveat_texts caveat_texts_array) is
l_cost_line_counter number; l_cost_line_counter number;
l_vertical_offset_for_costs number := p_vertical_offset+110; l_vertical_offset_for_costs number := p_vertical_offset+110;
l_works_counter number; l_works_counter number;
l_caveats_counter number;
l_vertical_offset_for_works number := p_vertical_offset+52; l_vertical_offset_for_works number := p_vertical_offset+52;
l_cost_totals_offset number; --used to position the cost totals after the cost line items l_cost_totals_offset number; --used to position the cost totals after the cost line items
begin begin
--Page 2 --Page 2
plpdf.NewPage; plpdf.NewPage;
@@ -805,6 +853,14 @@ CREATE OR REPLACE PACKAGE BODY mip_quotation_document IS
loop loop
plpdf.PrintText(p_indent,l_vertical_offset_for_works+(l_works_counter*4), p_quote_data.quote_works(l_works_counter)); plpdf.PrintText(p_indent,l_vertical_offset_for_works+(l_works_counter*4), p_quote_data.quote_works(l_works_counter));
l_works_counter := l_works_counter +1; l_works_counter := l_works_counter +1;
end loop;
--PUT DESC_WORK caveat here
l_caveats_counter :=1;
while p_caveat_texts(l_caveats_counter) is not null
loop
plpdf.PrintText(p_indent,l_vertical_offset_for_works+(l_works_counter*4), p_caveat_texts(l_caveats_counter));
l_caveats_counter := l_caveats_counter +1;
l_works_counter := l_works_counter +1;
end loop; end loop;
plpdf.SetPrintFont(p_font,null,10); --unset bold plpdf.SetPrintFont(p_font,null,10); --unset bold
plpdf.PrintText(p_indent,p_vertical_offset+90, 'Indicative Lead Time from Acceptance to Physical Commencement: '); plpdf.PrintText(p_indent,p_vertical_offset+90, 'Indicative Lead Time from Acceptance to Physical Commencement: ');
@@ -860,7 +916,7 @@ CREATE OR REPLACE PACKAGE BODY mip_quotation_document IS
plpdf.PrintText(p_indent+80,p_vertical_offset+50,'Height: '||p_quote_data.base_height||' mm'); plpdf.PrintText(p_indent+80,p_vertical_offset+50,'Height: '||p_quote_data.base_height||' mm');
plpdf.PrintText(p_indent,p_vertical_offset+58,'Minimum Ventilation: '||p_quote_data.outlet_termninal_size||' mm'); plpdf.PrintText(p_indent,p_vertical_offset+58,'Minimum Ventilation: '||p_quote_data.outlet_termninal_size||' mm');
plpdf.PrintText(p_indent,p_vertical_offset+74,'Special Features/Terms/Conditions:'); plpdf.PrintText(p_indent,p_vertical_offset+74,'Special Features/Terms/Conditions:');
--CAVEATS GO HERE DUDES/DUDETTES --Terms and condition CAVEATS GO HERE DUDES/DUDETTES
plpdf.SetPrintFont(p_font,'B',10); --set bold plpdf.SetPrintFont(p_font,'B',10); --set bold
--the caveats will be looped in so the positioning of the the following items will --the caveats will be looped in so the positioning of the the following items will
--need to be dynamic (see the quote costs code above for an example) --need to be dynamic (see the quote costs code above for an example)
@@ -925,8 +981,8 @@ CREATE OR REPLACE PACKAGE BODY mip_quotation_document IS
if p_base_blob is null then if p_base_blob is null then
plpdf.PrintText(p_indent+50,p_vertical_offset+50,'No Base Diagram Available'); plpdf.PrintText(p_indent+50,p_vertical_offset+50,'No Base Diagram Available');
else else
l_img_props := scale_image_dimensions(100, 60, p_module_blob ); l_img_props := scale_image_dimensions(100, 60, p_base_blob );
plpdf.PutImage('base',p_base_blob,p_indent,10,l_img_props.width,l_img_props.height); plpdf.PutImage('base',p_base_blob,p_indent+50,p_vertical_offset+25,l_img_props.width,l_img_props.height);
end if; end if;
--House Details --House Details
plpdf.SetPrintFont(p_font,'BU',12); --set bold,underline and 12pt plpdf.SetPrintFont(p_font,'BU',12); --set bold,underline and 12pt
@@ -942,10 +998,11 @@ CREATE OR REPLACE PACKAGE BODY mip_quotation_document IS
plpdf.PrintCell(15,6,'Weight:',1,0,'L',0); plpdf.PrintCell(15,6,'Weight:',1,0,'L',0);
plpdf.PrintCell(15,6,p_quote_data.house_dimensions(4),1,1,'R',0); plpdf.PrintCell(15,6,p_quote_data.house_dimensions(4),1,1,'R',0);
if p_house_blob is null then if p_house_blob is null then
plpdf.PrintText(p_indent+50,p_vertical_offset+132,'No House Diagram Available'); plpdf.PrintText(p_indent+50,p_vertical_offset+132,'No Housing Diagram Available');
else else
l_img_props := scale_image_dimensions(100, 60, p_module_blob );
plpdf.PutImage('house',p_house_blob,p_indent+50,108,l_img_props.width,l_img_props.height); l_img_props := scale_image_dimensions(100, 60, p_house_blob );
plpdf.PutImage('house',p_house_blob,p_indent+50,p_vertical_offset+108,l_img_props.width,l_img_props.height);
end if; end if;
--Module details --Module details
plpdf.SetPrintFont(p_font,'BU',12); --set bold,underline and 12pt plpdf.SetPrintFont(p_font,'BU',12); --set bold,underline and 12pt
@@ -1166,17 +1223,23 @@ CREATE OR REPLACE PACKAGE BODY mip_quotation_document IS
*/ */
FUNCTION generate_detailed_quote_pdf(p_quote_data in quote_data,p_quote_id in number) RETURN VARCHAR2 is FUNCTION generate_detailed_quote_pdf(p_quote_data in quote_data,p_quote_id in number) RETURN VARCHAR2 is
l_blob blob; l_blob blob;
l_enty_code varchar(80); --the type of enquiry l_enty_code varchar2(80); --the type of enquiry
l_rec_counter number;
l_caveat_texts := caveat_texts_array(null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null);
l_logo_blob blob; l_logo_blob blob;
l_signature_blob blob; l_signature_blob blob;
l_success boolean; --holds whether the quote was saved i nthe docuemnts tables or not l_success boolean; --holds whether the quote was saved i nthe docuemnts tables or not
l_base_blob blob; --the base drawing l_base_blob blob; --the base drawing
l_house_blob blob; --the house drawing l_house_blob blob; --the house drawing
l_module_blob blob; --the module drawing l_module_blob blob; --the module drawing
l_pdf_name varchar(90); -- the id of the quote we generate l_pdf_name varchar2(90); -- the id of the quote we generate
l_indent number := 31.7; l_indent number := 31.7;
l_vertical_offset number := 30; l_vertical_offset number := 30;
l_font varchar2(40) := 'Arial'; --arial not daz l_font varchar2(40) := 'Arial'; --arial not daz
l_desc_work_row caveat_texts%ROWTYPE;
l_term_cond_row caveat_texts%ROWTYPE;
l_cont_sum_row caveat_texts%ROWTYPE;
l_cont_sum_qa_row caveat_texts%ROWTYPE;
CURSOR c_get_logo(cp_logo varchar2) IS CURSOR c_get_logo(cp_logo varchar2) IS
SELECT blob_content SELECT blob_content
FROM wwv_flow_files FROM wwv_flow_files
@@ -1188,8 +1251,16 @@ CREATE OR REPLACE PACKAGE BODY mip_quotation_document IS
CURSOR c_get_enty(cp_quid varchar2) IS CURSOR c_get_enty(cp_quid varchar2) IS
SELECT enty_code SELECT enty_code
FROM quote_items FROM quote_items
WHERE qute_id = cp_quid and quit_type = 'LQI' ; WHERE qute_id = cp_quid and quit_type = 'LQI' ;
CURSOR c_get_caveats(cp_enty_code varchar2, cp_mety_code varchar2, cp_svcpt_code varchar2, cp_document_position varchar2) IS
select *
from caveat_texts t
where enty_code = cp_enty_code and mety_code = cp_mety_code and svcpt_code = cp_svcpt_code and document_position = cp_document_position
order by 2;
---built cursor above now need to get it into either separate variables or a record!
begin begin
IF NOT c_get_logo%ISOPEN THEN IF NOT c_get_logo%ISOPEN THEN
OPEN c_get_logo('quote_logo.jpg'); OPEN c_get_logo('quote_logo.jpg');
@@ -1209,6 +1280,42 @@ CREATE OR REPLACE PACKAGE BODY mip_quotation_document IS
FETCH c_get_enty FETCH c_get_enty
INTO l_enty_code; INTO l_enty_code;
CLOSE c_get_enty; CLOSE c_get_enty;
--Get all the caveats
--Description of works caveats
/* IF NOT c_get_caveats%ISOPEN THEN
OPEN c_get_caveats(l_enty_code, p_quote_data.mety_code, p_quote_data.svcpt_code, 'DESC_WORK');
END IF;*/
l_rec_counter := 1;
for rec in c_get_caveats(l_enty_code, p_quote_data.mety_code, p_quote_data.svcpt_code, 'DESC_WORK')
loop
l_caveat_texts(l_rec_counter) := rec.text;
l_rec_counter := l_rec_counter +1;
end loop;
/* FETCH c_get_caveats
INTO l_desc_work_row;
CLOSE c_get_caveats;
--Terms and Conditions
IF NOT c_get_caveats%ISOPEN THEN
OPEN c_get_caveats(l_enty_code, p_quote_data.mety_code,p_quote_data.svcpt_code,'DESC_WORK');
END IF;
FETCH c_get_caveats
INTO l_term_cond_row;
CLOSE c_get_caveats;
--Contract Sum
IF NOT c_get_caveats%ISOPEN THEN
OPEN c_get_caveats(l_enty_code, p_quote_data.mety_code,p_quote_data.svcpt_code,'CONT_SUM');
END IF;
FETCH c_get_caveats
INTO l_cont_sum_row;
CLOSE c_get_caveats;
--Contract Sum Quote Acceptance
IF NOT c_get_caveats%ISOPEN THEN
OPEN c_get_caveats(l_enty_code, p_quote_data.mety_code,p_quote_data.svcpt_code,'CONT_SUM_QA');
END IF;
FETCH c_get_caveats
INTO l_cont_sum_qa_row;
CLOSE c_get_caveats; */
--get the quote diagrams --get the quote diagrams
l_base_blob := get_drawing(p_quote_data.base_diagram); l_base_blob := get_drawing(p_quote_data.base_diagram);
l_house_blob := get_drawing(p_quote_data.house_diagram); l_house_blob := get_drawing(p_quote_data.house_diagram);
@@ -1217,7 +1324,7 @@ CREATE OR REPLACE PACKAGE BODY mip_quotation_document IS
plpdf.init; plpdf.init;
--build the pages for the quote --build the pages for the quote
build_covering_letter(p_quote_data,l_font,l_indent,l_vertical_offset,l_logo_blob, l_signature_blob);--1 build_covering_letter(p_quote_data,l_font,l_indent,l_vertical_offset,l_logo_blob, l_signature_blob);--1
build_costs_page(p_quote_data,l_font,l_indent,l_vertical_offset); --2 build_costs_page(p_quote_data,l_font,l_indent,l_vertical_offset, l_caveat_texts); --2
build_caveats_page(p_quote_data,l_font,l_indent,l_vertical_offset); --3 build_caveats_page(p_quote_data,l_font,l_indent,l_vertical_offset); --3
--OFMAT, Addon jobs don't have module diagrams --OFMAT, Addon jobs don't have module diagrams
if not (l_enty_code = 'OFMAT' or l_enty_code = 'AMR' or l_enty_code = 'EMS') then if not (l_enty_code = 'OFMAT' or l_enty_code = 'AMR' or l_enty_code = 'EMS') then