Jump to content

[Ideas] Quotes/estimates System


Blesta Addons

Recommended Posts

Hello All ,

i will start in coding Quotes System plugin for the community , and i need some ideas feedbacks .

1 - Why Quotes System ?

Quotes is something related to the productivite and add a plus for the admins , also all the big companies use it , also some companies that offer services (design, coding, mobile APP.... ) with hourly rate (like me) , and need every time send a qoute to the clients then the client accept we creat a invoice for them . i want to make this step as easy as possible .

2 - How much cost this new plugin ?

Is totally Free , but if you consider it worth , you can donate for it .

3 - Where expected to be released ?

first we need to make a simple Quotes system that do the trick , then we will extend it to do more functionality and task and maybe automated task :) , so the simple thing we begin with it the near future date is released .

4 - what i have a TODO list ?

i have 2 TODO list , one if for the first release , and second is for next released versions .

i will group ideas based in the easy implementation and the basic feature.

TODO list 1 :

- Admins can add/edit/delete Quotes .(i'm not sure if i use close instead of delete)
- Create Quote for the client .
- Client can view Quote from the client panel .
- Cleint can accept or reject the Quote .
- Admins convert accepted Quote to invoice   not needed , as the system convert it auto .
- client can view the quotes assigned to them (accepted or closed or rejected or expired)

TODO list 2 :

- cronjob to convert a accepted quote to invoice .
- Clients can receive the quote via email as PDF , they can also download it as PDF. (implemented)
- Comments both for client and staff under the qoute (threaded reply/conversation).
- Devide Quote in two invoice after accept (for prepayment ,and after final work)

- Create Quote for non clients , they can view it with a unique url .
- Store Client info in the quotes for history .

That is all .

any one has an idea to implement it , i will add it to my one of TODO list .

Link to comment
Share on other sites

so to not lose time, the quote status will have 'open','accepted','dead','closed' .

'open', for new quotes

'accepted', when client accept the quote

'dead', when the quote is expired

'closed' when the quote is rejected or closed by admins .

i don't know if better to add a new status for rejected and Delivered status .

what i prefer if to ad new status for rejected , and add new row for Delivered , but this will be in the >TODO list 2 when i add the option to send the quote via email .

Link to comment
Share on other sites

this is the mysql shema that i will use ,  any correction ?  

$this->Record->				
	setField("id", array('type'=>"int", 'size'=>10, 'unsigned'=>true, 'auto_increment'=>true))->		
	setField("subject", array('type'=>"varchar", 'size'=>255))->
	setField("client_id", array('type'=>"int", 'size'=>10, 'unsigned'=>true, 'is_null'=>true, 'default'=>null))->				
	setField("date_added", array('type'=>"datetime"))->
	setField("date_valid", array('type'=>"datetime"))->
	setField("date_closed", array('type'=>"datetime", 'is_null'=>true, 'default'=>null))->
	setField("active", array('type'=>"int", 'size'=>10, 'default'=>1))->			
	setField("company_id", array('type'=>"int", 'size'=>10, 'unsigned'=>true))->				
	setField("currency", array('type'=>"varchar", 'size'=>3, 'default'=>'USD'))->
	setField("status", array('type'=>"enum", 'size'=>"'open','accepted','dead','closed'", 'default'=>"open"))->
	setField("note_public", array('type'=>"mediumtext"))->				
	setField("note_private", array('type'=>"mediumtext"))->
	setKey(array("id"), "primary")->
	setKey(array("company_id"), "index")->
	setKey(array("date_added", "status"), "index")->				
	create("nh_quotes", true);
		
// Quotes Lines
$this->Record->
	setField("id", array('type'=>"int", 'size'=>10, 'unsigned'=>true, 'auto_increment'=>true))->
	setField("quote_id", array('type'=>"int", 'size'=>10, 'unsigned'=>true))->
	setField("description", array('type'=>"mediumtext"))->
	setField("qty",  array('type'=>"decimal", 'size'=> (12,4), 'default'=>"1.0000"))->
	setField("amount", array('type'=>"decimal", 'size'=> (12,4), 'default'=>"0.0000"))->
	setKey(array("id"), "primary")->
	setKey(array("quote_id"), "index")->
	create("nh_quotes_lines", true);

Link to comment
Share on other sites

As for whether to use delete or close. I would suggest to go with both, but closed Quotes can be later reopened, but We should also be able to completely delete Quotes.

 

Would be nice If a Client had the ability to share Quote via Email to non registered Member who can then view it via a unique link and comment as well.

 

Thanks @Naja

Link to comment
Share on other sites

this is the mysql shema that i will use ,  any correction ?  

$this->Record->				
	setField("id", array('type'=>"int", 'size'=>10, 'unsigned'=>true, 'auto_increment'=>true))->		
	setField("subject", array('type'=>"varchar", 'size'=>255))->
	setField("client_id", array('type'=>"int", 'size'=>10, 'unsigned'=>true, 'is_null'=>true, 'default'=>null))->			

Why is client_id not required? How do you plan on sending quotes to clients who do not exist within the system? I understand quotes are not invoices, but when you create a quote, you already have a client in mind (at least their name, company, email address, etc). Might be better, and easier, if every quote you created was associated with some client. It would make garbage collection easier -- no orphaned records, etc.

 

	setField("date_added", array('type'=>"datetime"))->
	setField("date_valid", array('type'=>"datetime"))->
	setField("date_closed", array('type'=>"datetime", 'is_null'=>true, 'default'=>null))->
	setField("active", array('type'=>"int", 'size'=>10, 'default'=>1))->			
	setField("company_id", array('type'=>"int", 'size'=>10, 'unsigned'=>true))->				
	setField("currency", array('type'=>"varchar", 'size'=>3, 'default'=>'USD'))->
	setField("status", array('type'=>"enum", 'size'=>"'open','accepted','dead','closed'", 'default'=>"open"))->

What is the difference between status column and activate? For example, how can a quote be activate but "dead." Or inactivate but open? Seems like you these two fields should be normalized (merged).

 

	setField("note_public", array('type'=>"mediumtext"))->				
	setField("note_private", array('type'=>"mediumtext"))->
	setKey(array("id"), "primary")->
	setKey(array("company_id"), "index")->
	setKey(array("date_added", "status"), "index")->				
	create("nh_quotes", true);
		
// Quotes Lines
$this->Record->
	setField("id", array('type'=>"int", 'size'=>10, 'unsigned'=>true, 'auto_increment'=>true))->
	setField("quote_id", array('type'=>"int", 'size'=>10, 'unsigned'=>true))->
	setField("description", array('type'=>"mediumtext"))->
	setField("qty",  array('type'=>"decimal", 'size'=> (12,4), 'default'=>"1.0000"))->
	setField("amount", array('type'=>"decimal", 'size'=> (12,4), 'default'=>"0.0000"))->
	setKey(array("id"), "primary")->
	setKey(array("quote_id"), "index")->
	create("nh_quotes_lines", true);

Other then that, looks good.

-Adam

Link to comment
Share on other sites

Why is client_id not required? How do you plan on sending quotes to clients who do not exist within the system? I understand quotes are not invoices, but when you create a quote, you already have a client in mind (at least their name, company, email address, etc). Might be better, and easier, if every quote you created was associated with some client. It would make garbage collection easier -- no orphaned records, etc.

 

i have in mind that quote can be for clients and no clients in future release, so i have put this field to null , then i can controle if is empty or not via rules .

What is the difference between status column and activate? For example, how can a quote be activate but "dead." Or inactivate but open? Seems like you these two fields should be normalized (merged).

 

i have forget to update the shema , because i have already deleted this field , the intention was to hide a quote from client , so client can't view the quote until it was activated by admins .

Other then that, looks good.

-Adam

thanks for you feedbacks

Link to comment
Share on other sites

first step is done ;)

