ad_proc -public im_custom_next_project_nr {
{-customer_id 0 }
{-nr_digits {}}
{-date_format {}}
} {
Project_nr should look like: cccc-xxxxx with the first 4 digits being
the customer code and the second 4 digits is the current project_nr
Returns "" if there was an error calculating the number.
} {
if {"none" == $date_format} { set date_format "" }
set customer_customer_code ""
set customer_name "Error retreiving Customer Information"
catch {
db_1row cust_code "
select company_id,
borg_customer_code as customer_customer_code,
company_name as customer_name
from im_companies
where company_id = :customer_id
"
} errmsg
ns_log Notice "im_customer_next_project_nr: customer_customer_code=$customer_code"
if {[string length $customer_code] != 4} {
ad_return_complaint 1 "<b>Unable to find 'Spanish Customer Code'</b>:
<p>
The customer <a href=/intranet/companies/view?company_id=$customer_id>$customer_name</a>
does not have a valid 4 digit 'Customer Code' field. <br>
Please follow the link and setup a customer code with four digits.<br>
</p>
<pre>$errmsg</pre>
"
ad_script_abort
}
# ----------------------------------------------------
# Calculate the next project nr by finding out the last
# one +1
# code + year code
set today [db_string today "select to_char(now(), :date_format)"]
set today "$customer_code$today"
# Adjust the position of the start of date and nr in the invoice_nr
set customer_customer_code_len [string length $customer_code]
set date_format_len [string length $date_format]
set date_format_len [expr $date_format_len + $customer_code_len]
set nr_start_idx [expr 2 + $date_format_len]
set date_start_idx 1
set num_check_sql ""
set zeros ""
for {set i 0} {$i < $nr_digits} {incr i} {
set digit_idx [expr 1 + $i]
append num_check_sql "
and ascii(substr(p.nr,$digit_idx,1)) > 47
and ascii(substr(p.nr,$digit_idx,1)) < 58
"
append zeros "0"
}
set sql "
select
trim(max(p.nr)) as last_project_nr
from (
select substr(project_nr, :nr_start_idx, :nr_digits) as nr
from im_projects
where lower(substr(project_nr, :date_start_idx, :date_format_len)) = lower('$today')
) p
where 1=1
$num_check_sql
"
set last_project_nr [db_string max_project_nr $sql -default $zeros]
set last_project_nr [string trimleft $last_project_nr "0"]
if {[empty_string_p $last_project_nr]} { set last_project_nr 0 }
set next_number [expr $last_project_nr + 1]
ns_log Notice "im_customer_next_project_nr: last_project_nr=$last_project_nr, next_number=$next_number"
# ----------------------------------------------------
# Put together the new project_nr
set nr_sql "select '$today' || '_' || trim(to_char($next_number,:zeros)) as project_nr"
set project_nr [db_string next_project_nr $nr_sql -default ""]
return $project_nr
}
Calle Aprestadora 19, 12o-2a
08902 Hospitalet de Llobregat (Barcelona)
Spain
Tel Europe: +34 609 953 751
Tel US: +1 415 200 2465
Mail: info@project-open.com