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 <TypeName> is <Datatype>;
  type caveat_text is varray(20) of varchar2(4000);
  type img_props is record(width number,
                           height number);
  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 := address(null,null,null,null,null,null,null),
     current_date DATE,
     agent_first_name varchar2(80),
     site_address address := address(null,null,null,null,null,null,null),
     mam varchar2(80),
     quote_works works := works(null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null),
     caveat_desc_works caveat_text:= caveat_text(null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null),
     lead_time number,
     total_cost number,
     caveat_cont_sum caveat_text:= caveat_text(null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null),
     quote_costs costs := costs(null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null),
     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,
     caveat_term_cond caveat_text:= caveat_text(null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null),
     liquid_damage_day number,
     liquid_damage_cap number,
     base_dimensions dimensions := dimensions(null,null,null,null,null,null,null,null,null,null),
     base_diagram varchar2(80),
     house_dimensions dimensions := dimensions(null,null,null,null,null,null,null,null,null,null),
     house_diagram varchar2(80),
     module_dimensions dimensions := dimensions(null,null,null,null,null,null,null,null,null,null),
     module_reference varchar2(80),
     module_diagram varchar2(80),
     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),
     meter_reference varchar(80),
     caveat_cont_sum_qa caveat_text:= caveat_text(null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null),
     mety_code varchar(80),
     svcpt_code varchar(10)
    );

  FUNCTION generate_quote_pdf(p_quote_id in number) RETURN VARCHAR2;   

