You are on page 1of 55

Odoo Accounting v9. Draft.

Table of Content

Introduction
Goals&Planning
ModelChanges
CashvsAccrualAccounting
ReviewReconciliation
Terminologychange
FullvsPartialmatching
Taxes
InformationonJournalItems
Taxcreation
TaxStatement
Thegenerictaxsummary
Handlingthetaxdeclarationinlocalizationmodules
Periods&FiscalYearsmanagement
FiscalYearClosing
SettingInitialAccountBalances
Sequencesmanagement
Accounts
AccountHierarchies
Activeaccounts
AccountTypes
Journals
Invoices
PaymentOrders
ModelofjournalItems
NotesforNewAPIconversion
account.py
account_analytic_line.py
account_bank.py
account_bank_statement.py
account_move_line.py
modulestructure
Changeeverywhere:
Wizards
Misc
BankandCashStatements
Expenses
1/55

ReportingEngine
ReportsMetadata
FollowupsReview
accountmodule:
account_followupmodule:
Newfeatures
kanbanjournalasadashboard
Bankingflow
Reverseentrieswizard
StornoandAngloSaxon
Modularity
Tests&DemoData
JournalEntriesRecording
SendInvoicesbyRegularMail
AddManagementReports
Deposittickets
Improvementsofexistingfeatures
Accessrights
Reconciliation
BankStatementReconciliation
BankStatementImport
Menuitems
Journalformview
Accountformview
Assets
Fiscalpositionformview
InvoiceReport
RemoveAllEDIstuff
BankAccountformview
Usability
UserOnBoardingFlow
Planner
Phase2:localization
switzerland:
US:
Ccheckwrinting
Chartofaccounts(correctionofdefaultUStemplates)
Cashdiscount

2/55

3/55

Introduction

Goals & Planning

OdooAccountingisasgoodasaccountingmodulesoftraditionalERPs.Butitdoesnothave
thequalityofdedicatedaccountingsoftware.Ourreference,intermsofusability(not
features),isXero.comOdoov9musthaveabetterusabilitythanXero.

OdooAccountingsUniqueSellingPropositionwillbe:
Supersmoothintegrationwithbanks:
Download/Importbankstatements
SmartreconciliationwithInvoices
Managepaymentseasily
Uploadpayments/sendchecks
Strongusability:
superclear&easytouse,nocomplexconfigormenus
fasttoperformdailyoperations.

Thisprojectcoversfeatureslikeassetsandexpenses.Wewillworkinthreephases:

Phase1:Genericimprovements:Oct2014Jan2015
Phase2:Localisationofkeycountries:Jan2015May2015
Phase3:Putinproductionandfinetune:March2015June2015
Phase4:Cleanextrafeatureslikebudget,analytic.

4/55


extraquestionstoaddressinworkshops
http://pad.odoo.com/p/accounting_roadmap_v9_extra_points
donotpostautomaticallyjournalentriesattheinvoicevalidation?
howcanweimprovepaymenttermswithdiscountsand/orextra
tobetested:fiscalpositionontheSObasedonthedeliveryaddressinsteadof
theinvoiceaddress
outstandingreceivable:currenciesrevaluationattheendofFY/period

5/55

Phase 1
Model Changes

Cash vs Accrual Accounting

Currently,OdooAccountingisusingtheaccrualaccountingmethodbutinsomecountries
(e.gUS),thenormismerelytodocashaccountingforsomebusinesses(usuallyservices).
Moredetailsonthedifferencebetweenbothmethodin:
http://www.irs.gov/publications/p538/ar02.html#en_US_201212_publink1000270633

Everyreportcanhaveanoptiontogeneratethereportusingacashbasedmethodoran
accrualbasedone(ontheTaxSummaryreportforexample,thiswillallowustohaveaVAT
onpaymentreporting).Thisoptionwillbeselectedbydefaultusingthisinformationfromthe
company.

Thereportsfiltersthejournalitemstouseaccordingtothemethod:
Accrual:thecurrentmethod:weusealljournalitemsinthereports
Cash:
ifjournalentriesarenotlinkedtoareceivableorpayableaccount,theyare
usedinthereport
ifjournalentriesarelinkedtoeitherareceivableorapayableaccount:ifthese
journalitemsarenotreconciled,theyarenotusedinthereport

Notethatpartialreconciliationhavealsoanimpactincashbasedreports(checkedinXero),
notonlyfullreconciliationareshownincashbasedreports.Thatmeansthatifasaleof100
with10ofvatismade,whenreceivingapaymentof11,werecognize10%ofthesaleand
10%ofthevattoo.Becauseofthis,wegonnaneedadditionalstoredfieldtoknowthedebit
andcredittouseincashbasedreports.

TODO:
addafieldonres.companytochoosebetweencashoraccrualmethod
(fields.selection,widget=radio,default=accrual)
addthefollowingfieldsonaccount.move.line:
debit_cash_basis:float
credit_cash_basis:float
atthecreationofaccount.move.line,ifthejournalentryisundera
sale/purchasejournal:thosefieldsaresetto0.Otherwisedebit_cash_basis=
debitandcredit_cash_basis=credit
6/55

atthereconciliation,onthereconcileditemsunderasale/purchasejournalupdate
debit_cash_basisandcredit_cash_basisfieldsattheprorataofthereconciledamount
onthetotalsold/purchased
inreportswherethisoptionhasameaning(P&L,BS,TaxSummary...),addtheoption
cashbasis.Ifitischecked,usethenewcolumnsinsteadoftheclassicdebitcredit
ones.

Review Reconciliation
Terminology change
Thesystemwillbeentirelyreviewedinordertocleartheconfusionabouttheterm
reconciliationwhich,inrealenglish,doesntrefertothebehaviorwehaveinOdoo.Weneed
todistinguish2usecasesthatcurrentlyusereconciliationasterminology(althoughevenin
frenchthereexists2differentwordsforthat):
1. Iwanttomakethelinkbetweenone/severalexistinginvoice(s)andone/several
existingpayment(s).Hereweshouldspeakaboutmatchingthepaymentsandthe
invoices.Infrenchwecancontinuetalkingaboutrconcilierdesfactureset
paiements.
2. IwanttomakethelinkbetweenabankstatementIimportedandexistingjournal
entriesthatarealreadypresentinmysystem.Hereweshouldspeakaboutthe
reconciliationofthebankstatement.Infrenchweshouldtalkaboutrapprocherdes
extraitsbancaires.

Becauseoftheunorderedwaywecreatedthedocument,youllstillfindinitreferencesto
bothusecasesusingreconciliationasasingleterminology.Pleasedontbeconfusedand
replacementallywithmatchingeverywherebankstatementsarentinvolved.

Full vs Partial matching


Current:
Reconciliationconceptisok.
Partialreconciliationisnotgood.Whenwepartiallyreconcile2paymentswith3
invoices,itsimpossibletoknowthedueamountforeachinvoice.

Weproposetosimplifypartialreconciliation.Insteadofusingthesameconceptasfull
reconcile(linkseverallinestogether),apartialreconciliationisadirectlinkfromonejournal
itemtoanother:youcanlinkthejournalitemofapaymenttooneandonlyonereceivable
journalitem(e.g.fromaninvoice).

TODO:
reconcile_partial_idfield:
remove:fields.many2one('account.move.reconcile')
7/55

add:fields.many2one('account.move.line')
Reviewthedueamountcomputedfieldoninvoicesandexpensestoreducepartial
payments:
Unreconciledreceivables/payablejournalitemspartialpayments
Showpaymentsdoneontheinvoiceandexpenses
SimplifyPayInvoicewizard:
nomoreselectionofdebit/creditlines(the2one2manyfields)
shouldnotbeanaccount.voucheranymore,createadedicatedobjectfor
payments.
Removethecodethattriestomergeseveralpartialreconciliationintoabiggerone.

Withthenewbankstatementthatallowstoreconcileonthefly,ausermayneverhavetodo
areconciliation1 :

Whenimportingbankstatements,thebankreconciliationprocessdothereconciliation
ofthepaymentwiththeinvoices
Whencreatinginvoices,ifthereisanoutstandingpaymentforthiscustomer,the
systemproposestoassignittotheinvoice.
1