now creation of quote from admin panel is completed . (the same as creating invoices ;) )

now second step = client interface .

third step = adding buttons to admins and clients (actions , accept , reject and close) .

fourth step = prepare quote to be viewed by clients as html or PDF ( not sur what will be easy ? ).

final step = test and test and test and share ;)

if i have time i will add the option to send the quote via email , if no i will add it in the next major release .

Link to comment
Share on other sites

Second Step =  Completed .

Third Step = Completed.

 

 

in third step  i have succed to integrate the quote system with the invoice template core, i ahev created a my own component for quote to communicate with the invoice template, now is possible to download quote as PDF .

 

my HTML template for pdf is also supported now , you can voiw quote as html page :)

 

i have made change for the status field, now "'open','accepted','rejected','closed'" , i have removed the "dead" status as i can now determinated a expired quote by thier date_valid .

also i have removed the "Accept/Reject" from the admin side , as the client only who have the right to accept or reject the quote , admins can edit/delete, reopen a closed quote .

clients can accept/reject/view quotes . nothing else .

 

at the moment , there is no option to add tax to quote lines  (removed the TAX from quotes ) , it need a huge work for calculation and conditions for inclusive/exclusive taxes , i will added in the next major release .

 

 

i think this week i will release the first edition :)

Link to comment
Share on other sites