END mip_quotation_document;
/
CREATE OR REPLACE PACKAGE BODY mip_quotation_document IS
  /*
   PROCEDURE print_caveats
   --Prints the supplied caveats to the current PLPDF page
   %param p_caveats -  an array of caveat paragraphs to print
   %param p_vertical_offset -  how far down the page we start printing
   %param p_line_spacing - the line spacing to use, defaults to 4
  */ 
  procedure print_caveats(p_caveats in caveat_text, p_vertical_offset in number, p_line_spacing in number :=4) is
    l_caveats_counter number;
    l_cell_margin number;
  begin
    --set up the screen so we can have our size 4 spacing
    l_cell_margin:= plpdf.GetCellMargin;
    plpdf.SetLeftMargin(33.7);
    plpdf.SetCellMargin(-2);
    plpdf.SetCurrentY(p_vertical_offset);
    
    l_caveats_counter :=1;
    while p_caveats(l_caveats_counter) is not null 
    loop
      plpdf.PrintFlowingText(p_line_spacing, p_caveats(l_caveats_counter));
      plpdf.LineBreak;  
      plpdf.LineBreak;   
      l_caveats_counter := l_caveats_counter +1;
    end loop;
    
    --revert back to the original screen settings
    plpdf.SetCellMargin(l_cell_margin);
    plpdf.SetLeftMargin(31.7);        
  end print_caveats; 
  /*
   FUNCTION scale_image_dimensions
   --The scale_image_dimensions provides the width and height of an image to
   --correctly scale into a specified size. 
   %param p_req_width -  The maximum width required for the image
   %param p_req_height -  The maximum height required for the image
   %param p_image_blob - The image we may need to scale down
   %return img_props - the new width and height of the image
  */ 
  function scale_image_dimensions(p_req_width in number, p_req_height in number, p_image_blob in blob) return img_props is
    l_new_width number;
    l_ratio number;
    l_new_height number;
    l_cur_width number;
    l_image_props plpdf_type.t_imageprops;
    l_new_dimensions img_props;
  begin
    --Get the properties for the image from plpdf
    l_image_props:=plpdf_img.getimageprops(p_image_blob);
    --if the image is too high cut it down to the limit and record the ratio
    --and cutting the width by the recored ratio 
    if l_image_props.height > p_req_height then
      l_new_height := p_req_height;
      l_ratio := l_image_props.height/p_req_height;
      l_cur_width := l_image_props.width/l_ratio;
    else
      l_new_height := l_image_props.height;
      l_cur_width := l_image_props.width;
    end if;
    --if it's too wide then cut it down to the limit and record the ratio
    --and cutting the height by the recored ratio 
    if l_cur_width > p_req_width then
      l_new_width := p_req_width;
      l_ratio := l_cur_width/p_req_width;
      l_new_height := l_new_height/l_ratio;
    else
      l_new_width := l_cur_width;
    end if;
    l_new_dimensions.width := l_new_width;
    l_new_dimensions.height := l_new_height;
    return l_new_dimensions;
  end scale_image_dimensions;
  
  /*
   FUNCTION get_drawing
   --The get_drawing function returns a blob of the drawing code 
   %param p_drwg_code - the code of the drawing you want the blob of.
   %return blob the drawing image
  */  
  function get_drawing(p_drwg_code varchar2) return blob is
    l_blob blob;
    CURSOR c_get_drawing(cp_drwg varchar2) IS
    SELECT blob_content
    FROM wwv_flow_files
    WHERE name = (SELECT uri
                  FROM documents
                  WHERE (SELECT docu_id
                         FROM document_roles
                         WHERE cp_drwg = drwg_code)=id);
  begin
   IF NOT c_get_drawing%ISOPEN THEN
      OPEN c_get_drawing(p_drwg_code);
    END IF;
    FETCH c_get_drawing
      INTO l_blob;
    CLOSE c_get_drawing;
    return l_blob;
  end get_drawing;
  /*
   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 quotation_text
      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_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
   --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 varchar2) 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_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
      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
   --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
      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
   --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;
  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
   --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)
    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_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
   --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;
    
  begin
  
  SELECT SUM(selling_price + nvl(delivery_price,0))
  into l_quote_total_cost
    FROM quote_items
    WHERE qute_id = p_quoteid and not (quit_type = 'AQI' and adit_code in ('LIFTING GEAR','PURGING'));
  
    return l_quote_total_cost;
  end get_total_cost;  
  
  /*
   PROCEDURE set_quote_items
   --This procedure sets the data for each of the items associated with the quotation.
   %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;
  CURSOR c_get_enquiry_type(cp_enty_code varchar2) IS
    SELECT *
    FROM enquiry_types
    WHERE code = cp_enty_code;
  --Quote Items
  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 := works(null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null); --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_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;
  l_service_pressure varchar2(80);   --these three used to determine whether to set 
  l_meter_type varchar2(80); --the lifting gear item or not 
  l_enqu_type varchar2(80);
  begin
  
    --get the meter type, pressure and job type so we can
    --determine whether to display the lifting gear cost line or not
    FOR quote_item_rec IN c_get_quote_item(p_quoteid) LOOP
     if quote_item_rec.quit_type = 'LQI' then
      l_service_pressure := quote_item_rec.svcpt_code;
      l_meter_type := quote_item_rec.mety_code;
      l_enqu_type := quote_item_rec.enty_code;
     end if;
    end loop;      
 
    --cycle through the quote items picking up each item to store in the
    --p_quote_data record
    l_counter := 0;
    FOR quote_item_rec IN c_get_quote_item(p_quoteid) LOOP
      --get the meter type, pressure and job type so we can
      --determine whether to display the lifting gear cost line or not
      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
            l_counter:=l_counter +1;
            p_quote_data.quote_costs(l_counter).cost_description := 'Base Delivery cost';
            p_quote_data.quote_costs(l_counter).cost_price := quote_item_rec.delivery_price;             
          end if;
          --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;
          p_quote_data.base_diagram := l_base_row.drwg_code;
        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
            l_counter:=l_counter +1;
            p_quote_data.quote_costs(l_counter).cost_description := 'Housing Delivery cost';
            p_quote_data.quote_costs(l_counter).cost_price := quote_item_rec.delivery_price;             
          end if;    
          --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;
          p_quote_data.house_diagram := l_housing_row.drwg_code;
       
        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);
          if quote_item_rec.adit_code = 'LIFTING GEAR' then
            if l_service_pressure = 'LP' and l_meter_type = 'DIAPHRAGM' and (l_enqu_type = 'INSTALL' or l_enqu_type = 'STD INSTALL') then 
              null;
            else
              p_quote_data.quote_costs(l_counter).cost_description := l_add_item_row.description;
              p_quote_data.quote_costs(l_counter).cost_price := quote_item_rec.selling_price;   
            end if;
          else
            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;          
          end if;
          if not(quote_item_rec.delivery_price is null) then
            l_counter:=l_counter +1;
            p_quote_data.quote_costs(l_counter).cost_description := l_add_item_row.description||' Delivery 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, but don't add lifting gear
          if quote_item_rec.adit_code <> 'LIFTING GEAR' then
            l_addons := l_addons || ', '||l_add_item_row.description;
          end if;          
        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
            l_counter:=l_counter +1;
            p_quote_data.quote_costs(l_counter).cost_description := 'Module Delivery 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 || ' ' || p_quote_data.meter_reference;
          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.meter_reference := l_module_row.metr_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;
          p_quote_data.module_diagram := l_module_row.drwg_code;
          --get meters qmax/qmin tech specs     
          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;
          p_quote_data.mety_code := l_meter_row.mety_code;
          --get the min base details for this module
          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_depth := l_base_row.dim_b;
          p_quote_data.base_height := l_base_row.depth;
          --get the min housing details for this module
          l_housing_row := get_housing_row(l_module_row.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 'LQI' then --Labour cost
          --get costs
          p_quote_data.quote_costs(l_counter).cost_description := 'Labour Costs';
          p_quote_data.quote_costs(l_counter).cost_price := quote_item_rec.selling_price;           
          if not(quote_item_rec.delivery_price is null) then
            l_counter:=l_counter +1;
            p_quote_data.quote_costs(l_counter).cost_description := 'Labour Delivery cost';
            p_quote_data.quote_costs(l_counter).cost_price := quote_item_rec.delivery_price;             
          end if; 
         
      end case;    
          
      --get existing meter if appropriate
      if quote_item_rec.enty_code is not null 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.existing_mety_code||', MSN: '||p_enqu_row.existing_meter_serial_no ;
        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.existing_mety_code;
        end if;
        if  quote_item_rec.enty_code <> 'OFMAT' and quote_item_rec.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 if;
        
    END LOOP;
    --get type of enquiry to display as works type
    IF NOT c_get_enquiry_type%ISOPEN THEN
      OPEN c_get_enquiry_type(l_enqu_type );
    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: '|| l_service_pressure;
    --
    --add up all the addons and format the string
    if l_addons is not null then
      l_works(4) := 'Add-Ons: '|| ltrim(l_addons, ',');
    end if;
    p_quote_data.quote_works := l_works;  
    
    --get caveats
    
  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; 
  --Enquiry data
  l_enquiry_id number;
  l_enqu_row enquiries%ROWTYPE;
  --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;    
  --Party name
  l_party_row parties%ROWTYPE;
  CURSOR c_get_party(cp_party_id number) IS
    SELECT *
    FROM parties
    WHERE id = cp_party_id;
  --The caveats
  CURSOR c_get_caveats(cp_enty_code varchar2, cp_mety_code varchar2, cp_svcpt_code 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  
    order by 1,2,3,4,5;
  --Agent Name
  l_agent_first_name varchar2(80);
  l_agent_last_name varchar2(80);
  --suppler name
  l_supplier_name varchar2(80);
  --caveat counters
  l_dw_counter number;
  l_tc_counter number;
  l_cs_counter number;
  l_csqa_counter number;

  begin
    --get the quote's data record
    l_quote_row := get_quote_row(p_quoteid);
    
    --get the enquiry data 
    l_enquiry_id := l_quote_row.enqu_id;  
    l_enqu_row := get_enquiry_row(l_enquiry_id);

    --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_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;
    --need get the mam
    l_quote_data.mam := get_mam(mip_regions.get_region_for_postcode(l_enqu_row.install_postcode));
    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.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
    set_quote_items_data(l_quote_data, l_quote_row.id,l_enqu_row);
    --get caveats
    l_dw_counter := 1;
    l_tc_counter := 1;
    l_cs_counter := 1;
    l_csqa_counter := 1;
    for rec in c_get_caveats(l_enqu_row.enty_code, l_quote_data.mety_code, l_quote_data.svcpt_code)
    loop
      case rec.document_position
        when 'TERM_COND' then --terms and conditions/specialfeatures caveat point 
          l_quote_data.caveat_term_cond(l_tc_counter) := rec.text; 
          l_tc_counter := l_tc_counter +1;
        when 'DESC_WORK' then --description of works caveat point 
          l_quote_data.caveat_desc_works(l_dw_counter) := rec.text; 
          l_dw_counter := l_dw_counter +1;
        when 'CONT_SUM' then --description of works caveat point 
          l_quote_data.caveat_cont_sum(l_cs_counter) := rec.text; 
          l_cs_counter := l_cs_counter +1;          
        when 'CONT_SUM_QA' then --description of works caveat point 
          l_quote_data.caveat_cont_sum_qa(l_csqa_counter) := rec.text; 
          l_csqa_counter := l_csqa_counter +1;            
      end case;   
    end loop;
    --phew, lets return all that lovely data we captured then...    
    return l_quote_data;
  end get_detailed_quote_data; 
  /*
   PROCEDURE build_covering_letter
   --This procedure builds the covering letter for the quotation, it writes data
   --to an existing plpdf document
   %param p_quote_data in - The current data for this quote
   %param p_font - the type of font to use - typically 'Arial'.
   %param p_indent - the left margin measurement.
   %param p_vertical_offset - the top margin measurement. 
   %param p_logo_blob - the logo(image) to display at the top of the page
   %param p_signature_blob  - the signature(image) to display at the bottom of the page
  */  
  PROCEDURE build_covering_letter(p_quote_data in quote_data, p_font in varchar2, p_indent in number, p_vertical_offset in number,p_logo_blob blob,p_signature_blob blob,p_watermark_blob blob) is
    l_note_text varchar2(500);
    l_cell_margin number;
  begin
    plpdf.NewPage;
    --set watermark if it exists
    if p_watermark_blob is not null then
      plpdf.PutImage('test watermark',p_watermark_blob,50,50,200,200);
    end if;
    -- set margins
    plpdf.SetLeftMargin(31.7);
    plpdf.SetRightMargin(31.7);
    plpdf.SetTopMargin(25.4);

    plpdf.SetPrintFont(p_font,null,7);  
    -- Set header stuff up
    plpdf.PutImage('ngmlogo',p_logo_blob,p_indent,10,52,18);
    plpdf.PrintText(140,10,'4 Abbotts Lane ');
    plpdf.PrintText(140,13,'Coventry');
    plpdf.PrintText(140,16,'CV1 4AY');
    plpdf.PrintText(170,10,'T +44 (0) 24 7628 6000');  
    plpdf.PrintText(170,13,'F +44 (0) 24 7628 6022');
    plpdf.PrintText(170,16,'www.nationalgrid.com');  
    -- And Footer stuff
    plpdf.PrintText(50,280,'National Grid Metering is the trading name for National Grid Metering Ltd.');
    plpdf.PrintText(50,283,'Registered Office: 1-3 Strand, London, WCZN 5EH. Registered in England and Wales, No. 3705992');  
    plpdf.SetPrintFont(p_font,null,10); -- set back to 10 pt
    plpdf.PrintText(p_indent,p_vertical_offset+10,'National Grid Metering''s Ref: '|| to_char(p_quote_data.quote_ref));
    plpdf.PrintText(p_indent,p_vertical_offset+14,'Customer Reference: '|| p_quote_data.transaction_ref);
    plpdf.PrintText(p_indent,p_vertical_offset+18,'MPRN: '|| to_char(p_quote_data.mprn));
    plpdf.PrintText(p_indent,p_vertical_offset+26,p_quote_data.supplier_address(1));
    plpdf.PrintText(p_indent,p_vertical_offset+30,p_quote_data.supplier_address(2));
    plpdf.PrintText(p_indent,p_vertical_offset+34,p_quote_data.supplier_address(3));
    plpdf.PrintText(p_indent,p_vertical_offset+38,p_quote_data.supplier_address(4));
    plpdf.PrintText(p_indent,p_vertical_offset+42,p_quote_data.supplier_address(5));
    plpdf.PrintText(p_indent,p_vertical_offset+46,p_quote_data.supplier_address(6));
    plpdf.PrintText(p_indent,p_vertical_offset+50,p_quote_data.supplier_address(7));
    plpdf.PrintText(p_indent,p_vertical_offset+58,'Date: '||p_quote_data.current_date);
    plpdf.PrintText(p_indent,p_vertical_offset+66,'Quotation Contact: Non Standard Customer Service Team');
    plpdf.PrintText(p_indent,p_vertical_offset+70,'Mailbox ; ic.nonstandard1@uk.ngrid.com');
    plpdf.PrintText(p_indent,p_vertical_offset+74,'Hunt Group 02476 286322');
    plpdf.PrintText(p_indent,p_vertical_offset+78,'Fax 02476 286044');        
    plpdf.PrintText(p_indent,p_vertical_offset+90,'Dear '|| p_quote_data.agent_first_name); --agent first name
    plpdf.SetPrintFont(p_font,'B',10); --set bold
    plpdf.PrintText(p_indent,p_vertical_offset+98,'Re: '||rtrim(ltrim(p_quote_data.site_address(1)||', '||p_quote_data.site_address(2)||', '||p_quote_data.site_address(3)||', '||p_quote_data.site_address(4)||', '||p_quote_data.site_address(5)||', '||p_quote_data.site_address(6)||', '||p_quote_data.site_address(7),', '),', ')); --site address  
    l_note_text := 'Note: National Grid Metering are a service provider working on behalf of ';
    l_note_text := l_note_text || p_quote_data.mam;--mam
    l_note_text := l_note_text || ', please direct all enquiries regarding this quote to National Grid Metering.';   
    l_cell_margin:= plpdf.GetCellMargin;
    plpdf.SetLeftMargin(33.7);
    plpdf.SetCellMargin(-2);
    plpdf.SetCurrentY(p_vertical_offset+106);
    plpdf.PrintFlowingText(4,l_note_text);     
    plpdf.LineBreak;
    plpdf.LineBreak;
    plpdf.SetPrintFont(p_font,null,10); --unset bold
    plpdf.PrintFlowingText(4,'I am pleased to provide you with a quotation for works ');
    plpdf.SetPrintFont(p_font,'B',10); --set bold
    plpdf.PrintFlowingText(4,'    on behalf of '||p_quote_data.mam);
    plpdf.SetPrintFont(p_font,null,10); --unset bold
    plpdf.PrintFlowingText(4,'     and in accordance with their General Conditions of Contract for Transactional Meter Works Not Exceeding 7 Bar.');
    plpdf.SetPrintFont(p_font,'B',10); --set bold
    plpdf.PrintFlowingText(4,'     Please note, if you accept this quotation you are agreeing to be bound by the terms of the '||p_quote_data.mam||' and General Conditions of Contract for Transactional Meter Works Not Exceeding 7 Bar, and all subsequent work will be performed in accordance with that contract.');
    plpdf.SetCellMargin(l_cell_margin);
    plpdf.SetLeftMargin(31.7);   
    plpdf.SetPrintFont(p_font,null,10); --unset bold         
    plpdf.PrintText(p_indent,p_vertical_offset+148,'This quotation is produced on the basis that, the information provided in the request is correct.');
    plpdf.PrintText(p_indent,p_vertical_offset+152,'Your acceptance of the quotation will be taken to mean that you also accept that the stated');
    plpdf.PrintText(p_indent,p_vertical_offset+156,'assumptions are correct. If it is later determined, by either party prior to works commencing on');
    plpdf.PrintText(p_indent,p_vertical_offset+160,'site, that any stated assumption is significantly incorrect, National Grid Metering will determine');
    plpdf.PrintText(p_indent,p_vertical_offset+164,'whether the quotation shall be varied or withdrawn. Works will only then commence if any');
    plpdf.PrintText(p_indent,p_vertical_offset+168,'variation is agreed in line with the relevant General Conditions of Contract.');
    --
    plpdf.PrintText(p_indent,p_vertical_offset+176,'To accept the quotation please submit a work request via IX, as outlined in the Rainbow Manual,');
    plpdf.PrintText(p_indent,p_vertical_offset+180,'or complete the enclosed Acceptance Form and return it to the above National Grid Metering''');
    plpdf.PrintText(p_indent,p_vertical_offset+184,'office.');    
    --
    plpdf.PrintText(p_indent,p_vertical_offset+192,'Please note that this quotation is valid for 90 days from the date specified in the quotation.');    
    plpdf.PrintText(p_indent,p_vertical_offset+196,'Please use National Grid Metering''s Reference, which is at the top of the letter, on any future');    
    plpdf.PrintText(p_indent,p_vertical_offset+200,'correspondence relating to this request.');    
    --
    plpdf.PrintText(p_indent,p_vertical_offset+208,'If you have any queries, please contact the team on the number above.');
    plpdf.PrintText(p_indent,p_vertical_offset+216,'Yours sincerely');
    --put on daves signature
    plpdf.PutImage('dhsignature',p_signature_blob,p_indent,248,44,11);    
    plpdf.PrintText(p_indent,p_vertical_offset+234,'David Harper');
    plpdf.PrintText(p_indent,p_vertical_offset+238,'I&C Technical Manager');  
    plpdf.PrintText(p_indent,p_vertical_offset+242,'National Grid Metering');  
  end build_covering_letter;
  /*
   PROCEDURE build_costs_page
   --This procedure builds the costs page for the quotation, it writes data
   --to an existing plpdf document
   %param p_quote_data in - The current data for this quote
   %param p_font - the type of font to use - typically 'Arial'.
   %param p_indent - the left 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,p_watermark_blob blob) is
    l_cost_line_counter number;
    l_vertical_offset_for_costs number := p_vertical_offset+126;
    l_works_counter number;
    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_caveat_desc_works_offset number; --used to position caveat_desc_works as running calculation in 
                                       --function parameter causes error on pdf
  begin
    --Page 2
    plpdf.NewPage;
    --set watermark if it exists
    if p_watermark_blob is not null then
      plpdf.PutImage('test watermark',p_watermark_blob,50,50,200,200);
    end if;
    -- set margins
    plpdf.SetLeftMargin(31.7);
    plpdf.SetRightMargin(31.7);
    plpdf.SetTopMargin(25.4);
    plpdf.SetPrintFont(p_font,'B',10); --set bold    
    plpdf.PrintText(p_indent,p_vertical_offset+10,'QUOTATION');
    plpdf.SetPrintFont(p_font,null,10); --unset bold
    plpdf.PrintText(p_indent,p_vertical_offset+18,'National Grid Metering''s Ref: '|| to_char(p_quote_data.quote_ref));
    plpdf.PrintText(p_indent,p_vertical_offset+22,'Customer Reference: '|| p_quote_data.transaction_ref);
    plpdf.PrintText(p_indent,p_vertical_offset+26,'MPRN: '|| to_char(p_quote_data.mprn));
    plpdf.PrintText(p_indent,p_vertical_offset+30,'Date: '||p_quote_data.current_date);
    plpdf.SetPrintFont(p_font,'B',10); --set bold
    plpdf.PrintText(p_indent,p_vertical_offset+38,'Re: '||rtrim(ltrim(p_quote_data.site_address(1)||', '||p_quote_data.site_address(2)||', '||p_quote_data.site_address(3)||', '||p_quote_data.site_address(4)||', '||p_quote_data.site_address(5)||', '||p_quote_data.site_address(6)||', '||p_quote_data.site_address(7),', '),', ')); --site address  
    plpdf.SetPrintFont(p_font,'U',10); --set underline  
    plpdf.PrintText(p_indent,p_vertical_offset+48,'Full Description of Works to be carried out by National Grid Metering:');
    plpdf.SetPrintFont(p_font,'B',10); --set bold
    l_works_counter := p_quote_data.quote_works.first; 
    loop 
    exit when l_works_counter is null;
      if p_quote_data.quote_works(l_works_counter) is not null then 
        plpdf.PrintText(p_indent,l_vertical_offset_for_works+(l_works_counter*4), p_quote_data.quote_works(l_works_counter));        
        l_caveat_desc_works_offset := l_vertical_offset_for_works+(l_works_counter*4);
      end if;
      l_works_counter := p_quote_data.quote_works.next(l_works_counter);
    end loop;
    -- DESC_WORK caveat here
    if p_quote_data.caveat_desc_works is not null then
     -- print_caveats(p_quote_data.caveat_desc_works, l_vertical_offset_for_works+(l_works_counter*4));
      print_caveats(p_quote_data.caveat_desc_works, l_caveat_desc_works_offset+1);

    end if;
    plpdf.SetPrintFont(p_font,null,10); --unset bold 
    plpdf.PrintText(p_indent,p_vertical_offset+106, 'Indicative Lead Time from Acceptance to Physical Commencement: ');                       
    plpdf.SetPrintFont(p_font,'B',10); --set bold
    plpdf.PrintText(140,p_vertical_offset+106, p_quote_data.lead_time||' working days');
    plpdf.SetPrintFont(p_font,null,10); --unset bold     
    plpdf.PrintText(p_indent,p_vertical_offset+114,'Contract sum (excluding V.A.T): ');
    plpdf.SetPrintFont(p_font,'B',10); --set bold    
    plpdf.PrintText(85,p_vertical_offset+114,'£'||to_char(p_quote_data.total_cost,'FM999999D90'));
    -- CONT_SUM caveat here
    if p_quote_data.caveat_cont_sum is not null then
      print_caveats(p_quote_data.caveat_cont_sum, p_vertical_offset+118);
    end if;    
    plpdf.SetPrintFont(p_font,null,10); --unset bold     
    plpdf.PrintText(p_indent,p_vertical_offset+122,'Analysis of Costs (all costs exclude V.A.T)');     
    plpdf.SetPrintFont(p_font,'B',10); --set bold 
    l_cost_line_counter:=1;
    while  p_quote_data.quote_costs(l_cost_line_counter).cost_description is not null
    loop
      plpdf.PrintText(p_indent,l_vertical_offset_for_costs+l_cost_line_counter*4,p_quote_data.quote_costs(l_cost_line_counter).cost_description);                 
      plpdf.PrintText(120,l_vertical_offset_for_costs+l_cost_line_counter*4,'£'||to_char(p_quote_data.quote_costs(l_cost_line_counter).cost_price,'FM999999D90')); 
      l_cost_line_counter := l_cost_line_counter +1;
    end loop;
    l_cost_totals_offset := l_vertical_offset_for_costs+l_cost_line_counter*4;
    plpdf.DrawLine(p_indent,l_cost_totals_offset+2,185,l_cost_totals_offset+2);
    plpdf.PrintText(p_indent,l_cost_totals_offset+6,'Total costs:');
    plpdf.PrintText(120,l_cost_totals_offset+6,'£'||to_char(p_quote_data.total_cost,'FM999999D90')||' excluding lifting gear if required');       
  end build_costs_page;
  /*
   PROCEDURE build_caveats_page
   --This procedure builds the caveats page for the quotation, it writes data
   --to an existing plpdf document
   %param p_quote_data in - The current data for this quote
   %param p_font - the type of font to use - typically 'Arial'.
   %param p_indent - the left margin measurement.
   %param p_vertical_offset - the top margin measurement.   
  */  
  PROCEDURE build_caveats_page(p_quote_data in quote_data, p_font in varchar2, p_indent in number, p_vertical_offset in number,p_watermark_blob blob, p_logger_caveat_required in boolean) is
  l_cell_margin number;
  begin
    --Page 3
    plpdf.NewPage;
    --set watermark if it exists
    if p_watermark_blob is not null then
      plpdf.PutImage('test watermark',p_watermark_blob,50,50,200,200);
    end if;    
    -- set margins
    plpdf.SetLeftMargin(31.7);
    plpdf.SetRightMargin(31.7);
    plpdf.SetTopMargin(25.4);
    plpdf.SetPrintFont(p_font,null,10); --set font to plain
    --house
    plpdf.PrintText(p_indent,p_vertical_offset+10,'Meter Housing Details (if required):');
    plpdf.PrintText(p_indent,p_vertical_offset+18,'Length: '||p_quote_data.house_length||' mm');
    plpdf.PrintText(p_indent+40,p_vertical_offset+18,'Depth: '||p_quote_data.house_depth||' mm');    
    plpdf.PrintText(p_indent+80,p_vertical_offset+18,'Height: '||p_quote_data.house_height||' mm');
    --plpdf.PrintText(p_indent,p_vertical_offset+26,'Minimum Ventilation: '||p_quote_data.house_ventilation/10||' sq. cm');                
    --base
    plpdf.PrintText(p_indent,p_vertical_offset+34,'Meter Housing Base (if required):');
    plpdf.PrintText(p_indent,p_vertical_offset+42,'Length: '||p_quote_data.base_length||' mm');
    plpdf.PrintText(p_indent+40,p_vertical_offset+42,'Depth: '||p_quote_data.base_depth||' mm');    
    plpdf.PrintText(p_indent+80,p_vertical_offset+42,'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,'Special Features/Terms/Conditions:');
    plpdf.SetPrintFont(p_font,'B',10); --set bold 
    -- TERM_COND caveat here
    if p_quote_data.caveat_term_cond is not null then 
      print_caveats(p_quote_data.caveat_term_cond, p_vertical_offset+62);
    end if;
    if p_logger_caveat_required then
      --set up the screen so we can have our size 4 spacing
      l_cell_margin:= plpdf.GetCellMargin;
      plpdf.SetLeftMargin(33.7);
      plpdf.SetCellMargin(-2);
      plpdf.PrintFlowingText(4, 'This quote does not include the removal of the Datalogger. Please make the necessary arrangements with the Gas Transporter.');
      --revert back to the original screen settings
      plpdf.SetCellMargin(l_cell_margin);
      plpdf.SetLeftMargin(31.7);
    end if;       
      
    --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)    
    plpdf.SetPrintFont(p_font,null,10); --unset bold
    plpdf.PrintText(p_indent,p_vertical_offset+230,'Liquidated Damages (sum per day)(excluding V.A.T):');
    plpdf.PrintText(130,p_vertical_offset+230,'£'||to_char(p_quote_data.liquid_damage_day,'FM999999D90'));
    plpdf.PrintText(p_indent,p_vertical_offset+238,'Liquidated Damages (monetary cap)(excluding V.A.T):');         
    plpdf.PrintText(130,p_vertical_offset+238,'£'||to_char(p_quote_data.liquid_damage_cap,'FM999999D90'));

  end build_caveats_page;
  /*
   PROCEDURE build_drawings_page
   --This procedure builds the drawings page for the quotation, it writes data
   --to an existing plpdf document
   %param p_quote_data in - The current data for this quote
   %param p_font - the type of font to use - typically 'Arial'.
   %param p_indent - the left margin measurement.
   %param p_vertical_offset - the top margin measurement.   
   %param p_base_blob - the image of the base 
   %param p_house_blob - the image of the house 
   %param p_module_blob - the image of the module 
  */    
  PROCEDURE build_drawings_page(p_quote_data in quote_data, p_font in varchar2, p_indent in number, p_vertical_offset in number, p_base_blob blob, p_house_blob blob, p_module_blob blob,p_watermark_blob blob) is
   l_img_props img_props;
  begin
    --Okay here come the pretty pictures, the technical spec for the module, house & base
    --this will be page 4 for the quotation
    plpdf.NewPage;
    --set watermark if it exists
    if p_watermark_blob is not null then
      plpdf.PutImage('test watermark',p_watermark_blob,50,50,200,200);
    end if;
    -- set margins
    plpdf.SetLeftMargin(31.7);
    plpdf.SetRightMargin(31.7);
    plpdf.SetTopMargin(25.4);
    plpdf.SetPrintFont(p_font,'B',18); --set bold and 18pt
    plpdf.PrintText(p_indent,p_vertical_offset,'Technical Specification for '||p_quote_data.quote_ref);
    plpdf.SetPrintFont(p_font,'B',10); --set back to 10pt
    plpdf.PrintText(p_indent,p_vertical_offset+6,'Re: '||rtrim(ltrim(p_quote_data.site_address(1)||', '||p_quote_data.site_address(2)||', '||p_quote_data.site_address(3)||', '||p_quote_data.site_address(4)||', '||p_quote_data.site_address(5)||', '||p_quote_data.site_address(6)||', '||p_quote_data.site_address(7),', '),', ')); --site address     --Base Details
    --Base Details
    plpdf.SetPrintFont(p_font,'BU',12); --set bold,underline and 12pt
    plpdf.PrintText(p_indent,p_vertical_offset+12,'Floor Area/Base Requirements');
    plpdf.SetPrintFont(p_font,null,10); --set back to 10pt plain    
    plpdf.SetCurrentXY(p_indent,p_vertical_offset+25);    
    plpdf.PrintCell(15,6,'Depth:',1,0,'L',0);
    plpdf.PrintCell(15,6,p_quote_data.base_dimensions(1),1,1,'R',0);    
    plpdf.PrintCell(15,6,'Dim A:',1,0,'L',0);
    plpdf.PrintCell(15,6,p_quote_data.base_dimensions(2),1,1,'R',0);
    plpdf.PrintCell(15,6,'Dim B:',1,0,'L',0);
    plpdf.PrintCell(15,6,p_quote_data.base_dimensions(3),1,1,'R',0);      
    plpdf.PrintCell(15,6,'Dim C:',1,0,'L',0);
    plpdf.PrintCell(15,6,p_quote_data.base_dimensions(4),1,1,'R',0); 
    plpdf.PrintCell(15,6,'Dim D:',1,0,'L',0);
    plpdf.PrintCell(15,6,p_quote_data.base_dimensions(5),1,1,'R',0);
    plpdf.PrintCell(15,6,'Dim E:',1,0,'L',0);
    plpdf.PrintCell(15,6,p_quote_data.base_dimensions(6),1,1,'R',0); 
    plpdf.PrintCell(15,6,'Dim F:',1,0,'L',0);
    plpdf.PrintCell(15,6,p_quote_data.base_dimensions(7),1,1,'R',0);
    plpdf.PrintCell(15,6,'Dim G:',1,0,'L',0);
    plpdf.PrintCell(15,6,p_quote_data.base_dimensions(8),1,1,'R',0); 
    plpdf.PrintCell(15,6,'Dim H:',1,0,'L',0);
    plpdf.PrintCell(15,6,p_quote_data.base_dimensions(9),1,1,'R',0);    
    plpdf.PrintCell(15,6,'Dim I:',1,0,'L',0);
    plpdf.PrintCell(15,6,p_quote_data.base_dimensions(10),1,1,'R',0); 
    if p_base_blob is null then
      plpdf.PrintText(p_indent+50,p_vertical_offset+50,'No Base Diagram Available');
    else
      l_img_props := scale_image_dimensions(100, 60, p_base_blob );
      plpdf.PutImage('base',p_base_blob,p_indent+50,p_vertical_offset+25,l_img_props.width,l_img_props.height);
    end if;
    --House Details
    plpdf.SetPrintFont(p_font,'BU',12); --set bold,underline and 12pt
    plpdf.PrintText(p_indent,p_vertical_offset+100,'Housing / Work Area');
    plpdf.SetPrintFont(p_font,null,10); --set back to 10pt plain    
    plpdf.SetCurrentXY(p_indent,p_vertical_offset+108);    
    plpdf.PrintCell(15,6,'Length:',1,0,'L',0);
    plpdf.PrintCell(15,6,p_quote_data.house_dimensions(1),1,1,'R',0);    
    plpdf.PrintCell(15,6,'Width:',1,0,'L',0);
    plpdf.PrintCell(15,6,p_quote_data.house_dimensions(2),1,1,'R',0);
    plpdf.PrintCell(15,6,'Height:',1,0,'L',0);
    plpdf.PrintCell(15,6,p_quote_data.house_dimensions(3),1,1,'R',0);      
    plpdf.PrintCell(15,6,'Weight:',1,0,'L',0);
    plpdf.PrintCell(15,6,p_quote_data.house_dimensions(4),1,1,'R',0);
    if p_house_blob is null then
      plpdf.PrintText(p_indent+50,p_vertical_offset+132,'No Housing Diagram Available');
    else
      
      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;
    --Module details    
    plpdf.SetPrintFont(p_font,'BU',12); --set bold,underline and 12pt
    plpdf.PrintText(p_indent,p_vertical_offset+168,'Module Dimensions');
    plpdf.SetPrintFont(p_font,null,10); --set back to 10pt plain    
    plpdf.SetCurrentXY(p_indent,p_vertical_offset+180);    
    plpdf.PrintCell(15,6,'Dim A:',1,0,'L',0);
    plpdf.PrintCell(15,6,p_quote_data.module_dimensions(1),1,1,'R',0);    
    plpdf.PrintCell(15,6,'Dim B:',1,0,'L',0);
    plpdf.PrintCell(15,6,p_quote_data.module_dimensions(2),1,1,'R',0);
    plpdf.PrintCell(15,6,'Dim C:',1,0,'L',0);
    plpdf.PrintCell(15,6,p_quote_data.module_dimensions(3),1,1,'R',0);      
    plpdf.PrintCell(15,6,'Dim D:',1,0,'L',0);
    plpdf.PrintCell(15,6,p_quote_data.module_dimensions(4),1,1,'R',0); 
    plpdf.PrintCell(15,6,'Dim E:',1,0,'L',0);
    plpdf.PrintCell(15,6,p_quote_data.module_dimensions(5),1,1,'R',0);
    plpdf.PrintCell(15,6,'Dim H:',1,0,'L',0);
    plpdf.PrintCell(15,6,p_quote_data.module_dimensions(6),1,1,'R',0); 
    plpdf.PrintCell(15,6,'Dim I:',1,0,'L',0);
    plpdf.PrintCell(15,6,p_quote_data.module_dimensions(7),1,1,'R',0);
    plpdf.PrintCell(15,6,'Dim O:',1,0,'L',0);
    plpdf.PrintCell(15,6,p_quote_data.module_dimensions(8),1,1,'R',0); 
    plpdf.PrintCell(15,6,'Weight:',1,0,'L',0);
    plpdf.PrintCell(15,6,p_quote_data.module_dimensions(9),1,1,'R',0);  
    if p_module_blob is null then
      plpdf.PrintText(p_indent+50,p_vertical_offset+205,'No Module Diagram Available');
    else
      l_img_props := scale_image_dimensions(100, 60, p_module_blob );
      plpdf.PutImage('module',p_module_blob,p_indent+50,p_vertical_offset+180,l_img_props.width,l_img_props.height);
    end if;
    plpdf.SetPrintFont(p_font,null,9); --set to 9pt
    plpdf.PrintText(p_indent,p_vertical_offset+245,'Note: All weights are in kg and all dimensions in mm       Module Ref: '||p_quote_data.module_reference);
    plpdf.PrintText(p_indent,p_vertical_offset+260,'National Grid Metering, Abbotts Lane, Coventry, West Midlands, CV1 4AY  Tel 02476 286000  Fax 02476 286022');

  end build_drawings_page;
  /*
   PROCEDURE build_module_specs_page
   --This procedure builds the module specification page for the quotation, it writes data
   --to an existing plpdf document
   %param p_quote_data in - The current data for this quote
   %param p_font - the type of font to use - typically 'Arial'.
   %param p_indent - the left margin measurement.
   %param p_vertical_offset - the top margin measurement.   
  */    
  PROCEDURE build_module_specs_page(p_quote_data in quote_data, p_font in varchar2, p_indent in number, p_vertical_offset in number,p_watermark_blob blob) is
  begin
    --this will be page 5 (part of the technical spec sheet) for the quotation
    plpdf.NewPage;
    --set watermark if it exists
    if p_watermark_blob is not null then
      plpdf.PutImage('test watermark',p_watermark_blob,50,50,200,200);
    end if;
    -- set margins
    plpdf.SetLeftMargin(31.7);
    plpdf.SetRightMargin(31.7);
    plpdf.SetTopMargin(25.4);
    plpdf.SetPrintFont(p_font,'B',18); --set bold and 18pt
    plpdf.PrintText(p_indent,p_vertical_offset,'Technical Specification for '||p_quote_data.quote_ref);
    plpdf.SetPrintFont(p_font,'B',10); --set back to 10pt
    plpdf.PrintText(p_indent,p_vertical_offset+6,'Re: '||rtrim(ltrim(p_quote_data.site_address(1)||', '||p_quote_data.site_address(2)||', '||p_quote_data.site_address(3)||', '||p_quote_data.site_address(4)||', '||p_quote_data.site_address(5)||', '||p_quote_data.site_address(6)||', '||p_quote_data.site_address(7),', '),', ')); --site address  
    plpdf.SetPrintFont(p_font,null,10); --set back to plain
    plpdf.PrintText(p_indent,p_vertical_offset+14,'The supply point must be of a suitable size and capacity to provide the specified Lowest');
    plpdf.PrintText(p_indent,p_vertical_offset+18,'Operating Pressure(LOP-from table1) at the Emergency Control Valve(ECV) outlet');
    plpdf.PrintText(p_indent,p_vertical_offset+22,'under the requested Q Max load as detailed below in table 2');
    --table 1
    plpdf.SetCurrentXY(p_indent,p_vertical_offset+30); 
    plpdf.SetPrintFont(p_font,'B',10); --set to bold   
    plpdf.PrintCell(90,6,'Table 1',1,0,'L',0);           
    plpdf.PrintCell(30,6,'ECV Outlet (u)',1,0,'C',0);
    plpdf.PrintCell(40,6,'Consumer Outlet (c)',1,1,'C',0); 
    plpdf.SetPrintFont(p_font,null,10); --set back to plain
    if p_quote_data.svcpt_code = 'LP' then
      plpdf.PrintCell(90,6,'Design Minimum Pressure (DMP)',1,0,'L',0);           
      plpdf.PrintCell(30,6,'19 mbar',1,0,'C',0);
      plpdf.PrintCell(40,6,'15 mbar',1,1,'C',0);
      plpdf.PrintCell(90,6,'Lowest Operating Pressure (LOP)',1,0,'L',0);           
      plpdf.PrintCell(30,6,'25 mbar',1,0,'C',0);
      plpdf.PrintCell(40,6,'21 mbar',1,1,'C',0);  
      plpdf.PrintCell(90,6,'Pressure Tier',1,0,'L',0);           
      plpdf.PrintCell(30,6,'75 mbar',1,0,'C',0);
      plpdf.PrintCell(40,6,'21 mbar',1,1,'C',0);
    else --for MP
      plpdf.PrintCell(90,6,'Design Minimum Pressure (DMP)',1,0,'L',0);           
      plpdf.PrintCell(30,6,'270 mbar',1,0,'C',0);
      plpdf.PrintCell(40,6,'21 mbar',1,1,'C',0);
      plpdf.PrintCell(90,6,'Lowest Operating Pressure (LOP)',1,0,'L',0);           
      plpdf.PrintCell(30,6,'270 mbar',1,0,'C',0);
      plpdf.PrintCell(40,6,'21 mbar',1,1,'C',0);  
      plpdf.PrintCell(90,6,'Pressure Tier',1,0,'L',0);           
      plpdf.PrintCell(30,6,'2000 mbar',1,0,'C',0);
      plpdf.PrintCell(40,6,'21 mbar',1,1,'C',0);
    end if;    
    --table 2
    plpdf.SetCurrentXY(p_indent,p_vertical_offset+60); 
    plpdf.SetPrintFont(p_font,'B',10); --set to bold   
    plpdf.PrintCell(90,6,'Table 2',1,0,'L',0);           
    plpdf.PrintCell(70,6,'Meter Module Design',1,1,'C',0);
    plpdf.SetPrintFont(p_font,null,10); --set back to plain    
    plpdf.PrintCell(90,6,'Requested Q Max (kw/h)',1,0,'L',0);           
    plpdf.PrintCell(70,6,p_quote_data.requested_qmax,1,1,'C',0);
    plpdf.PrintCell(90,6,'Q Max of the meter module (kw/h)',1,0,'L',0);           
    plpdf.PrintCell(70,6,p_quote_data.module_qmax,1,1,'C',0);
    plpdf.PrintCell(90,6,'Q Min of the meter module (kw/h)',1,0,'L',0);           
    plpdf.PrintCell(70,6,p_quote_data.module_qmin,1,1,'C',0);
    --table 3
    plpdf.SetCurrentXY(p_indent,p_vertical_offset+90); 
    plpdf.SetPrintFont(p_font,'B',10); --set to bold   
    plpdf.PrintCell(90,6,'Table 3',1,0,'L',0);           
    plpdf.PrintCell(70,6,'Module Design Parameters',1,1,'C',0);
    plpdf.SetPrintFont(p_font,null,10); --set back to plain    
    plpdf.PrintMultilineCell(60,6,'Note: Inlet connection size and location details must be checked against supply point details supplied by GT to ensure compatibility                                                     ',1,'L',0);
    --Multi line cell thing is a bit annoying the printcell will not wrap to
    --the edge of the multi-line cell so we have to set the cursor for the
    --remaining parts of the table, have found a fix for this will do if we
    --have any time
    plpdf.SetCurrentXY(91.7,p_vertical_offset+96);              
    plpdf.PrintCell(30,6,'',1,0,'C',0);
    plpdf.PrintCell(35,6,'Inlet',1,0,'C',0);
    plpdf.PrintCell(35,6,'Outlet',1,1,'C',0);
    plpdf.SetCurrentX(91.7);
    plpdf.PrintCell(30,6,'Height',1,0,'C',0);
    plpdf.PrintCell(35,6,p_quote_data.module_inlet_height||'mm',1,0,'C',0);
    plpdf.PrintCell(35,6,p_quote_data.module_outlet_height||'mm',1,1,'C',0);
    plpdf.SetCurrentX(91.7);
    plpdf.PrintCell(30,6,'Size',1,0,'C',0);
    plpdf.PrintCell(35,6,p_quote_data.module_inlet_size||'mm',1,0,'C',0);
    plpdf.PrintCell(35,6,p_quote_data.module_outlet_size||'mm',1,1,'C',0);    
    plpdf.SetCurrentX(91.7);
    plpdf.PrintCell(30,6,'Type',1,0,'C',0);
    plpdf.PrintCell(35,6,p_quote_data.module_inlet_type,1,0,'C',0);
    plpdf.PrintCell(35,6,p_quote_data.module_outlet_type,1,1,'C',0);     
    plpdf.SetCurrentX(91.7);
    plpdf.PrintCell(30,6,'Orientation',1,0,'C',0);
    plpdf.PrintCell(35,6,p_quote_data.module_inlet_orientation,1,0,'C',0);
    plpdf.PrintCell(35,6,p_quote_data.module_outlet_orientation,1,1,'C',0);
    plpdf.PrintText(p_indent,p_vertical_offset+134,'The meter module offered is a single stream supply with only a nominal maintenance');
    plpdf.PrintText(p_indent,p_vertical_offset+138,'bypass facility. The bypass connections are for use during maintenance, and are only');
    plpdf.PrintText(p_indent,p_vertical_offset+142,'sized to maintain gas pressure downstream under no load conditions. Therefore');
    plpdf.PrintText(p_indent,p_vertical_offset+146,'during maintenance it will be necessary to disrupt supplies.');
    --next para
    plpdf.PrintText(p_indent,p_vertical_offset+154,'Electric Connections to gas meters are subject to the assesment of the hazardous');
    plpdf.PrintText(p_indent,p_vertical_offset+158,'area around the meter, this is largely affected by the ventilation of the housing. Should');
    plpdf.PrintText(p_indent,p_vertical_offset+162,'the ventilation be found to be inadequate, the connection will not be made and the');
    plpdf.PrintText(p_indent,p_vertical_offset+166,'requirements to allow the connection reported to you. The quotation does not include');
    plpdf.PrintText(p_indent,p_vertical_offset+170,'the provision of a separate instrumentation cabinet.');
    plpdf.SetPrintFont(p_font,null,7); --set to 7 pt    
    plpdf.PrintText(p_indent,p_vertical_offset+178,'Definitions');
    plpdf.PrintText(p_indent,p_vertical_offset+182,'DMP - The minimum pressure that may occur at the point of reference at the time of system design flow rate under extreme gas supply conditions');
    plpdf.PrintText(p_indent,p_vertical_offset+186,'LOP - The lowest pressure that may occur under normal operating conditions');        
    plpdf.PrintText(p_indent,p_vertical_offset+190,'Conversion calculations are based on an average CV of 38.4 MJ/m3');
    plpdf.SetPrintFont(p_font,null,9); --set to 9 pt  
    plpdf.PrintText(p_indent,p_vertical_offset+260,'National Grid Metering, Abbotts Lane, Coventry, West Midlands, CV1 4AY  Tel 02476 286000  Fax 02476 286022');
  end build_module_specs_page;
  /*
   PROCEDURE build_acceptance_page
   --This procedure builds the acceptance form page for the quotation, it writes data
   --to an existing plpdf document
   %param p_quote_data in - The current data for this quote
   %param p_font - the type of font to use - typically 'Arial'.
   %param p_indent - the left margin measurement.
   %param p_vertical_offset - the top margin measurement.  
   %param p_logo_blob - the logo(image) to display at the top of the page 
  */  
  PROCEDURE build_acceptance_page(p_quote_data in quote_data, p_font in varchar2, p_indent in number, p_vertical_offset in number,p_logo_blob blob,p_watermark_blob blob) is
  begin
    ---weeeeee last page
    plpdf.NewPage;
    --set watermark if it exists
    if p_watermark_blob is not null then
      plpdf.PutImage('test watermark',p_watermark_blob,50,50,200,200);
    end if;
    -- set margins
    plpdf.SetLeftMargin(31.7);
    plpdf.SetRightMargin(31.7);
    plpdf.SetTopMargin(25.4);
    -- Set header stuff up
    plpdf.PutImage('ngmlogo',p_logo_blob,p_indent,10,52,18);
    plpdf.SetPrintFont(p_font,null,7);  
    plpdf.PrintText(140,10,'4 Abbotts Lane ');
    plpdf.PrintText(140,13,'Coventry');
    plpdf.PrintText(140,16,'CV1 4AY');
    plpdf.PrintText(170,10,'T +44 (0) 24 7628 6000');  
    plpdf.PrintText(170,13,'F +44 (0) 24 7628 6022');
    plpdf.PrintText(170,16,'www.nationalgrid.com');  
    -- And Footer stuff
    plpdf.PrintText(50,280,'National Grid Metering is the trading name for National Grid Metering Ltd.');
    plpdf.PrintText(50,283,'Registered Office: 1-3 Strand, London, WCZN 5EH. Registered in England and Wales, No. 3705992');  
    plpdf.SetPrintFont(p_font,null,10); -- big text please
    plpdf.PrintText(p_indent,p_vertical_offset+10,'National Grid Metering''s Ref: '|| to_char(p_quote_data.quote_ref));
    plpdf.PrintText(p_indent,p_vertical_offset+14,'Customer Reference: '|| p_quote_data.transaction_ref);
    plpdf.PrintText(p_indent,p_vertical_offset+18,'MPRN: '|| to_char(p_quote_data.mprn));
    plpdf.PrintText(p_indent,p_vertical_offset+26,'F.A.O');
    plpdf.PrintText(p_indent,p_vertical_offset+30,'I&C Work Planning Team');
    plpdf.PrintText(p_indent,p_vertical_offset+34,'National Grid Metering Ltd');
    plpdf.PrintText(p_indent,p_vertical_offset+38,'Abbott''s Lane');
    plpdf.PrintText(p_indent,p_vertical_offset+42,'Coventry');
    plpdf.PrintText(p_indent,p_vertical_offset+46,'CV1 4AY');
    plpdf.SetPrintFont(p_font,'B',10); --set bold
    plpdf.PrintText(p_indent,p_vertical_offset+54,'Re: '||rtrim(ltrim(p_quote_data.site_address(1)||', '||p_quote_data.site_address(2)||', '||p_quote_data.site_address(3)||', '||p_quote_data.site_address(4)||', '||p_quote_data.site_address(5)||', '||p_quote_data.site_address(6)||', '||p_quote_data.site_address(7),', '),', ')); --site address  
    plpdf.SetPrintFont(p_font,null,10); --unset bold     
    plpdf.PrintText(p_indent,p_vertical_offset+62,'Contract sum (excluding V.A.T): ');
    plpdf.SetPrintFont(p_font,'B',10); --set bold    
    plpdf.PrintText(85,p_vertical_offset+62,'£'||p_quote_data.total_cost||' excluding lifting gear if required.');
    -- CONT_SUM_QA caveat here
    if p_quote_data.caveat_cont_sum_qa is not null then
      print_caveats(p_quote_data.caveat_cont_sum_qa, p_vertical_offset+66);
    end if;      
    plpdf.SetPrintFont(p_font,null,10); --unset bold     
    plpdf.PrintText(p_indent,p_vertical_offset+74,'* I confirm on behalf of my Company that I accept the above referenced quotation for the conduct');      
    plpdf.PrintText(p_indent,p_vertical_offset+78,'of works as detailed therein, and here by certify on behalf of my Company that no additional');      
    plpdf.PrintText(p_indent,p_vertical_offset+82,'terms and conditions (other than those set out in the quotation) are required.');
    plpdf.PrintText(p_indent,p_vertical_offset+90,'OR');
    plpdf.PrintText(p_indent,p_vertical_offset+98,'* I confirm on behalf of my Company that the above referenced quotation for the conduct or works');
    plpdf.PrintText(p_indent,p_vertical_offset+102,'as detailed therein is acceptable to my Company provided that (in addition to the conditions set');
    plpdf.PrintText(p_indent,p_vertical_offset+106,'out in the quotation [if any]) the General Conditions of Contract for Transactional Meter Works');
    plpdf.PrintText(p_indent,p_vertical_offset+110,'Not Exceeding 7 Bar in respect of the works are modified by the incorporation of the terms and');
    plpdf.PrintText(p_indent,p_vertical_offset+114,'conditions annexed hereto.');
    plpdf.PrintText(p_indent,p_vertical_offset+122,'(* Delete as appropriate)');
    plpdf.PrintText(p_indent,p_vertical_offset+130,'Save as set out above, I confirm that my Company agrees to be bound in connection with the');
    plpdf.PrintText(p_indent,p_vertical_offset+134,'works by the General Conditions of Contract for Transactional Meter Works Not');
    plpdf.PrintText(p_indent,p_vertical_offset+138,'Exceeding 7 Bar (as ammended by the quotation).');
    plpdf.PrintText(p_indent,p_vertical_offset+146,'Commencement');
    plpdf.PrintText(p_indent,p_vertical_offset+154,'Permission to organise directly with site contact');      
    plpdf.PrintText(p_indent+120,p_vertical_offset+154,'Yes / No'); 
    plpdf.PrintText(p_indent,p_vertical_offset+162,'Earliest date site ready for work to commence'); 
    plpdf.PrintText(p_indent+120,p_vertical_offset+162,'___/___/___');
    plpdf.PrintText(p_indent,p_vertical_offset+170,'Anticipated date gas required on site'); 
    plpdf.PrintText(p_indent+120,p_vertical_offset+170,'___/___/___');
    plpdf.PrintText(p_indent,p_vertical_offset+178,'Signed on behalf of the Company'); 
    plpdf.PrintText(p_indent,p_vertical_offset+186,'Name:________________________________'); 
    plpdf.PrintText(p_indent+85,p_vertical_offset+186,'Position:____________________________'); 
    plpdf.PrintText(p_indent,p_vertical_offset+194,'Company:_____________________________'); 
    plpdf.PrintText(p_indent+85,p_vertical_offset+194,'Date:_______________________________'); 
    plpdf.PrintText(p_indent,p_vertical_offset+202,'Signature:_____________________________________________________________________'); 

  end build_acceptance_page;
  /*
   FUNCTION generate_detailed_quote_pdf
   --The generate_detailed_quote_pdf builds the pdf document for the quotation from
   --the supplied data and stores the resulting pdf document in the database.
   %param p_quote_data - the data to build into the quote.
   %return - l_pdf_id the id of the pdf file we have created
  */  
  FUNCTION generate_detailed_quote_pdf(p_quote_data in quote_data,p_quote_id in number) RETURN VARCHAR2 is
    l_blob blob;
    l_enty_code varchar2(80); --the type of enquiry
    l_logo_blob blob;
    l_signature_blob blob;
    l_watermark_blob blob;
    l_success boolean; --holds whether the quote was saved in the docuemnts tables or not
    l_base_blob blob; --the base drawing
    l_house_blob blob; --the house drawing
    l_module_blob blob; --the module drawing
    l_pdf_name varchar2(90); -- the id of the quote we generate
    l_indent number := 31.7;
    l_vertical_offset number := 30;
    l_font varchar2(40) := 'Arial'; --arial not daz              
    CURSOR c_get_logo(cp_logo varchar2) IS
      SELECT blob_content
      FROM wwv_flow_files
      WHERE filename = cp_logo;
    CURSOR c_get_signature(cp_signature varchar2) IS
      SELECT blob_content
      FROM wwv_flow_files
      WHERE filename = cp_signature;
    CURSOR c_get_watermark(cp_watermark varchar2) IS
      SELECT blob_content
      FROM wwv_flow_files
      WHERE filename = cp_watermark;      
    CURSOR c_get_enty(cp_quid varchar2) IS
      SELECT enty_code
      FROM quote_items
      WHERE qute_id = cp_quid and quit_type = 'LQI' ;

  begin
    IF NOT c_get_logo%ISOPEN THEN
      OPEN c_get_logo('quote_logo.jpg');
    END IF;
    FETCH c_get_logo
      INTO l_logo_blob;
    CLOSE c_get_logo;
    IF NOT c_get_signature%ISOPEN THEN
      OPEN c_get_signature('quote_signature.jpg');
    END IF;
    FETCH c_get_signature
      INTO l_signature_blob;
    CLOSE c_get_signature;
     IF NOT c_get_watermark%ISOPEN THEN
      OPEN c_get_watermark('test_watermark.jpg');
    END IF;
    FETCH c_get_watermark
      INTO l_watermark_blob;
    CLOSE c_get_watermark;   
    IF NOT c_get_enty%ISOPEN THEN
      OPEN c_get_enty(p_quote_id);
    END IF;
    FETCH c_get_enty
      INTO l_enty_code;
    CLOSE c_get_enty;
    
    --get the quote diagrams
    l_base_blob := get_drawing(p_quote_data.base_diagram);
    l_house_blob := get_drawing(p_quote_data.house_diagram);
    l_module_blob := get_drawing(p_quote_data.module_diagram);
    -- Initialize PDF
    plpdf.init;
    --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, l_watermark_blob);--1
    build_costs_page(p_quote_data,l_font,l_indent,l_vertical_offset,l_watermark_blob);           --2
    if l_enty_code = 'REMOVE' or l_enty_code = 'STD REMOVE' or l_enty_code = 'ADVERSARIAL' then
      build_caveats_page(p_quote_data,l_font,l_indent,l_vertical_offset,l_watermark_blob, true);         --3
    else
      build_caveats_page(p_quote_data,l_font,l_indent,l_vertical_offset,l_watermark_blob, false);         --3
    end if;
    --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
      build_drawings_page(p_quote_data,l_font,l_indent,l_vertical_offset, l_base_blob, l_house_blob, l_module_blob,l_watermark_blob);        --4 
    end if;
    build_module_specs_page(p_quote_data,l_font,l_indent,l_vertical_offset,l_watermark_blob);    --5 
    build_acceptance_page(p_quote_data,l_font,l_indent,l_vertical_offset,l_logo_blob,l_watermark_blob); --6      
    --get our beautiful pdf into the local var l_blob  
    plpdf.SendDoc(l_blob);
    --punt the created pdf into the APEX files table
    insert into wwv_flow_files( name, title, mime_type, flow_id, doc_size ,description, blob_content )
    values ( sys_guid()||'/quote_'||p_quote_data.quote_ref||'.pdf', 'Quotation - '||p_quote_data.quote_ref, 'application/pdf', 190, DBMS_LOB.GETLENGTH(l_blob),'this is an auto generated quotation from mip_quotation_document.generate_detailed_quote for quotation '||p_quote_data.quote_ref, l_blob)  
    returning name into l_pdf_name;
    --set up the file associations within our documents tables
    l_success:= mip_files.set_file_association(l_pdf_name,
                                   'Automatically Generated Quotation for quote '||p_quote_data.quote_ref,
                                   'INDO',
                                   'GENERATED QUOTATION',
                                   p_quote_data.quote_ref,
                                   null,
                                   null,
                                   'QUDO');
    return l_pdf_name; -- return the id of the newly created blob pdf record
  end generate_detailed_quote_pdf; 
  /*
   FUNCTION generate_quote_pdf
   --The generate_detailed_quote_pdf builds the pdf document for the quotation from
   --the supplied quote id and stores the resulting pdf document in the database.
   %param p_quote_id - the id of the quote you want to build a pdf for.
   %return - the name of the pdf file we have created. This is a unique value within the wwv_flow_files table
  */   
  FUNCTION generate_quote_pdf(p_quote_id in number) RETURN VARCHAR2 is
    l_quote_data quote_data;
  begin
    l_quote_data := get_detailed_quote_data(p_quote_id);
    return generate_detailed_quote_pdf(l_quote_data, p_quote_id);
  end generate_quote_pdf;
  
 
BEGIN
  -- Initialization
  NULL;
END mip_quotation_document;
/
