Go Back   vb.org Archive > vBulletin 4 Discussion > vB4 Programming Discussions
FAQ Community Calendar Today's Posts Search

Reply
 
Thread Tools Display Modes
  #1  
Old 09-03-2012, 05:57 AM
qpurser qpurser is offline
 
Join Date: Jul 2011
Posts: 275
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default Calculation on date profile fields

This might be a tricky one and I am counting on those who are smarter as I am to help me

Scenario:
Our members must attend at least 1 meeting every 12 months to retain membership.
I created 2 custom user fields (field 16 and 19) where we enter the dates from the last 2 meetings they attended. Data is entered like 2012-12-01.

What we need:
First we have to see which field is closest to TODAY (actual date)
Then we have to use that field and calculate how many days are left from TODAY they are still member.
For example TODAY = 2012-09-03 and the last meeting = 2012-08-03
The output should be 365 (days in a year) minus 31 (difference from TODAY and Last Meeting) and should say something like "Your membership will expire in xxx days"

Hope somebody can help me
Thanks
Reply With Quote
  #2  
Old 09-03-2012, 06:47 AM
kh99 kh99 is offline
 
Join Date: Aug 2009
Location: Maine
Posts: 13,185
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

Here's a test program that seems to work:
Code:
$field1 = "2012-08-03";
$field2 = "2010-08-03";

$last_meeting = strtotime($field1);
if (($t = strtotime($field2)) AND ($t > $last_meeting))
{
    $last_meeting = $t;
}
if ($last_meeting)
{
    $days_left = intval(365 - ((time() - $last_meeting) / 86400)) + 1;
    echo "$days_left days left in membership";
}
else
{
    echo "Failed to find any valid meeting dates";
}

