Jump to content

Developing a Jfusion plugin for prestashop


Truemedia

Recommended Posts

In order to make prestashop integratable into other software packages for websites that need the login combined with other software packages, I have decided to make a Jfusion plugin for prestashop. Jfusion is a joomla plugin which allows you to use one login across your entire website (www.jfusion.org).

I have already started a topic on the Jfusion forum discussing what to do, and what I need to make it. Just to let people know who are interested in this I am currently developing this plugin now, and it's free so if anyone is interested in helping me build it who knows a lot about prestashop or jusion/joomla please reply to this topic with how you can help.

To check the progress of this developement check this Link

The more people that help contribute to building this plugin, the quicker it will be available.

Link to comment
Share on other sites

Ok I'm half way through the process of building this plugin, and you will be able to download this plugin at the jfusion website when it is finished.

I don't know what password encryption presta shop uses, which I'm still trying to find out. Does anyone know the algorithm and if it uses a salt?

Link to comment
Share on other sites

Cheerz, Iv'e just got done assigning all the copyright and licenses needed to cover the legal side of production, and I think I have everything I need to know now about prestashop's own classes and functions to access them externally.

This might be an early prediction, but I think it will be done before the end of the weekend.

Link to comment
Share on other sites

Ok so far I have got a mechanism working for accessing the prestashop database through the plugin, and from the database I'm trying to find the values of:

the script path

cookie path

server name

cookie domain

cookie name


Prestashop database holds a massive amount of data so it is going to take me a while to find these values. Does anyone know which tables I can find some of these values in? prestashop doesn't contain any in the configuration table.
Link to comment
Share on other sites

The script path and cookie path are the value of the PS_BASE_URI variable in config/settings.inc.php. You can see how the cookie is stored in the constructor in classes/Cookie.php. PrestaShop has two cookies. The name of the cookie for the front office is the md5 hash of 'ps' followed by the COOKIE_KEY in config/settings.inc.php. The name of the cookie for the back office is the md5 hash of 'psAdmin' followed by the COOKIE_KEY. I don't think the server name is stored anywhere. You have to use the Tools::getHttpHost function, which uses $_SERVER['HTTP_X_FORWARDED_HOST'] if it exists, or $_SERVER['HTTP_HOST'].

Link to comment
Share on other sites

  • 2 weeks later...

OK I have this code to work out server settings:

$config['server_name'] = Tools::getServerName();
$config['cookie_domain'] = str_replace('www.', '', $_SERVER['SERVER_NAME']);



Seems to be fine (including the prestashop/classes/Tools.php file), but I have 2 other ideas I'm unsure about.
Can you ban or unban customers or employees in prestashop, or is that functionality available in any free module? as this would mostly likely be a needed feature for this plugin to manipulate.
Also how can I access prestashop sessions, and what variables inside the session are available?

All help is appreciated thanks.

Link to comment
Share on other sites

Yes, you can ban a customer by editing a customer on the Customers tab and changing the Status to X. This will change the "active" field of the customer in the ps_customer table to 0, which will prevent them logging in. You can do the same for employees on the Employees tab (or the ps_employee table).

All the session information is stored in PrestaShop's cookie. Here are some of the variables available in the cookie. I'll try to write a page on my website with all of them later today.

$cookie->customer_firstname     The first name of the currently logged in customer
$cookie->customer_lastname      The last name of the currently logged in customer
$cookie->email                  The email address of the currently logged in customer
$cookie->id_address_invoice     The ID of the currently selected invoice address
$cookie->id_cart                The ID of the cart of the current visitor
$cookie->id_currency            The ID of the currently selected currency
$cookie->id_customer            The ID of the customer (when logged in)
$cookie->id_employee            The ID of the currently logged in employee
$cookie->id_guest               The ID of the guest (when not logged in)
$cookie->id_lang                The ID of currently selected language
$cookie->id_wishlist            The ID of the wishlist of the current customer
$cookie->last_visited_category  The ID of the last category page that the customer viewed
$cookie->logged                 Whether the current visitor is logged in
$cookie->passwd                 The password hash of the currently logged in customer
$cookie->profile                The profile of the current employee



EDIT: I've now added a PrestaShop Cookie Structure page to my website here.

Link to comment
Share on other sites

Ok Iv'e tried accessing the logout function in classes/tools.php but so far no luck.

