From f36b6a178c9811357ff5d5291874aa239d22bc2a Mon Sep 17 00:00:00 2001 From: ivan Date: Sat, 4 May 2002 15:00:18 +0000 Subject: [PATCH] schema changes for proper texas tax --- FS/FS.pm | 2 + FS/FS/cust_main_county.pm | 8 +++ FS/FS/cust_tax_exempt.pm | 131 ++++++++++++++++++++++++++++++++++++++++++ FS/FS/part_pkg.pm | 4 +- FS/MANIFEST | 2 + FS/t/cust_tax_exempt.pm | 5 ++ README.1.4.0pre12 | 15 +++++ bin/fs-setup | 21 ++++++- httemplate/docs/admin.html | 2 +- httemplate/docs/schema.dia | Bin 10766 -> 11176 bytes httemplate/docs/schema.html | 11 ++++ httemplate/docs/upgrade8.html | 13 +++++ 12 files changed, 210 insertions(+), 4 deletions(-) create mode 100644 FS/FS/cust_tax_exempt.pm create mode 100644 FS/t/cust_tax_exempt.pm diff --git a/FS/FS.pm b/FS/FS.pm index 287e50c67..3a9c9f336 100644 --- a/FS/FS.pm +++ b/FS/FS.pm @@ -48,6 +48,8 @@ L - Referral class L - Locale (tax rate) class +L - Tax exemption record class + L - Service base class L - Account (shell, RADIUS, POP3) class diff --git a/FS/FS/cust_main_county.pm b/FS/FS/cust_main_county.pm index 56d29da94..a9a4a85bd 100644 --- a/FS/FS/cust_main_county.pm +++ b/FS/FS/cust_main_county.pm @@ -57,6 +57,10 @@ currently supported: =item tax - percentage +=item taxclass + +=item exempt_amount + =back =head1 METHODS @@ -97,11 +101,15 @@ methods. sub check { my $self = shift; + $self->amount(0) unless $self->amount; + $self->ut_numbern('taxnum') || $self->ut_textn('state') || $self->ut_textn('county') || $self->ut_text('country') || $self->ut_float('tax') + || $self->ut_textn('taxclass') # ... + || $self->ut_money('amount') ; } diff --git a/FS/FS/cust_tax_exempt.pm b/FS/FS/cust_tax_exempt.pm new file mode 100644 index 000000000..ab873c0a7 --- /dev/null +++ b/FS/FS/cust_tax_exempt.pm @@ -0,0 +1,131 @@ +package FS::cust_tax_exempt; + +use strict; +use vars qw( @ISA ); +use FS::Record qw( qsearch qsearchs ); + +@ISA = qw(FS::Record); + +=head1 NAME + +FS::cust_tax_exempt - Object methods for cust_tax_exempt records + +=head1 SYNOPSIS + + use FS::cust_tax_exempt; + + $record = new FS::cust_tax_exempt \%hash; + $record = new FS::cust_tax_exempt { 'column' => 'value' }; + + $error = $record->insert; + + $error = $new_record->replace($old_record); + + $error = $record->delete; + + $error = $record->check; + +=head1 DESCRIPTION + +An FS::cust_tax_exempt object represents a historical record of a customer tax +exemption. Currently this is only used for "texas tax". FS::cust_tax_exempt +inherits from FS::Record. The following fields are currently supported: + +=over 4 + +=item exemptnum - primary key + +=item custnum - customer (see L) + +=item taxnum - tax rate (see L) + +=item year + +=item month + +=item amount + +=back + +=head1 METHODS + +=over 4 + +=item new HASHREF + +Creates a new exemption record. To add the example to the database, see +L<"insert">. + +Note that this stores the hash reference, not a distinct copy of the hash it +points to. You can ask the object for a copy with the I method. + +=cut + +# the new method can be inherited from FS::Record, if a table method is defined + +sub table { 'cust_tax_exempt'; } + +=item insert + +Adds this record to the database. If there is an error, returns the error, +otherwise returns false. + +=cut + +# the insert method can be inherited from FS::Record + +=item delete + +Delete this record from the database. + +=cut + +# the delete method can be inherited from FS::Record + +=item replace OLD_RECORD + +Replaces the OLD_RECORD with this one in the database. If there is an error, +returns the error, otherwise returns false. + +=cut + +# the replace method can be inherited from FS::Record + +=item check + +Checks all fields to make sure this is a valid example. If there is +an error, returns the error, otherwise returns false. Called by the insert +and replace methods. + +=cut + +# the check method should currently be supplied - FS::Record contains some +# data checking routines + +sub check { + my $self = shift; + + $self->ut_numbern('exemptnum') + || $self->ut_foreign_key('custnum', 'cust_main', 'custnum') + || $self->ut_foreign_key('taxnum', 'cust_main_county', 'taxnum') + || $self->ut_number('year') #check better + || $self->ut_number('month') #check better + || $self->ut_money('amount') + ; +} + +=back + +=head1 BUGS + +Texas tax is a royal pain in the ass. + +=head1 SEE ALSO + +L, L, L, schema.html from the +base documentation. + +=cut + +1; + diff --git a/FS/FS/part_pkg.pm b/FS/FS/part_pkg.pm index 8ab8ad452..1f3106544 100644 --- a/FS/FS/part_pkg.pm +++ b/FS/FS/part_pkg.pm @@ -235,7 +235,7 @@ sub check { || $self->ut_anything('plandata') || $self->ut_enum('setuptax', [ '', 'Y' ] ) || $self->ut_enum('recurtax', [ '', 'Y' ] ) - || $self->ut_enum('texastax', [ '', 'none', 'access', 'hosting' ] ) + || $self->ut_enum('taxclass', [ '', 'none', 'access', 'hosting' ] ) || $self->ut_enum('disabled', [ '', 'Y' ] ) ; } @@ -297,7 +297,7 @@ sub payby { =head1 VERSION -$Id: part_pkg.pm,v 1.12 2002-04-25 10:37:08 ivan Exp $ +$Id: part_pkg.pm,v 1.13 2002-05-04 15:00:18 ivan Exp $ =head1 BUGS diff --git a/FS/MANIFEST b/FS/MANIFEST index 86516e3d9..2e72d5af8 100644 --- a/FS/MANIFEST +++ b/FS/MANIFEST @@ -79,6 +79,7 @@ FS/radius_usergroup.pm FS/queue.pm FS/queue_arg.pm FS/msgcat.pm +FS/cust_tax_exempt.pm t/agent.t t/agent_type.t t/CGI.t @@ -136,3 +137,4 @@ t/queue.t t/queue_arg.t t/msgcat.t t/raddb.t +t/cust_tax_exempt.t diff --git a/FS/t/cust_tax_exempt.pm b/FS/t/cust_tax_exempt.pm new file mode 100644 index 000000000..8af13e3aa --- /dev/null +++ b/FS/t/cust_tax_exempt.pm @@ -0,0 +1,5 @@ +BEGIN { $| = 1; print "1..1\n" } +END {print "not ok 1\n" unless $loaded;} +use FS::cust_tax_exempt; +$loaded=1; +print "ok 1\n"; diff --git a/README.1.4.0pre12 b/README.1.4.0pre12 index 7de0619cc..8b883d4df 100644 --- a/README.1.4.0pre12 +++ b/README.1.4.0pre12 @@ -44,6 +44,21 @@ CREATE INDEX export_svc3 ON export_svc ( svcpart ); ALTER TABLE part_export RENAME svcpart TO deprecated; +ALTER TABLE part_pkg ADD taxclass varchar(80) NULL; + +CREATE TABLE cust_tax_exempt ( + exemptnum int primary key, + custnum int not null, + taxnum int not null, + year int not null, + month int not null, + amount decimal(10,2) +); +CREATE UNIQUE INDEX cust_tax_exempt1 ON cust_tax_exempt ( custnum, taxnum, year, month ); + +ALTER TABLE cust_main_county ADD taxclass varchar(80) NULL; +ALTER TABLE cust_main_county ADD exempt_amount decimal(10,2); + Run bin/dbdef-create Run bin/create-history-tables diff --git a/bin/fs-setup b/bin/fs-setup index 37ecf1b87..e05d44531 100755 --- a/bin/fs-setup +++ b/bin/fs-setup @@ -1,6 +1,6 @@ #!/usr/bin/perl -Tw # -# $Id: fs-setup,v 1.89 2002-04-20 06:33:03 ivan Exp $ +# $Id: fs-setup,v 1.90 2002-05-04 15:00:18 ivan Exp $ #to delay loading dbdef until we're ready BEGIN { $FS::Record::setup_hack = 1; } @@ -518,6 +518,8 @@ sub tables_hash_hack { 'state', 'varchar', 'NULL', $char_d, 'county', 'varchar', 'NULL', $char_d, 'country', 'char', '', 2, + 'taxclass', 'varchar', 'NULL', $char_d, + 'exempt_amount', @money_type, 'tax', 'real', '', '', #tax % ], 'primary_key' => 'taxnum', @@ -659,6 +661,7 @@ sub tables_hash_hack { 'plan', 'varchar', 'NULL', $char_d, 'plandata', 'text', 'NULL', '', 'disabled', 'char', 'NULL', 1, + 'taxclass', 'varchar', 'NULL', $char_d, ], 'primary_key' => 'pkgpart', 'unique' => [ [] ], @@ -989,6 +992,22 @@ sub tables_hash_hack { 'index' => [], }, + 'cust_tax_exempt' => { + 'columns' => [ + 'exemptnum', 'int', '', '', + 'custnum', 'int', '', '', + 'taxnum', 'int', '', '', + 'year', 'int', '', '', + 'month', 'int', '', '', + 'amount', @money_type, + ], + 'primary_key' => 'exemptnum', + 'unique' => [ [ 'custnum', 'taxnum', 'year', 'month' ] ], + 'index' => [], + }, + + + ); %tables; diff --git a/httemplate/docs/admin.html b/httemplate/docs/admin.html index 0093fd2b7..50beafe78 100755 --- a/httemplate/docs/admin.html +++ b/httemplate/docs/admin.html @@ -12,7 +12,7 @@ "your_host" with the name or network address of your web server.
  • Select Configuration from the main menu and update your configuration values.
  • Next you must create a service definition. An example of a service - definition would be a dial-up account or a domain. For starters, it is + definition would be a dial-up account or a domain. First, it is necessary to create a domain definition. Click on View/Edit service definitions and Add a new service definition with Table svc_domain (and no modifiers). diff --git a/httemplate/docs/schema.dia b/httemplate/docs/schema.dia index 4a54652856d71a4f10cf828b02d0ff233c9120c0..148c1dfbcd89920b16ae652f157b61e1647cad33 100644 GIT binary patch literal 11176 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 literal 10766 zcmYLvWmH^Eur2QH?(Pmj1_u;A_xT!IFN!QI{6J-E9MgbXlf@L<6%-@R+ScYbvJ zIemK7sa?BvS2txW64d`bu;+mwcT&0ZbN?WCsnEZp+L!|F95i&g) zaQ})bdmQ`z2B%hX*nHruUs`<53HUBZI-pnQ zrze=LcJwqF>GAJ1cEC6z$hbGaCp!a}Z!`amb4ez>LHzvOyg&Dme)QGcVlv?f`TgB` zcDTCCgs>Fe6W(D-DhPluf)534SMV~I^rhKlnqeDs3vcUKw1@7gq7lZ^YXqBpjq2{z0@ zY8eIh{ou&=YTfzolqZ|w%IPUJcJ1e@LB6yGKL4I0)OP;{_UFX4SdEIj`phQS_&qfK zv05ElUtit%d0Nyqzp*sJ*EfF?S@G@$Ahn7$f7;sv3%sS@Px_WL3J9UZlNd5sNP8XqXUV}D}&i`IQjYA`d|kTaT3m^Xj^>DUo()eQ%{51E4Ytn*w)EQLrmA~x+&-%<{c+ddR%^MlnYZ@t zsIkewSL^e0^`x*TOBCF!FrPj#jaQ3QA5j=f387hYFEY=^07s?iA_SuxF+Eg-;gV3O z*C1l>8i()BW}kS{d^K#DR$?JPl{;H|xqQ!^S=zMS%WEPBJmzDTe03fV&~@Y`rU=rz zd0!sA177xm*#;zGv*mEFa~_KEt*lM1rF0TBVy zgR+Tl2HtWuo!Vdfo~K}I%hT#8NBO%f?gF1Qdhf!XR8Ga?9D>*eUY{7%gv3>sA?~RA zSLJcEo;bI(dVYLW;s4&z)9BwyHiE9IGbwu_FDvF4+4o1TGYeXzDewO{@Ql(XE4#cj zZA<~xni|=fMRO39ojblQOsh7$U{;jG?@sjVJu7hjb8ebwf!y3oi?fyFWOFu)vcE9L zTc3U#(f+0d411A68{J*H6P?%9{0;dhCkq)LO$k`!Otxst8(-ST4e7hB)A#;y;ap)t z@TEtZ)cs&f|NV{0;?H_TuvH3~ZBi{v3Tg>7luO`G6}e za=S zyYl+8cG*mFW=n|Lx&qKmqBM2#INvv7G0`fj36PI8P0`lcB34w zz$ENCs4B6z`P2n3gQzacwy4WSol~K;87`|*)Er)IiRHc?0n35pxx$b=QF$#L_H{Le zk* z9B94gZTCGTUPS7e(`OLNl^btkJiEy_j4CL$iuXRk{M zFY#?G?FRv!hnqpErf{jX%R!h7IViVFNh9}bnpxD}L_%YC*j#969mQALlp&n4Ig}v@ zu9$RQVIz5BRo~v*CT<}23AUt2&o{6RXJ;jjuy!s%zOM}(4IKT?djfQr&R5Pqd(3Op zewqjVrnL7UCA<`YkKFPV&x-fXdh#P!%ihu<0X=b(W!(E!emOggxAn!*saq4RT&2Ow z#wewpV#@2B*tsNetS;ANk4p`72!7D1GA?~ss4CK;6?;(*KXpBR&5E2t45HBFmq5d! z6eP!1M#FmOe|%pPQGw?f39;Vp4o(U&J6OF~Wmd7sOGc)_^Nud0yYFRlQCv!6#vikK z;?&Kd^XPJoN6^zj&8Yj+oF2g()ut-9!lkluPmmG&Ah^I)WJa@ozd}C~S@`sd9%|ib zo5%@m9{gBIWo$jV12cp<7=U7WU$pxbg9~cL=zD{Tga`kn5CE{XO_!B*!VG zZZk;?rTWXlu#yZ&)*@hT&wK2sl`ZJExz5|5(}9Me%Ke=v3YBu4ogoAQW||+vZ9Vz9 zNz}qPUNsg=EDH8tM~_NCR6kqjrU2ujTSuGS3S=*NUEn?|$jm)X*w_8GFUP z0M4Di*=mMcV7`(Y6Dux2eR$VN&BO6G#N6ly%!eQKpF^zW(~qe1dA1^~Cq)+6o-AgQ zy^HkSZPTCmrbT=DbK;8(KDUM2`|4IhPJh$tMK~Z#A~GSw0P_kF1P~IapC#_0v#Cd5 zhZ8yGrMfLu%9OIue5AoVag28aNIFug(P_F77%zO)_P&ql_IBynL^c-o=`^~L2_O%i zFiqq#97RYMQ`)g36lU!^_qB=uY#j7{{_uuN?QuU*?&me=WJB4TJ37QvXoyzujr*pX zm=MYk^xj&-RbRY^7p5#irW(~2DKIQxEZDm6$#P*P`Z?gk-g7Tpj3# z`trT-AIsuS{FE2>yks8!36*I0h4YsRLB>QpY_1y8oO~i|z8dnpJQqx{8tUQ%4@{{V z?vgzJhZ(z+=*RvYpy0ngD&+h&6-8 z^*}iz6KS>^ll%eLPAjbW*uR14-f9!UJcZkDOe1Xb%O~{Z;!typ&^EzDR2PAfhag8? zk9EhF|0T|`%pX3gEm*$G`ca__JbP@?7eiblT-a_*@JWhWBiQ7gcza-xYJQZ(%TPs9 zH@spR;XSsIK;$Q)=%}P9qUg?P)gU<fxdr42??pznaAsjQ@q)#=8Q(ReX( zE38(^ZSFkJTm^AF6KRR8)L-(WjXupK4#S$%K1jmzEC%nr0f#0RR!HS#9mzxl(p4<> zLmH7wu){1|2FFJgCXR?PI;lR$rSVE{=D2gR-TudTG7_!T$km1{3XqUF*#`@smIaVe zDYP`!Y7@4$|xY(>jdyNJJ!iDLhET z^ewD^uDU9LSkD{YcS^CWWw^;o2PCY`slpA@>*+NP$20NyhbIR|OJCXLx835D> z6gS6xhm(xeAGG0mOXY{xczsE}>ptA3&!f zKK}y+!40`7NP(A)fSEX+j_Qwty19jN&j$ANl1o|(4w9kIY*x^A63R!wCvqo|nIdF* zpG6SB0U2*EYIy?l8T4189}bVWv0zwBI_^9)*`I)6gCeD zjr~$^^@fm!T&XN!HPofe&^sW>z(&S(@C|lU;yMXG|3NU8k2Bc3uydR#pYY_F?b5hB zydIXRBhM-g-y3y-n`_$w?OD(s1qpU2upHb&uSbM+;jOspm>LoZy_a91sp9UjixBmU zwg>X?%24HOs5n6Ve)xl4ha<_!DZ6_gOG*(!LB5hW7Fc3EoVKO zM9fU`l9DJ>S*3-w38EL5;CO0O_>T~Co1+sUMC6$Is9}ZN&=e9A>r7O_qynX8K6q6M zowqUWQ+?(>3Xw$u>mVA}$GCvT_c6N0@ugiXYdbFU;pfW}ax2i&RnRR(;Ng!&CktzY zE>t43L|#_v`k~PC*n8s}Ac8^SU*j+a$aL}86;(HssjKb~`A)zKo0b_x>s%IABIs&&R2 zdiD|1nuKy(=3_t%KNjvV_F0e+G#2bg;Cva`>!$)UDzw1>5>wR%ZeeV$3$eK26mL{Z zcq-V5b6DS80_I%QVB&6n?VY^kF{k8KWxV)J28HPb28HfsmE_`Z`%@J~^Zj-O`^JW& zqQ2){_2;eU^Be0_0<0bCZYd9O+{GPA-{Z8aA-`X~t3l4Q;|r|NhqzF;9stD(;uz}? zND9^AT=2``>ZMDtDU#?B-Bn{b46rzQ75gqvb3>sP4vNPFLJoNs(nP@)S zat$*=HuPlY4A3`=lVqLrM0&*Wp#F222F;Z0MFck3lE&k}ng{(}`;5f|o7!sEU^3PF zX|rNfbX*K@aqR{S5_ouoB*}rXUmEkhIppOo8Eiw)xe7+`Z55{S+A$IGLymm#fL2Qm_ zbg+}h*>FWL^0Mo69~ApBQW5Lx1Wr~jskBswD=N=0pIZTR%%_;om$2;c)!2Z!I;*By z{ESozMdou7OV`QOhq2Qq0ja7<20vC~(ziH2mRAYL9+i2mF^OV)HdOF1W3V zR8MfupHV4iy=typKbCUtfvnS<6O6!o=qV7wb%h!fw**?9SpJ$biNiUY8MomYGD)kK zZhI|i+O*MBIPcKD{duHIb^01dG?zxs8uAdW-MOz<9^_N0m;8C+*1W9!LnH+WJy}z~ z4Z`KqL8vM+A8oBIdu<~-pR6X2p9LNLRAVT%4UQG9;E;1;SvIn0!b3CW{mn4aB3v=D zG_DPf%HwT9zP#(;zwa8o`&y_;aKYPxRKNx(D+ywJgUSV%Wa>-pX_5M>URr+cZMrF} z6Z89ld#_gg%_RHEPm9`{(n>>n1P*PD1KGp#Y#jpji|Gj!|H7#rE(l8IsotasgD?c) z&MQ>TZ9Mnfve4c?Dk?9Za$)Dgd83j5U~HS09h)C^UgK)}e47_38_L5{!bEMER6cv~ z<~E711~`;4It%jes$Cv zbMfm({=wh*UG$ylue(EtcHq^exK~7Jjw~T=!VEIe4*`$ zA*?EY(Tu95(Tti{{%GYcY<%jBbUyXPyRSm(;J$Q842?A;+8)XsW}lIo=T@fwK?)Qh z`Y7N4;h6VMB^#NH^IIs3N`Li-;E@)c2a4X^gBDn5JIp2Hf>N4ds)O<_XB%e}u7RA#Gpg|HV{%7n@3QGpsps@87agBL*VH$?6sOnLS3CAn)js z`$sP0@6L0KwG;OW#1G*c;~!?;i3i2aa=LFP+*?)7i^ZqGS6sP|j#Ztk2_nYGq{}{) zo}8#wO>tVSEhN;yZQrXD_HCEH^lPXILgW49*Zvc7T)IO z&)x3cvPOx1z>Qqi2g^I+w_wBfAXqrqpXW4>?tl8eH*#@p+i+LN$M(=$dYL}aDZYUT zU`Hw>CS>lbg1ynGq)dTyjnf3ezwIdcVDqgdO$ig!XMKu2Uod>K;ii z*e+52ZqZLM2{b#NbUr(h2L!?BHEzSOoCRW|8Y&e7nq1|$*d4-`D|WHi_TS1Q$EX*5 zd($3#pOsvhQWn!DhtVZ79d$CL>Cg~sFEym)#Y7a#!z7+93%l;>HBbjyfVTnLpK|eW zK3W3zE^&$2AN$^&;mo)YQ>xDSlR*hCtZfH4lji}8-?)tdD0&oXP?k_ncsy0Vtd^Mz z(U=}6r-HU;WAQ$=I%>gb6)B^Zi=Wc7VA4aZlvChhLiX;0UB36caQ#=%zH41W_P*wG zENa2{e7BAUt&W4I_YTL4Xdhvtcc|PVyJWJT8)VWsJM=-Jjhy0*?frl$fyDd!jP-ZF z=hMBOd1mLyFvg}FbXKo_cuZ^KuOCUSaosQV|C3zq|B}35!cD&csKeBL-Rqu0gxwPD zn5mslWIV^}J(8vV1IO3k32a!c^JDK}=vkoV_x$U;%7P{RLqwy`SA$X< zia;s&i#=kSnl|gwEOxjKH1qZjjTHu;d#I8XK@Iv&lD3rdF3ZRyi&EB+GYQ|-5;wu2 zcZ^vA=Z$yVD+;Ecex+#`#QiEGUsDfF#>Owu*JiUr)o3cYF4^NMb*j`|-pq~Lg?m~M z69b+&^627PQo08yd;i^)GL0J~3gL#a@G-j@$~Re41$<6pme~I0X`}z4@IU%6Xn{Bq z5skQCHq4xmL_OyqJna{c)hWN8z!=Vn}hA5X{9F z@jawV)&D;6e$*nl1RaBoJRTeFyDYDVQrxwMjQNB(CleRlM{gBMe^O$86fyNLIFo)G zyB>qzh?B?J3fN|DsSuvzmO|85qb1tl8~3&9%2Xe(@gKNd|blFydu}r|7!|A4r~^ru)W*yOt&jA z7B_h$qcNFrw;**=8EIkvaXmRu$2lCJ%hfwv3E>&mxj(Y%imq^UQX;hYOx$3^|2vfk zV$vuO(e=vuW0$P$d)+5T3s&M|o}ONHoSJ52oVg_H2|g*nd};>LFPCiHK2VRSv{?d`{oPeJ=j zqtBz+)1!@G5QvnsN{1mSemN;zg(#Z2AET6BnH4-sRK`w<5l+4K&Tf|N3Rafp+1%Jk zr(Y^jLe=V0wKa!dM%I!h9)1w7pw6ywXJ>+-G0O;;;&~g%YKUE_(1CT+y;_sCnJ)7x zuQI}sX;RzdJk>tKl$VwJeU*36MrIYmGlmq_9>Yso(9v^Tbky18R|2Ui;V4j*L zX=a*yvJtL1iT5JuU^Su(&-Yf=GsqIcb=n+5jZ*6#@m(>el}5M>Uj|f&KexY(g8D^l z>lOvyqOY3$qECzh`W8M^9Lf>{c`?amM*sdZ1NH8<@2bCRj8M_NiF9iYkm z>kD`aQL-Qp-(Jx!^b-Y0|6`idkqK5!W|c9Ms3e@)4+omFWE8}z+=?3WY>SHxqFTRq z9C)WWbJyC};f{R$c5`hi>gsVg*<{(yK-v2C=NV0&s_d*Hfxu~IhmMk9ZA_*Mdt~L0 zuCN%un!TjMY9595Bv0P<$h)dj4 zFxA3nu*eV_`)s5f2LCR-S#N$|rkX7AV==PHA6fE88Wxkv!+@VSawGewvrO9HI6cYmKQCGsT~3sfuXtNz4JO zb?+AL$D$t+``jyom~~gfZ%RpHzU7*XZVl2yM-i67MbsL3cD$+CT*UPf$Z12JnN?>F z{-91GdUFto%m(FH2Q>bRm(eBzHc+UsjdlC3!AHU7K$wf%~5e}PX0MHe6&j_kT9N}|@}4|r31a#n0RLQ=X5!??p|!g>sFMlnRz zfpCX`ZkKx3BRCFOG5TXI{cY?CiS(jKGdj~k8b-(iajR}MGexWEj8huZG_$cR={WHP zA`~it4yEkH!od^pKD{(Su6c33xJM~D&Q-Z>5)gsv%=@eTCQ6}#24&zqLR-;lew#12$~)DHo_7v5A`VQOEn zc=y#XL#KsJsU=N$;<6C#q~9GM?Y8?_N$3mw?X7BSS2)HfZ2ROsZ0}_M*L8nn zKz(jVY3-SmBMlV#h)L&n&5X!VE`c^PYx5pZvER?X|0;(#UGo+*4p2}PIv$yJ1nA? z8WpD8(;{2~`=m|Fh_O1H6N5N)5QBsUpF(fjmYbyz;XNRNMERTfU%8CTJ zGM?Q=$N9u0lS0L<7Qc>Y=Iq)OqwX>PmapB=1UMS?ax{bJn~O-Tq%Nf?HH$6Mm5;~h zag}ihTXBeU_ydd%4_NeA6owHUb-S0`#fA3QJ^ljvCI|6mNre9llKRkmKM8Mtoshw> znAK}E?_}al^39wy`+TJ2{i1xp1+cw@QDCxyoR!V#lu~A}2D-|SuaHWAo@YYTzbQEt zh_7J?t-$`$3C=GFN7Icf^CF6o(63}@lxD?mIolaqYiCOeM>VjQZ)Y*g;&vXcNp~Iy zKYwtjTQ*~ErWn+5%J8WYXqf5lTM+!aSu+zL1FsA3tIw0hbb09NsqLnpf**J>fW`|h zyEq@8T-OawmQau*OwJNJW$!m*7gAT0fzXXbm##5P1>FJUuL>*qd-)tnFf6taP#H6MyYOVS`Wilcmlt6bb4?O~#qu&0|rRN~@*I`o@}E zT+7E=lD@m*R-ue^&yvS1rA)+1FLfqkR--pXeG022#%f}pSJs{IkL1WXG9;;Nf^@y; z#=5moz$jV4dR84}FOzwiJF}U49OSh7JH6+VWT(-I)>_N)F9EwaAvHrY-txUMwFu~4 z0~Zc>|BycON4@xqmu~BZvB|BE2HFLdm}I#6TdhB@_3=)c`p%!-#mx0U(wr@$J)91~ zlP&Bs$0x|~{!dxm(D*^w`Iz`^jm?Ss==f4(54u-D4rO979_qAD z2G7I_{|F6!%40Y|56aKSBptYM-WYKbO=@XO%J*8*y{jZzrhXEj&tg%;$xn8~r~jmm z!*rsrfg{2|zd5$K&vW2DuF82OTf0!!J(4Fde3ce4GR_0dV{g&P4gxhRrsbVhuRjIa z+6)8mcBidl(qjj8u!i=_i9}D56Er${Xafm7R)t!Oa23j&sM1&VSjnYbQi!C&)2wZy znQWT%Wiq3M7i`b&+Yg12ojkh|m<^LeE>gYBIG3XPXtcX#8?jp9x9odzH~0(dJoS6` z^Lx@CezbL>c9{H%Yl_HVMiAzsd$4Z9nGbFcNSvsxHL4IhHy}0c@OqXSO5CMNa)Iji z(+z0LuU&BCNOj6}t@p5P!)sGhvis@I5;=ukj;>@m@qu}yA49#EHEBOO*K%itw4qY1mRbh(kOeI|74zuTB@uDf6Le>Qx zqi(+~q>FtFv!?jv*)Iu$;FCrEK2}xVtZJv!RVh^|akw-+soMDLg)S#=&`Y`W7vwVo zEscKDuAtv0da%hb3T-Ny<B zjr=%-qBvdrU{BtbfgiEE#o(GW48jnqx}(&AK_FYLpqfGu(Hp5RT!kPlIq%Q7-^w@O zsd}X$CJPczoTGbk=XhdIqDQhd?xWH=B=V{?j#faWedX0AK+cVFgY}=Q>bj*z<4HSb zw^MFEhu)Bp5&AT41_486Q)pL_>DzBZf^r!RYKxn-v0q*@A%d%C;eU&2S3(@o@w*8O zB}ZWl+b$il80y5 zjI0I#W|uan6q9zX@O8I{w+=~c)G@|bIu->@6HcIE^@8XO5D9VQ)ZXtXOA{yO(0)n8@Hm2?jY<_C}8U;PhZ zgIuTGssHc<@VW( z>6i;$ms0T~)BcVZ;@d-Mnkd8UVcCDVi+2jE{p52-L0U4}eb?}1EULA@t#oH;F{O@7 zY;AP0WS2s0ZFbQjO%4b?&eOk*NbfaY73K4qENUsSj~L?!AA7463m^MQ@p&H?GoCUG zCErCGXMsI@EJR=G|MxNJ6$1YDJL1;;MzI2lBh*9`z_|RdM7pT|Kv0>n# z=D794$<^X3yhB>B zc4EdbOE7li1DEMSJa+tQa`%X73ih}J-hQou`%>a5XhgJ{=!gKA7M5#nTpbQ;*r)Sn zkbsPV-!4n*DM}#J>KpWZNE{JJP4Cy$KN@ucrW*9AWOO1W@~p<}3RQoTkn2i{wLzRY zel1q1nT?_c^IV7#94J+u!Bcr^YXjWQKjL%$gG#`d|x>_Zglq9Tx3$DdSchkXfLC*6l~iHBeFj_=c5>M zzI7MD=2A#I$vaikdR+S!n7 z5bL`U&rOKw%R^{bKH(8*ECTPCC)rFxAQ?e=vV#03mc9o0_j=`k|GiJA>#fBv%&$un zGf;Nsn_ri$YFu9d(Jem!OfEhxZ8vYtc|IL+iS+Dd-~GMm0i9%wuG$?sLJMvI}o)CurZQ7WVqt!drb@-MJ7<5F_SX>V^7f=e29RlrEgtFg`RF^IUj= z)g%d~!Ot%*CdP6#?i3D2ph^!K>6IEp$~r&PbbAqP;Z(M3x{(=;WotpNHY;StZPzbd zs?AsKDl%qE`}7NEh3jp_>(LBa0NdLn`BZ@Ojj H@KFB)mbB{Q diff --git a/httemplate/docs/schema.html b/httemplate/docs/schema.html index 07fcb908e..3f627448f 100644 --- a/httemplate/docs/schema.html +++ b/httemplate/docs/schema.html @@ -47,6 +47,7 @@
  • plan - eventcode plan
  • plandata - additional plan data
  • disabled - Disabled flag, empty or `Y' +
  • taxclass - Texas tax class flag, empty or "none", "access", or "hosting"
  • cust_bill_pkg - Invoice line items
      @@ -130,6 +131,16 @@
    • county
    • country
    • tax - % rate +
    • taxclass +
    • exempt_amount +
    +
  • cust_tax_exempt - Tax exemption record +
      +
    • exemptnum - primary key +
    • taxnum - tax rate +
    • year +
    • month +
    • amount
  • cust_pay - Payments. Money being transferred from a customer.
      diff --git a/httemplate/docs/upgrade8.html b/httemplate/docs/upgrade8.html index 841a053ed..97758fdb2 100644 --- a/httemplate/docs/upgrade8.html +++ b/httemplate/docs/upgrade8.html @@ -195,6 +195,16 @@ CREATE TABLE msgcat ( ); CREATE INDEX msgcat1 ON msgcat ( msgcode, locale ); +CREATE TABLE cust_tax_exempt ( + exemptnum int primary key, + custnum int not null, + taxnum int not null, + year int not null, + month int not null, + amount decimal(10,2) +); +CREATE UNIQUE INDEX cust_tax_exempt1 ON cust_tax_exempt ( taxnum, year, month ); + ALTER TABLE svc_acct ADD domsvc integer NOT NULL; ALTER TABLE svc_domain ADD catchall integer NULL; ALTER TABLE cust_main ADD referral_custnum integer NULL; @@ -215,6 +225,9 @@ ALTER TABLE cust_refund ADD closed char(1) NULL; ALTER TABLE cust_bill_event ADD status varchar(80); ALTER TABLE cust_bill_event ADD statustext text NULL; ALTER TABLE svc_acct ADD sec_phrase varchar(80) NULL; +ALTER TABLE part_pkg ADD taxclass varchar(80) NULL; +ALTER TABLE cust_main_county ADD taxclass varchar(80) NULL; +ALTER TABLE cust_main_county ADD exempt_amount decimal(10,2); CREATE INDEX cust_main3 ON cust_main ( referral_custnum ); CREATE INDEX cust_credit_bill1 ON cust_credit_bill ( crednum ); CREATE INDEX cust_credit_bill2 ON cust_credit_bill ( invnum ); -- 2.11.0