vb.org Archive

vb.org Archive (https://vborg.vbsupport.ru/index.php)
-   vB4 Programming Discussions (https://vborg.vbsupport.ru/forumdisplay.php?f=252)
-   -   Calculation on date profile fields (https://vborg.vbsupport.ru/showthread.php?t=287406)

qpurser 09-03-2012 05:57 AM

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

kh99 09-03-2012 06:47 AM

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).

qpurser 09-03-2012 09:41 AM

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)

cellarius 09-03-2012 11:02 AM

add
Code:

AND ($t <= 365)
to your if-condition.

qpurser 09-03-2012 12:05 PM

Quote:

Originally Posted by cellarius (Post 2362213)
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

kh99 09-03-2012 01:44 PM

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.

qpurser 09-03-2012 02:02 PM

1 Attachment(s)
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;



All times are GMT. The time now is 10:07 PM.

Powered by vBulletin® Version 3.8.12 by vBS
Copyright ©2000 - 2025, vBulletin Solutions Inc.

X vBulletin 3.8.12 by vBS Debug Information
  • Page Generation 0.01064 seconds
  • Memory Usage 1,737KB
  • Queries Executed 10 (?)
More Information
Template Usage:
  • (1)ad_footer_end
  • (1)ad_footer_start
  • (1)ad_header_end
  • (1)ad_header_logo
  • (1)ad_navbar_below
  • (8)bbcode_code_printable
  • (1)bbcode_quote_printable
  • (1)footer
  • (1)gobutton
  • (1)header
  • (1)headinclude
  • (6)option
  • (1)post_thanks_navbar_search
  • (1)printthread
  • (7)printthreadbit
  • (1)spacer_close
  • (1)spacer_open 

Phrase Groups Available:
  • global
  • postbit
  • showthread
Included Files:
  • ./printthread.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/class_bbcode_alt.php
  • ./includes/class_bbcode.php
  • ./includes/functions_bigthree.php 

Hooks Called:
  • init_startup
  • init_startup_session_setup_start
  • init_startup_session_setup_complete
  • cache_permissions
  • fetch_threadinfo_query
  • fetch_threadinfo
  • fetch_foruminfo
  • style_fetch
  • cache_templates
  • global_start
  • parse_templates
  • global_setup_complete
  • printthread_start
  • bbcode_fetch_tags
  • bbcode_create
  • bbcode_parse_start
  • bbcode_parse_complete_precache
  • bbcode_parse_complete
  • printthread_post
  • printthread_complete