so to not lose time, the quote status will have 'open','accepted','dead','closed' .

'open', for new quotes

'accepted', when client accept the quote

'dead', when the quote is expired

'closed' when the quote is rejected or closed by admins .

i don't know if better to add a new status for rejected and Delivered status .

what i prefer if to ad new status for rejected , and add new row for Delivered , but this will be in the >TODO list 2 when i add the option to send the quote via email .

It will be better to use the status "expired" instead of "dead", so that it's less ambigious. No need for "reject" button or "reject" status. It should be understood by clients that closing a quote means "close without accepting" which is the same as rejecting.

 

 

TODO list 2 :

- cronjob to convert a accepted quote to invoice .

- Clients can receive the quote via email as PDF , they can also download it as PDF. (implemented)

- Comments both for client and staff under the qoute (threaded reply/conversation).

- Devide Quote in two invoice after accept (for prepayment ,and after final work)

- Create Quote for non clients , they can view it with a unique url .

- Store Client info in the quotes for history .

That is all .

any one has an idea to implement it , i will add it to my one of TODO list .

I agree with Adam, I don't think it's a good idea to create quotes for non clients. Every quote has to be addressed to someone so you will need all the same information from the person as if they were to be a client. So for a comprehensive approach this person to get the quote should be added to Blesta as if they were a client. If the person is not a client and they have a quote, then when they click accept and it converts to an invoice it would mean they have to now be a client not so?

I think there may still be a way for you to issue quotes to non clients but I believe it would be best to have something in place to drop these quotes from the database once they become expired. Ok i disagree with myself on this line so strike :P

Link to comment
Share on other sites

It will be better to use the status "expired" instead of "dead", so that it's less ambigious. No need for "reject" button or "reject" status. It should be understood by clients that closing a quote means "close without accepting" which is the same as rejecting.

about the expired sentanse is lready used in the client and admin board , also i have removed the dead status from database, because we get the expired quotes from sql query with date-valid .

client can't close quote , they have only 3 buttons, accept, reject , view .

closed quote is not rejected quote . the closed quote is the quote closed by admins, admins can't reject quote :)

 

I agree with Adam, I don't think it's a good idea to create quotes for non clients. Every quote has to be addressed to someone so you will need all the same information from the person as if they were to be a client. So for a comprehensive approach this person to get the quote should be added to Blesta as if they were a client. If the person is not a client and they have a quote, then when they click accept and it converts to an invoice it would mean they have to now be a client not so?

I think there may still be a way for you to issue quotes to non clients but I believe it would be best to have something in place to drop these quotes from the database once they become expired. Ok i disagree with myself on this line so strike :P

in this version the quote is just for clients .

about the non clients , is just a option to add or not . if we decied to add we will have some more task like .

if the quote is adressed to no client , we should use email instead of client_id , also we should genereta a unique url for the quote . and for accept button , he should take them a to a page of registration , then they fill thier info and click register and accpet button , the account should be created , the quote moved to that account , then cjange status to accept, genereate invoice, delete unique url :)

not a complicated case :)

Link to comment
Share on other sites

  • 2 years later...
  • Michael locked and unlocked this topic

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...