https://www.odoo.com/forum/help1/question/howcanireconcilegeneralaccountsfrommybankstatement
56566

8/55


TODO:Whenconfirminganinvoice,ifthecustomerhasanoutstandingcredit,thesystem
proposestoautomaticallyassignittothisinvoiceasshownbythescreenshotbelow:

Ofcourse,thereconciliationprocessstillexistsbutitshouldnotbeamandatoryoperation
anymore.Userswillnothavetoworryanymoreaboutthereconciliationprocess.(whichis
notasimpleconcepttoexplain)

Nearlyalljournalitemswillbereconciledatthebankstatementreconciliationprocess2
(paymentafterinvoice)orattheinvoicevalidation(paymentbeforeinvoice).

Taxes
Information on Journal Items

IncurrentversionsofOdoo,asupplierinvoice/refundmaygeneratethefollowingjournal
items(basedonBelgiumaccounting,apurchaserefundinvoicewith21%ofVATonasingle
productcosting252.88):

Journal
Entry

Account

Taxes

Debit

Credit

TaxCode

TaxAmount

440Payable

305.98

411VAT

53.10

63

53.10

611Charges

85

252.88

Thebankstatementreconciliation(anewconceptinOdoov9)isnotthesamethingthanthejournalitem
reconciliation.(aconceptalreadyexistinginOdoo)

9/55

611Charges

21%

252.88

82

252.88

Themainproblemwewanttosolvehereisthethirdlinewithdebit=credit=0whichisa
technicalhacktohavealinewithaTaxCode85andTaxamount,butnotaccountingentries.
(weoftenhaveaccountantsthatreportsthisasabug)

Wethinkweshouldsplit:
Thedataaboutthejournalitems
TheTaxLegalStatementthatshouldbeareportliketheP&LandBS.Wedontneed
tostorethetaxcodesinthejournalitems,wejustneedtoknowwhichjournalitems
havebeencreatedbywhichtaxline.

Thetablebelowarethejournalitemsforthesametransactionthantheonedescribedabove.

Journal
Entry

Account

Taxes

Debit

Credit

TaxLineID

440Payable

305.98

411VAT

53.10

611Charges

611Charges

21%

252.88

Insteadofhavingataxcodesreferredinthejournalitemstocomputethebaseandtax
amountsforthetaxstatement,theTaxStatementReportswillcomputetheseinformation
usingjournalitemslinkedtospecifictaxes.

Themainadvantagesare:
Noredundancybetweendebit/creditandTaxAmountnopossibleerrors
Nomorestrangejournalitemswithdebit=credit=0
Weremovetheconceptoftaxcodestructurethatwascomplextounderstand
ThetaxstatementbecomesanormalreportsliketheP&L/BSsamereportengine,
lesscode.

Tax creation

Ataxhasseveraltaxlinesbutcannotbedefinedasagroupoftaxes.Taxgroupscanbe
implementedusingseveraltaxlines.
10/55


Everydocumentthatreferstoatax(invoices,expenses,)shoulduseamany2manyfield
fortaxesinsteadofmany2one.(e.g.SalesReceiptandPurchaseReceiptshouldbe
changed).

Thisway,SalesReceiptandPurchaseReceiptsaremultitaxes.Thereasonwhywedont
wanttaxgroupsanymoreare:
becauseitsabitoverlappingwiththeone2manytaxlines
becauseweneedtobeabletomakethetaxdeclarationreport,anditmakesthings
morecomplicatedifweallowtaxgroups.(e.g.isataxgroupataxinitselforjusta
shortcuttoselecttwotaxes?)

Thatmeansthatsomeofthefieldsthatwerepreviouslyonthetaxaremovedatthelinelevel:
includeinbaseamount,pythoncode.

Thetaxlinesaresimplifiedtotheminimum:
a(hidden)sequence(tomakeitdraggable),
acomputationtype(availabletypesforthetaxpartarepercent,fixed,pythonandwe
willadddivisionwhichisneededinsomecountrieslikebrazilandBolivia),
thegeneralaccount(notrequiredifleftemptythejournalitemcreatedbythistaxline
willusetheaccountofthesale/base.),
theamount,
ataxtypethatcanbeusedtogrouptaxesinreports,e.g.
Deductible/NonDeductibletaxes
thepythoncode(movedintoanotherextramodule)
theincludeinbaseamountfield=>needtogiveanexamplehowitneedstowork

Noteonhowtocomputepercentanddivisiontaxes:
Percent:(currentmechanismofOdoo)
PricewithTaxExcluded:Tax=Price*21%
PricewithTaxIncluded:Tax=Total(Price/(100%+21%))
Division:(anewtaxtype)
PricewithTaxExcluded:Tax=Price/(100%12%)Price
PricewithTaxIncluded:Tax=Price*12%

Note:
weshoulduseabetternamethandivision:PercentageofPriceTaxExcludedand
PercentageofPriceTaxIncluded.
wealsoaddacheckboxtoavoidhavingtodefinetwicethesametaxlinesforinvoices
andrefundsiftheresnodifferenceinbetween.

Thebelgianpurchasetaxof21%thusbecomesassimpletodefineasthis:

11/55

Tax Statement

IncurrentOdoosversion,thetaxstatementreportisbasedontaxcodes.Therewasachart
oftaxcodethatallowslocalizationtocreateataxstatementreportbasedonthesumofthe
fieldtax_amountfromaccount.move.line,groupedbytax_code_id.

Wethinkitsanissuebecause:
mostusersdidnotunderstandthetaxcodeconcept
somelocalizationcomputesthetaxstatementbasedonaccounts,notontaxcodes

Inv9,thoseinformationwillbecomputedbythereports.Therewillbeagenericreportcalled
BelgiumTaxStatementthatwilljustprintthesummaryofbase/taxamountspertax.
Moreover,eachlocalizationwillhavethepossibilitytodefineareportthatgivestheexact
sameinformationaspreviouslythetaxcodeswereproviding.

Letstakebackourexampleofabelgiansupplierrefundonasingleproductcosting252.88
with21%ofVAT,andseehowbothreportscanbebuilt.Assaidbefore,wehadpreviously
(v8)thefollowingjournalitems:
Journa
lEntry

Account

440Payable

1
1

Debit

Credit

Tax_code_id Tax
Amount

305.98

411VAT

53.10

63

53.10

611Charges

85

252.88
12/55

611Charges

252.88

82

252.88

While,inthev9,giventhetaxdefinedasexplainedintheabovesection,wewillhavethis
instead:
Journa
lEntry

Account

440Payable

411VAT

Debit

Credit

Tax_ids

305.98

53.10

Tax_line_id

#42
(1stlineof
purchase21%
service)

611Charges

252.88

#35

(purchase21%
service)

Notethat:
Thetax_idsisanewmany2manyfieldthatwillcontainallthetaxesinvolvedinthe
operation.
Thetax_line_idisanewmany2onefieldthatwillheldthereferencetothetaxlinethat
createdthejournalitem.

The generic tax summary

13/55

