Tuesday, July 21, 2015

Odoo v8 New API

Hello all,

Its been long time of my presence here. Today, I would like to share few things about Odoo v8 new API which can help us to develop modules easily.

With new API, functions can be execute on a recordset, We consider 'self' as a recordset.

class test_test(models.model):
    _name = 'test.test'
    def method_test(self):

Recordset Operations:

filtered():
records.filtered(lambda l: l.account_id == self.account_id)
sorted():
records.sorted(key=lambda t: t.date)
mapped():
records.mapped('product_id.type') 

Environment variables: 
Remember: cr, uid, context in old API. In new API, we can use it with recordsets, as below:

records.env --> returns object name
records.env.cr --> returns cursor object
records.env.user --> returns logged user id

Environment alternatives:
records.env['res.partner'].sudo().create({'name': 'Priyesh'})
records.env['res.partner'].with_context(partner_id=so.partner_id).create(vals)

ORM Methods:
Consider 'self' as a recordset as below:

self.create({'name': 'Priyesh'})
self.write({'name': 'Priyesh'})
self.browse([1, 2, 3, 4, 5])
self.unlink()

Model definition with old API:
class test(osv.osv):
Model definition with new API:
class test(models.model):
Field definition with old API:
'name': fields.char('Description', size=64, select=True, required=True)
Field definition with new API:
name = fields.Char(string='Reference/Description', index=True, required=True)
name = fields.char(string='Name', default=default_name) --> To compute default value
name = fields.char(string='Name', compute='_compute_name') --> Function field

To allow searching on computed field, set 'search' parameter as below:
name = fields.char(string='Name', compute='_compute_name', search='_search_name')
To allow setting value of computed field, set 'inverse' parameter as below:
name = fields.char(string='Name', compute='_compute_name', inverse='_set_name') 

More coming soon.....

Saturday, March 29, 2014

Account Payments in OpenERP

Hi all,

I would like to share different ways of payment in OpenERP. I have found four ways to do that as below:

1. Invoice --> Payment
2. Invoice --> Bank Statement --> Payment
3. Invoice --> Bank Statement --> Manual Reconciliation --> Payment
4. Invoice --> Bank Statement --> Automatic Reconciliation --> Payment

First of all, you need to install account_voucher module for this.

1. Its very simple way to manage payment. You can register a payment from Invoice itself.

Here are the steps:
  • Create an Invoice.
  • Validate it.
  • Make Payment by clicking on Register Payment and Invoice will be validated.

2. You can import an Invoice from Bank statement to make its payment.

Here are the steps:
  • Create an Invoice.
  • Validate it.
  • Create a Bank Statement.
  • Import that Invoice that you just validate it.
  • Note that You can import only those invoice which are in Open state. (Validated Invoice only)
  • Confirm that Bank Statement.
  • Invoice will be Paid once you confirm the bank statement.

3. You can make payment of Invoices by Manual Reconciliation wizard.

Here are the steps:
  • Create an Invoice.
  • Validate it.
  • Create a Bank Statement.
  • Create a Bank Statement Line manually with that Partner and Amount that you want to pay.
  • If that amount will be match with invoice, It will be Full payment otherwise Partial Payment.
  • Confirm that Bank Statement.
  • Open Manual Reconciliation wizard.
  • You will see two entries : One for Sales Journal and another for Bank Journal.
  • Select those entries and Reconcile it.
  • Amount of that invoice will be affect.
  • If it will be same amount in Bank statement as like in Invoice, Invoice will be in Paid State otherwise Remaining amount will be appear as in Balance field in Invoice.

4. You can make payment of Invoices by Automatic Reconciliation wizard too.

Here are the steps:
  • Create an Invoice.
  • Validate it.
  • Create a Bank Statement.
  • Create a Bank Statement Line manually with that Partner and Amount that you want to pay.
  • If that amount will be match with invoice, It will be Full payment otherwise Partial Payment.
  • Confirm that Bank Statement.
  • Open Automatic Reconciliation wizard.
  • Add accounts which you want to reconcile.
  • It will automatically select related Sales and Bank accounting entries and Reconcile it.
  • Amount of invoices will be affect.
  • If it will be same amount in Bank statement as like in Invoice, Invoice will be in Paid State otherwise Remaining amount will be appear as in Balance field in Invoice.


 

Tuesday, May 14, 2013

Negotiation and Problem Solving

A father left 17 camels as an asset for his three sons.
When the father passed away, his sons opened up the will.