(Of course this just shows the calculation, you'll need to change it to use your profile fields and do something with the value other than echo it).
Reply With Quote
  #3  
Old 09-03-2012, 09:41 AM
qpurser qpurser is offline
 
Join Date: Jul 2011
Posts: 275
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

thx for the quick reply.

I have been playing around with it and tried to put it in a php forum block:

Code:
$field1 = "2005-09-02";
$field2 = "2005-09-02";

$last_meeting = strtotime($field1);
if (($t = strtotime($field2)) AND ($t > $last_meeting))
{
    $last_meeting = $t;
}
if ($last_meeting)
{
    $days_left = intval(365 - ((time() - $last_meeting) / 86400)) + 1;
   
}
else
{
   $days_left= "Overdue";
}
return  $days_left;
The block output works and shows the days left when field1 or field2 stay within the 365 day range.
Normally when those fields exceed the 365 days I think I should see the output from the "else" statement ("overdue") but instead I get a minus value (for example: -640)
Reply With Quote
  #4  
Old 09-03-2012, 11:02 AM
cellarius's Avatar
cellarius cellarius is offline
 
Join Date: Aug 2005
Posts: 1,987
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

add
Code:
AND ($t <= 365)
to your if-condition.
Reply With Quote
  #5  
Old 09-03-2012, 12:05 PM
qpurser qpurser is offline
 
Join Date: Jul 2011
Posts: 275
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

Quote:
Originally Posted by cellarius View Post
add
Code:
AND ($t <= 365)
to your if-condition.
This didn't do it.

Maybe I explained wrong:
When the result of
Code:
$days_left = intval(365 - ((time() - $last_meeting) / 86400)) + 1;
is less then 365 days it should display the result from "$days_left"

If the result of
Code:
$days_left = intval(365 - ((time() - $last_meeting) / 86400)) + 1;
is more then 365 days it should display "overdue"

Thanks for trying to help guys.
Appreciate it
Reply With Quote
  #6  
Old 09-03-2012, 01:44 PM
kh99 kh99 is offline
 
Join Date: Aug 2009
Location: Maine
Posts: 13,185
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

The "else" in the code I posted was the case where there was no last meeting date entered in either field (or the format was invalid or something like that). If in that situation you want it to display the "overdue" message, then you could use something like this:

Code:
$field1 = "2005-09-02";
$field2 = "2005-09-02";

$last_meeting = strtotime($field1);
if (($t = strtotime($field2)) AND ($t > $last_meeting))
{
    $last_meeting = $t;
}
if ($last_meeting)
{
    $days_left = intval(365 - ((time() - $last_meeting) / 86400)) + 1;
}
if (!isset($days_left) OR $days_left < 0)
{
   $days_left= "Overdue";
}
return  $days_left;

A couple other things I should mention - because it uses timestamps, if there is a "leap day" between the last meeting day and today, that will add an extra day (i.e. it will show their membership as expiring one day earlier). And the "+ 1" at the end of the calculations rounds up, so that if there is a fraction of a day left it will show as 1 day. If you'd rather have a fraction show as 0 (have it say "0 days left" on their last day) you could remove the + 1. Also, this may mean that you want the condition to be "< 1" instead of "< 0" to display the overdue message.

Also, you'll probably want to remove the $field1 and $field2 variables and replace them with $vbulletin->userinfo['fieldX'] and $vbulletin->userinfo['fieldY'] (where X and Y are the numbers of your custom fields).

One more thing - if you're using a PHP type forum block, you probably need to set the "Cache Time" to 0 for it to work correctly.
Reply With Quote
  #7  
Old 09-03-2012, 02:02 PM
qpurser qpurser is offline
 
Join Date: Jul 2011
Posts: 275
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

WOW.... Thanks so much.
Works perfect now.

As I am a complete beginner with coding I just want to share my full block code for those who are not that familiar either. Don't know if it is perfect but it gives me the right display:

Code:
$field1 = "2012-09-02";
$field2 = "2007-09-02";
$text1  = "TCMAS membership expires in  ";
$text2  = " days!";

$last_meeting = strtotime($field1);
if (($t = strtotime($field2)) AND ($t > $last_meeting))
{
    $last_meeting = $t;
}
if ($last_meeting)
{
    $days_left =  intval(365 - ((time() - $last_meeting) / 86400)) + 1;
    
}
if (!isset($days_left) OR $days_left < 0)
{
    $days_left= "TCMAS membership expired";
}
else
{
  $days_left=  ($text1.$days_left.$text2);
}
return  $days_left;
Attached Images
File Type: png Screen Shot 2012-09-03 at 4.56.49 PM.png (9.2 KB, 0 views)
Reply With Quote
Reply


Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT. The time now is 01:17 PM.


Powered by vBulletin® Version 3.8.12 by vBS
Copyright ©2000 - 2024, vBulletin Solutions Inc.
X vBulletin 3.8.12 by vBS Debug Information
  • Page Generation 0.04083 seconds
  • Memory Usage 2,245KB
  • Queries Executed 14 (?)
More Information
Template Usage:
  • (1)SHOWTHREAD
  • (1)ad_footer_end
  • (1)ad_footer_start
  • (1)ad_header_end
  • (1)ad_header_logo
  • (1)ad_navbar_below
  • (1)ad_showthread_beforeqr
  • (1)ad_showthread_firstpost
  • (1)ad_showthread_firstpost_sig
  • (1)ad_showthread_firstpost_start
  • (8)bbcode_code
  • (1)bbcode_quote
  • (1)footer
  • (1)forumjump
  • (1)forumrules
  • (1)gobutton
  • (1)header
  • (1)headinclude
  • (1)navbar
  • (3)navbar_link
  • (120)option
  • (7)post_thanks_box
  • (7)post_thanks_button
  • (1)post_thanks_javascript
  • (1)post_thanks_navbar_search
  • (7)post_thanks_postbit_info
  • (7)postbit
  • (1)postbit_attachment
  • (7)postbit_onlinestatus
  • (7)postbit_wrapper
  • (1)spacer_close
  • (1)spacer_open
  • (1)tagbit_wrapper 

Phrase Groups Available:
  • global
  • inlinemod
  • postbit
  • posting
  • reputationlevel
  • showthread
Included Files:
  • ./showthread.php
  • ./global.php
  • ./includes/init.php
  • ./includes/class_core.php
  • ./includes/config.php
  • ./includes/functions.php
  • ./includes/class_hook.php
  • ./includes/modsystem_functions.php
  • ./includes/functions_bigthree.php
  • ./includes/class_postbit.php
  • ./includes/class_bbcode.php
  • ./includes/functions_reputation.php
  • ./includes/functions_post_thanks.php 

Hooks Called:
  • init_startup
  • init_startup_session_setup_start
  • init_startup_session_setup_complete
  • cache_permissions
  • fetch_postinfo_query
  • fetch_postinfo
  • fetch_threadinfo_query
  • fetch_threadinfo
  • fetch_foruminfo
  • style_fetch
  • cache_templates
  • global_start
  • parse_templates
  • global_setup_complete
  • showthread_start
  • showthread_getinfo
  • forumjump
  • showthread_post_start
  • showthread_query_postids
  • showthread_query
  • bbcode_fetch_tags
  • bbcode_create
  • showthread_postbit_create
  • postbit_factory
  • postbit_display_start
  • post_thanks_function_post_thanks_off_start
  • post_thanks_function_post_thanks_off_end
  • post_thanks_function_fetch_thanks_start
  • post_thanks_function_fetch_thanks_end
  • post_thanks_function_thanked_already_start
  • post_thanks_function_thanked_already_end
  • fetch_musername
  • postbit_imicons
  • bbcode_parse_start
  • bbcode_parse_complete_precache
  • bbcode_parse_complete
  • postbit_display_complete
  • post_thanks_function_can_thank_this_post_start
  • postbit_attachment
  • tag_fetchbit_complete
  • forumrules
  • navbits
  • navbits_complete
  • showthread_complete