ThatreportjustloopsoneachtaxlineandforeachgivestheNetamount(sumofjournal
itemshavingtherelatedtaxinthetax_idscolumn)andtheTaxamount(sumofjournalitems
havingthattaxlineintax_line_id.Thetaxlinesaregroupedbytag(deductible,non
deductible)andthe2firstcolumnssimplyshowitsrelatedtaxnameandshortname.

Handling the tax declaration in localization modules

Becauseweneedtobeabletohavethetaxdeclarationinalegalformat,thetaxsummary
reportisntenough.Thatsthereasonwhywewantthelocalizationmodulestobeableto
definereportsthatwillgivestheexactsameinformationasthetaxcodeswereprovidingin
v8.
Forthat,wethinkthatlocalizationmodulesshoulddefineaccount.financial.reportthatwill
haveeachpreviouslyexistingtaxcodeasalineinthereportandthatwillcomputethe
amountsforthem.

Forexample,inthebelgianlocalizationmodulewewilldefinethefollowingformulaethatwill
givetheexactsameinformationwehadbeforeontheaccount.move.line.

taxcode

formula
14/55

63

sumofjournalitemshaving#42intax_line_id

82

sumofdebitofjournalitemshaving#35intax_ids

85

sumofjournalitemshaving#35intax_idstocheck

Moreexplanationontheaccount.financial.reportandthepossibilitiesofferedbyitinalater
section.

TODO:
removeaccount.tax.codeobject
createaaccount.tax.groupobject:
Namefield,translate=True
AsData:
Deductible
NonDeductible
implementthenewtaxsystem
implementthegenerictaxstatementreport
putthePythoncomputationontaxinaseparatemodule
implementthebelgiantaxstatementasanexampleofcomplexstatement

Periods & Fiscal Years management

Theconceptofperiodisonlyusedfor:
beingabletocloseaperiod(toavoidpostingjournalentrieswhenyoualready
reportedtotheestate,forexample).
Setanaccountingperiodondocuments

Theperiodconcepthasafewissues:
Usability:creationoffiscalyearsandtheyrelatedperiods
SpecialPeriodforOpeningEntries
Usersoftendothemistaketofilterondatesratherthanperiods.(forinstancetheget
theturnoverofthelastmonth).
Whenworkingwithmultiplecompanies,itsconfusingtohaveseveralperiodsforthe
sametimedelta.
simplifythereportsoptionswherewecanjustfilterondates

15/55

Insteadofusinganobjectandchoosetheperiodwithamany2oneondocuments,wewill
replacetheperiodbyanAccountingValuationDateondocuments.Forexample,therewill
betwodatesontheinvoice:
theInvoiceDateandtheAccountingDate.
theaccountingdatewillbesetautomaticallywhenonchangetheinvoicedate
Theaccountingdatefieldis:
hiddenoncustomerinvoices
visibleonsupplierinvoices

Wealsoneedtotakecareoftheperiodclosing.Weplantohaveafreezedateonfiscal
years,thatwillpreventcreating/modifyingjournalentriesinajournalifitsaccountingdateis
beforethefreezedateofthejournal.

TODO:
replacetheperiod_idwithanewdate_accountfield
removeaccount.periodtable
increationoftheanalyticlines,usethisnewaccountingdate
Onfiscalyears,addafreezedate:freezealljournalitemsuntil__/__/____(will
replacetheconceptofclosingaperiod)
weneedtoimprovethefilteringondatesranges,forkeepingeasinessonreport
options:weshouldbeabletofilterinoneclickonperiodsordates:Lastquarter,Year
toDate(usingFiscalYear1stday),ThisMonth,(shouldbeokwiththetaskof
Gery)
Removethefieldonthejournal:forcetheInvoiceDatetobeintherelatedperiod.
thiswillbemanagedbydocument,notbyjournals(e.g.supplierinvoice:2dates,
customerinvoices:1date,expenses:1dateondocument,1dateperline,...)

Fiscalyearshouldbecomeoptional,andnotmandatory.Thiswillallowto:
avoidaconfigurationwizardatinstallation
avoidtocreateafiscalyearbeforepostingnewinvoicesinanewyear(accountants
alwaysforgetthis)

Fiscalyearswillmostly(only?)beusedinreporting:
Computationoftheopeningbalanceaccordingtotheaccounttype
Easyselectionofthefilters(ThisYear,PreviousYear)andcomparisonswithlastyear.

Alloperationswillbebasedondates,notonfiscalyearsanymore.Thismeans,wecancreate
fiscalyearsafterwards.Wejustneedtheconceptoffiscalyeartohavemoreefficientfiltersin
reports.WecansetamessageontopofreportsifthefiscalyearisnotcreatedintheP&L:
Nofiscalyeardefined,thisreportcomputesOpeningBalancesincethe1stofJanuary.
pleasecreateafiscalyeartorefinethis.
TODO:checkwherefiscalyearareusedtovalidatetheabovespecification.

16/55

Fiscal Year Closing

Weplantoremovetheconceptofopeningentrieswhenclosingafiscalyear:
Reportsarealwayscorrect,eveniftheprecedingfiscalyearhasnotbeenclosed
Easierforenduser:noneedtoconstantlygenerateopeningentriesforreporting,
removethem,
Noredundancyonreceivable/payableentries
Noneedforanopeningperiod
Noneedforanopeningjournal

EveryreportwillimplementcorrectlytheOpeningBalance,atthereportlevel,notdepending
onopeningentriesjournalitems.So,fortheaccountant,thisdoesnotchangeanythingon
reports.Hejustdonothavetoworryaboutgeneratingopeningentries.>Theopening
balanceiscomputedatthereportinglevel,notbycreatingJournalEntries(it'salready
partiallylikethatinsomereports)

TheOpeningBalanceofanaccountshouldbecomputedaccordingtotheaccounttype
(P&LorBS)andthisshouldnotbediff,Indeed,itshouldbetheroleofthereporttocompute
theinitialbalancewhatevertheopeningentrieshavebeencreatedornot.

Thebiggestadvantageswouldbetohavealwaysthereportsthatarecorrectwithoutany
workfromtheaccountants.Noneedanymoretoregenerateeachtimetheopeningentries
beforeprintingthebalancesheet.Noneedtohaveacrappyspecialmovewhereeverythingis
reconciledtogether.

Inthebalancesheet,weaddalineCurrentYearEarningswiththenonaffectedresult,that
isnotanaccount,butcomputedbasedontheP&L.

Westillneedtoclosefiscalyearfor:
creatingtheRetainedEarningsjournalentry.
freezingperiods

Whenclosingafiscalyear,wecheckthattheCurrentYearEarningissetto0.Ifnot,we
openadialogmessagewithasampleentrytoregister:CurrentYearEarningRetained
Earnings.Wedonotcreatethisentryautomatically,itsjustamessagefortheenduserwitha
suggestion.(becauseyousometimeswantsomethingdifferentfortheaffectationoftheresult)

Setting Initial Account Balances

Weneedatooltosettheaccountbalancesforcompaniesthatstart:
17/55

InSettings/Accounting,addabutton:SetInitialBalances(putthisintheplannertoo)
Thisopensaneditablelistviewofallaccountswithdebitandcreditbeingread/write
Ifyouwriteindebit/credit,itcreateajournaliteminaCentralisedand
Miscellaneousjournalwiththedifferencebetweenthecurrentdebitandthegiven
one.

ThisapproachworksforbothcompaniesthatstartfromnothingorthosehavingusedOdoo
forbillingduringafewmonthsandthatdeployaccountingafter.

Sequences management

Weshouldbeabletoeasilymanagethesequences.Currentlytheusabilityisapain.Actually,
peopleshouldntatallbeawareofsequences.

SincetheFiscalyeararenotrequiredanymoreinorderforthesystemtowork(wecanuse
thembutwecanalsosimplyuseasetofdaterange),wecantbaseourselvesontheFYfor
thesequence.

Whatwewantistheabilitytocreatesequencebyrangeofdate,andthatfeaturecouldalso
beusedinothermoduleandnotonlyaccounting.

Therefore,wewillchangedirectlytheir.sequenceobject.Whatneedstobedoneisthe
following:

addabooleanfieldsontheir.sequenceobjectinordertoknowifweshouldusethe
daterangefieldsornot
addaone2manyfielddate_range_idsthatpointstoanewobject
ir.sequence.date_range
thatnewobjectonlyhasafewfields:
range_from
range_to
number_next
number_next_display(fields.functionthatdoesthesameasthe
number_next_actualfieldinir.sequence)usedtodisplaytheinformation
ontheviewandlettheuserchangeitifhewants
bydefaultthedaterangewillbealltheyear(from1stjanuarytill31th
december)
intheget_nextmethodcalledtogetthenextincrementalnumber,addaconditionto
checkifweusedaterangeornot.
ifself.use_date_range:
ifcontext.get(date,today())existsinself.date_range_ids:
18/55

incrementnumberincorrectir.sequence.date_rangeandreturnthatone
else://wedonthaveair.sequence.date_rangeyet
createnewir.sequence.date_rangeandstartnumberingatone
addaviewtoseetheir.sequence.date_range

Note:whencreatinganewir.sequence.date_range,checkifwedontalreadyhavea
ir.sequence.date_rangethatexistforthecurrentyear,ifyes,taketheonewiththeclosest
range_to(inthepast),incrementitbyonedayandusethatasrange_fromforthenew
ir.sequence.date_range(range_togoesbydefaulttoendoftheyear,exceptifwehavea
ir.sequence.date_rangeobjectwitharange_frominthefutureinwhichcaseweshoulduse
thatdayminusoneasrange_to)

Accounts
Account Hierarchies

Removethehierarchiesinthechartofaccountsandreplaceitbyoptionaltags(thatcanbe
usedtocreatehierarchiesintheCoAreportkeepinmindthattheCoAwillbeareporton
thescreen,notanymoreatreeview.Thiswillallowsmartfilters,optionslikecomparisons,...):
TheconceptofParentAccountistoocomplex.Weoftenseeaccountantsthat
createsaccountswithoutparents.
TheconceptofViewAccountsorRootNodeistoocomplex
Beingforcedtocreatethewholestructureinordertostartistoocomplextoo.(note
fromRonda:fortheU.S.version,considerstartingwiththeaccountslistedonthe
1120taxformscheduleL,page6ofPDF:U.S.chartofaccount.)

Whatwillitsolve:
EasiercreationofanewAccounts(noparent,noviewaccounts,nostructureto
precreate)
Easiertoimporttheinitialchartofaccount(justaCSVofaccountnamesandcodes)
Workingonalistofaccountsismucheasierthanbrowsingatreeofaccounts(youcan
filterallaccountsofclass30*,filteronthenametoaccessquickly,groupbyType,)

ThedefaultwaytobrowseaccountsSHOULDNOTBEanymorethroughtheChartsof
Accountstreeview.TheuserwillbrowsethedatathroughtheHTMLreports(P&L,BSor
ChartsofAccounts)thathaveahierarchy.

Havealookatthereportingsectionbelowtounderstandthis.

LegalreportsWILLhaveahierarchybutdefinedbythereport(Profit,Loss...)Wekeepthelist
viewofaccountsfortheConfigurationsection.(notforadailyusage)
19/55


Wekeeptheaggregationsystemforconsolidationofmultiplecompanies(wewillalsoadda
percentageontheconsolidationreportforcompaniesthatarentownedat100%).Weadd
Tagsonaccountsthetagswillbeusedforreportingand,eventually,thehierarchyinthe
CoA.

TODO:
Removeparentaccountsandchildrenaccountsonaccount.accountobject
Changethewaycreditanddebitarecomputedonaccounts(noneedtosumchildren
accounts)
Removethetype:Viewonaccountforms
Addanewfieldmany2many(account.account.tag)toanewobjecthavingthe
followingfields:
Name
Defineanon_changemethodtoautomaticallyselectthetypeandthetagsbasedon
thecode:assignthetagsandtypeoftheaccounthavingthebiggestnumberofdigits
incommonandminimum2(iflessthan2,dontassignanythingtothesefields.)
RemovetheChartofAccountsmenu.(thetreeviewonaccounts)thelistof
accountsisenough.Moreover,wewillhaveaGeneralLedgerreportthatrendersa
chartofaccountswithahierarchy.(newreportsareonscreenwithfiltersandoptions
likecomparisons.)

Tounderstandwhyitseasiertoworkonlistsofaccounts,youneedtounderstandthetask
thatimprovessearch,filterandgroups.Youcantesttherelatedmockuphere:
http://k2lkjf.axshare.com/#p=advanced_search&hi=1&c=1(thisisadynamicmockup,tryto
clickontheexpandfiltericon)