I tried what you suggested to access the cookie variables and functions by including both the config/settings.php and classes/Cookie.php, and it was bringing up errors with the require argument being wrong.

Since it has the .inc extra extension in the middle I added that, but got missing argument errors in classes. I figured that maybe it was a different file that needed to be included so I tried config/config.inc.php which resolved the problem and nothing seemed immediately wrong now, but when I went to see if I was logged out I was still logged in.

Accessing the function via a variable containing the cookie object didn't work

$cookie = new cookie();
$cookie->logout();

, and using the double colon between the class and the function

cookie::logout();

didn't show an echo message on the page I am trying to make an external logout on.

I really wanted to use prestashop classes and functions in this project to simplify things, and make it easier to maintain but I know how to create an expired cookie for prestashop which effectively logs out the user, if needed. But is there any more details I need to make the logout function work?

This is my the code of my test page:

<?php
   define("DS", '/');
   global $cookie;
   require("../../store" . DS . "config" . DS . "config.inc.php");
   require("../../store" . DS . "classes" . DS . "Cookie.php");
   $cookie = new cookie();
   $cookie->mylogout();
   echo("now logged out");
?>

Link to comment
Share on other sites

Well theres two logout functions in Cookie php which are logout and mylogout.

So that url parameter seems to hint the function call, but I havn't found any solid examples in prestashop itself that calls this function directly.

EDIT: Actually my method for deleting the cookie doesn't work, which makes no sense:

setcookie(md5("ps") . _COOKIE_KEY_, '', time() - 60 * 60 * 24 * 365, "/store/", "/");



I think I'm missing a major point here, yet all the resources are correct.

Link to comment
Share on other sites

I think your code is wrong. You are overwriting the existing global $cookie with a blank cookie, then attempting to log out. You should remove the $cookie = new cookie(); line, or using one of the following instead:

$cookie = new Cookie('ps');
$cookie = new Cookie('psAdmin');

Link to comment
Share on other sites

Yes both

$cookie = new cookie("ps");

and

new cookie("psAdmin");

work perfectly. I can't believe I actually knew it before because I looked at the link you posted on cookie variables and said to add one of those parameters ($name) there. I even had it in my own setcookie() attempt but from coding over little time over days at a time, I realize I have forgotten how far I had gotten and not realized that I needed the extra parameter (Can't believe I was trying to figure out what that $name variable was in the constructor for so long).

Although I was intimidated by OOP code since I had only learned it earlier this year, and something that wasn't actually mentioned in all the tutorials was passing a parameter through a class would automatically be used as the parameter in the _constructor function (which is strange a lot of tutorials missed this point out), yet it makes sense now.

Once again thanks, and now I'm gunna try external login :smirk: cheerz.

EDIT: BTW anyone who wants to create an external logout page for prestashop either of these code snippets below work fine.

require("prestashop/config/config.inc.php");
require("prestashop/classes/Cookie.php");
$cookie = new cookie('ps');
$cookie->logout();


require("prestashop/config/config.inc.php");
require("prestashop/classes/Cookie.php");
$cookie = new cookie('ps');
$cookie->mylogout();

Link to comment
Share on other sites

I can't believe I've got this done so quickly but here is the code for an external login (it uses a password and email but the first example has no form, next one does) and it works perfect.

