Beruflich Dokumente
Kultur Dokumente
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
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
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.
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.
13/55
ThatreportjustloopsoneachtaxlineandforeachgivestheNetamount(sumofjournal
itemshavingtherelatedtaxinthetax_idscolumn)andtheTaxamount(sumofjournalitems
havingthattaxlineintax_line_id.Thetaxlinesaregroupedbytag(deductible,non
deductible)andthe2firstcolumnssimplyshowitsrelatedtaxnameandshortname.
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
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
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)
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
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)
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
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)
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
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
TODO:speconhowtorecordjournalentries.
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.
44/55
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
Tocheck:
DontrememberifwefinishedtheReconcileWithExistingEntriesfeature(iftheguy
usedthePayInvoicebutton.Usefulforcheckshandling(orcreditcardpayments).
Somecountriesprefertodothatratherthanusinganintermediateaccounts.
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
Todo:improvethismockup:
CodeShortNameonReports/defaultprefixforsequence
ExplaintheTypefield(isthereatooltip?)
Explainthelinkbetweenjournalandpaymenttype,itsnotusual.
50/55
Assets
Theassetcategoryshouldappearconditionallyaccordingtotheproduct.(addamany2one
assetcategoryonproduct.templateobject)
Whensettinganassetcategory,theaccountshouldchangeaccordinglyontheinvoice(and
whenusedinthePO).
Onanasset,addawaytodisengagetheasset(e.g.yousoldit).
addscreenshot
51/55
Invoice Report
Allowtodisplayshippingaddressoninvoices
Whenafiscalpositionisset,weshoulddisplayarelatedtextontheinvoice(alaw
requirementinsomecountriesforsomefiscalpositions)
Allowtodisplaythesaledate(thatcanbedifferentfromtheinvoicedate)Someone
saiditsmandatoryinFrance,butIamnotsureaboutit.tobevalidated.
WeshouldremoveorreviewEDIstuff.(shouldwekeepit?)Isanyoneusingit?
TODO:
AddaTypefield:IBAN,SavingsAccount,...
Preloadthelistofbanks?
52/55
Usability
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