Itssupereasytofilterorgroupbyaccounttypes(andthiscreateshierarchiestoo).

Active accounts

TheconceptofActiveistoocomplex,andreferstosomethinguncommonforaccountants.
Weproposetoreplacethatconceptwiththefollowingrulesandmeasures:
Theusercandeleteanaccountifithasnojournalitems
Iftherearejournalitems,wecannotdeleteit
Iftherewerejournalitemsinpreviousfiscalyearsbutnotinthecurrentone,this
accountdoesnotappearinreports.
ReplaceActivebyDeprecatedcheckboxtheaccountisstillvisiblebutnot
accessibleinmany2onelinkingtoaccounts.

Thatway,thesamefeaturesareavailablebuttheusabilityisimproved.

20/55

TODO:
Removetheactivefieldonaccounts(youcandeleteanaccount,butnotunactiveit.)
CreateaDeprecatedcheckbox
RemovetheCloseaccounttype
Putdomainsonallmany2onelinkingtoaccountstonotseedeprecatedaccounts.

Account Types

Currently,anaccounthastwotypes:
AccountType:usedtechnically(views,aggregation,receivable,payable)
UserType:dependsonthecountry,usedforlegalreports(P&L,BS)

Inv9,anaccountdefinitionformshouldonlycontainonefield:theUserType(renamedinto
Type).ThecurrentAccountTypeshouldbeafieldontheUserTypeobject.

TODO:improvethismockupstoaddTags,amany2many_tagsfield.
21/55


Notethatpeoplewillstillbeabletocontinuedefiningtheirownusertypethroughthe
configurationorlocalizationmoduleiftheywantbutwebelievethiswontbenecessarymost
ofthetimeasweplantocreatebydefaultthemainones(revenue,sales,directcosts,other
income,expenses,depreciation,overheads,currentassets,prepayments,bankaccounts,
fixedassets,noncurrentassets,currentliabilities,liabilities,noncurrentliabilities,equity).

TODO:
Onaccount.account.type:
Putatypeselectionfield,withsamedefinitionthanthecurrentoneon
account.account
Onaccount.account,thetypefieldbecomesarelatedtouser_type_id.type
RemovetheTypefieldfromtheformview
createintheaccountmodule,thefollowingaccounttypes:revenue,sales,directcosts,
otherincome,expenses,depreciation,overheads,currentassets,prepayments,bank
accounts,fixedassets,noncurrentassets,currentliabilities,liabilities,noncurrent
liabilities,equity)
configurethebuiltinprofit/lossandbalancesheetreportsasshownbelow:

22/55

Journals

Journalsshouldhavetwosequences:
Invoices(alreadyexists)
Refunds(newmany2onefieldtoadd)

Thisallowscompaniestoputinvoicesandrefundsinthesamejournalorcreatetwoseparate
journals.

Advantagesofputtinginthesamejournal:
Turnoveriscorrectinthelistofinvoices(invoicesrefund)
Dashboardissimplified(not2xeveryjournal)

Bydefault,attheinstallationofthesoftware,onlyonesaleandonepurchasejournalsare
created(invoiceandrefundareinthesamejournal).Thisallowstohaveacleardashboard
andnotduplicateeverymenu.

Whencreatingarefundbasedonaninvoice,ifthesequenceissetforarefund,thesystem
donotaskforajournalandautomaticallyputtherefundinthesamejournal(inthewizard).

Inthedashboard,thebuttontocreateaninvoicehasadropdowntoalsocreatearefund.Like
this:http://getbootstrap.com/components/#btndropdownssplit

Invoices

Addacomputedfieldoninvoices:amount_total_signedwhichistheamountinthecurrencyof
thecompanyandnegativeforrefundinvoices(orrefundsupplierinvoices).

Displaythisfieldinlistviews(insteadofthecurrentamount_totalone)butnotinformsviews.
Thiswouldallowtoputinvoicesandrefundinvoicesinthesamemenuandhavethetotal
belowwhichiscorrect.

Theonchangetosettotalandtaxesshouldbeautomatic.Thiswouldbeanautomaticwin
whenportingtothenewAPI.

Changedata/demodatathedefaultistousethesamejournalforinvoicesandrefund
ratherthantwodifferentjournals.Peoplecouldchangethisbutbydefaultwewillputinvoices
andtheirrelatedrefundsinthesamejournal.
23/55

Payment Orders

PaymentshouldbemanagedbythePayInvoicebuttononsupplierinvoices,insteadofthe
currentPaymentOrderform.Onceinvoicesarepaidviathisbutton,amenucanbeusedto
sendthepaymentstothebanks.(orgeneratefileslikeSEPA).