define("DS", '/');
   require("prestashop" . DS . "config" . DS . "config.inc.php");
   require("prestashop" . DS . "init.php");
   $passwd = trim("yourPassword");
   $email = trim("yourEmail");
   if (empty($email))
       $errors[] = Tools::displayError('e-mail address is required');
   elseif (!Validate::isEmail($email))
       $errors[] = Tools::displayError('invalid e-mail address');
   elseif (empty($passwd))
       $errors[] = Tools::displayError('password is required');
   elseif (Tools::strlen($passwd) > 32)
       $errors[] = Tools::displayError('password is too long');
   elseif (!Validate::isPasswd($passwd))
       $errors[] = Tools::displayError('invalid password');
   else
   {
       $customer = new Customer();
       $authentication = $customer->getByemail(trim($email), trim($passwd));
       /* Handle brute force attacks */
       sleep(1);
       if (!$authentication OR !$customer->id)
           $errors[] = Tools::displayError('authentication failed');
       else
       {
           $cookie->id_customer = intval($customer->id);
           $cookie->customer_lastname = $customer->lastname;
           $cookie->customer_firstname = $customer->firstname;
           $cookie->logged = 1;
           $cookie->passwd = $customer->passwd;
           $cookie->email = $customer->email;
           if (Configuration::get('PS_CART_FOLLOWING') AND (empty($cookie->id_cart) OR Cart::getNbProducts($cookie->id_cart) == 0))
               $cookie->id_cart = intval(Cart::lastNoneOrderedCart(intval($customer->id)));
           Module::hookExec('authentication');
       }
   }
   echo("now logged in 
");



and this is with a form and redirect:

if (array_key_exists('_submit_check', $_POST)) {
    /* Login details have been submitted */
define("DS", '/');
   require("prestashop" . DS . "config" . DS . "config.inc.php");
   require("prestashop" . DS . "init.php");
   $passwd = trim($_POST['email']);
   $email = trim($_POST['pass']);
   if (empty($email))
       $errors[] = Tools::displayError('e-mail address is required');
   elseif (!Validate::isEmail($email))
       $errors[] = Tools::displayError('invalid e-mail address');
   elseif (empty($passwd))
       $errors[] = Tools::displayError('password is required');
   elseif (Tools::strlen($passwd) > 32)
       $errors[] = Tools::displayError('password is too long');
   elseif (!Validate::isPasswd($passwd))
       $errors[] = Tools::displayError('invalid password');
   else
   {
       $customer = new Customer();
       $authentication = $customer->getByemail(trim($email), trim($passwd));
       /* Handle brute force attacks */
       sleep(1);
       if (!$authentication OR !$customer->id)
           $errors[] = Tools::displayError('authentication failed');
       else
       {
           $cookie->id_customer = intval($customer->id);
           $cookie->customer_lastname = $customer->lastname;
           $cookie->customer_firstname = $customer->firstname;
           $cookie->logged = 1;
           $cookie->passwd = $customer->passwd;
           $cookie->email = $customer->email;
           if (Configuration::get('PS_CART_FOLLOWING') AND (empty($cookie->id_cart) OR Cart::getNbProducts($cookie->id_cart) == 0))
               $cookie->id_cart = intval(Cart::lastNoneOrderedCart(intval($customer->id)));
           Module::hookExec('authentication');
                                        if ($back = Tools::getValue('back'))
               Tools::redirect($back);
           Tools::redirect('my-account.php');
       }
   }
}
}
else
{
echo('
<form action=' .  ['PHP_SELF'] . '>
 <input type="text" id="email" />
 <input type="password" id="pass" />
 <input type="hidden" name="_submit_check" value="1" /> 
 <input type="submit" />
</form>
');
}



I hope this helps anyone thats trying to integrate prestashop into there website, and the JFusion plugin should be ready soon :).

Link to comment
Share on other sites

Ok I have managed to get a working external registration script for prestashop, which I think some people might find useful for there own integration projects, so I'm posting the simple registration page that you can modify for your own use. Some of these elements will need modifying to be correct to the date and time of registrations, aswell as been up to date on locations.

This is the script (externalregistration.php):
I had to add this as an attachment as the charachter limit exceeded the amount allowed per post on this forum.

Hope it helps anyone tryna implement the same system. The JFusion plugin is almost finished just need to add the delete user function, and make sure everything is up and running right with no errors and it will be ready for submission and early download. If you have any questions or anything bout this code please feel free to ask any questions about it.

externalregistration.php

Link to comment
Share on other sites

Making the registration read from variables instead of form values without hacking prestashop itself is proving to be extremely difficult. This is the last stage in development of the plugin, but I really am restricted with how to achieve this.

Some parts of the registration page I can hack to read from variables, but the address class checks the form for values using the Tools:getValue(); which unless I duplicate the class and make a modified version of it, I can only bypass the entire class.

But even bypassing the class is pretty much imposable because of how deeply embedded it is in the registration page. Here is the code I am talking about (the external registration page using preset variable values):

If you compare this to the normal registration page you will notice I replaced all the $_POST references with an array value. I tried including modified versions of classes which refer to variables instead of form values in my most recent attempt, but no luck. Up to the new address deceleration all the code seems fine, so my problem is classes referring to the form.