The Will of the father stated that the eldest son should get half of 17 camels while the middle son should be given 1/3rd (one-third). The youngest son should be given 1/9th (one-ninth) of the 17 camels.

As it is not possible to divide 17 into half or 17 by 3 or 17 by 9, three sons started to fight with each other. So, the three sons decided to go to a wise man.

The wise man listened patiently about the Will.

The wise man, after giving this thought, brought one camel of his own and added the same to 17. That increased the total to 18 camels.

Now, he started reading the deceased father’s will.

Half of 18 = 9. So he gave the eldest son 9 camels

1/3rd of 18 = 6. So he gave the middle son 6 camels

1/9th of 18 = 2. So he gave the youngest son 2 camels.

Now add this up: 9 plus 6 plus 2 is 17 and this leaves one camel, which the wise man took back.


Moral :The attitude of negotiation and problem solving is to find the 18th camel i.e. the common ground. Once a person is able to find the 18th ground the issue is resolved. It is difficult at times. However, to reach a solution, the first step is to believe that there is a solution. If we think that there is no solution, we won’t be able to reach any!

Have a nice day!

Thursday, May 2, 2013

Our reaction to the Problems

Really nice story- Cockroach theory!! 

At a restaurant, a cockroach suddenly flew from somewhere and sat on
a lady. She started screaming out of fear. With a panic stricken
face and trembling voice, she started jumping, with both her hands
desperately trying to get rid of the cockroach.

Her reaction was contagious, as everyone in her group also got
panicky.

The lady finally managed to push the cockroach away but ...it landed
on another lady in the group.

Now, it was the turn of the other lady in the group to continue the
drama.

The waiter rushed forward to their rescue.
In the relay of throwing, the cockroach next fell upon the waiter.

The waiter stood firm, composed himself and observed the behavior of
the cockroach on his shirt.
When he was confident enough, he grabbed it with his fingers and
threw it out of the restaurant.

Sipping my coffee and watching the amusement, the antenna of my mind
picked up a few thoughts and started wondering, was the cockroach
responsible for their histrionic behavior?
If so, then why was the waiter not disturbed?
He handled it near to perfection, without any chaos.

It is not the cockroach, but the inability of the ladies to handle
the disturbance caused by the cockroach that disturbed the ladies.

I realized that, it is not the shouting of my father or my boss or
my wife that disturbs me, but it's my inability to handle the
disturbances caused by their shouting that disturbs me.

It's not the traffic jams on the road that disturbs me, but my
inability to handle the disturbance caused by the traffic jam that
disturbs me.

More than the problem, it's my reaction to the problem that creates
chaos in my life.

Lessons learnt from the story:
I understood, I should not react in life.
I should always respond.
The women reacted, whereas the waiter responded.

Reactions are always instinctive whereas responses are always well
thought of, just and right to save a situation from going out of
hands, to avoid cracks in relationship, to avoid taking decisions in
anger, anxiety, stress or hurry.

Have a nice day.

Sunday, April 28, 2013

OpenERP 7.0 : Gain/Loss Exchange Rate Account

What is Gain and Loss Exchange Rate Account ? How We can use and configure it in OpenERP ?

To enable it, First install account_voucher module.

Go to the Settings --> Configuration --> Invoicing and In Features option, Tick 'Allow Multi Currencies'.

As soon as you will tick it, You will see 2 more account fields which are Gain Exchange Rate Account and Loss Exchange Rate Account.

Gain Exchange Rate Account should have Regular as Internal Type and Income as Account Type.

Loss Exchange Rate Account should have Regular as Internal Type and Expense as Account Type.

Scenario 1:

Suppose INR is base currency and USD has rate 50.00 in respect of INR.
I create an invoice of 1000 USD and validate it. Now before payment, I change rate of USD from 50.00 to 40.00.
After setting a new rate, I make a payment of it. After payment, I can see that Gain Exchange Rate Account will be credit with 5.00 amount.
1000/50 = 20 and 1000/40 = 25 means 25-20 = 5

Scenario 2:

Suppose INR is base currency and USD has rate 50.00 in respect of INR.
I create an invoice of 1000 USD and validate it. Now before payment, I change rate of USD from 50.00 to 60.00.
After setting a new rate, I make a payment of it. After payment, I can see that Loss Exchange Rate Account will be debit with 3.33 amount.
1000/50 = 20 and 1000/60 = 16.67 means 20-16.67 = 3.33