So,paymentorderarereplacedbyjournalentrieswithastatus.Youmustbeabletosearch/
filteroninvoicesbasedontheirpaymentstatus:ToPay,PaymentOrdered,PaymentDone.

Removetheaccount_paymentmodule
Putapayment_statefieldonjournalentriesaccount.move
None
Todo
Done
Onthejournal,ifitsabankjournal,adda:
payment_typefieldselection:
Manual
CheckPrinting
SEPA(ifaccount_sepaisinstalled)
InthePayinvoicewizard,displayaselectionfield,withdefaultcomingfromthe
journal:
Payvia:SEPA,manually
Inthepaymentordermenu,displayalljournalentrieshavingpayment_stateintodo:
Domain:payment_state<>None
DefaultSearch:payment_state=todo

Onsupplierinvoices,addawizardallowingtomarkselectedinvoicesforpaymentinbatch.
ThisallowstodoBulkPayments.Thiswizardletsyouselect:
Paymentmode:Journal
PaymentMethod:SEPA,Check,(comefromtheselectedjournal)
nearthepaymentmethods,youhaveinformationlike:
CurrentBalance:4500
ToPay:2300
ScheduledforPayment:1000
Balance:1200
Date:Directly,AtMaturityDate

24/55

Model of journal Items

Weplantokeepmodelofjournalentries,butnotsubscriptions.Thesubscriptionmechanism
willbereplacedby:
contracts:forinvoicebasedsubscriptions(alreadyexists)
modelofjournalentries:thatcanbecalledeasilyinajournal
modelofjournalentriesinbankreconciliation(alreadyexists)

Remove(temporarily?)subscriptionsonjournalentries.Thefeatureisnotgoodenoughtobe
maintainedasitis.Moreover,thenewtoolsallowstobettermanagerecurringentries:
bankloans:usemodelsduringbankreconciliationprocess
rentals:youcanuserecurringinvoicesoncontracts
payroll:usemodelofentriesandchangethemonceamonth
socialtaxes:samethanpayroll.

Asitwillbeveryeasytocallamodelorusemodelsduringbankstatementsreconciliation,I
thinkwedontneedsubscriptiononjournalitemsanymore.

TODO:
removetheobjects
addabooleanfieldonjournalentries:JournalEntryModel
Addabuttononjournalentriesformviewtocallamodel,selectamodelinthesame
journalandthejournalentrysautomaticallycreated.
Addasaveasamodelwizardonjournalentries(youcangetitfromtheMore
menu)

Notes for New API conversion


toreviewagainbasedonthedecisionsmadeintheothersections
SometechnicalcommentstocleanwhenportingtothenewAPI.

account.py
removemethodcheck_cycle(sinceweremoveparent_id)
payment.term:
Thelatestrowofapayment.termshouldalwaysbebalance
payment_term.line
Valuesshouldbein%,insteadofbetween0and1
account.account.type
removethefollowingmethod(andcheckwhyweneededit)
_get_financial_report_ref
_save_report_type
25/55

_get_current_report_type
close_method:
removetheDetailone
checkifwestillneedtheunreconciledone
removemethod_code_get(usemany2oneinsteadofselectionfieldfortype)
account.accountobject:
removeparent_id,parent_left,parent_store
remove_get_level,_get_child_ids,_check_recursion,_check_type,
_check_account_type,_check_company_account
simplifyname_search
removethefeaturethatallowtosearchonname:...ortype:...?
name_get
accordingtothecontext,name_getshouldreturn
Code(only)
CodeName
removecopymethod(andpossiblysetcopy=Falseonsomefields)
remove_check_allow_type_change
remove_check_allow_code_change(forgetaboutthemessageaboutlackof
confidence.PeoplewilllikeOdoobecauseitssimple.)
account.fiscalyear:
removecodefield,keeponlyname
removename_searchmethod
renameend_journal_period_idintoend_journal_id(many2onetojournal,)
removeobjectaccount.journal.period(andeverythingrelatedtoit)
account.moveobject:
removeaccount_move_prepare(thismethodisnotusedanywhere)
account.move.reconcile:
removeline_partial_idsfield
removetypefield
removeconstraint_check_same_partner???todiscussiinworkshop
removereconcile_partial_check
removename_get(sincethereisnopartialanymore,noneedforaspecific
name_get)
removeaccount.modelandaccount.model.line(andeverywhereitisused)
removeaccount.subscriptionandaccount.subscription.line(andeverythingrelatedto
this)
removeaccount.

account_analytic_line.py
removethesearch()method.Checkifsomemethodsareusing(from_dateorto_date)
inthecontextanduseadefault_searchonthecontextinstead.

26/55

account_bank.py
checkwhyweneedpost_write?Thiscodeshouldprobablybemovedelsewherein
thecodethecreatethebankandjournal

account_bank_statement.py
Separateaccount.bank.statementandaccount.cash.statementintotwoobjects
(eventuallyinheritingfromthesameobject)
Alotofmessiscomingfromthis
account.statement.operation.template
Wemayneedbothafixedamountandapercentageamount(ANDorOR)

account_move_line.py
removemethoddefault_get_move_form_hook
removeconverttoperiod
default_getshouldbesimplifiedALOT
noneedtocomputeremainingbasedondebit/credit/taxes
removedefault_get,putdefaultmethodsonfields
removefieldinvoice
removelist_periods,list_journals
(probablymoresimplificationtodohere)

module structure
Removethesubfolderaccount/projectandputeverythingrelatedtoanalyticaccountingintoa
single.pyand.xmlfiles.

Change everywhere:
thecontextshouldnevercontainperiod_idorjournal_id!
usedefault_period_idanddefault_context_idinstead

Wizards
Removethefollowingwizards(andeverythingrelatedtothem):
account_automatic_reconcile.py
account_change_currency.py
account_chart.py
account_journal_select.py
account_reconcile_partner_process.py
account_subscription_generate.py
account_use_model.py

27/55

Misc
Onaccount.move,addafields.reference(Origin)thatistherealdocumentthatcreatedthis
entry:
saleinvoice,purchaseinvoice,salesreceipt,purchaseReceipt,Asset,bankstatement
Ifnothinginreference,itsaJournalEntry

RemovethedecimalprecisionAccountandinsteadofit,
roundbyusingthecurrency(foreigncurrencyinvolvedorcompanycurrency)
storethefulllengthofthedecimalindb
usewidget=monetaryinviewssothatthedisplayofthesefieldsarestillfine

Bank and Cash Statements

Thecurrentimplementationofbankstatementsandcashstatementsisugly.Iwouldsuggest
tosplititintwodifferentobjectssothattheycaneachimplementitsownlogicwithouthaving
sideeffects.
Refactorthecodesothat:
account.statement&account.statement.linebecomesthemainobject:
renameobjectaccount.bank.statementaccount.statement
renameobjectaccount.bank.statement.lineaccount.statement.line
account.cash.statement_inheritsfromaccount.statemenetandaddhisownlogic.
Changethemenusandscreenstodirectlyworkontheaccount.cash.statementfor
cashregisters.

Expenses

Inthev9,employeeswilldirectlycreateexpenselines(orexpenselinescanbecreatedby
usersonbehalfofothersemployees)insteadofcreatingexpensesheets.

Hereisapropositionofanewuserflow:
1. Userscreateexpenses
2. TheycanclickSubmitonexpenses:
a. whensubmited,theexpenselineisaddedtotheexpensesheetthatisstillto
validateforthesameuser.
b. Ifnoepxensesheettovalidateexists,anewoneiscreated
3. TheHR/Managercanvalidateexpensesheetsthatareintovalidate
4. Theaccountantcangenerateentriesforvalidatedexpensesheets

TODO:
28/55

renamemodulehr_expenseexpense
renameobject:hr.expense.lineexpense
renameobject:hr.expense.expenseexpense.sheet
addastatefieldonexpenseobject:DraftSubmited
addabuttonDocumentsonexpensesheettoopentheattachmentsofrelated
expensese.g.scanneddocuments
Createamobileapptoeasily:
Takeaphotoofanexpense
Registername&Price
SendtoOdoo
Trackstatusofexpenses

Thetax(es)shouldalsobeselectableontheexpenseline.

29/55

Reporting Engine