Has anyone got an idea for code that can skip form references or use functions instead of objects for certain features that would not work with a none form registration? This is the last part that needs doing then I can release the plug-in, any help is really appreciated Thanks :exclaim:

externalregistration2.php

Link to comment
Share on other sites

Ok to avoid all problems with trying to modify the registration process, I have decided to write my own registration process that covers everything needed to insert the correct data safely.

From inspecting the table it seems like just the ps_customer, ps_customer_group, and ps_address need a row each adding to respectively.

I can insert all the data correctly except for two parts I am unsure about in the ps_customer table which is the columns secure_key and id_default_group.

I'm unsure what the secure key consists of as it is different for every user, even though several users are exactly the same apart from there email. The default group I cannot find where it is declared what the default group is, but I know that it is 1 seeing as though that is the value all my users have, so I can only think to use the value the majority of users have for that column.

I think I know what to do to filter data securely in all areas and make it suitable for what the database expects, so that shouldn't be too much of a problem. The main thing I need to know is what the secure_key consists of. I'm gonna have a long look around to see if I can find any info about this but until then, this is the 1 thing thats needs clarifying.

Link to comment
Share on other sites

OK I've got registration working without a form which uses data validation, and would like to share a file I created in the process to easily combine prestashop registration into another registration page from another software you want to integrate it with (for example phpBB, joomla, drupal, WordPress, ect ect.

This is an automated registration page that when loaded uses variables from within the file itself to register a user if the information provided in the variables are correct, and also compares the information in a table so you can see how prestashop stores, limits, and deals with data. Also if any variables do not validate, the page brings up its own error as well as preventing the registration happening, so should be safe although for the reason I am justifying below I would not use this code on a live server.

This file is for testing and debugging purposes only, and you will need to remove the html sections and the parts that load an existing user to compare your registration variables with in order to add this to another piece of softwares registration system, and it would have to load user details from a form in that software.

Also I all the mysql details and default values for user details need filling in. You will be able to fill these in inside the file where you see

$user_variables['field'] "Your ... (field to be filled) ";



If you have any questions about this reply in another topic or pm me. Now I am integrating this registration into my JFusion plugin.

formless_registration_comparison.php

Link to comment
Share on other sites

Ok I am now working through some bugs, but apart from that I believe that I have developed everything I need for this plug-in on both the Joomla side and PrestaShop side.

Thanks so much rocky and MrBaseball34 for your help and expertize, you have been so much help in giving me a lot of information I needed about prestashop to accomplish a lot of things. I will add a post to this topic with a link to download the plugin when the bug fixes are solved and create a topic to discuss it.

JFusion is free and so are the plugins at jfusion.org so need for any payments (all open source), will add the download link soon :)

Link to comment
Share on other sites

I am happy to see you have accomplished your goal of creating this plugin since I first noticed you playing with the idea quite a few weeks ago. I would like to use it on my Joomla membership site but am unsure how I will make it work the way I need it to.

My joomla site uses Community Builder and AEC for subscription management.

I think I will need a micro_integration script for AEC to properly use your plugin the way I need to.

Right now I have 2 subscription plans. One is a free subscription with some limited capabilities. The other is a paid subscription with private content and downloads.

I was wanting to have all users registered into my prestashop, but put into different groups depending on which plan they signed up for on my Joomla site.

For instance the free subscribers will just be put into a default group with no special discounts. However for my paid subscription users I need them put into a separate group so I can allow them to get a percentage off all products in my store.

Will I be able to do this, or will I need to have a plugin for my subscription manager to set the 2 different groups. I also have the ability to have my subscription manager to perform a mySQL query. I may be able to use the mySQL query feature to set the correct group assignment in prestashop depending on which subscription the user has on my Joomla site.

Any ideas or suggestions?
Would you be interested in creating a micro_integration for the AEC subscription management component. I think it would be welcomed into the AEC community quite well and could give you some extra exposure for your plugin and/or website.

I think your plugin will get tons of attention because prestashop is a much better shopping cart than any Joomla Shopping cart like Virtuemart. Other people are integrating Magento, but it is way to bloated and resource extensive among many other problems, issues and concerns for a small shop. Plus for people that do not have much money for development Magento is costly to customize and a developer nightmare.

Well done, I can't wait to test it out and hopefully use it for my membership site. Thanks for taking the time to create it.

Link to comment
Share on other sites

