View
108
Download
30
Embed Size (px)
Citation preview
Odoo Accounting v9. Draft. Table of Content
Introduction
Goals&PlanningModelChanges
CashvsAccrualAccountingReviewReconciliation
TerminologychangeFullvsPartialmatching
TaxesInformationonJournalItemsTaxcreationTaxStatement
ThegenerictaxsummaryHandlingthetaxdeclarationinlocalizationmodules
Periods&FiscalYearsmanagementFiscalYearClosingSettingInitialAccountBalancesSequencesmanagementAccounts
AccountHierarchiesActiveaccountsAccountTypes
JournalsInvoicesPaymentOrdersModelofjournalItemsNotesforNewAPIconversion
account.pyaccount_analytic_line.pyaccount_bank.pyaccount_bank_statement.pyaccount_move_line.pymodulestructureChangeeverywhere:WizardsMisc
BankandCashStatementsExpenses
1/55
ReportingEngineReportsMetadataFollowupsReview
accountmodule:account_followupmodule:
NewfeatureskanbanjournalasadashboardBankingflowReverseentrieswizardStornoandAngloSaxonModularityTests&DemoDataJournalEntriesRecordingSendInvoicesbyRegularMailAddManagementReportsDeposittickets
ImprovementsofexistingfeaturesAccessrightsReconciliationBankStatementReconciliationBankStatementImportMenuitemsJournalformviewAccountformviewAssetsFiscalpositionformviewInvoiceReportRemoveAllEDIstuffBankAccountformview
UsabilityUserOnBoardingFlowPlanner
Phase2:localizationswitzerland:US:
CcheckwrintingChartofaccounts(correctionofdefaultUStemplates)Cashdiscount
2/55
3/55
Introduction
Goals & Planning OdooAccountingisasgoodasaccountingmodulesoftraditionalERPs.Butitdoesnothavethequalityofdedicatedaccountingsoftware.Ourreference,intermsofusability(notfeatures),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
http://www.google.com/url?q=http%3A%2F%2Fpad.odoo.com%2Fp%2Faccounting_roadmap_v9_extra_points&sa=D&sntz=1&usg=AFQjCNEv0FU7bcP7TVnkl22hYG4UEWOOWAPhase 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_publink1000270633Everyreportcanhaveanoptiontogeneratethereportusingacashbasedmethodoranaccrualbasedone(ontheTaxSummaryreportforexample,thiswillallowustohaveaVATonpaymentreporting).Thisoptionwillbeselectedbydefaultusingthisinformationfromthecompany.Thereportsfiltersthejournalitemstouseaccordingtothemethod:
Accrual:thecurrentmethod:weusealljournalitemsinthereports Cash:
ifjournalentriesarenotlinkedtoareceivableorpayableaccount,theyareusedinthereport
ifjournalentriesarelinkedtoeitherareceivableorapayableaccount:ifthesejournalitemsarenotreconciled,theyarenotusedinthereport
Notethatpartialreconciliationhavealsoanimpactincashbasedreports(checkedinXero),notonlyfullreconciliationareshownincashbasedreports.Thatmeansthatifasaleof100with10ofvatismade,whenreceivingapaymentof11,werecognize10%ofthesaleand10%ofthevattoo.Becauseofthis,wegonnaneedadditionalstoredfieldtoknowthedebitandcredittouseincashbasedreports.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
http://www.google.com/url?q=http%3A%2F%2Fwww.irs.gov%2Fpublications%2Fp538%2Far02.html%23en_US_201212_publink1000270633&sa=D&sntz=1&usg=AFQjCNExGk5ZGeKsfqMROSkmAzCxU336VAatthereconciliation,onthereconcileditemsunderasale/purchasejournalupdatedebit_cash_basisandcredit_cash_basisfieldsattheprorataofthereconciledamountonthetotalsold/purchased
inreportswherethisoptionhasameaning(P&L,BS,TaxSummary...),addtheoptioncashbasis.Ifitischecked,usethenewcolumnsinsteadoftheclassicdebitcreditones.
Review Reconciliation
Terminology change Thesystemwillbeentirelyreviewedinordertocleartheconfusionaboutthetermreconciliationwhich,inrealenglish,doesntrefertothebehaviorwehaveinOdoo.Weneedtodistinguish2usecasesthatcurrentlyusereconciliationasterminology(althougheveninfrenchthereexists2differentwordsforthat):
1. Iwanttomakethelinkbetweenone/severalexistinginvoice(s)andone/severalexistingpayment(s).Hereweshouldspeakaboutmatchingthepaymentsandtheinvoices.Infrenchwecancontinuetalkingaboutrconcilierdesfacturesetpaiements.
2. IwanttomakethelinkbetweenabankstatementIimportedandexistingjournalentriesthatarealreadypresentinmysystem.Hereweshouldspeakaboutthereconciliationofthebankstatement.Infrenchweshouldtalkaboutrapprocherdesextraitsbancaires.
Becauseoftheunorderedwaywecreatedthedocument,youllstillfindinitreferencestobothusecasesusingreconciliationasasingleterminology.Pleasedontbeconfusedandreplacementallywithmatchingeverywherebankstatementsarentinvolved.
Full vs Partial matching Current:
Reconciliationconceptisok. Partialreconciliationisnotgood.Whenwepartiallyreconcile2paymentswith3
invoices,itsimpossibletoknowthedueamountforeachinvoice.Weproposetosimplifypartialreconciliation.Insteadofusingthesameconceptasfullreconcile(linkseverallinestogether),apartialreconciliationisadirectlinkfromonejournalitemtoanother:youcanlinkthejournalitemofapaymenttooneandonlyonereceivablejournalitem(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,ausermayneverhavetodoareconciliation :1
Whenimportingbankstatements,thebankreconciliationprocessdothereconciliation
ofthepaymentwiththeinvoices Whencreatinginvoices,ifthereisanoutstandingpaymentforthiscustomer,the
systemproposestoassignittotheinvoice.
1https://www.odoo.com/forum/help1/question/howcanireconcilegeneralaccountsfrommybankstatement56566
8/55
https://www.google.com/url?q=https%3A%2F%2Fwww.odoo.com%2Fforum%2Fhelp-1%2Fquestion%2Fhow-can-i-reconcile-general-accounts-from-my-bank-statement-56566&sa=D&sntz=1&usg=AFQjCNFB-0RHcvdgmSY6rTtxxQCiD91BqQhttps://www.google.com/url?q=https%3A%2F%2Fwww.odoo.com%2Fforum%2Fhelp-1%2Fquestion%2Fhow-can-i-reconcile-general-accounts-from-my-bank-statement-56566&sa=D&sntz=1&usg=AFQjCNFB-0RHcvdgmSY6rTtxxQCiD91BqQTODO:Whenconfirminganinvoice,ifthecustomerhasanoutstandingcredit,thesystemproposestoautomaticallyassignittothisinvoiceasshownbythescreenshotbelow:
Ofcourse,thereconciliationprocessstillexistsbutitshouldnotbeamandatoryoperationanymore.Userswillnothavetoworryanymoreaboutthereconciliationprocess.(whichisnotasimpleconcepttoexplain)Nearlyalljournalitemswillbereconciledatthebankstatementreconciliationprocess 2
(paymentafterinvoice)orattheinvoicevalidation(paymentbeforeinvoice).
Taxes
Information on Journal Items IncurrentversionsofOdoo,asupplierinvoice/refundmaygeneratethefollowingjournalitems(basedonBelgiumaccounting,apurchaserefundinvoicewith21%ofVATonasingleproductcosting252.88):
JournalEntry
Account Taxes Debit Credit TaxCode TaxAmount
1 440Payable 305.98 0
1 411VAT 0 53.10 63 53.10
1 611Charges 0 0 85 252.88
2Thebankstatementreconciliation(anewconceptinOdoov9)isnotthesamethingthanthejournalitemreconciliation.(aconceptalreadyexistinginOdoo)
9/55
1 611Charges 21% 0 252.88 82 252.88
Themainproblemwewanttosolvehereisthethirdlinewithdebit=credit=0whichisatechnicalhacktohavealinewithaTaxCode85andTaxamount,butnotaccountingentries.(weoftenhaveaccountantsthatreportsthisasabug)Wethinkweshouldsplit:
Thedataaboutthejournalitems TheTaxLegalStatementthatshouldbeareportliketheP&LandBS.Wedontneed
tostorethetaxcodesinthejournalitems,wejustneedtoknowwhichjournalitemshavebeencreatedbywhichtaxline.
Thetablebelowarethejournalitemsforthesametransactionthantheonedescribedabove.
JournalEntry
Account Taxes Debit Credit TaxLineID
1 440Payable 305.98 0
1 411VAT 0 53.10 1
1 611Charges 0 0 2
1 611Charges 21% 0 252.88
Insteadofhavingataxcodesreferredinthejournalitemstocomputethebaseandtaxamountsforthetaxstatement,theTaxStatementReportswillcomputetheseinformationusingjournalitemslinkedtospecifictaxes.Themainadvantagesare:
Noredundancybetweendebit/creditandTaxAmountnopossibleerrors Nomorestrangejournalitemswithdebit=credit=0 Weremovetheconceptoftaxcodestructurethatwascomplextounderstand ThetaxstatementbecomesanormalreportsliketheP&L/BSsamereportengine,
lesscode.
Tax creation Ataxhasseveraltaxlinesbutcannotbedefinedasagroupoftaxes.Taxgroupscanbeimplementedusingseveraltaxlines.
10/55
Everydocumentthatreferstoatax(invoices,expenses,)shoulduseamany2manyfieldfortaxesinsteadofmany2one.(e.g.SalesReceiptandPurchaseReceiptshouldbechanged).Thisway,SalesReceiptandPurchaseReceiptsaremultitaxes.Thereasonwhywedontwanttaxgroupsanymoreare:
becauseitsabitoverlappingwiththeone2manytaxlines becauseweneedtobeabletomakethetaxdeclarationreport,anditmakesthings
morecomplicatedifweallowtaxgroups.(e.g.isataxgroupataxinitselforjustashortcuttoselecttwotaxes?)
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:PercentageofPriceTaxExcludedandPercentageofPriceTaxIncluded.
wealsoaddacheckboxtoavoidhavingtodefinetwicethesametaxlinesforinvoicesandrefundsiftheresnodifferenceinbetween.
Thebelgianpurchasetaxof21%thusbecomesassimpletodefineasthis:
11/55
Tax Statement IncurrentOdoosversion,thetaxstatementreportisbasedontaxcodes.Therewasachartoftaxcodethatallowslocalizationtocreateataxstatementreportbasedonthesumofthefieldtax_amountfromaccount.move.line,groupedbytax_code_id.Wethinkitsanissuebecause:
mostusersdidnotunderstandthetaxcodeconcept somelocalizationcomputesthetaxstatementbasedonaccounts,notontaxcodes
Inv9,thoseinformationwillbecomputedbythereports.TherewillbeagenericreportcalledBelgiumTaxStatementthatwilljustprintthesummaryofbase/taxamountspertax.Moreover,eachlocalizationwillhavethepossibilitytodefineareportthatgivestheexactsameinformationaspreviouslythetaxcodeswereproviding.Letstakebackourexampleofabelgiansupplierrefundonasingleproductcosting252.88with21%ofVAT,andseehowbothreportscanbebuilt.Assaidbefore,wehadpreviously(v8)thefollowingjournalitems:
JournalEntry
Account Debit Credit Tax_code_id TaxAmount
1 440Payable 305.98 0
1 411VAT 0 53.10 63 53.10
1 611Charges 0 0 85 252.88
12/55
1 611Charges 0 252.88 82 252.88
While,inthev9,giventhetaxdefinedasexplainedintheabovesection,wewillhavethisinstead:
JournalEntry
Account Debit Credit Tax_ids Tax_line_id
1 440Payable 305.98 0
1 411VAT 0 53.10 #42(1stlineof
purchase21%service)
1 611Charges 0 252.88 #35(purchase21%
service)
Notethat:
Thetax_idsisanewmany2manyfieldthatwillcontainallthetaxesinvolvedintheoperation.
Thetax_line_idisanewmany2onefieldthatwillheldthereferencetothetaxlinethatcreatedthejournalitem.
The generic tax summary
13/55
ThatreportjustloopsoneachtaxlineandforeachgivestheNetamount(sumofjournalitemshavingtherelatedtaxinthetax_idscolumn)andtheTaxamount(sumofjournalitemshavingthattaxlineintax_line_id.Thetaxlinesaregroupedbytag(deductible,nondeductible)andthe2firstcolumnssimplyshowitsrelatedtaxnameandshortname.
Handling the tax declaration in localization modules Becauseweneedtobeabletohavethetaxdeclarationinalegalformat,thetaxsummaryreportisntenough.Thatsthereasonwhywewantthelocalizationmodulestobeabletodefinereportsthatwillgivestheexactsameinformationasthetaxcodeswereprovidinginv8.Forthat,wethinkthatlocalizationmodulesshoulddefineaccount.financial.reportthatwillhaveeachpreviouslyexistingtaxcodeasalineinthereportandthatwillcomputetheamountsforthem.Forexample,inthebelgianlocalizationmodulewewilldefinethefollowingformulaethatwillgivetheexactsameinformationwehadbeforeontheaccount.move.line.
taxcode formula
14/55
63 sumofjournalitemshaving#42intax_line_id
82 sumofdebitofjournalitemshaving#35intax_ids
85 sumofjournalitemshaving#35intax_idstocheck
Moreexplanationontheaccount.financial.reportandthepossibilitiesofferedbyitinalatersection.TODO:
removeaccount.tax.codeobject createaaccount.tax.groupobject:
Namefield,translate=True AsData:
Deductible NonDeductible
implementthenewtaxsystem implementthegenerictaxstatementreport putthePythoncomputationontaxinaseparatemodule implementthebelgiantaxstatementasanexampleofcomplexstatement
Periods & Fiscal Years management Theconceptofperiodisonlyusedfor:
beingabletocloseaperiod(toavoidpostingjournalentrieswhenyoualreadyreportedtotheestate,forexample).
SetanaccountingperiodondocumentsTheperiodconcepthasafewissues:
Usability:creationoffiscalyearsandtheyrelatedperiods SpecialPeriodforOpeningEntries Usersoftendothemistaketofilterondatesratherthanperiods.(forinstancetheget
theturnoverofthelastmonth). Whenworkingwithmultiplecompanies,itsconfusingtohaveseveralperiodsforthe
sametimedelta. simplifythereportsoptionswherewecanjustfilterondates
15/55
Insteadofusinganobjectandchoosetheperiodwithamany2oneondocuments,wewillreplacetheperiodbyanAccountingValuationDateondocuments.Forexample,therewillbetwodatesontheinvoice:
theInvoiceDateandtheAccountingDate. theaccountingdatewillbesetautomaticallywhenonchangetheinvoicedate Theaccountingdatefieldis:
hiddenoncustomerinvoices visibleonsupplierinvoices
Wealsoneedtotakecareoftheperiodclosing.Weplantohaveafreezedateonfiscalyears,thatwillpreventcreating/modifyingjournalentriesinajournalifitsaccountingdateisbeforethefreezedateofthejournal.TODO:
replacetheperiod_idwithanewdate_accountfield removeaccount.periodtable increationoftheanalyticlines,usethisnewaccountingdate Onfiscalyears,addafreezedate:freezealljournalitemsuntil__/__/____(will
replacetheconceptofclosingaperiod) weneedtoimprovethefilteringondatesranges,forkeepingeasinessonreport
options:weshouldbeabletofilterinoneclickonperiodsordates:Lastquarter,YeartoDate(usingFiscalYear1stday),ThisMonth,(shouldbeokwiththetaskofGery)
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,wecancreatefiscalyearsafterwards.Wejustneedtheconceptoffiscalyeartohavemoreefficientfiltersinreports.WecansetamessageontopofreportsifthefiscalyearisnotcreatedintheP&L:Nofiscalyeardefined,thisreportcomputesOpeningBalancesincethe1stofJanuary.pleasecreateafiscalyeartorefinethis.TODO:checkwherefiscalyearareusedtovalidatetheabovespecification.
16/55
Fiscal Year Closing Weplantoremovetheconceptofopeningentrieswhenclosingafiscalyear:
Reportsarealwayscorrect,eveniftheprecedingfiscalyearhasnotbeenclosed Easierforenduser:noneedtoconstantlygenerateopeningentriesforreporting,
removethem, Noredundancyonreceivable/payableentries Noneedforanopeningperiod Noneedforanopeningjournal
EveryreportwillimplementcorrectlytheOpeningBalance,atthereportlevel,notdependingonopeningentriesjournalitems.So,fortheaccountant,thisdoesnotchangeanythingonreports.Hejustdonothavetoworryaboutgeneratingopeningentries.>Theopeningbalanceiscomputedatthereportinglevel,notbycreatingJournalEntries(it'salreadypartiallylikethatinsomereports)TheOpeningBalanceofanaccountshouldbecomputedaccordingtotheaccounttype(P&LorBS)andthisshouldnotbediff,Indeed,itshouldbetheroleofthereporttocomputetheinitialbalancewhatevertheopeningentrieshavebeencreatedornot.Thebiggestadvantageswouldbetohavealwaysthereportsthatarecorrectwithoutanyworkfromtheaccountants.Noneedanymoretoregenerateeachtimetheopeningentriesbeforeprintingthebalancesheet.Noneedtohaveacrappyspecialmovewhereeverythingisreconciledtogether.Inthebalancesheet,weaddalineCurrentYearEarningswiththenonaffectedresult,thatisnotanaccount,butcomputedbasedontheP&L.Westillneedtoclosefiscalyearfor:
creatingtheRetainedEarningsjournalentry. freezingperiods
Whenclosingafiscalyear,wecheckthattheCurrentYearEarningissetto0.Ifnot,weopenadialogmessagewithasampleentrytoregister:CurrentYearEarningRetainedEarnings.Wedonotcreatethisentryautomatically,itsjustamessagefortheenduserwithasuggestion.(becauseyousometimeswantsomethingdifferentfortheaffectationoftheresult)
Setting Initial Account Balances Weneedatooltosettheaccountbalancesforcompaniesthatstart:
17/55
InSettings/Accounting,addabutton:SetInitialBalances(putthisintheplannertoo) Thisopensaneditablelistviewofallaccountswithdebitandcreditbeingread/write Ifyouwriteindebit/credit,itcreateajournaliteminaCentralisedand
Miscellaneousjournalwiththedifferencebetweenthecurrentdebitandthegivenone.
ThisapproachworksforbothcompaniesthatstartfromnothingorthosehavingusedOdooforbillingduringafewmonthsandthatdeployaccountingafter.
Sequences management Weshouldbeabletoeasilymanagethesequences.Currentlytheusabilityisapain.Actually,peopleshouldntatallbeawareofsequences.SincetheFiscalyeararenotrequiredanymoreinorderforthesystemtowork(wecanusethembutwecanalsosimplyuseasetofdaterange),wecantbaseourselvesontheFYforthesequence.Whatwewantistheabilitytocreatesequencebyrangeofdate,andthatfeaturecouldalsobeusedinothermoduleandnotonlyaccounting.Therefore,wewillchangedirectlytheir.sequenceobject.Whatneedstobedoneisthefollowing:
addabooleanfieldsontheir.sequenceobjectinordertoknowifweshouldusethedaterangefieldsornot
addaone2manyfielddate_range_idsthatpointstoanewobjectir.sequence.date_range
thatnewobjectonlyhasafewfields: range_from range_to number_next number_next_display(fields.functionthatdoesthesameasthe
number_next_actualfieldinir.sequence)usedtodisplaytheinformationontheviewandlettheuserchangeitifhewants
bydefaultthedaterangewillbealltheyear(from1stjanuarytill31thdecember)
intheget_nextmethodcalledtogetthenextincrementalnumber,addaconditiontocheckifweusedaterangeornot.ifself.use_date_range:
ifcontext.get(date,today())existsinself.date_range_ids:
18/55
incrementnumberincorrectir.sequence.date_rangeandreturnthatoneelse://wedonthaveair.sequence.date_rangeyet
createnewir.sequence.date_rangeandstartnumberingatone addaviewtoseetheir.sequence.date_range
Note:whencreatinganewir.sequence.date_range,checkifwedontalreadyhaveair.sequence.date_rangethatexistforthecurrentyear,ifyes,taketheonewiththeclosestrange_to(inthepast),incrementitbyonedayandusethatasrange_fromforthenewir.sequence.date_range(range_togoesbydefaulttoendoftheyear,exceptifwehaveair.sequence.date_rangeobjectwitharange_frominthefutureinwhichcaseweshouldusethatdayminusoneasrange_to)
Accounts
Account Hierarchies Removethehierarchiesinthechartofaccountsandreplaceitbyoptionaltags(thatcanbeusedtocreatehierarchiesintheCoAreportkeepinmindthattheCoAwillbeareportonthescreen,notanymoreatreeview.Thiswillallowsmartfilters,optionslikecomparisons,...):
TheconceptofParentAccountistoocomplex.Weoftenseeaccountantsthatcreatesaccountswithoutparents.
TheconceptofViewAccountsorRootNodeistoocomplex Beingforcedtocreatethewholestructureinordertostartistoocomplextoo.(note
fromRonda:fortheU.S.version,considerstartingwiththeaccountslistedonthe1120taxformscheduleL,page6ofPDF:U.S.chartofaccount.)
Whatwillitsolve:
EasiercreationofanewAccounts(noparent,noviewaccounts,nostructuretoprecreate)
Easiertoimporttheinitialchartofaccount(justaCSVofaccountnamesandcodes) Workingonalistofaccountsismucheasierthanbrowsingatreeofaccounts(youcan
filterallaccountsofclass30*,filteronthenametoaccessquickly,groupbyType,)ThedefaultwaytobrowseaccountsSHOULDNOTBEanymorethroughtheChartsofAccountstreeview.TheuserwillbrowsethedatathroughtheHTMLreports(P&L,BSorChartsofAccounts)thathaveahierarchy.Havealookatthereportingsectionbelowtounderstandthis.LegalreportsWILLhaveahierarchybutdefinedbythereport(Profit,Loss...)WekeepthelistviewofaccountsfortheConfigurationsection.(notforadailyusage)
19/55
http://www.google.com/url?q=http%3A%2F%2Fwww.irs.gov%2Fpub%2Firs-pdf%2Ff1120.pdf&sa=D&sntz=1&usg=AFQjCNGEgWO8z8ekWL484L_mlk0qZz8r0gWekeeptheaggregationsystemforconsolidationofmultiplecompanies(wewillalsoaddapercentageontheconsolidationreportforcompaniesthatarentownedat100%).WeaddTagsonaccountsthetagswillbeusedforreportingand,eventually,thehierarchyintheCoA.TODO:
Removeparentaccountsandchildrenaccountsonaccount.accountobject Changethewaycreditanddebitarecomputedonaccounts(noneedtosumchildren
accounts) Removethetype:Viewonaccountforms Addanewfieldmany2many(account.account.tag)toanewobjecthavingthe
followingfields: Name
Defineanon_changemethodtoautomaticallyselectthetypeandthetagsbasedonthecode:assignthetagsandtypeoftheaccounthavingthebiggestnumberofdigitsincommonandminimum2(iflessthan2,dontassignanythingtothesefields.)
RemovetheChartofAccountsmenu.(thetreeviewonaccounts)thelistofaccountsisenough.Moreover,wewillhaveaGeneralLedgerreportthatrendersachartofaccountswithahierarchy.(newreportsareonscreenwithfiltersandoptionslikecomparisons.)
Tounderstandwhyitseasiertoworkonlistsofaccounts,youneedtounderstandthetaskthatimprovessearch,filterandgroups.Youcantesttherelatedmockuphere:http://k2lkjf.axshare.com/#p=advanced_search&hi=1&c=1(thisisadynamicmockup,trytoclickontheexpandfiltericon)Itssupereasytofilterorgroupbyaccounttypes(andthiscreateshierarchiestoo).
Active accounts TheconceptofActiveistoocomplex,andreferstosomethinguncommonforaccountants.Weproposetoreplacethatconceptwiththefollowingrulesandmeasures:
Theusercandeleteanaccountifithasnojournalitems Iftherearejournalitems,wecannotdeleteit Iftherewerejournalitemsinpreviousfiscalyearsbutnotinthecurrentone,this
accountdoesnotappearinreports. ReplaceActivebyDeprecatedcheckboxtheaccountisstillvisiblebutnot
accessibleinmany2onelinkingtoaccounts.Thatway,thesamefeaturesareavailablebuttheusabilityisimproved.
20/55
http://www.google.com/url?q=http%3A%2F%2Fk2lkjf.axshare.com%2F%23p%3Dadvanced_search%26hi%3D1%26c%3D1&sa=D&sntz=1&usg=AFQjCNHkyKhaP9v0JmMW2-rQp61NMvVgwwTODO: 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(renamedintoType).ThecurrentAccountTypeshouldbeafieldontheUserTypeobject.
TODO:improvethismockupstoaddTags,amany2many_tagsfield.
21/55
Notethatpeoplewillstillbeabletocontinuedefiningtheirownusertypethroughtheconfigurationorlocalizationmoduleiftheywantbutwebelievethiswontbenecessarymostofthetimeasweplantocreatebydefaultthemainones(revenue,sales,directcosts,otherincome,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,bankaccounts,fixedassets,noncurrentassets,currentliabilities,liabilities,noncurrentliabilities,equity)
configurethebuiltinprofit/lossandbalancesheetreportsasshownbelow:
22/55
Journals Journalsshouldhavetwosequences:
Invoices(alreadyexists) Refunds(newmany2onefieldtoadd)
Thisallowscompaniestoputinvoicesandrefundsinthesamejournalorcreatetwoseparatejournals.Advantagesofputtinginthesamejournal:
Turnoveriscorrectinthelistofinvoices(invoicesrefund) Dashboardissimplified(not2xeveryjournal)
Bydefault,attheinstallationofthesoftware,onlyonesaleandonepurchasejournalsarecreated(invoiceandrefundareinthesamejournal).Thisallowstohaveacleardashboardandnotduplicateeverymenu.Whencreatingarefundbasedonaninvoice,ifthesequenceissetforarefund,thesystemdonotaskforajournalandautomaticallyputtherefundinthesamejournal(inthewizard).Inthedashboard,thebuttontocreateaninvoicehasadropdowntoalsocreatearefund.Likethis:http://getbootstrap.com/components/#btndropdownssplit
Invoices Addacomputedfieldoninvoices:amount_total_signedwhichistheamountinthecurrencyofthecompanyandnegativeforrefundinvoices(orrefundsupplierinvoices).Displaythisfieldinlistviews(insteadofthecurrentamount_totalone)butnotinformsviews.Thiswouldallowtoputinvoicesandrefundinvoicesinthesamemenuandhavethetotalbelowwhichiscorrect.Theonchangetosettotalandtaxesshouldbeautomatic.ThiswouldbeanautomaticwinwhenportingtothenewAPI.Changedata/demodatathedefaultistousethesamejournalforinvoicesandrefundratherthantwodifferentjournals.Peoplecouldchangethisbutbydefaultwewillputinvoicesandtheirrelatedrefundsinthesamejournal.
23/55
http://www.google.com/url?q=http%3A%2F%2Fgetbootstrap.com%2Fcomponents%2F%23btn-dropdowns-split&sa=D&sntz=1&usg=AFQjCNFfhdLMfh1eS_L02Wqt3P45DtpPvwPayment Orders PaymentshouldbemanagedbythePayInvoicebuttononsupplierinvoices,insteadofthecurrentPaymentOrderform.Onceinvoicesarepaidviathisbutton,amenucanbeusedtosendthepaymentstothebanks.(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,withdefaultcomingfromthejournal:
Payvia:SEPA,manually Inthepaymentordermenu,displayalljournalentrieshavingpayment_stateintodo:
Domain:payment_stateNone 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.Thesubscriptionmechanismwillbereplacedby:
contracts:forinvoicebasedsubscriptions(alreadyexists) modelofjournalentries:thatcanbecalledeasilyinajournal modelofjournalentriesinbankreconciliation(alreadyexists)
Remove(temporarily?)subscriptionsonjournalentries.Thefeatureisnotgoodenoughtobemaintainedasitis.Moreover,thenewtoolsallowstobettermanagerecurringentries:
bankloans:usemodelsduringbankreconciliationprocess rentals:youcanuserecurringinvoicesoncontracts payroll:usemodelofentriesandchangethemonceamonth socialtaxes:samethanpayroll.
Asitwillbeveryeasytocallamodelorusemodelsduringbankstatementsreconciliation,Ithinkwedontneedsubscriptiononjournalitemsanymore.TODO:
removetheobjects addabooleanfieldonjournalentries:JournalEntryModel Addabuttononjournalentriesformviewtocallamodel,selectamodelinthesame
journalandthejournalentrysautomaticallycreated. Addasaveasamodelwizardonjournalentries(youcangetitfromtheMore
menu)
Notes for New API conversion toreviewagainbasedonthedecisionsmadeintheothersectionsSometechnicalcommentstocleanwhenportingtothenewAPI.
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/projectandputeverythingrelatedtoanalyticaccountingintoasingle.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)thatistherealdocumentthatcreatedthisentry:
saleinvoice,purchaseinvoice,salesreceipt,purchaseReceipt,Asset,bankstatement Ifnothinginreference,itsaJournalEntry
RemovethedecimalprecisionAccountandinsteadofit,
roundbyusingthecurrency(foreigncurrencyinvolvedorcompanycurrency) storethefulllengthofthedecimalindb usewidget=monetaryinviewssothatthedisplayofthesefieldsarestillfine
Bank and Cash Statements Thecurrentimplementationofbankstatementsandcashstatementsisugly.Iwouldsuggesttosplititintwodifferentobjectssothattheycaneachimplementitsownlogicwithouthavingsideeffects.Refactorthecodesothat:
account.statement&account.statement.linebecomesthemainobject: renameobjectaccount.bank.statementaccount.statement renameobjectaccount.bank.statement.lineaccount.statement.line
account.cash.statement_inheritsfromaccount.statemenetandaddhisownlogic.Changethemenusandscreenstodirectlyworkontheaccount.cash.statementforcashregisters.
Expenses Inthev9,employeeswilldirectlycreateexpenselines(orexpenselinescanbecreatedbyusersonbehalfofothersemployees)insteadofcreatingexpensesheets.Hereisapropositionofanewuserflow:
1. Userscreateexpenses2. TheycanclickSubmitonexpenses:
a. whensubmited,theexpenselineisaddedtotheexpensesheetthatisstilltovalidateforthesameuser.
b. Ifnoepxensesheettovalidateexists,anewoneiscreated3. TheHR/Managercanvalidateexpensesheetsthatareintovalidate4. 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.ReportingwillbenormalHTMLviewsthatopensinthenormalUI(keepingtheleftmenu).Wizardsarereplacedbyfiltersandoptionsonthetop.Whetheryouwanttoworkonthedata(inthescreen)orprintthemitsthesame.Forperformanceissueswithhugereports(e.g.generalledger),wecanusepagerandlazyloadingtomakethemveryfast.Ofcourse,ifyouclickonPrintbutton,itstillusesthewebkitprint(witheverythingunfolded)Onthetechnicalpointofview,reportswillbegeneratedserverside.Thatmeansthatifwewantthemtobedynamic,weneedtosplititintoseveralssmalltemplatesandwhendoinganaction(likefold/unfold)wecanonlycallthesesmalltemplatesandreplacetheminsidethegeneratedhtml(thisinordertopreventreloadingtheallreportwheneverwechangesomething)
30/55
TODO:improvethemockup.Itsnotgoodenough.Thereportinghastobeakillingfeature.Wehavetodo3samplereportsinmockupstogointothedetailsofthefeatures.E.G.:wecanusegraphsontopofthedatatable(likeingoogleanalytics)putpostitseverywhereonthepage,addsparklinesnearaccountnumbers,...Weshouldbrainstormabitmore.whataboutusingpivottables?NoaccountingsoftwarehasarealBIintegrated.Wewilladdactionsinthereporting.(e.g.youcanreconcilejournalitemsdirectlyfromthepartnerbalancereport)Ifyoufindjournalitemstoreconcileorifyouwanttodrilldowninanaccount,youcandoitdirectlyfromthereport.Thefiltersareonthetop.Youllbeabletochangetheoptionsandwillseetheresultinthesamepage,orexpandsomepartofthereportassomelineswillbeclickable(e.g.clickonanaccounttozoomintoit)Wecanimplementfold/unfoldinthereportaswell.
31/55
Theideaistoofferthepossibilitytouserstoplaywiththeoptionuntiltheygettheinformationtheyneed.Then,theyhaveabuttontoprintthecurrentreportdisplayedinapdf.WecanalsoaddfeatureslikeAddaCommentoneveryline/header/footer.(likepostit)Thisway,theaccountantcancommentareportbeforegivingittothemanagers.Simpleexample:PrinttheAgedReceivablereportandputnotesfortheresponsibleofthecreditcollectioneffort.(checkwhythiscustomerdidnotpay,hetoldmeitshouldhavebeendonelastweek)Listoffeaturesonreports:
filters/groupbyonthetopofthesheet Addnoteseverywhere Fold/Unfold(exampleP&L,BS)inJS Drilldown(clickonanaccounttogetitsdetailedjournalitems) optionalgraphsand/orsparklines Weneedextrafieldsliketagsontheaccountthatcanbeusedtogroup. Weshouldbeabletocreategroupsthataremasterdataindependentofthechartof
accountinwhichweputtheaccountswewanttoanalysetogether.Especiallyifthereisnotmuchdoneinanalyticaccounting.Thesegroupsshouldbeusedasaselectioncriteriaandalsoagroupingcriteriainreporting.
Developmentinprogressonhttps://github.com/odoodev/odoo/tree/masterhtmlreportconfiguratorpvyEvenifsomeoptionsofthefiltersarecommon(YoYcomparison,accrual/cashbased),someoptionsshoulddependonthereport,example:
P&LDates:fromto BSdate:At
Reportstoadd:
Executivesummary(ratioliketheBesoinenFonddeRoulement(WorkingCapital),disponibilitdetrsorerie,)
ChartofAccounts/GeneralLedger(note:itlookslikethetermGeneralLedgerisnotthesameinU.S.orinEurope:Insage,thegeneralledgerisaprintofalljournalitemsperaccount.InXero,itsallaccountsandtheirbalance,butyoucanclicktozoomtothejournalitems)
Cashflowstatement TaxSummary(kpitocontrolthetaxreportiscorrect) Partnerstatement(animprovedAgedBalance)
Replaced:
theGeneralledgerwillreplacedbythelistviewofaccount_move_lineinordertobeabletohavemoreflexibility(search,group_by,etc)
32/55
https://www.google.com/url?q=https%3A%2F%2Fgithub.com%2Fodoo-dev%2Fodoo%2Ftree%2Fmaster-html-report-configurator-pvy&sa=D&sntz=1&usg=AFQjCNEmyhwmbnBtyIaMuL5mCkECpEBcOgAllotherreportshavetobeimproved:agedbalances,p&l,bs,ImplementtheAccrual/CashBasedasanoptiontomostreports.cashflowstatementexample:
Reports Metadata currentlybeingwrittenSomeaccountingreportsshouldbedefinedusingaccountfinancialreport:thesearetheP&L,BS,ChartofAccount(TrialBalance),CashFlowStatement,ExecutiveSummaryandallthecountryspecificreports.Alltheotherreports(taxgeneric,agedpartnerbalance,followup,...)willusecustomcodeandwontbebasedonaccountfinancialreport.Account.financial.reportshouldbebasedonfilters,thatwaywecanspecifyitforanyaccountorotherfinancialreports.ThiscouldbeusedtocreatehierarchiesintheChartofAccount
33/55
report(notanymoreatreeview)ortocreateKPIsintheexecutivesummaryliketheBesoinenFonddeRoulement/WorkingCapital.Wegonnasplitthecurrentaccount.financial.reportin2models:account.financial.reportandaccount.financial.report.line.Thefirstoneistheretodefinedthereportandglobaloptions,suchasnumberofcolumnsinsidethereport(debit+credit+balanceoronlybalance),header,andsoon.Itwillservethesamepurposeasthecurrentwizardwehavewhenopeningareport.Thesecondmodelcorrespondtothecurrentaccount.financial.reportShouldbegenericforallreports:
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
ShouldbeabletoprinttaxdeclarationtooTODOfullspecOneveryreport,whenclickingonaline,itshouldopentherightdocument,accordingtotheoriginreferencefieldontheaccount.move.
Followups Review Thefollowupsgonnabeimprovedinthefollowingway:accountmainmodulewillhaveasimplefollowupsystemmadebyinvoicethatshouldbeenoughformostofpeople.Theadvancedfeatureswillbeaddedbythecurrentaccount_followupmodule.
account module: Onthelistviewofinvoice,allowtoeasilyaddanexpectedpaymentdate.Orderthelistofunpaidinvoicebyexpectedpaymentdate(firsttheoneswithoutexpecteddate),highlightinredtheoverpassedones.Onthesameinvoicelist,youcaneasilyloganinternalnoteordotheusualstuff(printtheselectedinvoices,sendthembymail..).Thenewthingisthatyouhavethepossibilitytosentthecustomerstatement.Thatactionmakeyoujumponthelistofpartnershaveareceivableaccount>0andshowingtheirdueamountandlastremindersentdate.Youcanselectonlysomeofthemandeffectivelyprintthecustomerstatementwhichlisttheirinvoicesandpaymentsunderastaticcustomizabletext(tosetonthecompany).ThereportisHTMLmadeandfirstdisplayedonthescreenbeforeyoureactuallyabletoprintit.
35/55
account_followup module: Oncethismoduleisinstalled,userscanusethefullpowerofthecurrentmodule:defineseveralfollowuplevelwiththeirlevelspecifictexttoprintonthecustomerstatementinplaceoftheregulartextandaccordinglytothehighestlevelofthepartnersinvoices.
36/55
New features
kanban journal as a dashboard Menusaretoocomplex.Withacleankanbanview,theuserwillnotevenneedtousemenus.Alotofmenusmayberemovedduetothis.(functionlikeimportBankStatementcanbedonedirectlyfromtheKanbanviewwithabigbuttonontheBankjournal).Thekanbanviewofjournalswillhelptoreducethenumberofmenuitemsbyprovidingsomeinfoinahandywayandshortcutsdedicatedtothetypeofjournal.WhenyouclickontheAccountingmenuitem,youarriveinthedashboard(=kanbanviewofjournal)Eachjournalwillshowvariousactionandinformationaswellasshortcutsfortheuser.Hereisthelistforeachjournaloftheactionsitneedstobeabletoperform:Salejournal:
a2linedchartshowingthecurrentmonthturnoveragainsttheturnoveroflastmonth figuresandshortcutswillbeforthesalejournalANDfortheassociatedsale_refund
journal Howmany(draft,duethismonth,tobesend)invoiceswehave Linktosee/createinvoices paymentfollowupactions
Purchasejournal:
agraphshowingtheestimatedcostovertime.graphshouldstarttodayandvalueshouldgoincreasinglyforthefuture(aswehavedraftandvalidatedpurchasethatwillcome)
figuresandshortcutswillbeforpurchasejournalandassociatedpurchase_refundjournal
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(todealwithaccessrightsrestrictions)addhegroupinthekanbanview
inthekanbanview,userswillonlyseejournalsforwhichtheyhavebeenaddedasusers(astheywoulddoforprojects)
possibilitytoaddsomejournalsinfavorite(byclickingonasmallstarforexample),thosewillshowontopoftheview.
onlyAdvisorgroupcanseethegraphHereishowitlookslikeinXero:(mainbuttonslikeReconcileonbankstatementjournalorCreateInvoiceonsalesjournalaredirectlyinthisview)
38/55
https://www.google.com/url?q=https%3A%2F%2Fgithub.com%2Fodoo-dev%2Fodoo%2Ftree%2Fmaster-journal-dashboard-csn&sa=D&sntz=1&usg=AFQjCNFwF9lVzDs6ZgoUp4V-hIb-ENEgLgNoteaboutmoneytransfer:Atraditionalapproachtotransfermoneyfromonebankaccounttoanotheristouseanintermediaryaccount(e.g.inBelgium,58virementsinternes)Butmostaccountingsoftwaredonothaveagreatbankreconciliationfeature:youcanpreregisteratransactionanditsreconciledafterwardswhenreceivingthebankstatement.Butwithagoodbankreconciliationmechanism,itchangeseverything.IjusttestedXeroandtheydoadirecttransferthatkeepsa"unreconciled"status.It'satthesametimemorepowerfulandeasier:
Morepowerful:asyoudirectlygivetherightdestinationaccount,thesystemexpecttogetthistransferinthisspecificaccount.(forecastsarebetter,reconciliationiseasier)
Easier:noneedtoworryaboutintermediaryaccountsandreconcileentriesinthisaccount.It'sfaster,youonlyhaveonetransactiontorecord,thereconciliationisdoneathestatementofthesecondbank.Moreover,intermediaryaccountsareanightmareinmulticurrencies.(howdoyouknowifthedifferenceisduetocurrencyexchangeratesorprofit&losswhenreconcilingafterwards)
So,themoneytransferwizardsshouldonlyhavethefollowingfields:
Date FromAccount ToAccount
39/55
Amount Communication
ItshouldjustcreateaJournalEntry.(directlyfromonebank/cashaccounttoanother)Itcanbeagainstthehabitofsomeaccountantsthatareusedtouseanintermediaryaccount,buttheycanstilldothatduringthebankreconciliationprocess(eveninoneclickusingmodelofentries)
40/55
Banking flow Assaidintheintroduction,oneofourprimaryobjectivewillbetosmooththeprocessesrelatedtothebankingflow.TheimportofCODA,.OFXand.QIFfileshavealreadybeendeveloped.TheSEPAintegrationisalsointhepipe.(directdebit,payments,bankstatementimport).Butwewanttogomuchfurtherthanthat.Wewanttohavebankstatementstobeimportedautomaticallyfromthebankeveryhour.Wewantpaymentordertobesentautomaticallytoyourbank,checkstobeprintedautomatically,Fabienstartednegotiationwithexternalwebservicesinsomecountriestoautomatetheseinterfaceswithbanks.Whatdoeseverymanagerdowhenhearrivesattheoffice?Hewantstocheckthepaymentreceivedontheday/yesterday.WewantOdootoallowthat!Arealtimevisibilityonyourcashandthepaymentofyoursuppliersinoneclick,ThiswillbethereasonwhypeoplewillloveOdooaccounting.Itwillevenbeinournewuseronboardingflow(seebelow)
Reverse entries wizard Yearsago,amodulenamedaccount_reversalwascreatedbythecommunity.Itsgoalistoofferaneasywaytocreatetheexactoppositeaccountingentrythantheselectedone.https://www.odoo.com/apps/7.0/account_reversal/Wearewillingtointegratethemainfeatureofthemoduleaspartofthecorefeaturesoftheaccounting,butwebelieveitneeds
somecodereview codeconversiontonewAPI someofthesatellitefeatures(e.g.checkboxtobereversed+filter)tobedropped
Storno and Anglo-Saxon TheStornomodule(puttingnegativevaluesindebitand/orcreditwhenreversingajournalentry)shouldbeintegratedbydefault.
41/55
https://www.google.com/url?q=https%3A%2F%2Fwww.odoo.com%2Fapps%2F7.0%2Faccount_reversal%2F&sa=D&sntz=1&usg=AFQjCNGFyoeRkp7RnObl4ATwt-lswmFI8wBothStornoandAngloSaxonshouldbeinseparatedmoduleANDtheymustbeactivatedbycompany.Thiswouldallowtohavemulticompaniesenvironment,somewithstornoaccounting,otherswithout.
Modularity Thefollowingchangesshouldbedoneonmodules:
mergeaccount&account_voucher(andremovealltheunnecessaryfeaturesinvoucher)
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/quotationsbyregularmailinallcountries.(invoicesareprintedinthelocalcountryanddeliveredbythepost.Itcostslessthan$1perlettertosend).WeusetheservicesofDocsawayandhaveanagreementwiththemtoputtheOdoologoonthefrontletter.
TODO:improvethismockup:SettingslikeInk,PaperWeight,currency,balancecanbeintheSettings.(unlessthebalanceisnotenoughthenweshouldhaveamessage)
43/55
So,youdontneedtoprintinvoices,puttheminenvelopandpostthem.Justsendthembypostinoneclick.Thewizardworksonasingleinvoicebutalsoallowtosendabatchofinvoicesatonce.
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,addageartosaveasatemplateandanothertomanagetemplates.Ifthelistofbuttonistoobig,haveabuttonmoreinsteadofgoinginseverallinesSincebankstatementdonotusetheaccount.voucherobjectanymore,itcanbesimplifiedalot.AccountvouchersareusedforSalesReceiptandpurchaseReceiptonly.
45/55
https://www.google.com/url?q=https%3A%2F%2Fgithub.com%2Fodoo-dev%2Fodoo%2Ftree%2Fmaster-manual-reconciliation-ama%2F&sa=D&sntz=1&usg=AFQjCNE0Wc2X0hLUvXdM-x16SniAslvQnQBank Statement Reconciliation
Tocheck:
DontrememberifwefinishedtheReconcileWithExistingEntriesfeature(iftheguyusedthePayInvoicebutton.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.(usingtheCSVimporttoolwithsometweakstocreatejournalentrieswhenimportingjournalitems).basedontheCSVimporttool.
Createjournalentriesandlinkthem AutoassignCoAaccountsandpartnersaccordingtobankaccounts
Todo:addstepbystepscreenshotsonhowtogetyourbankstatementfileaccordingtoyourbank.(likeslides)Weneedthisineverycountry.Callforcontributorswiththecommunity.(createadocumentofwhatwearelookingforweneedtodothefirstsonesforBelgium)
47/55
https://www.google.com/url?q=https%3A%2F%2Fgithub.com%2Fodoo-dev%2Fodoo%2Ftree%2Fmaster-manual-reconciliation-ama%2F&sa=D&sntz=1&usg=AFQjCNE0Wc2X0hLUvXdM-x16SniAslvQnQhttp://www.google.com/url?q=http%3A%2F%2Fwww.vystarcu.org%2Fhome%2FfiFiles%2Fstatic%2Fimages%2Fbalance_chk_accnt.jpg&sa=D&sntz=1&usg=AFQjCNFcEnp1-oFfiLgVwqdsbkXO0AEbrgIhavetestedaBelgiansmallSaaSBilling/BankInterfacesoftwareafewweeksago.Theydiditright(screenshotsofeverystepstogetyourcodafileineverybank)butIdontfinditanymore.
Menu items Thenumberofmenuitemswilldrasticallybereducedthankstothedashboard.(kanbanviewofjournals)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
TheAllreportsmenushowsallreportsandyoucanfavouritesometomakethemappearinthemenu.
TODO:mockupforthisfeature(andhowwehandlecustomreportdefinition)
49/55
Journal form view
Todo:improvethismockup:
CodeShortNameonReports/defaultprefixforsequence ExplaintheTypefield(isthereatooltip?) Explainthelinkbetweenjournalandpaymenttype,itsnotusual.
Account form view
50/55
Assets Theassetcategoryshouldappearconditionallyaccordingtotheproduct.(addamany2oneassetcategoryonproduct.templateobject)Whensettinganassetcategory,theaccountshouldchangeaccordinglyontheinvoice(andwhenusedinthePO).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. FreeTrial2. CreateInvoice3. SendbyPost(*)4. (receiveitinyourmailbox3daysafter)
Scenario2:
1. FreeTrial2. SyncWithBank(orImportabankStatement)3. Dataareallfilledandstuffconfigured:
a. bankaccountcreatedb. bankcreatedasacontactc. bankjournalcreatedd. journalitemsavailable
So,afterthefreetrial(orinstallationoftheDB),theuserarrivesinthekanbandashboardwithafewjournalcreated(sales,purchases,bank,cash).Weneedaprimarybuttononthesejournalsanddependingonthebuttonhechoose,hegoestheScenario1orScenario2.(*)Itmaynotbeclearfortheuserwhatsthevalueofsendinginvoicesbypostautomatically.ItwouldbegoodtoaddaTIPforthefirsttime,explainingwhatthewizardwilldoandwhyitsgreat!Inourcompany,theaccountantsendinvoicesonceaweek(becauseshepreferstoprintandpostbybatches).Thismeanswecandeliverinvoices4daysfasteronaverage(3.5duetothebatchand1duetointernationalletterswhenit'sprinted+postedintherightcountrydirectly)Sinceouraveragecustomerpaymenttermis30days,bysendinginvoices4daysearlier,wecanhave13%ofourmonthlyturnoverinourbankaccount.TODO:Weneedtodoanonboardingflowlikethisone:https://fr.slideshare.net/secret/upjRZ9TgRHnSFX
53/55
https://www.google.com/url?q=https%3A%2F%2Ffr.slideshare.net%2Fsecret%2FupjRZ9TgRHnSFX&sa=D&sntz=1&usg=AFQjCNHTR2Kjr117nTg-vL9W4Y1x1_tzYAPlanner TheplanneraimstoguidenewusersthroughtheinitialconfigurationofOdooasadaytodayaccountingsolution.Itsalsoanintroductiontothebasicprinciplesofaccountingforbeginners(asthereisaminimallevelofknowledgerequiredtousethemoduleefficiently)Mockup:http://qf6iua.axshare.com/accounting.html(workinprogress)
54/55
http://www.google.com/url?q=http%3A%2F%2Fqf6iua.axshare.com%2Faccounting.html&sa=D&sntz=1&usg=AFQjCNEqCKAGQ7VmZtzYV440bQcVeAu5IwPhase 2: localization
switzerland: needoneextrafieldontheaccount.move.linetostorethebvrreference(orneedawaytocreatejournalentrieswith"invoicebvr+asequence"...chosenonthepaymentterm?)(theydon'twantitonthegeneralledgerforexample...)=>addabooleanonpaymenttermline
US: checkwrinting
55/55