Inthepast,wehadtwodifferentusagessupporteddifferentlyintheapplication:
List/Treeviewstobrowsedatainthescreen(e.g.treeofaccounts)
PDFreportstoprintdata(e.g.P&LandBS)

Inthefuture,reportingshouldbecomethedefaultwaytobrowsethedata.Reportingwillbe
normalHTMLviewsthatopensinthenormalUI(keepingtheleftmenu).Wizardsare
replacedbyfiltersandoptionsonthetop.Whetheryouwanttoworkonthedata(inthe
screen)orprintthemitsthesame.

Forperformanceissueswithhugereports(e.g.generalledger),wecanusepagerandlazy
loadingtomakethemveryfast.Ofcourse,ifyouclickonPrintbutton,itstillusesthewebkit
print(witheverythingunfolded)

Onthetechnicalpointofview,reportswillbegeneratedserverside.Thatmeansthatifwe
wantthemtobedynamic,weneedtosplititintoseveralssmalltemplatesandwhendoingan
action(likefold/unfold)wecanonlycallthesesmalltemplatesandreplacetheminsidethe
generatedhtml(thisinordertopreventreloadingtheallreportwheneverwechange
something)

30/55

TODO:improvethemockup.Itsnotgoodenough.Thereportinghastobeakillingfeature.
Wehavetodo3samplereportsinmockupstogointothedetailsofthefeatures.E.G.:we
canusegraphsontopofthedatatable(likeingoogleanalytics)putpostitseverywhereon
thepage,addsparklinesnearaccountnumbers,...Weshouldbrainstormabitmore.what
aboutusingpivottables?NoaccountingsoftwarehasarealBIintegrated.

Wewilladdactionsinthereporting.(e.g.youcanreconcilejournalitemsdirectlyfromthe
partnerbalancereport)Ifyoufindjournalitemstoreconcileorifyouwanttodrilldowninan
account,youcandoitdirectlyfromthereport.

Thefiltersareonthetop.Youllbeabletochangetheoptionsandwillseetheresultinthe
samepage,orexpandsomepartofthereportassomelineswillbeclickable(e.g.clickonan
accounttozoomintoit)Wecanimplementfold/unfoldinthereportaswell.
31/55


Theideaistoofferthepossibilitytouserstoplaywiththeoptionuntiltheygettheinformation
theyneed.Then,theyhaveabuttontoprintthecurrentreportdisplayedinapdf.

WecanalsoaddfeatureslikeAddaCommentoneveryline/header/footer.(likepostit)This
way,theaccountantcancommentareportbeforegivingittothemanagers.Simpleexample:
PrinttheAgedReceivablereportandputnotesfortheresponsibleofthecreditcollection
effort.(checkwhythiscustomerdidnotpay,hetoldmeitshouldhavebeendonelastweek)

Listoffeaturesonreports:
filters/groupbyonthetopofthesheet
Addnoteseverywhere
Fold/Unfold(exampleP&L,BS)inJS
Drilldown(clickonanaccounttogetitsdetailedjournalitems)
optionalgraphsand/orsparklines
Weneedextrafieldsliketagsontheaccountthatcanbeusedtogroup.
Weshouldbeabletocreategroupsthataremasterdataindependentofthechartof
accountinwhichweputtheaccountswewanttoanalysetogether.Especiallyifthere
isnotmuchdoneinanalyticaccounting.Thesegroupsshouldbeusedasaselection
criteriaandalsoagroupingcriteriainreporting.

Developmentinprogresson
https://github.com/odoodev/odoo/tree/masterhtmlreportconfiguratorpvy

Evenifsomeoptionsofthefiltersarecommon(YoYcomparison,accrual/cashbased),some
optionsshoulddependonthereport,example:
P&LDates:fromto
BSdate:At

Reportstoadd:
Executivesummary(ratioliketheBesoinenFonddeRoulement(WorkingCapital),
disponibilitdetrsorerie,)
ChartofAccounts/GeneralLedger(note:itlookslikethetermGeneralLedgerisnot
thesameinU.S.orinEurope:Insage,thegeneralledgerisaprintofalljournalitems
peraccount.InXero,itsallaccountsandtheirbalance,butyoucanclicktozoomto
thejournalitems)
Cashflowstatement
TaxSummary(kpitocontrolthetaxreportiscorrect)
Partnerstatement(animprovedAgedBalance)

Replaced:
theGeneralledgerwillreplacedbythelistviewofaccount_move_lineinordertobe
abletohavemoreflexibility(search,group_by,etc)
32/55


Allotherreportshavetobeimproved:agedbalances,p&l,bs,

ImplementtheAccrual/CashBasedasanoptiontomostreports.

cashflowstatementexample:

Reports Metadata
currentlybeingwritten
Someaccountingreportsshouldbedefinedusingaccountfinancialreport:thesearetheP&L,
BS,ChartofAccount(TrialBalance),CashFlowStatement,ExecutiveSummaryandallthe
countryspecificreports.Alltheotherreports(taxgeneric,agedpartnerbalance,followup,...)
willusecustomcodeandwontbebasedonaccountfinancialreport.

Account.financial.reportshouldbebasedonfilters,thatwaywecanspecifyitforanyaccount
orotherfinancialreports.ThiscouldbeusedtocreatehierarchiesintheChartofAccount
33/55

report(notanymoreatreeview)ortocreateKPIsintheexecutivesummaryliketheBesoin
enFonddeRoulement/WorkingCapital.

Wegonnasplitthecurrentaccount.financial.reportin2models:account.financial.reportand
account.financial.report.line.Thefirstoneistheretodefinedthereportandglobaloptions,
suchasnumberofcolumnsinsidethereport(debit+credit+balanceoronlybalance),header,
andsoon.Itwillservethesamepurposeasthecurrentwizardwehavewhenopeninga
report.Thesecondmodelcorrespondtothecurrentaccount.financial.report

Shouldbegenericforallreports:
Targetmoves(allentries,postedentries)
date_from
date_to

Object:account.financial.report
Boolean:allowcomparison
Boolean:allowcashbasismethod
Boolean:showdebitcredit
Boolean:showbalance
ReportTitle

Objet:account.financial.report.line
Domain(tospecifywhichjournaloraccounttoshow)(shoulduseir.filters)
groupby
Referencefield:Actiontoperformwhenclickingonaline(openaccount,invoice,
other)
Type:selection:
Accountstoberemoved,itsmoreflexibletoforceusingtags
AccountTypes
AccountTags
Reportstoberemoved,wecanuseformulaeforthis
SumofChildren
Formulae

Formulae
e.g:[Income]/[Income,1]*100(incomegrowth)
Canbebasedon
[ReportCode]
[ReportCode,1,debit]precedingperiodanalysed
[ReportCode,1:3,debit]preceding3periodsanalysed
[ReportCode,0,debit]currentperiod
{tag}notsureifReportCodeisenoughornot?
{tag,1}samethanReportCode
34/55

#DaysNumberofdaysintheanalysedperiod
#Days[1,3]Numberofdaysinthelast3periods
#MonthsNumberofmonthsintheanalysedperiod
ReportType:
Currency,Percent,SimpleFloat
DisplayDetail
SumOnly
AllAccounts
AllJournalItems
DrillDown:
Show.
Style
h1,h2,h4,h4,p
Possibilitytohavepythoncode(withasafeeval),thatwaywecandothingslikeiftotal
>0thenprintsomethingelseshownothing
Shouldbeabletoprinttaxdeclarationtoo

TODOfullspec
Oneveryreport,whenclickingonaline,itshouldopentherightdocument,accordingtothe
originreferencefieldontheaccount.move.

Followups Review

Thefollowupsgonnabeimprovedinthefollowingway:accountmainmodulewillhavea
simplefollowupsystemmadebyinvoicethatshouldbeenoughformostofpeople.The
advancedfeatureswillbeaddedbythecurrentaccount_followupmodule.