I can only provide a bit of ideas and information since I'm involved in quite a lot of projects already, and I go back to college in about 2 weeks.

I definitely think it's possible for you to have the two groups mechanism like this for your site working, although there is a couple of ways to consider depending which is most suitable for you.

Once the jfusion plugin is released you should be able to select your default free group as the default usergroup given to newly registered members. With the users that already have a paid subscription, it mite be best to edit the tables manually to make sure subscribers are in the right group.

Then with this other plugin extend it either with a plugin of a plugin or modifying the plugin, make it execute extra code to change the usergroup in prestashop when someone subscribes (you could also accomplish this with a jfusion module plugin I think).

I would like to help make it but I really don't have time to commit to many free and open projects atm with limited time and so many projects to finish. Although I don't like to charge for projects, thats the only way I would be able to do at the current time. If your interested in building it yourself. The tables you need to edit are ps_customer and ps_customer_group.

Link to comment
Share on other sites

  • 3 weeks later...

Good news the plugin is NOW AVAILABLE :-) fixed all the bugs in login, logout, and registration now all working perfectly. This took longer than I thought and had less time to work on the plugin so don't think just because this is a later update than the other that the project was dropped.

You can download this plugin for free from HERE. I am now submitting this plugin to the JFusion team for consideration of future inclusion in JFusion distributions and see if I can be accepted as a developer. If it is accepted and my plugin is added to there SVN I will add a new topic in the plugins/extensions part of this website with link to official JFusion website.

The download is on a Prestashop store which actually uses this plugin which you can try out if you wish ;-), BUT PLEASE DO NOT PURCHASE THE PLUGIN IT IS FREE, click the download link only.

I spend a massive amount of time on this plugin and went through a lot of frustration building, learning, and perfecting it so please appreciate the time and effort put into this project and JFusion as a whole, and respect I am offering it for free instead of trying to sell it (integration like this should be a basic standard anyone can achieve of any buisness or orginization without wasting money on black box often outdated bridge solutions).

Again thanks so much to the prestashop developers and jfusion developers that helped me along the way, wouldn't of finished it without you. enjoy. I look forward to making a jfusion plugin hopefully for wordpress next, which yes will be usable with prestashop and once again free.

Also be warned my website is under active developement so if your account gets modified or deleted it is for testing or clearing the site of too much data before release, don't worry if that happens :exclaim: .