It means that Gain / Loss Exchange Rate Account will be updated on the base of Residual Amount.
If Residual Amount is > 0, OpenERP will consider Loss Exchange Rate Account for debit.
If Residual Amount is < 0, OpenERP will consider Gain Exchange Rate Account for credit.

Hope this post will help you, guys. See you later.

Cheers,
Priyesh Solanki

Saturday, April 13, 2013

OpenERP 7.0 : Attributes _track and track_visibility


_track on the object is used to track events related to a document (an invoice has been paid, an opportunity is won, a task is blocked, ...). Users can follow events, represented by a mail.message.subtype, on any object.

It's different from the track_visibility attribute that you can define on a field which is used to track changes on this field. (e.g. Stage: Proposition --> Negotiation)

Both _track and track_visibility produces messages on the document. Your object need to inherit from mail.thread.

If an object is inherited from 'mail.thread' then _track is used to send notifications. Therefore 'module.subtype_xml' is the related  "Message Subtype". These subtypes have to be declared in XML. Here is an example:

<record id="subtype_xml" model="mail.message.subtype">
    <field name="name">Relevant Fields</field> 
    <field name="res_model">project.issue</field>
    <field name="default" eval="True"/>
    <field name="description">The issue has been closed.</field>
</record>

Then whenever the field "field" is updated, all subtypes ("subtype_xml", "subtype_xml2") of this field are processed.

This means that the related method (in this example: lambda ...) is called and if the result is True, then for all users which follow this object and have checked the subtype a notification is created.

In the user preferences every user can choose whether he/she wants to be updated by email in case of new notifications.

You can also set a mail.message.subtype that depends on an other to act through a relation field. Here is an example from crm for Sales Teams crm.case.section using the section_id m2o in crm.lead: 

<record id="mt_lead_won" model="mail.message.subtype">
    <field name="name">Opportunity Won</field>
    <field name="res_model">crm.lead</field>
    <field name="default" eval="False"/>
    <field name="description">Opportunity Won</field>
</record>

<record id="mt_salesteam_lead_won" model="mail.message.subtype">
    <field name="name">Opportunity Won</field>
    <field name="res_model">crm.case.section</field>
    <field name="parent_id" eval="ref('mt_lead_won')"/>
    <field name="relation_field">section_id</field>
</record>

This allows a user to follow all "Opportunities Won" that are in a specific sales team. The user follow the event "Opportunity Won" on a sales team and he will become automatically follower of all leads/opportunities of this sales team and _track event.

Hope this post will help you to understand the concept of _track and track_visibility.

Cheers,
Priyesh Solanki

Wednesday, March 27, 2013

Operational Error coming during starting of OpenERP Server

Hi all,

Yesterday, when I tried to start my openerp-server, I got an traceback as below:

Operational Error: Could not connect to server: No such file or directory
Is the server running locally and accepting
Connections on Unix domain socket "/var/run/postgresql/ .s.PGSQL.5432"?

Error says that There was no postgresql service running on my machine.
So I opened my terminal and fire this command:
ps aux | grep post
but I did not find any result.

After that, I fired this command to start postgresql service:
sudo /etc/init.d/postgresql start

After firing this command, I found this error:
* The PostgreSQL server failed to start. Please check the log output.

After that, I went to the /var/log/postgresql/..LOG_FILES, I did not find anything over there.
It seems that it was an bad permission issue. I needed to create a new group that includes only postgres users with all necessary rights like this:

sudo groupadd dbtest
sudo usermod -a -G dbtest postgres
sudo chgrp -R dbtest /var/log
sudo chmod -R 770 /var/log

After this, I again started postgres service by firing the same command:
sudo /etc/init.d/postgresql start

And, finally I was able to see the log that was coming during that.
It was as below:
FATAL: data directory "/var/lib/postgresql/9.1/main" has group or world access
DETAIL: Permissions should be u=rwx (0700).

It was a wrong permission issue and I fired this command to solve that:
sudo chmod -R 700 /var/lib/postgresql/9.1/main/

After this, it works fine. I was able to start and stop postgres service as normal. As this issue been solved, I was able to start OpenERP Server successfully.

To solve this, I spent much time on this and that's why, I am posting this in my blog, so one does not need to try and spend much time for this if google shows my blog link to him/her regarding searching of this issue :-)

Hope this will help you.
See you later.

Cheers,
Priyesh Solanki