account module:
Onthelistviewofinvoice,allowtoeasilyaddanexpectedpaymentdate.Orderthelistof
unpaidinvoicebyexpectedpaymentdate(firsttheoneswithoutexpecteddate),highlightin
redtheoverpassedones.Onthesameinvoicelist,youcaneasilyloganinternalnoteordo
theusualstuff(printtheselectedinvoices,sendthembymail..).Thenewthingisthatyou
havethepossibilitytosentthecustomerstatement.Thatactionmakeyoujumponthelistof
partnershaveareceivableaccount>0andshowingtheirdueamountandlastremindersent
date.Youcanselectonlysomeofthemandeffectivelyprintthecustomerstatementwhichlist
theirinvoicesandpaymentsunderastaticcustomizabletext(tosetonthecompany).The
reportisHTMLmadeandfirstdisplayedonthescreenbeforeyoureactuallyabletoprintit.

35/55

account_followup module:
Oncethismoduleisinstalled,userscanusethefullpowerofthecurrentmodule:define
severalfollowuplevelwiththeirlevelspecifictexttoprintonthecustomerstatementinplace
oftheregulartextandaccordinglytothehighestlevelofthepartnersinvoices.

36/55

New features
kanban journal as a dashboard

Menusaretoocomplex.Withacleankanbanview,theuserwillnotevenneedtousemenus.
Alotofmenusmayberemovedduetothis.(functionlikeimportBankStatementcanbedone
directlyfromtheKanbanviewwithabigbuttonontheBankjournal).

Thekanbanviewofjournalswillhelptoreducethenumberofmenuitemsbyprovidingsome
infoinahandywayandshortcutsdedicatedtothetypeofjournal.Whenyouclickonthe
Accountingmenuitem,youarriveinthedashboard(=kanbanviewofjournal)

Eachjournalwillshowvariousactionandinformationaswellasshortcutsfortheuser.Hereis
thelistforeachjournaloftheactionsitneedstobeabletoperform:

Salejournal:
a2linedchartshowingthecurrentmonthturnoveragainsttheturnoveroflastmonth
figuresandshortcutswillbeforthesalejournalANDfortheassociatedsale_refund
journal
Howmany(draft,duethismonth,tobesend)invoiceswehave
Linktosee/createinvoices
paymentfollowupactions

Purchasejournal:
agraphshowingtheestimatedcostovertime.graphshouldstarttodayandvalue
shouldgoincreasinglyforthefuture(aswehavedraftandvalidatedpurchasethatwill
come)
figuresandshortcutswillbeforpurchasejournalandassociatedpurchase_refund
journal
showhowmanydraft,due,validatedpurchaseswehave
Linktosee/createpurchaseinvoice

Bankandcashjournal:
Linegraphshowingjournalentries
TransferMoneyNewwizardtodevelop,tocreateajournalentry
SendMoneyPurchaseReceiptwithdefaulttothebankaccount
ReceiveMoneySalesReceiptwithdefaulttothebankaccount
ReconcileAccount
ImportaStatement
View/createstatements

37/55


canbetestedon:https://github.com/odoodev/odoo/tree/masterjournaldashboardcsn

Thedesignerswillmakethisdashboardbeautiful.

Notethat:
thegraphsshouldonlybevisibleforthemanagersoftheaccountingapplication(to
dealwithaccessrightsrestrictions)addhegroupinthekanbanview
inthekanbanview,userswillonlyseejournalsforwhichtheyhavebeenaddedas
users(astheywoulddoforprojects)
possibilitytoaddsomejournalsinfavorite(byclickingonasmallstarforexample),
thosewillshowontopoftheview.
onlyAdvisorgroupcanseethegraph

HereishowitlookslikeinXero:(mainbuttonslikeReconcileonbankstatementjournalor
CreateInvoiceonsalesjournalaredirectlyinthisview)

38/55

Noteaboutmoneytransfer:
Atraditionalapproachtotransfermoneyfromonebankaccounttoanotheristousean
intermediaryaccount(e.g.inBelgium,58virementsinternes)Butmostaccountingsoftware
donothaveagreatbankreconciliationfeature:youcanpreregisteratransactionandits
reconciledafterwardswhenreceivingthebankstatement.Butwithagoodbankreconciliation
mechanism,itchangeseverything.

IjusttestedXeroandtheydoadirecttransferthatkeepsa"unreconciled"status.It'satthe
sametimemorepowerfulandeasier:
Morepowerful:asyoudirectlygivetherightdestinationaccount,thesystemexpectto
getthistransferinthisspecificaccount.(forecastsarebetter,reconciliationiseasier)
Easier:noneedtoworryaboutintermediaryaccountsandreconcileentriesinthis
account.It'sfaster,youonlyhaveonetransactiontorecord,thereconciliationisdone
athestatementofthesecondbank.Moreover,intermediaryaccountsareanightmare
inmulticurrencies.(howdoyouknowifthedifferenceisduetocurrencyexchange
ratesorprofit&losswhenreconcilingafterwards)

So,themoneytransferwizardsshouldonlyhavethefollowingfields:
Date
FromAccount
ToAccount
39/55

Amount
Communication

ItshouldjustcreateaJournalEntry.(directlyfromonebank/cashaccounttoanother)

Itcanbeagainstthehabitofsomeaccountantsthatareusedtouseanintermediaryaccount,
buttheycanstilldothatduringthebankreconciliationprocess(eveninoneclickusingmodel
ofentries)

40/55

Banking flow

Assaidintheintroduction,oneofourprimaryobjectivewillbetosmooththeprocesses
relatedtothebankingflow.TheimportofCODA,.OFXand.QIFfileshavealreadybeen
developed.TheSEPAintegrationisalsointhepipe.(directdebit,payments,bankstatement
import).

Butwewanttogomuchfurtherthanthat.Wewanttohavebankstatementstobeimported
automaticallyfromthebankeveryhour.Wewantpaymentordertobesentautomaticallyto
yourbank,checkstobeprintedautomatically,

Fabienstartednegotiationwithexternalwebservicesinsomecountriestoautomatethese
interfaceswithbanks.

Whatdoeseverymanagerdowhenhearrivesattheoffice?Hewantstocheckthe
paymentreceivedontheday/yesterday.WewantOdootoallowthat!Arealtimevisibilityon
yourcashandthepaymentofyoursuppliersinoneclick,

ThiswillbethereasonwhypeoplewillloveOdooaccounting.Itwillevenbeinournewuser
onboardingflow(seebelow)

Reverse entries wizard

Yearsago,amodulenamedaccount_reversalwascreatedbythecommunity.Itsgoalisto
offeraneasywaytocreatetheexactoppositeaccountingentrythantheselectedone.
https://www.odoo.com/apps/7.0/account_reversal/

Wearewillingtointegratethemainfeatureofthemoduleaspartofthecorefeaturesofthe
accounting,butwebelieveitneeds
somecodereview
codeconversiontonewAPI
someofthesatellitefeatures(e.g.checkboxtobereversed+filter)tobedropped

Storno and Anglo-Saxon

TheStornomodule(puttingnegativevaluesindebitand/orcreditwhenreversingajournal
entry)shouldbeintegratedbydefault.
41/55

BothStornoandAngloSaxonshouldbeinseparatedmoduleANDtheymustbeactivatedby
company.Thiswouldallowtohavemulticompaniesenvironment,somewithstorno
accounting,otherswithout.

Modularity

Thefollowingchangesshouldbedoneonmodules:
mergeaccount&account_voucher(andremovealltheunnecessaryfeaturesin
voucher)
putPythonCodefortaxcomputationandRatesinaseparatemodule:
account_tax_advanced
officializeaccount_storno

Tests & Demo Data


Tests and demo data currently rely on a dedicated test chart of account and
taxes, which currently results in creation of duplicated Chart of Accounts,
duplicated journals and so on. Those demo data pollute the demo instances and
confuse people. The runbot is also hardly usable because of several localization
modules installed.
In order to clean the databases installed with demo data, and the runbot, we
gonna do the following changes: the demo data and the test files will be located
in the account module but they will only be instantiated and tested in
localization module: they will simply be referred in l10n_*/__openerp__.py by
demo: [../account/demo_file.xml]
test: [../account/test/test_file.xml]
When installing a l10n_* module, the system will check if there already exists a
CoA for the users company. If not, it will directly generate the CoA from the
installed templates, otherwise the template are just installed normally.
In order to have the accounting tested using a random localization, the runbot
will install only one random localization module (for the main company),
skipping the other ones.
42/55