EDIT: Since some people have been trying to actually buy this plugin even though I'd appreciate the money :) , they have either misunderstood or not read most of what Iv'e said (one lucky person even tried hacking which didn't work for them :roll: ) so aswell as offering it on my site you can download it as an attachment below. Hope this is more accessible for some people.

JFusion_PrestaShop(plugin).zip

Link to comment
Share on other sites

  • 2 weeks later...
  • 3 weeks later...

This is a little off topic but i am sure you will have thought about this.

Have you come across a joomla search plugin for a prestashop install. This would be the last thing that would need to be programmed up as you can do products feeds to the front with RSS.

Thansk

shoulders

Link to comment
Share on other sites

Yes I have, but very few jfusion plugins have search integration and my main goal at the time was user integration. I will include it in a future release once JFusion 1.6 is released (my plugin will come bundled with that by default), since my plugin is now on the jfusion svn.

I am looking very deeply into very valuable integration between prestashop and other software. I have already created a menu module for prestashop here:
http://www.prestashop.com/forums/viewthread/74336/job_offers_and_paid_services/module_gum_global_utility_menu

Which is going to integrate with wordpress first then other software that anyone thinks would be very valuable to use. Wordpress is a big integration I am doing now for both jfusion and my global utility menu module (link in this post ^^).

Blesta and myob have been suggested to me as freelance jobs, and depending on the agreement they may be included in future modules (depending on if the offer goes through).

All my work at the minute and for a while now has been integration of great applications so that's what I'm mainly going to speacialize in anyway. I could offer to help build search integration into my menu module easier and I would be willing to do that if you purchased it, depends if you actually need menu integration.

Link to comment
Share on other sites

currently I have just installed my shop and was looking just for a basic joomla plugin to add prestashop search results in to the main joomla search as i might just use it as a catalog. I am not sure about user integration yet but i am now going to look at it.

tar

Link to comment
Share on other sites

  • 1 month later...
  • 3 weeks later...

That's not included atm until JFusion 2.0 comes out, and I will be updating it to do that for JFusion 2.0.

There is another way if you comment out the registration page of prestashop and replace it with a redirect using javascript.

I will be doing a plugin for prestashop itself in 2011 (probably before JFusion 2.0) that would allow you to do this, but I'm not working on it currently. I could do it sooner, but I have work to do.

Link to comment
Share on other sites

Thnx for the fast reply.

The reason i asked this cause i didnt get it to work. prestashopa as master.. as it keeps moaning ( user sync) about :
-----------
Please enter your name.
-----------
and it doesnt actually do the user-sync

I tried every combo that made sense to me within the options... But it didnt help.

Any clue on what im doing wrong ?


Cheers

Dre

Link to comment
Share on other sites

sorry im mixing things here.


ill be more precise

Prestashop as master and joomla as slave doesnt give me any user-sync ( it just is hanging idle)

Joomla master and Prestashop slave

gives me the following errors on the user-sync :

Please enter your name.


On every user ( thousands for that matter)

Hope this clears it a bit

Any help is appreciated

Link to comment
Share on other sites

Well it wont do anything with prestashop as master as that wont be available til JFusion 2.0 so you can't don that for now.

The user sync issue your having with prestashop as slave maybe be a part you havnt setup right or a setting you changed when making it master. Ask for support over at the jfusion forums and I will be able to help you further (under others).

Link to comment
Share on other sites

  • 1 month later...

Well its been available for a while there has been several links in this topic. Do you mean the jfusion 2.0 integration?

Only things new would be that im working on xenforo jfusion integration very slowly with free time I get, and planning to make the plugin official sometime after the xenforo plugin is released.

Link to comment
Share on other sites

It should work with prestashop 1.4 since i didn't spot anything that would change how the plugin works although I can correct that if I come across something that needs working around. You can't block registration in prestashop, you can only hide it by disabling the module.

I'm looking into a new way to tackle that problem.

Link to comment
Share on other sites

  • 1 month later...

First of all congratulate and thank the great work you have done with all these plugins, modules, etc.

I wanted to ask if I can explain a little as I can do the following through the module, install it, etc., and so we can explain it correctly in the forum so that others find it easier:

The idea is that ALL that Prestashop recorded in my store, do so automatically in Joomla, and by another bridge (Prestashop – PHPBB3) or Joomla – PHPBB3 (JFusion) were also recorded in PHPBB3.

The main idea is that all records and identifications will x PrestaShop, and that the sign in automatically identifying one another.

Another important thing is that both Joomla and PHPBB3 follow the same design as PrestaShop not appreciate the change.

In my tent http://www.eluniversodelperro.com/ can see a menu above to identify where I want it to appear all user menu options of both platforms, ie: PrestaShop JOOMLA AND PPBB3.

May seem complicated to do this, but I think with everything that has largely developed, JFusion and a little patience, you can take out and help others who want to do something similar.

Can you help?

Thank you very much for everything, a greeting

Link to comment
Share on other sites

several weeks I've been trying to unite with PHPBB3 Prestashop but as it might choose to do with Joomla and this with PHPBB3.

A JFusion root and add that here appears to JFusion can integrate all .... but I is not working.

I have Prestashop as Joomla and PHPBB3 Master and slave with disabled records, but the problem is that Prestashop Email and contrasela needs, while the other two need username and password, so tell me how to do it appreciate to modify the identification of users of Joomla and PPBB3 through email and password.

If you join them all (I think if) will place a series of instructions on how to do it.

A greeting.

Link to comment
Share on other sites

Yes I can make any further modifications if you wanted to hire me to do so (bit limited to more open source stuff atm but I can open source anything I make in the process). JFusion 2.0 supports what your after except the menu (which I have my own system for which you mite be interested in), although JFusion 2.0 looks like it is a looong way away.

I know how to do this so I could provide you with that then make it open source and available to everyone else as a mix of jfusion and a new system or reverse user management (login, registration, user sync, logout).

PM your budget and timeframe if you wish to do this commercially and I will most likely be able to fit those conditions as long as they are resonable (not severly below UK minimum wage, and made in a day). Let me know as I am very interested to develope further on my integration work, but have to dedicate my freelance time to a lot of commercial projects to cover my income.

Link to comment
Share on other sites

  • 5 years later...

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...