Journal Entries Recording

TODO:speconhowtorecordjournalentries.

Send Invoices by Regular Mail

Wedevelopedaninterfacewithaservicethatallowstosendinvoices/quotationsbyregular
mailinallcountries.(invoicesareprintedinthelocalcountryanddeliveredbythepost.It
costslessthan$1perlettertosend).WeusetheservicesofDocsawayandhavean
agreementwiththemtoputtheOdoologoonthefrontletter.

TODO:improvethismockup:SettingslikeInk,PaperWeight,currency,balancecanbeinthe
Settings.(unlessthebalanceisnotenoughthenweshouldhaveamessage)

43/55

So,youdontneedtoprintinvoices,puttheminenvelopandpostthem.Justsendthemby
postinoneclick.Thewizardworksonasingleinvoicebutalsoallowtosendabatchof
invoicesatonce.

Add Management Reports

44/55

Improvements of existing features


Access rights

Renameaccessrights:Billing,Accountant,Adviser.

Reconciliation

WIP:https://github.com/odoodev/odoo/tree/mastermanualreconciliationama/
inthewindowofmanualcounterpart,addageartosaveasatemplateandanotherto
managetemplates.Ifthelistofbuttonistoobig,haveabuttonmoreinsteadofgoingin
severallines

Sincebankstatementdonotusetheaccount.voucherobjectanymore,itcanbesimplifieda
lot.AccountvouchersareusedforSalesReceiptandpurchaseReceiptonly.

45/55

Bank Statement Reconciliation

Tocheck:
DontrememberifwefinishedtheReconcileWithExistingEntriesfeature(iftheguy
usedthePayInvoicebutton.Usefulforcheckshandling(orcreditcardpayments).
Somecountriesprefertodothatratherthanusinganintermediateaccounts.

Bank Statement Import

46/55

WIP:https://github.com/odoodev/odoo/tree/mastermanualreconciliationama/

Todo:
Improvethebinaryfieldwidget(uglyandunusable)
ReconcilethefirstsentriesandtherestinthebackgroundstonotlocktheUI
inthenotificationwindow:
addlinkstogoonthelistofitems
donotclosebyclickingonthenotificationbutonlyifweclickonacross

Forinformation,thestandardflowofreconcilestatementsintheU.S.:Checktheuserflow.
Todo:checkthatthedashboard(journalkanban)displaytheseinformation.

Currentlysupportedformat:CODA,QIF,OFX.

MakeitworkfortheCSVimporttoo.(usingtheCSVimporttoolwithsometweakstocreate
journalentrieswhenimportingjournalitems).basedontheCSVimporttool.
Createjournalentriesandlinkthem
AutoassignCoAaccountsandpartnersaccordingtobankaccounts

Todo:addstepbystepscreenshotsonhowtogetyourbankstatementfileaccordingtoyour
bank.(likeslides)Weneedthisineverycountry.Callforcontributorswiththecommunity.
(createadocumentofwhatwearelookingforweneedtodothefirstsonesforBelgium)

47/55

IhavetestedaBelgiansmallSaaSBilling/BankInterfacesoftwareafewweeksago.Theydid
itright(screenshotsofeverystepstogetyourcodafileineverybank)butIdontfindit
anymore.

Menu items

Thenumberofmenuitemswilldrasticallybereducedthankstothedashboard.(kanbanview
ofjournals)Secondaryfeatureswillbeavailablefromthedashboard.

Themenustructureontheright:
Accounting
Dashboard
JournalEntries
Customers
SaleInvoices
SaleRefunds
SalesReceiptshouldwekeepit?
Customers
Suppliers
PurchaseInvoices
PurchaseRefund
PurchaseReceipts
Suppliers
Statements
PaymentFollowup>CustomerStatements
...
PeriodicalProcessing
Reconciliation
Manual
Automatic
Reports
ProfitAndLoss
BalanceSheet
AgedReceivable
Taxes
AllReports(likeinXeroifareportisfavourited,itsaddedinthismenu)
Configuration
Accounting
FiscalYearThisformcouldbeusedtocloseaperiod/fiscalyear
Accounts
Journals
48/55

BankAccountsintechnicalfeatureforimportonly
Modelsmodelofentriesshouldbedefinedwhereweuseit.
Taxes
TaxesDefinition
FiscalPositions
FollowUps
PaymentTerms
Followuplevels

TheAllreportsmenushowsallreportsandyoucanfavouritesometomakethemappearin
themenu.

TODO:mockupforthisfeature(andhowwehandlecustomreportdefinition)

49/55

Journal form view

Todo:improvethismockup:
CodeShortNameonReports/defaultprefixforsequence
ExplaintheTypefield(isthereatooltip?)
Explainthelinkbetweenjournalandpaymenttype,itsnotusual.

Account form view

50/55

Assets

Theassetcategoryshouldappearconditionallyaccordingtotheproduct.(addamany2one
assetcategoryonproduct.templateobject)

Whensettinganassetcategory,theaccountshouldchangeaccordinglyontheinvoice(and
whenusedinthePO).

Onanasset,addawaytodisengagetheasset(e.g.yousoldit).

Fiscal position form view

addscreenshot

51/55

Invoice Report

Allowtodisplayshippingaddressoninvoices
Whenafiscalpositionisset,weshoulddisplayarelatedtextontheinvoice(alaw
requirementinsomecountriesforsomefiscalpositions)
Allowtodisplaythesaledate(thatcanbedifferentfromtheinvoicedate)Someone
saiditsmandatoryinFrance,butIamnotsureaboutit.tobevalidated.

Remove All EDI stuff

WeshouldremoveorreviewEDIstuff.(shouldwekeepit?)Isanyoneusingit?

Bank Account form view

TODO:
AddaTypefield:IBAN,SavingsAccount,...
Preloadthelistofbanks?

52/55

Usability

User On Boarding Flow

Insummary,wehavetwoWOWeffectspossibleinjustafewstep:

Scenario1:
1. FreeTrial
2. CreateInvoice
3. SendbyPost(*)
4. (receiveitinyourmailbox3daysafter)

Scenario2:
1. FreeTrial
2. SyncWithBank(orImportabankStatement)
3. Dataareallfilledandstuffconfigured:
a. bankaccountcreated
b. bankcreatedasacontact
c. bankjournalcreated
d. journalitemsavailable

So,afterthefreetrial(orinstallationoftheDB),theuserarrivesinthekanbandashboardwith
afewjournalcreated(sales,purchases,bank,cash).Weneedaprimarybuttononthese
journalsanddependingonthebuttonhechoose,hegoestheScenario1orScenario2.

(*)Itmaynotbeclearfortheuserwhatsthevalueofsendinginvoicesbypostautomatically.
ItwouldbegoodtoaddaTIPforthefirsttime,explainingwhatthewizardwilldoandwhyits
great!Inourcompany,theaccountantsendinvoicesonceaweek(becausesheprefersto
printandpostbybatches).Thismeanswecandeliverinvoices4daysfasteronaverage(3.5
duetothebatchand1duetointernationalletterswhenit'sprinted+postedintherightcountry
directly)Sinceouraveragecustomerpaymenttermis30days,bysendinginvoices4days
earlier,wecanhave13%ofourmonthlyturnoverinourbankaccount.

TODO:Weneedtodoanonboardingflowlikethisone:
https://fr.slideshare.net/secret/upjRZ9TgRHnSFX

53/55

Planner
TheplanneraimstoguidenewusersthroughtheinitialconfigurationofOdooasadaytoday
accountingsolution.Itsalsoanintroductiontothebasicprinciplesofaccountingforbeginners
(asthereisaminimallevelofknowledgerequiredtousethemoduleefficiently)

Mockup:http://qf6iua.axshare.com/accounting.html(workinprogress)

54/55

Phase 2: localization

switzerland:
needoneextrafieldontheaccount.move.linetostorethebvrreference(orneedawayto
createjournalentrieswith"invoicebvr+asequence"...chosenonthepaymentterm?)(they
don'twantitonthegeneralledgerforexample...)
=>addabooleanonpaymenttermline

US:
checkwrinting

55/55