Merge lp:~vauxoo/openerp-venezuela-localization/ovl70-fr-rev-hbto into lp:openerp-venezuela-localization
- ovl70-fr-rev-hbto
- Merge into trunk
Proposed by
hbto [Vauxoo] http://www.vauxoo.com
Status: | Merged |
---|---|
Merged at revision: | 765 |
Proposed branch: | lp:~vauxoo/openerp-venezuela-localization/ovl70-fr-rev-hbto |
Merge into: | lp:openerp-venezuela-localization |
Diff against target: |
1394 lines (+798/-267) 17 files modified
l10n_ve_fiscal_requirements/__openerp__.py (+1/-1) l10n_ve_fiscal_requirements/doc/fiscal_requirements.xmi (+234/-0) l10n_ve_fiscal_requirements/model/__init__.py (+1/-0) l10n_ve_fiscal_requirements/model/account.py (+49/-0) l10n_ve_fiscal_requirements/model/invoice.py (+16/-0) l10n_ve_fiscal_requirements/model/l10n_ut.py (+4/-2) l10n_ve_fiscal_requirements/model/partner.py (+153/-19) l10n_ve_fiscal_requirements/model/res_company.py (+13/-0) l10n_ve_fiscal_requirements/model/seniat_url.py (+44/-52) l10n_ve_fiscal_requirements/view/account_invoice_view.xml (+85/-5) l10n_ve_fiscal_requirements/view/partner_view.xml (+30/-24) l10n_ve_fiscal_requirements/view/res_company_view.xml (+6/-6) l10n_ve_fiscal_requirements/wizard/account_invoice_debit.py (+135/-121) l10n_ve_fiscal_requirements/wizard/search_info_partner_seniat.py (+22/-19) l10n_ve_fiscal_requirements/wizard/update_info_partner.py (+4/-8) l10n_ve_fiscal_requirements/wizard/wizard_invoice_nro_ctrl.py (+0/-7) l10n_ve_fiscal_requirements/wizard/wizard_nro_ctrl.py (+1/-3) |
To merge this branch: | bzr merge lp:~vauxoo/openerp-venezuela-localization/ovl70-fr-rev-hbto |
Related bugs: | |
Related blueprints: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
hbto [Vauxoo] http://www.vauxoo.com | Pending | ||
Review via email: mp+138900@code.launchpad.net |
Commit message
Description of the change
Version revisada del modulo de fiscal requirements
To post a comment you must log in.
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === modified file 'l10n_ve_fiscal_requirements/__openerp__.py' |
2 | --- l10n_ve_fiscal_requirements/__openerp__.py 2012-09-26 20:05:11 +0000 |
3 | +++ l10n_ve_fiscal_requirements/__openerp__.py 2012-12-10 03:34:20 +0000 |
4 | @@ -23,7 +23,7 @@ |
5 | # along with this program. If not, see <http://www.gnu.org/licenses/>. |
6 | ################################################################################ |
7 | { |
8 | - "name" : "Requirements for Venezuela", |
9 | + "name" : "Venezuelan Fiscal Requirements", |
10 | "version" : "0.2", |
11 | "author" : "Vauxoo", |
12 | "website" : "http://vauxoo.com", |
13 | |
14 | === added file 'l10n_ve_fiscal_requirements/doc/fiscal_requirements.xmi' |
15 | --- l10n_ve_fiscal_requirements/doc/fiscal_requirements.xmi 1970-01-01 00:00:00 +0000 |
16 | +++ l10n_ve_fiscal_requirements/doc/fiscal_requirements.xmi 2012-12-10 03:34:20 +0000 |
17 | @@ -0,0 +1,234 @@ |
18 | +<?xml version="1.0" encoding="UTF-8"?> |
19 | +<XMI verified="false" xmi.version="1.2" timestamp="2012-12-01T15:25:02" xmlns:UML="http://schema.omg.org/spec/UML/1.3"> |
20 | + <XMI.header> |
21 | + <XMI.documentation> |
22 | + <XMI.exporter>umbrello uml modeller http://uml.sf.net</XMI.exporter> |
23 | + <XMI.exporterVersion>1.5.8</XMI.exporterVersion> |
24 | + <XMI.exporterEncoding>UnicodeUTF8</XMI.exporterEncoding> |
25 | + </XMI.documentation> |
26 | + <XMI.metamodel xmi.version="1.3" href="UML.xml" xmi.name="UML"/> |
27 | + </XMI.header> |
28 | + <XMI.content> |
29 | + <UML:Model isSpecification="false" isAbstract="false" isLeaf="false" xmi.id="m1" isRoot="false" name="UML Model"> |
30 | + <UML:Namespace.ownedElement> |
31 | + <UML:Stereotype visibility="public" isSpecification="false" namespace="m1" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="folder" name="folder"/> |
32 | + <UML:Stereotype visibility="public" isSpecification="false" namespace="m1" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="datatype" name="datatype"/> |
33 | + <UML:Model stereotype="folder" visibility="public" isSpecification="false" namespace="m1" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="Logical View" name="Logical View"> |
34 | + <UML:Namespace.ownedElement> |
35 | + <UML:Package stereotype="folder" visibility="public" isSpecification="false" namespace="Logical View" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="Datatypes" name="Datatypes"> |
36 | + <UML:Namespace.ownedElement> |
37 | + <UML:DataType stereotype="datatype" visibility="public" isSpecification="false" namespace="Datatypes" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="Hhr1p6xuKJbV" name="int"/> |
38 | + <UML:DataType stereotype="datatype" visibility="public" isSpecification="false" namespace="Datatypes" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="se8bAs3OdVm5" name="char"/> |
39 | + <UML:DataType stereotype="datatype" visibility="public" isSpecification="false" namespace="Datatypes" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="LoKxVQWk5Mjs" name="bool"/> |
40 | + <UML:DataType stereotype="datatype" visibility="public" isSpecification="false" namespace="Datatypes" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="QgnlyMEo0MP9" name="float"/> |
41 | + <UML:DataType stereotype="datatype" visibility="public" isSpecification="false" namespace="Datatypes" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="CSVpvHsE4AAX" name="double"/> |
42 | + <UML:DataType stereotype="datatype" visibility="public" isSpecification="false" namespace="Datatypes" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="bgHg00XReKAc" name="short"/> |
43 | + <UML:DataType stereotype="datatype" visibility="public" isSpecification="false" namespace="Datatypes" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="eOPdjomtFFhA" name="long"/> |
44 | + <UML:DataType stereotype="datatype" visibility="public" isSpecification="false" namespace="Datatypes" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="UZPYkZ3JDKxE" name="unsigned int"/> |
45 | + <UML:DataType stereotype="datatype" visibility="public" isSpecification="false" namespace="Datatypes" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="IUdxmlXR9w4q" name="unsigned short"/> |
46 | + <UML:DataType stereotype="datatype" visibility="public" isSpecification="false" namespace="Datatypes" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="joky3R6XyV4g" name="unsigned long"/> |
47 | + <UML:DataType stereotype="datatype" visibility="public" isSpecification="false" namespace="Datatypes" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="27xGSvSiN3f8" name="string"/> |
48 | + </UML:Namespace.ownedElement> |
49 | + </UML:Package> |
50 | + </UML:Namespace.ownedElement> |
51 | + <XMI.extension xmi.extender="umbrello"> |
52 | + <diagrams> |
53 | + <diagram showopsig="1" linecolor="#ff0000" snapx="10" showattribassocs="1" snapy="10" linewidth="0" showattsig="1" isopen="0" showpackage="1" showpubliconly="1" showstereotype="1" name="class diagram" font="Sans Serif,9,-1,0,50,0,0,0,0,0" canvasheight="537" canvaswidth="811" localid="-1" snapcsgrid="0" showgrid="0" showops="1" griddotcolor="#000000" backgroundcolor="#ffffff" usefillcolor="1" fillcolor="#ffff00" zoom="100" xmi.id="DnSQSq2Hcg6b" documentation="" showscope="1" snapgrid="0" showatts="1" type="1"> |
54 | + <widgets/> |
55 | + <messages/> |
56 | + <associations/> |
57 | + </diagram> |
58 | + <diagram showopsig="1" linecolor="#ff0000" snapx="10" showattribassocs="1" snapy="10" linewidth="0" showattsig="1" isopen="0" showpackage="1" showpubliconly="1" showstereotype="1" name="base_vat" font="Sans Serif,9,-1,0,50,0,0,0,0,0" canvasheight="537" canvaswidth="811" localid="-1" snapcsgrid="0" showgrid="0" showops="1" griddotcolor="#000000" backgroundcolor="#ffffff" usefillcolor="1" fillcolor="#ffff00" zoom="100" xmi.id="oBZv5bkoPSkS" documentation="" showscope="1" snapgrid="0" showatts="1" type="1"> |
59 | + <widgets/> |
60 | + <messages/> |
61 | + <associations/> |
62 | + </diagram> |
63 | + <diagram showopsig="1" linecolor="#ff0000" snapx="10" showattribassocs="1" snapy="10" linewidth="0" showattsig="1" isopen="1" showpackage="1" showpubliconly="1" showstereotype="1" name="activity diagram" font="Sans Serif,9,-1,0,50,0,0,0,0,0" canvasheight="709" canvaswidth="794" localid="-1" snapcsgrid="0" showgrid="1" showops="1" griddotcolor="#808080" backgroundcolor="#ffffff" usefillcolor="1" fillcolor="#ffff00" zoom="100" xmi.id="trxpM1WN9Tbb" documentation="" showscope="1" snapgrid="0" showatts="1" type="6"> |
64 | + <widgets> |
65 | + <activitywidget linecolor="none" usesdiagramfillcolor="1" linewidth="none" usesdiagramusefillcolor="1" x="324" showstereotype="1" y="0" font="Sans Serif,9,-1,0,50,0,0,0,0,0" width="28" isinstance="0" usefillcolor="1" fillcolor="none" activityname="" xmi.id="M3Ji4xqq6NjB" postcondition="" documentation="" activitytype="0" height="28" precondition=""/> |
66 | + <activitywidget linecolor="none" usesdiagramfillcolor="1" linewidth="none" usesdiagramusefillcolor="1" x="295" showstereotype="1" y="53" font="Sans Serif,9,-1,0,50,0,0,0,0,0" width="126" isinstance="0" usefillcolor="1" fillcolor="none" activityname="button_check_vat" xmi.id="yTyNvinmZkau" postcondition="" documentation="" activitytype="1" height="24" precondition=""/> |
67 | + <activitywidget linecolor="none" usesdiagramfillcolor="1" linewidth="none" usesdiagramusefillcolor="1" x="283" showstereotype="1" y="460" font="Sans Serif,9,-1,0,50,0,0,0,0,0" width="20" isinstance="0" usefillcolor="1" fillcolor="none" activityname="" xmi.id="m4HvVsUqtlYv" postcondition="" documentation="" activitytype="4" height="20" precondition=""/> |
68 | + <activitywidget linecolor="none" usesdiagramfillcolor="1" linewidth="none" usesdiagramusefillcolor="1" x="110" showstereotype="1" y="675" font="Sans Serif,9,-1,0,50,0,0,0,0,0" width="30" isinstance="0" usefillcolor="1" fillcolor="none" activityname="" xmi.id="gMlmjSwhwu2p" postcondition="" documentation="" activitytype="2" height="30" precondition=""/> |
69 | + <notewidget width="60" showstereotype="1" x="542" noteType="0" usesdiagramusefillcolor="1" y="501" usesdiagramfillcolor="1" isinstance="0" fillcolor="none" height="30" linecolor="none" xmi.id="cpaCXA4JCJCh" usefillcolor="1" linewidth="none" font="Sans Serif,9,-1,0,50,0,0,0,0,0" text=""/> |
70 | + <floatingtext linecolor="none" usesdiagramfillcolor="1" linewidth="none" usesdiagramusefillcolor="1" x="228" showstereotype="1" y="551" text="Failed vat validity" font="Sans Serif,9,-1,0,50,0,0,0,0,0" pretext="" role="700" width="113" isinstance="0" posttext="" usefillcolor="1" fillcolor="none" xmi.id="9eX2O5v4Rgp8" height="18"/> |
71 | + <activitywidget linecolor="none" usesdiagramfillcolor="1" linewidth="none" usesdiagramusefillcolor="1" x="70" showstereotype="1" y="573" font="Sans Serif,9,-1,0,50,0,0,0,0,0" width="120" isinstance="0" usefillcolor="1" fillcolor="none" activityname="Message Error!!!" xmi.id="8lp2frqHeORC" postcondition="" documentation="" activitytype="1" height="24" precondition=""/> |
72 | + <regionwidget width="339" showstereotype="1" x="42" usesdiagramusefillcolor="1" y="157" usesdiagramfillcolor="1" isinstance="0" fillcolor="none" height="362" linecolor="none" regionname="" xmi.id="BR7opZyL2R3p" usefillcolor="1" documentation="" linewidth="none" font="Sans Serif,9,-1,0,50,0,0,0,0,0"/> |
73 | + <floatingtext linecolor="none" usesdiagramfillcolor="1" linewidth="none" usesdiagramusefillcolor="1" x="156" showstereotype="1" y="131" text="check_vat" font="Sans Serif,9,-1,0,50,0,0,0,0,0" pretext="" role="700" width="68" isinstance="0" posttext="" usefillcolor="1" fillcolor="none" xmi.id="3RkKMgyKWfi3" height="18"/> |
74 | + <notewidget width="60" showstereotype="1" x="173" noteType="0" usesdiagramusefillcolor="1" y="161" usesdiagramfillcolor="1" isinstance="0" fillcolor="none" height="30" linecolor="none" xmi.id="9FeMZFEkhMWW" usefillcolor="1" linewidth="none" font="Sans Serif,9,-1,0,50,0,0,0,0,0" text=""/> |
75 | + <activitywidget linecolor="none" usesdiagramfillcolor="1" linewidth="none" usesdiagramusefillcolor="1" x="134" showstereotype="1" y="176" font="Sans Serif,9,-1,0,50,0,0,0,0,0" width="110" isinstance="0" usefillcolor="1" fillcolor="none" activityname="vat_check_vies" xmi.id="tUstutixKRHe" postcondition="" documentation="" activitytype="1" height="24" precondition=""/> |
76 | + <activitywidget linecolor="none" usesdiagramfillcolor="1" linewidth="none" usesdiagramusefillcolor="1" x="118" showstereotype="1" y="261" font="Sans Serif,9,-1,0,50,0,0,0,0,0" width="20" isinstance="0" usefillcolor="1" fillcolor="none" activityname="" xmi.id="7Gzdtfe1uGNT" postcondition="" documentation="" activitytype="4" height="20" precondition=""/> |
77 | + <activitywidget linecolor="none" usesdiagramfillcolor="1" linewidth="none" usesdiagramusefillcolor="1" x="252" showstereotype="1" y="270" font="Sans Serif,9,-1,0,50,0,0,0,0,0" width="110" isinstance="0" usefillcolor="1" fillcolor="none" activityname="vies_vat_check" xmi.id="WaCBughnBXe5" postcondition="" documentation="" activitytype="1" height="24" precondition=""/> |
78 | + <activitywidget linecolor="none" usesdiagramfillcolor="1" linewidth="none" usesdiagramusefillcolor="1" x="80" showstereotype="1" y="364" font="Sans Serif,9,-1,0,50,0,0,0,0,0" width="126" isinstance="0" usefillcolor="1" fillcolor="none" activityname="simple_vat_check" xmi.id="RL2jmKOtYLUP" postcondition="" documentation="" activitytype="1" height="24" precondition=""/> |
79 | + <activitywidget linecolor="none" usesdiagramfillcolor="1" linewidth="none" usesdiagramusefillcolor="1" x="91" showstereotype="1" y="460" font="Sans Serif,9,-1,0,50,0,0,0,0,0" width="101" isinstance="0" usefillcolor="1" fillcolor="none" activityname="check_vat_ve" xmi.id="09QvNmMtMW2G" postcondition="" documentation="" activitytype="1" height="24" precondition=""/> |
80 | + <floatingtext linecolor="none" usesdiagramfillcolor="1" linewidth="none" usesdiagramusefillcolor="1" x="156" showstereotype="1" y="258" text="rc.check_vies = True" font="Sans Serif,9,-1,0,50,0,0,0,0,0" pretext="" role="700" width="131" isinstance="0" posttext="" usefillcolor="1" fillcolor="none" xmi.id="Dk1MFdReyROk" height="18"/> |
81 | + <activitywidget linecolor="none" usesdiagramfillcolor="1" linewidth="none" usesdiagramusefillcolor="1" x="283" showstereotype="1" y="365" font="Sans Serif,9,-1,0,50,0,0,0,0,0" width="20" isinstance="0" usefillcolor="1" fillcolor="none" activityname="" xmi.id="lkbH56h3D7ya" postcondition="" documentation="" activitytype="4" height="20" precondition=""/> |
82 | + <floatingtext linecolor="none" usesdiagramfillcolor="1" linewidth="none" usesdiagramusefillcolor="1" x="237" showstereotype="1" y="355" text="failed" font="Sans Serif,9,-1,0,50,0,0,0,0,0" pretext="" role="700" width="41" isinstance="0" posttext="" usefillcolor="1" fillcolor="none" xmi.id="tJSDnUR0CSMS" height="18"/> |
83 | + <floatingtext linecolor="none" usesdiagramfillcolor="1" linewidth="none" usesdiagramusefillcolor="1" x="332" showstereotype="1" y="452" text="successed" font="Sans Serif,9,-1,0,50,0,0,0,0,0" pretext="" role="700" width="70" isinstance="0" posttext="" usefillcolor="1" fillcolor="none" xmi.id="4l42DQnyAMED" height="18"/> |
84 | + <floatingtext linecolor="none" usesdiagramfillcolor="1" linewidth="none" usesdiagramusefillcolor="1" x="57" showstereotype="1" y="304" text="rc.check_vies = False" font="Sans Serif,9,-1,0,50,0,0,0,0,0" pretext="" role="700" width="136" isinstance="0" posttext="" usefillcolor="1" fillcolor="none" xmi.id="6XIJxdj1On2b" height="18"/> |
85 | + <activitywidget linecolor="none" usesdiagramfillcolor="1" linewidth="none" usesdiagramusefillcolor="1" x="427" showstereotype="1" y="462" font="Sans Serif,9,-1,0,50,0,0,0,0,0" width="20" isinstance="0" usefillcolor="1" fillcolor="none" activityname="" xmi.id="EnYM9maafrBf" postcondition="" documentation="" activitytype="4" height="20" precondition=""/> |
86 | + <activitywidget linecolor="none" usesdiagramfillcolor="1" linewidth="none" usesdiagramusefillcolor="1" x="416" showstereotype="1" y="346" font="Sans Serif,9,-1,0,50,0,0,0,0,0" width="81" isinstance="0" usefillcolor="1" fillcolor="none" activityname="update_rif" xmi.id="2NXZzbr667N1" postcondition="" documentation="" activitytype="1" height="24" precondition=""/> |
87 | + <floatingtext linecolor="none" usesdiagramfillcolor="1" linewidth="none" usesdiagramusefillcolor="1" x="422" showstereotype="1" y="413" text="VE vat" font="Sans Serif,9,-1,0,50,0,0,0,0,0" pretext="" role="700" width="47" isinstance="0" posttext="" usefillcolor="1" fillcolor="none" xmi.id="k619r3i5qGSx" height="18"/> |
88 | + <floatingtext linecolor="none" usesdiagramfillcolor="1" linewidth="none" usesdiagramusefillcolor="1" x="513" showstereotype="1" y="451" text="NOn VE vat" font="Sans Serif,9,-1,0,50,0,0,0,0,0" pretext="" role="700" width="77" isinstance="0" posttext="" usefillcolor="1" fillcolor="none" xmi.id="00XfrjJt4oQ4" height="18"/> |
89 | + <activitywidget linecolor="none" usesdiagramfillcolor="1" linewidth="none" usesdiagramusefillcolor="1" x="647" showstereotype="1" y="640" font="Sans Serif,9,-1,0,50,0,0,0,0,0" width="15" isinstance="0" usefillcolor="1" fillcolor="none" activityname="" xmi.id="NF8TNVT7ZUEQ" postcondition="" documentation="" activitytype="2" height="15" precondition=""/> |
90 | + <activitywidget linecolor="none" usesdiagramfillcolor="1" linewidth="none" usesdiagramusefillcolor="1" x="642" showstereotype="1" y="465" font="Sans Serif,9,-1,0,50,0,0,0,0,0" width="20" isinstance="0" usefillcolor="1" fillcolor="none" activityname="" xmi.id="XxWLBwICwopl" postcondition="" documentation="" activitytype="4" height="20" precondition=""/> |
91 | + </widgets> |
92 | + <messages/> |
93 | + <associations> |
94 | + <assocwidget indexa="1" roleBdoc="" linecolor="none" usesdiagramfillcolor="0" widgetbid="yTyNvinmZkau" indexb="1" linewidth="none" usesdiagramusefillcolor="0" totalcounta="2" totalcountb="2" widgetaid="M3Ji4xqq6NjB" roleAdoc="" visibilityA="0" visibilityB="0" usefillcolor="2" fillcolor="#000000" changeabilityA="900" changeabilityB="900" documentation="" type="515"> |
95 | + <linepath> |
96 | + <startpoint startx="336" starty="28"/> |
97 | + <endpoint endx="336" endy="53"/> |
98 | + </linepath> |
99 | + </assocwidget> |
100 | + <assocwidget indexa="1" roleBdoc="" linecolor="none" usesdiagramfillcolor="0" widgetbid="8lp2frqHeORC" indexb="1" linewidth="none" usesdiagramusefillcolor="0" totalcounta="2" totalcountb="2" widgetaid="m4HvVsUqtlYv" roleAdoc="" visibilityA="0" visibilityB="0" usefillcolor="0" fillcolor="#000000" changeabilityA="900" changeabilityB="900" documentation="" type="515"> |
101 | + <linepath> |
102 | + <startpoint startx="295" starty="480"/> |
103 | + <endpoint endx="190" endy="575"/> |
104 | + <point x="295" y="575"/> |
105 | + </linepath> |
106 | + </assocwidget> |
107 | + <assocwidget indexa="1" roleBdoc="" linecolor="none" usesdiagramfillcolor="0" widgetbid="gMlmjSwhwu2p" indexb="1" linewidth="none" usesdiagramusefillcolor="0" totalcounta="2" totalcountb="2" widgetaid="8lp2frqHeORC" roleAdoc="" visibilityA="0" visibilityB="0" usefillcolor="0" fillcolor="#000000" changeabilityA="900" changeabilityB="900" documentation="" type="515"> |
108 | + <linepath> |
109 | + <startpoint startx="128" starty="597"/> |
110 | + <endpoint endx="128" endy="675"/> |
111 | + </linepath> |
112 | + </assocwidget> |
113 | + <assocwidget indexa="1" roleBdoc="" linecolor="none" usesdiagramfillcolor="0" widgetbid="BR7opZyL2R3p" indexb="1" linewidth="none" usesdiagramusefillcolor="0" totalcounta="2" totalcountb="2" widgetaid="yTyNvinmZkau" roleAdoc="" visibilityA="0" visibilityB="0" usefillcolor="99" fillcolor="#000000" changeabilityA="900" changeabilityB="900" documentation="" type="515"> |
114 | + <linepath> |
115 | + <startpoint startx="297" starty="77"/> |
116 | + <endpoint endx="297" endy="157"/> |
117 | + </linepath> |
118 | + </assocwidget> |
119 | + <assocwidget indexa="1" roleBdoc="" linecolor="none" usesdiagramfillcolor="0" widgetbid="7Gzdtfe1uGNT" indexb="1" linewidth="none" usesdiagramusefillcolor="0" totalcounta="2" totalcountb="2" widgetaid="tUstutixKRHe" roleAdoc="" visibilityA="0" visibilityB="0" usefillcolor="185" fillcolor="#000000" changeabilityA="900" changeabilityB="900" documentation="" type="515"> |
120 | + <linepath> |
121 | + <startpoint startx="138" starty="200"/> |
122 | + <endpoint endx="138" endy="261"/> |
123 | + </linepath> |
124 | + </assocwidget> |
125 | + <assocwidget indexa="1" roleBdoc="" linecolor="none" usesdiagramfillcolor="0" widgetbid="WaCBughnBXe5" indexb="1" linewidth="none" usesdiagramusefillcolor="0" totalcounta="2" totalcountb="2" widgetaid="7Gzdtfe1uGNT" roleAdoc="" visibilityA="0" visibilityB="0" usefillcolor="0" fillcolor="#000000" changeabilityA="900" changeabilityB="900" documentation="" type="515"> |
126 | + <linepath> |
127 | + <startpoint startx="138" starty="276"/> |
128 | + <endpoint endx="252" endy="276"/> |
129 | + </linepath> |
130 | + </assocwidget> |
131 | + <assocwidget indexa="1" roleBdoc="" linecolor="none" usesdiagramfillcolor="138" widgetbid="09QvNmMtMW2G" indexb="1" linewidth="none" usesdiagramusefillcolor="10" totalcounta="2" totalcountb="2" widgetaid="RL2jmKOtYLUP" roleAdoc="" visibilityA="0" visibilityB="0" usefillcolor="72" fillcolor="none" changeabilityA="900" changeabilityB="900" documentation="" type="515"> |
132 | + <linepath> |
133 | + <startpoint startx="132" starty="388"/> |
134 | + <endpoint endx="132" endy="460"/> |
135 | + </linepath> |
136 | + </assocwidget> |
137 | + <assocwidget indexa="1" roleBdoc="" linecolor="none" usesdiagramfillcolor="32" widgetbid="lkbH56h3D7ya" indexb="1" linewidth="none" usesdiagramusefillcolor="0" totalcounta="2" totalcountb="2" widgetaid="WaCBughnBXe5" roleAdoc="" visibilityA="0" visibilityB="0" usefillcolor="10" fillcolor="none" changeabilityA="900" changeabilityB="900" documentation="" type="515"> |
138 | + <linepath> |
139 | + <startpoint startx="292" starty="294"/> |
140 | + <endpoint endx="292" endy="365"/> |
141 | + </linepath> |
142 | + </assocwidget> |
143 | + <assocwidget indexa="1" roleBdoc="" linecolor="none" usesdiagramfillcolor="0" widgetbid="RL2jmKOtYLUP" indexb="1" linewidth="none" usesdiagramusefillcolor="0" totalcounta="2" totalcountb="2" widgetaid="lkbH56h3D7ya" roleAdoc="" visibilityA="0" visibilityB="0" usefillcolor="0" fillcolor="#000000" changeabilityA="900" changeabilityB="900" documentation="" type="515"> |
144 | + <linepath> |
145 | + <startpoint startx="283" starty="375"/> |
146 | + <endpoint endx="206" endy="375"/> |
147 | + </linepath> |
148 | + </assocwidget> |
149 | + <assocwidget indexa="1" roleBdoc="" linecolor="none" usesdiagramfillcolor="0" widgetbid="m4HvVsUqtlYv" indexb="1" linewidth="none" usesdiagramusefillcolor="0" totalcounta="2" totalcountb="2" widgetaid="lkbH56h3D7ya" roleAdoc="" visibilityA="0" visibilityB="0" usefillcolor="51" fillcolor="#000000" changeabilityA="900" changeabilityB="900" documentation="" type="515"> |
150 | + <linepath> |
151 | + <startpoint startx="292" starty="385"/> |
152 | + <endpoint endx="292" endy="460"/> |
153 | + </linepath> |
154 | + </assocwidget> |
155 | + <assocwidget indexa="1" roleBdoc="" linecolor="none" usesdiagramfillcolor="0" widgetbid="m4HvVsUqtlYv" indexb="1" linewidth="none" usesdiagramusefillcolor="0" totalcounta="2" totalcountb="2" widgetaid="09QvNmMtMW2G" roleAdoc="" visibilityA="0" visibilityB="0" usefillcolor="137" fillcolor="#000000" changeabilityA="900" changeabilityB="900" documentation="" type="515"> |
156 | + <linepath> |
157 | + <startpoint startx="192" starty="470"/> |
158 | + <endpoint endx="283" endy="470"/> |
159 | + </linepath> |
160 | + </assocwidget> |
161 | + <assocwidget indexa="1" roleBdoc="" linecolor="none" usesdiagramfillcolor="0" widgetbid="RL2jmKOtYLUP" indexb="1" linewidth="none" usesdiagramusefillcolor="0" totalcounta="2" totalcountb="2" widgetaid="7Gzdtfe1uGNT" roleAdoc="" visibilityA="0" visibilityB="0" usefillcolor="141" fillcolor="#000000" changeabilityA="900" changeabilityB="900" documentation="" type="515"> |
162 | + <linepath> |
163 | + <startpoint startx="118" starty="281"/> |
164 | + <endpoint endx="118" endy="364"/> |
165 | + </linepath> |
166 | + </assocwidget> |
167 | + <assocwidget indexa="1" roleBdoc="" linecolor="none" usesdiagramfillcolor="0" widgetbid="EnYM9maafrBf" indexb="1" linewidth="none" usesdiagramusefillcolor="0" totalcounta="2" totalcountb="2" widgetaid="m4HvVsUqtlYv" roleAdoc="" visibilityA="0" visibilityB="0" usefillcolor="21" fillcolor="#000000" changeabilityA="900" changeabilityB="900" documentation="" type="515"> |
168 | + <linepath> |
169 | + <startpoint startx="303" starty="471"/> |
170 | + <endpoint endx="427" endy="471"/> |
171 | + </linepath> |
172 | + </assocwidget> |
173 | + <assocwidget indexa="1" roleBdoc="" linecolor="none" usesdiagramfillcolor="161" widgetbid="2NXZzbr667N1" indexb="1" linewidth="none" usesdiagramusefillcolor="10" totalcounta="2" totalcountb="2" widgetaid="EnYM9maafrBf" roleAdoc="" visibilityA="0" visibilityB="0" usefillcolor="168" fillcolor="none" changeabilityA="900" changeabilityB="900" documentation="" type="515"> |
174 | + <linepath> |
175 | + <startpoint startx="437" starty="462"/> |
176 | + <endpoint endx="437" endy="370"/> |
177 | + </linepath> |
178 | + </assocwidget> |
179 | + <assocwidget indexa="1" roleBdoc="" linecolor="none" usesdiagramfillcolor="0" widgetbid="XxWLBwICwopl" indexb="1" linewidth="none" usesdiagramusefillcolor="0" totalcounta="2" totalcountb="2" widgetaid="2NXZzbr667N1" roleAdoc="" visibilityA="0" visibilityB="0" usefillcolor="198" fillcolor="#000000" changeabilityA="900" changeabilityB="900" documentation="" type="515"> |
180 | + <linepath> |
181 | + <startpoint startx="497" starty="364"/> |
182 | + <endpoint endx="652" endy="465"/> |
183 | + <point x="653" y="364"/> |
184 | + <point x="652" y="435"/> |
185 | + </linepath> |
186 | + </assocwidget> |
187 | + <assocwidget indexa="1" roleBdoc="" linecolor="none" usesdiagramfillcolor="82" widgetbid="NF8TNVT7ZUEQ" indexb="1" linewidth="none" usesdiagramusefillcolor="8" totalcounta="2" totalcountb="2" widgetaid="XxWLBwICwopl" roleAdoc="" visibilityA="0" visibilityB="0" usefillcolor="16" fillcolor="none" changeabilityA="900" changeabilityB="900" documentation="" type="515"> |
188 | + <linepath> |
189 | + <startpoint startx="653" starty="485"/> |
190 | + <endpoint endx="653" endy="640"/> |
191 | + </linepath> |
192 | + </assocwidget> |
193 | + <assocwidget indexa="1" roleBdoc="" linecolor="none" usesdiagramfillcolor="0" widgetbid="XxWLBwICwopl" indexb="1" linewidth="none" usesdiagramusefillcolor="0" totalcounta="2" totalcountb="2" widgetaid="EnYM9maafrBf" roleAdoc="" visibilityA="0" visibilityB="0" usefillcolor="198" fillcolor="#000000" changeabilityA="900" changeabilityB="900" documentation="" type="515"> |
194 | + <linepath> |
195 | + <startpoint startx="447" starty="476"/> |
196 | + <endpoint endx="642" endy="476"/> |
197 | + </linepath> |
198 | + </assocwidget> |
199 | + </associations> |
200 | + </diagram> |
201 | + </diagrams> |
202 | + </XMI.extension> |
203 | + </UML:Model> |
204 | + <UML:Model stereotype="folder" visibility="public" isSpecification="false" namespace="m1" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="Use Case View" name="Use Case View"> |
205 | + <UML:Namespace.ownedElement/> |
206 | + </UML:Model> |
207 | + <UML:Model stereotype="folder" visibility="public" isSpecification="false" namespace="m1" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="Component View" name="Component View"> |
208 | + <UML:Namespace.ownedElement/> |
209 | + </UML:Model> |
210 | + <UML:Model stereotype="folder" visibility="public" isSpecification="false" namespace="m1" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="Deployment View" name="Deployment View"> |
211 | + <UML:Namespace.ownedElement/> |
212 | + </UML:Model> |
213 | + <UML:Model stereotype="folder" visibility="public" isSpecification="false" namespace="m1" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="Entity Relationship Model" name="Entity Relationship Model"> |
214 | + <UML:Namespace.ownedElement/> |
215 | + </UML:Model> |
216 | + </UML:Namespace.ownedElement> |
217 | + </UML:Model> |
218 | + </XMI.content> |
219 | + <XMI.extensions xmi.extender="umbrello"> |
220 | + <docsettings viewid="trxpM1WN9Tbb" uniqueid="XxWLBwICwopl" documentation=""/> |
221 | + <listview> |
222 | + <listitem open="1" type="800" id="Views"> |
223 | + <listitem open="1" type="821" id="Component View"/> |
224 | + <listitem open="1" type="827" id="Deployment View"/> |
225 | + <listitem open="1" type="836" id="Entity Relationship Model"/> |
226 | + <listitem open="1" type="801" id="Logical View"> |
227 | + <listitem open="0" type="809" id="trxpM1WN9Tbb" label="activity diagram"/> |
228 | + <listitem open="0" type="807" id="oBZv5bkoPSkS" label="base_vat"/> |
229 | + <listitem open="0" type="807" id="DnSQSq2Hcg6b" label="class diagram"/> |
230 | + <listitem open="0" type="830" id="Datatypes"> |
231 | + <listitem open="1" type="829" id="LoKxVQWk5Mjs"/> |
232 | + <listitem open="1" type="829" id="se8bAs3OdVm5"/> |
233 | + <listitem open="1" type="829" id="CSVpvHsE4AAX"/> |
234 | + <listitem open="1" type="829" id="QgnlyMEo0MP9"/> |
235 | + <listitem open="1" type="829" id="Hhr1p6xuKJbV"/> |
236 | + <listitem open="1" type="829" id="eOPdjomtFFhA"/> |
237 | + <listitem open="1" type="829" id="bgHg00XReKAc"/> |
238 | + <listitem open="1" type="829" id="27xGSvSiN3f8"/> |
239 | + <listitem open="1" type="829" id="UZPYkZ3JDKxE"/> |
240 | + <listitem open="1" type="829" id="joky3R6XyV4g"/> |
241 | + <listitem open="1" type="829" id="IUdxmlXR9w4q"/> |
242 | + </listitem> |
243 | + </listitem> |
244 | + <listitem open="1" type="802" id="Use Case View"/> |
245 | + </listitem> |
246 | + </listview> |
247 | + <codegeneration> |
248 | + <codegenerator language="C++"/> |
249 | + </codegeneration> |
250 | + </XMI.extensions> |
251 | +</XMI> |
252 | |
253 | === modified file 'l10n_ve_fiscal_requirements/model/__init__.py' |
254 | --- l10n_ve_fiscal_requirements/model/__init__.py 2012-11-29 19:13:14 +0000 |
255 | +++ l10n_ve_fiscal_requirements/model/__init__.py 2012-12-10 03:34:20 +0000 |
256 | @@ -22,6 +22,7 @@ |
257 | # You should have received a copy of the GNU Affero General Public License |
258 | # along with this program. If not, see <http://www.gnu.org/licenses/>. |
259 | ################################################################################ |
260 | +import account |
261 | import invoice |
262 | import partner |
263 | import res_company |
264 | |
265 | === added file 'l10n_ve_fiscal_requirements/model/account.py' |
266 | --- l10n_ve_fiscal_requirements/model/account.py 1970-01-01 00:00:00 +0000 |
267 | +++ l10n_ve_fiscal_requirements/model/account.py 2012-12-10 03:34:20 +0000 |
268 | @@ -0,0 +1,49 @@ |
269 | +#!/usr/bin/python |
270 | +# -*- encoding: utf-8 -*- |
271 | +########################################################################### |
272 | +# Module Writen to OpenERP, Open Source Management Solution |
273 | +# Copyright (C) OpenERP Venezuela (<http://openerp.com.ve>). |
274 | +# All Rights Reserved |
275 | +###############Credits###################################################### |
276 | +# Coded by: Vauxoo C.A. |
277 | +# Planified by: Nhomar Hernandez |
278 | +# Audited by: Vauxoo C.A. |
279 | +############################################################################# |
280 | +# This program is free software: you can redistribute it and/or modify |
281 | +# it under the terms of the GNU Affero General Public License as published by |
282 | +# the Free Software Foundation, either version 3 of the License, or |
283 | +# (at your option) any later version. |
284 | +# |
285 | +# This program is distributed in the hope that it will be useful, |
286 | +# but WITHOUT ANY WARRANTY; without even the implied warranty of |
287 | +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
288 | +# GNU Affero General Public License for more details. |
289 | +# |
290 | +# You should have received a copy of the GNU Affero General Public License |
291 | +# along with this program. If not, see <http://www.gnu.org/licenses/>. |
292 | +################################################################################ |
293 | + |
294 | +from osv import fields, osv |
295 | +__TYPES__ = [('sale_debit', 'Sale Debit'),('purchase_debit', 'Purchase Debit')] |
296 | + |
297 | +__HELP__= " Select 'Sale Debit' for customer debit note journals. Select 'Purchase Debit' for supplier debit note journals." |
298 | + |
299 | +class account_journal(osv.osv): |
300 | + _inherit = 'account.journal' |
301 | + |
302 | + _columns = { |
303 | +'type': fields.selection([('sale', 'Sale'),('sale_refund','Sale Refund'), |
304 | + ('purchase', 'Purchase'), ('purchase_refund','Purchase Refund'), |
305 | + ('cash', 'Cash'), ('bank', 'Bank and Cheques'), ('general', 'General'), |
306 | + ('situation', 'Opening/Closing Situation'),('sale_debit', 'Sale Debit'), |
307 | + ('purchase_debit', 'Purchase Debit')], 'Type', size=32, required=True, |
308 | + help = "Select 'Sale' for customer invoices journals."\ |
309 | + " Select 'Purchase' for supplier invoices journals."\ |
310 | + " Select 'Cash' or 'Bank' for journals that are used in customer or supplier payments."\ |
311 | + " Select 'General' for miscellaneous operations journals."\ |
312 | + " Select 'Opening/Closing Situation' for entries generated for new fiscal years."\ |
313 | + " Select 'Sale Debit' for customer debit note journals."\ |
314 | + " Select 'Purchase Debit' for supplier debit note journals.") |
315 | + } |
316 | + |
317 | +account_journal() |
318 | |
319 | === modified file 'l10n_ve_fiscal_requirements/model/invoice.py' |
320 | --- l10n_ve_fiscal_requirements/model/invoice.py 2012-11-29 19:13:14 +0000 |
321 | +++ l10n_ve_fiscal_requirements/model/invoice.py 2012-12-10 03:34:20 +0000 |
322 | @@ -27,6 +27,22 @@ |
323 | from tools.translate import _ |
324 | class account_invoice(osv.osv): |
325 | |
326 | + def _get_journal(self, cr, uid, context=None): |
327 | + if context is None: |
328 | + context = {} |
329 | + journal_type_inv = context.get('journal_type', 'sale') |
330 | + if journal_type_inv in ('sale_debit', 'purchase_debit'): |
331 | + user = self.pool.get('res.users').browse(cr, uid, uid, context=context) |
332 | + company_id = context.get('company_id', user.company_id.id) |
333 | + journal_obj = self.pool.get('account.journal') |
334 | + res = journal_obj.search(cr, uid, [('type', '=',journal_type_inv), |
335 | + ('company_id', '=', company_id)], |
336 | + limit=1) |
337 | + return res and res[0] or False |
338 | + else: |
339 | + return super(account_invoice, self)._get_journal(cr, uid, context=context) |
340 | + |
341 | + |
342 | |
343 | def _unique_invoice_per_partner(self, cr, uid, ids, context=None): |
344 | if context is None: context={} |
345 | |
346 | === modified file 'l10n_ve_fiscal_requirements/model/l10n_ut.py' |
347 | --- l10n_ve_fiscal_requirements/model/l10n_ut.py 2012-11-29 19:13:14 +0000 |
348 | +++ l10n_ve_fiscal_requirements/model/l10n_ut.py 2012-12-10 03:34:20 +0000 |
349 | @@ -56,7 +56,8 @@ |
350 | rate=cr.fetchall()[0][0] |
351 | return rate |
352 | |
353 | - def compute(self, cr, uid, from_amount, date=False, context={}): |
354 | + def compute(self, cr, uid, from_amount, date=False, context=None): |
355 | + if context is None: context ={} |
356 | result = 0.0 |
357 | ut = self.get_amount_ut(cr, uid, date=False) |
358 | if ut: |
359 | @@ -64,7 +65,8 @@ |
360 | |
361 | return result |
362 | |
363 | - def compute_ut_to_money(self, cr, uid, amount_ut, date=False, context={}): |
364 | + def compute_ut_to_money(self, cr, uid, amount_ut, date=False, context=None): |
365 | + if context is None: context ={} |
366 | money = 0.0 |
367 | ut = self.get_amount_ut(cr, uid, date) |
368 | if ut: |
369 | |
370 | === modified file 'l10n_ve_fiscal_requirements/model/partner.py' |
371 | --- l10n_ve_fiscal_requirements/model/partner.py 2012-11-29 19:13:14 +0000 |
372 | +++ l10n_ve_fiscal_requirements/model/partner.py 2012-12-10 03:34:20 +0000 |
373 | @@ -14,6 +14,8 @@ |
374 | # Miguel Delgado <miguel@openerp.com.ve> |
375 | # Israel FermÃn Montilla <israel@openerp.com.ve> |
376 | # Juan Márquez <jmarquez@tecvemar.com.ve> |
377 | +# Humberto Arocha <hbto@vauxoo.com> |
378 | +# Yanina Aular <yanina.aular@vauxoo.com> |
379 | # |
380 | # This program is free software: you can redistribute it and/or modify |
381 | # it under the terms of the GNU Affero General Public License as |
382 | @@ -30,17 +32,36 @@ |
383 | # |
384 | ############################################################################## |
385 | |
386 | +from openerp.osv.orm import except_orm |
387 | from osv import fields, osv |
388 | from tools.translate import _ |
389 | import re |
390 | |
391 | class res_partner(osv.osv): |
392 | _inherit = 'res.partner' |
393 | - |
394 | + |
395 | + def _get_country_code(self, cr, uid, context=None): |
396 | + context = context or {} |
397 | + user_company = self.pool.get('res.users').browse(cr, uid, uid, context=context).company_id |
398 | + return user_company.partner_id and user_company.partner_id.country_id \ |
399 | + and user_company.partner_id.country_id.code or 'XX' |
400 | + |
401 | + def default_get(self, cr, uid, fields, context=None): |
402 | + context = context or {} |
403 | + res = super(res_partner, self).default_get(cr, uid, fields, context=context) |
404 | + res.update({'uid_country': self._get_country_code(cr,uid,context=context)}) |
405 | + return res |
406 | + |
407 | + def _get_uid_country(self, cr, uid, ids, field_name, args, context=None): |
408 | + context = context or {} |
409 | + res= {}.fromkeys(ids,self._get_country_code(cr,uid,context=context)) |
410 | + return res |
411 | + |
412 | _columns = { |
413 | 'seniat_updated': fields.boolean('Seniat Updated', help="This field indicates if partner was updated using SENIAT button"), |
414 | + 'uid_country': fields.function(_get_uid_country, type='char', string="uid_country", size=20), |
415 | } |
416 | - |
417 | + |
418 | _default = { |
419 | 'seniat_updated': False, |
420 | } |
421 | @@ -60,7 +81,7 @@ |
422 | ''' |
423 | def _check_partner_invoice_addr(self,cr,uid,ids,context={}): |
424 | partner_obj = self.browse(cr,uid,ids[0]) |
425 | - if partner_obj.vat and partner_obj.vat[:2].upper() == 'VE': |
426 | + if partner_obj.vat and partner_obj.vat[:2].upper() == 'VE' and not partner_obj.parent_id: |
427 | res = partner_obj.type == 'invoice' |
428 | if res: |
429 | return True |
430 | @@ -70,26 +91,132 @@ |
431 | return True |
432 | return True |
433 | |
434 | - def _check_vat_uniqueness(self, cr, uid, ids, context={}): |
435 | - #Check if its possible to use 'browse' in this 'read' |
436 | + def _check_vat_uniqueness_def(self, cr, uid, ids, current_vat,list_node_tree, context=None): |
437 | + if context is None: context = {} |
438 | + nodes = self.search(cr, uid, [] ) |
439 | + nodes = list( set(nodes) - set(list_node_tree) ) |
440 | + nodes = self.search(cr, uid, [('vat','=',current_vat),('id','in',nodes)] ) |
441 | + return not nodes |
442 | + |
443 | + def _check_vat_uniqueness(self, cr, uid, ids, context=None): |
444 | + if context is None: context = {} |
445 | + |
446 | + user_company = self.pool.get('res.users').browse(cr, uid, uid).company_id |
447 | + |
448 | + #User must be of VE |
449 | + if not (user_company.partner_id and user_company.partner_id.country_id and user_company.partner_id.country_id.code == 'VE'): |
450 | + return True |
451 | + |
452 | partner_brw = self.browse(cr, uid,ids) |
453 | - if not 'VE' in [a.country_id.code for a in partner_brw ]: |
454 | - return True |
455 | - |
456 | current_vat = partner_brw[0].vat |
457 | - |
458 | - if not current_vat or current_vat.strip()=='': |
459 | + current_parent_id = partner_brw[0].parent_id |
460 | + |
461 | + if not current_vat: |
462 | return True # Accept empty VAT's |
463 | - |
464 | - duplicates = self.read(cr, uid, self.search(cr, uid, [('vat', '=', current_vat)]), ['vat']) |
465 | - |
466 | - return not current_vat in [p['vat'] for p in duplicates if p['id'] != partner_brw[0].id] |
467 | + |
468 | + #Partners without parent, must have RIF uniqueness |
469 | + if not current_parent_id: |
470 | + duplicates = self.browse(cr, uid, self.search(cr, uid, [('vat', '=', current_vat),('parent_id','=',None),('id','!=',partner_brw[0].id)])) |
471 | + return not duplicates |
472 | + |
473 | + currrent_is_company =partner_brw[0].is_company |
474 | + |
475 | + #Partners that are not company and have parent_id, can't have partners' RIF that are not part of its siblings or parent |
476 | + if(current_parent_id and not currrent_is_company): |
477 | + list_nodes = current_parent_id.child_ids |
478 | + list_nodes = map(lambda x: x.id, list_nodes) |
479 | + list_nodes.append(current_parent_id.id) |
480 | + return self._check_vat_uniqueness_def(cr, uid, ids, current_vat, list_nodes , context=context) |
481 | + |
482 | + return True |
483 | + |
484 | + def _check_vat_mandatory(self, cr, uid, ids, context=None): |
485 | + '''This method will check the vat mandatoriness in partners |
486 | + for those user logged on with a Venezuelan Company |
487 | + |
488 | + The method will return True when: |
489 | + *) The user's company is not from Venezuela |
490 | + *) The partner being created is the one for the a company being created [TODO] |
491 | + |
492 | + The method will return False when: |
493 | + *) The user's company is from Venezuela AND the vat field is empty AND: |
494 | + +) partner is_company=True AND parent_id is not NULL |
495 | + +) partner with parent_id is NULL |
496 | + +) partner with parent_id is NOT NULL AND type of address is invoice |
497 | + ''' |
498 | + if context is None: context = {} |
499 | + # Avoiding Egg-Chicken Syndrome |
500 | + # TODO: Refine this approach this is big exception |
501 | + # One that can be handle be end user, I hope so!!! |
502 | + if context.get('create_company',False): |
503 | + return True |
504 | + |
505 | + user_company = self.pool.get('res.users').browse(cr, uid, uid).company_id |
506 | + #Check if the user is not from a VE Company |
507 | + if not (user_company.partner_id and user_company.partner_id.country_id and user_company.partner_id.country_id.code == 'VE'): |
508 | + return True |
509 | + |
510 | + partner_brw = self.browse(cr, uid,ids) |
511 | + current_vat = partner_brw[0].vat |
512 | + current_parent_id = partner_brw[0].parent_id |
513 | + current_is_company =partner_brw[0].is_company |
514 | + current_type = partner_brw[0].type |
515 | + |
516 | + #Partners company type and with parent, not exists |
517 | + if (current_is_company and current_parent_id): |
518 | + return False |
519 | + |
520 | + #Partners without parent must have vat |
521 | + if not current_vat and not current_parent_id: |
522 | + return False |
523 | + |
524 | + #Partners invoice type that not be company and have parent, must have vat |
525 | + if (current_type == 'invoice' and not current_vat and not current_is_company and current_parent_id): |
526 | + return False |
527 | + |
528 | + return True |
529 | + |
530 | + def _validate(self, cr, uid, ids, context=None): |
531 | + #In the original orm.py openerp does not allow using |
532 | + #context within the constraint because we have to yield |
533 | + # the same result always, |
534 | + # we have overridden this behaviour |
535 | + # TO ALLOW PASSING CONTEXT TO THE RESTRICTION IN RES.PARTNER |
536 | + context = context or {} |
537 | + lng = context.get('lang') |
538 | + trans = self.pool.get('ir.translation') |
539 | + error_msgs = [] |
540 | + for constraint in self._constraints: |
541 | + fun, msg, fields = constraint |
542 | + # We don't pass around the context here: validation code |
543 | + # must always yield the same results. |
544 | + if not fun(self, cr, uid, ids, context=context): |
545 | + # Check presence of __call__ directly instead of using |
546 | + # callable() because it will be deprecated as of Python 3.0 |
547 | + if hasattr(msg, '__call__'): |
548 | + tmp_msg = msg(self, cr, uid, ids, context=context) |
549 | + if isinstance(tmp_msg, tuple): |
550 | + tmp_msg, params = tmp_msg |
551 | + translated_msg = tmp_msg % params |
552 | + else: |
553 | + translated_msg = tmp_msg |
554 | + else: |
555 | + translated_msg = trans._get_source(cr, uid, self._name, 'constraint', lng, msg) |
556 | + error_msgs.append( |
557 | + _("Error occurred while validating the field(s) %s: %s") % (','.join(fields), translated_msg) |
558 | + ) |
559 | + self._invalids.update(fields) |
560 | + if error_msgs: |
561 | + raise except_orm('ValidateError', '\n'.join(error_msgs)) |
562 | + else: |
563 | + self._invalids.clear() |
564 | |
565 | _constraints = [ |
566 | + (_check_vat_mandatory, _("Error ! VAT is mandatory"), []), |
567 | (_check_vat_uniqueness, _("Error ! Partner's VAT must be a unique value or empty"), []), |
568 | - (_check_partner_invoice_addr, _('Error ! The partner does not have an invoice address.'), []), |
569 | + #~ (_check_partner_invoice_addr, _('Error ! The partner does not have an invoice address.'), []), |
570 | ] |
571 | - |
572 | + |
573 | def vat_change_fiscal_requirements(self, cr, uid, ids, value, context=None): |
574 | if context is None: |
575 | context={} |
576 | @@ -117,10 +244,8 @@ |
577 | if context is None: |
578 | context={} |
579 | if re.search(r'^[VJEG][0-9]{9}$', vat): |
580 | - context.update({'ci_pas':False}) |
581 | return True |
582 | - if re.search(r'^([0-9]{1,8}|[D][0-9]{9})$', vat): |
583 | - context.update({'ci_pas':True}) |
584 | + if re.search(r'^([VE][0-9]{1,8}|[D][0-9]{9})$', vat): |
585 | return True |
586 | return False |
587 | |
588 | @@ -130,5 +255,14 @@ |
589 | su_obj = self.pool.get('seniat.url') |
590 | return su_obj.update_rif(cr, uid, ids, context=context) |
591 | |
592 | + def button_check_vat(self, cr, uid, ids, context=None): |
593 | + if context is None: context = {} |
594 | + context.update({'update_fiscal_information':True}) |
595 | + super(res_partner, self).button_check_vat(cr, uid, ids, context=context) |
596 | + user_company = self.pool.get('res.users').browse(cr, uid, uid).company_id |
597 | + if user_company.vat_check_vies: |
598 | + # force full VIES online check |
599 | + self.update_rif(cr, uid, ids, context=context) |
600 | + return True |
601 | res_partner() |
602 | # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: |
603 | |
604 | === modified file 'l10n_ve_fiscal_requirements/model/res_company.py' |
605 | --- l10n_ve_fiscal_requirements/model/res_company.py 2012-11-29 19:13:14 +0000 |
606 | +++ l10n_ve_fiscal_requirements/model/res_company.py 2012-12-10 03:34:20 +0000 |
607 | @@ -37,5 +37,18 @@ |
608 | 'jour_id': fields.many2one('account.journal', 'Journal',required=False,help="Default journal for damaged invoices"), |
609 | 'acc_id': fields.many2one('account.account', 'Account',required=False,help="Default account used for invoices and lines from damaged invoices"), |
610 | } |
611 | + |
612 | + def create(self, cr, uid, vals, context=None): |
613 | + if context is None: context = {} |
614 | + context.update({'create_company':True}) |
615 | + return super(res_company, self).create(cr, uid, vals, context=context) |
616 | + |
617 | + def write(self, cr, uid, ids, values, context=None): |
618 | + context = context or {} |
619 | + self.cache_restart(cr) |
620 | + context.update({'create_company':True}) |
621 | + return super(res_company, self).write(cr, uid, ids, values, context=context) |
622 | + |
623 | + |
624 | res_company() |
625 | |
626 | |
627 | === modified file 'l10n_ve_fiscal_requirements/model/seniat_url.py' |
628 | --- l10n_ve_fiscal_requirements/model/seniat_url.py 2012-11-29 19:13:14 +0000 |
629 | +++ l10n_ve_fiscal_requirements/model/seniat_url.py 2012-12-10 03:34:20 +0000 |
630 | @@ -63,7 +63,9 @@ |
631 | retries -= 1 |
632 | return str_error |
633 | |
634 | - def _buscar_porcentaje(self,rif,url): |
635 | + def _buscar_porcentaje(self, cr, uid, rif): |
636 | + url_obj = self.browse(cr, uid, self.search(cr, uid, []))[0] |
637 | + url = url_obj.url_seniat + '%s' |
638 | context={} |
639 | html_data = self.pool.get('seniat.url')._load_url(3,url %rif) |
640 | html_data = unicode(html_data, 'ISO-8859-1').encode('utf-8') |
641 | @@ -84,11 +86,7 @@ |
642 | self.logger.info("RIF: %s Found" % rif) |
643 | if name.count('(') > 0: |
644 | name = name[:name.index('(')].rstrip() |
645 | - if context.get('spf_info'): |
646 | - res= {'name': name,'vat_subjected': vat_subjected,'vat':'VE'+rif_aux,'wh_iva_agent':wh_agent} |
647 | - else: |
648 | - res= {'name': name,'vat_subjected': vat_subjected,'vat':'VE'+rif_aux} |
649 | - return res |
650 | + return {'name': name,'vat_subjected': vat_subjected,'vat':'VE'+rif_aux,'wh_iva_agent':wh_agent} |
651 | |
652 | def _print_error(self, error, msg): |
653 | raise osv.except_osv(error,msg) |
654 | @@ -110,25 +108,41 @@ |
655 | return True |
656 | else: |
657 | return False |
658 | + def _get_rif(self, vat, url1, url2, context=None): |
659 | + if context is None: context={} |
660 | |
661 | - def _dom_giver(self, url1, url2, url3, vat, context): |
662 | - if context.get('ci_pas'): |
663 | - xml_data = self._load_url(3,url3 % vat) |
664 | - match = re.search(r'No existe el contribuyente solicitado', xml_data) |
665 | - vat = '0'*(8-len(vat))+vat |
666 | - match2 = re.search(r'[VJEG]'+vat+'[0-9]{1}', xml_data) |
667 | - if match: |
668 | - return False |
669 | - elif match2: |
670 | - vat = match2.group(0) |
671 | xml_data = self._load_url(3,url1 % vat) |
672 | - |
673 | - if not self._eval_seniat_data(xml_data,vat,context): |
674 | + if not self._eval_seniat_data(xml_data,vat,context=context): |
675 | dom = parseString(xml_data) |
676 | return self._parse_dom(dom, vat, url2,context=context) |
677 | - else: |
678 | + |
679 | + def _dom_giver(self, cr, uid, vat, context=None): |
680 | + if context is None: context={} |
681 | + |
682 | + url_obj = self.browse(cr, uid, self.search(cr, uid, []))[0] |
683 | + url1 = url_obj.name + '%s' |
684 | + url2 = url_obj.url_seniat + '%s' |
685 | + url3 = url_obj.url_seniat2 + '%s' |
686 | + if re.search(r'^[VJEG][0-9]{9}$', vat): |
687 | + '''Checked vat is a RIF''' |
688 | + return self._get_rif(vat, url1, url2, context=context) |
689 | + |
690 | + elif re.search(r'^([D][0-9]{9})$', vat): |
691 | + '''Checked vat is a Passport''' |
692 | + #TODO: NEEDS VALID NUMBERS TO CHECK THE VALIDITY AND COMPLETE THIS CODE |
693 | return False |
694 | |
695 | + elif re.search(r'^([VE][0-9]{1,8})$', vat): |
696 | + '''Checked vat is an ID''' |
697 | + xml_data = self._load_url(3,url3 % str(int(vat[1:]))) |
698 | + vat = vat[1:].rjust(8,'0') |
699 | + match2 = re.search(r'[VE]'+vat+'[0-9]{1}', xml_data) |
700 | + if re.search(r'No existe el contribuyente solicitado', xml_data): |
701 | + return False |
702 | + elif match2: |
703 | + vat = match2.group(0) |
704 | + return self._get_rif(vat, url1, url2, context=context) |
705 | + |
706 | def _update_partner(self, cr, uid, id, context=None): |
707 | rp_obj = self.pool.get('res.partner') |
708 | rp_obj.write(cr, uid, id, {'seniat_updated': True}) |
709 | @@ -136,47 +150,25 @@ |
710 | def update_rif(self, cr, uid, ids, context={}): |
711 | aux=[] |
712 | rp_obj = self.pool.get('res.partner') |
713 | - url_obj = self.browse(cr, uid, self.search(cr, uid, []))[0] |
714 | - url1 = url_obj.name + '%s' |
715 | - url2 = url_obj.url_seniat + '%s' |
716 | - url3 = url_obj.url_seniat2 + '%s' |
717 | if context.get('exec_wizard'): |
718 | - res = self._dom_giver(url1, url2, url3, context['vat'],context) |
719 | + res = self._dom_giver(cr, uid, context['vat'],context=context) |
720 | if res: |
721 | - self._update_partner(cr, uid, ids, context) |
722 | + self._update_partner(cr, uid, ids, context=context) |
723 | return res |
724 | else: |
725 | return False |
726 | for partner in rp_obj.browse(cr,uid,ids): |
727 | + if not partner.vat or partner.vat[:2]!='VE': |
728 | + continue |
729 | rp_obj.write(cr, uid, partner.id, {'seniat_updated': False}) |
730 | - if partner.vat and partner.type == 'invoice': |
731 | - partner_id =partner.id |
732 | - code = partner.country_id and partner.country_id.code |
733 | - if code == 'VE': |
734 | - if rp_obj.check_vat_ve(partner.vat[2:],context): |
735 | - res = self._dom_giver(url1, url2, url3,partner.vat[2:],context) |
736 | - if res: |
737 | - rp_obj.write(cr,uid,partner.id,res) |
738 | - self._update_partner(cr, uid, partner.id, context) |
739 | - else: |
740 | - if not context.get('all_rif'): |
741 | - return False |
742 | - #~ self._print_error(_('Error'),_("Does not exist the contributor requested")) |
743 | - else: |
744 | - if not context.get('all_rif'): |
745 | - return False |
746 | - #~ self._print_error(_('Error'),_("The RIF, CI or passport are not well constructed, please check \n The format of the RIF should be for example J1234567890,CI should be 12345678, and passports must be D123456789")) |
747 | - else: |
748 | - if not context.get('all_rif'): |
749 | - return False |
750 | - #~ self._print_error(_('Error'),_("The country in invoice address is not Venezuela, can not establish connection with sSENIAT")) |
751 | + res = self._dom_giver(cr, uid, partner.vat[2:],context=context) |
752 | + if res: |
753 | + rp_obj.write(cr,uid,partner.id,res) |
754 | + self._update_partner(cr, uid, partner.id, context) |
755 | else: |
756 | - if partneri and partner.type == 'invoice': |
757 | - invoices_addr_country = partner.country_id and [partner.country_id.code] |
758 | - if invoices_addr_country: |
759 | - country = [j for j in invoices_addr_country if j] |
760 | - if country and 'VE' in country and not context.get('all_rif',False): |
761 | - self._print_error(_('Vat Error !'),_('The field vat is empty')) |
762 | + if not context.get('all_rif'): |
763 | + return False |
764 | + #~ self._print_error(_('Error'),_("The RIF, CI or passport are not well constructed, please check \n The format of the RIF should be for example J1234567890,CI should be 12345678, and passports must be D123456789")) |
765 | return True |
766 | |
767 | def connect_seniat(self, cr, uid, ids, context={}, all_rif=False): |
768 | |
769 | === modified file 'l10n_ve_fiscal_requirements/view/account_invoice_view.xml' |
770 | --- l10n_ve_fiscal_requirements/view/account_invoice_view.xml 2012-11-07 21:33:58 +0000 |
771 | +++ l10n_ve_fiscal_requirements/view/account_invoice_view.xml 2012-12-10 03:34:20 +0000 |
772 | @@ -68,7 +68,7 @@ |
773 | type='action' |
774 | string='Debit Note' |
775 | icon="gtk-execute" |
776 | - attrs="{'invisible':['|',('state','in',['proforma2','proforma','cancel', 'draft']),('type','in',['out_refund', 'in_refund'])]}"/> |
777 | + attrs="{'invisible':['|','|',('state','in',['proforma2','proforma','cancel', 'draft']),('type','in',['out_refund', 'in_refund']),('parent_id','!=',False)]}"/> |
778 | </xpath> |
779 | <xpath expr="//button[@string='Refund Invoice']" position="after"> |
780 | <button name="%(action_account_invoice_parent)d" |
781 | @@ -181,9 +181,89 @@ |
782 | </field> |
783 | </record> |
784 | |
785 | - |
786 | - |
787 | - |
788 | - |
789 | + <record id="action_sale_debit_tree" model="ir.actions.act_window"> |
790 | + <field name="name">Customer Debit Notes</field> |
791 | + <field name="res_model">account.invoice</field> |
792 | + <field name="view_type">form</field> |
793 | + <field name="view_mode">tree,form,calendar,graph</field> |
794 | + <field eval="False" name="view_id"/> |
795 | + <field name="domain">[('type','=','out_invoice'),('parent_id','!=',False)]</field> |
796 | + <field name="context">{'default_type':'out_invoice', 'type':'out_invoice', 'journal_type': 'sale_debit'}</field> |
797 | + <field name="search_view_id" ref="account.view_account_invoice_filter"/> |
798 | + <field name="help" type="html"> |
799 | + <p class="oe_view_nocontent_create"> |
800 | + Click to create a customer debit note. |
801 | + </p><p> |
802 | + OpenERP's electronic invoicing allows to ease and fasten the |
803 | + collection of customer payments. Your customer receives the |
804 | + invoice by email and he can pay online and/or import it |
805 | + in his own system. |
806 | + </p><p> |
807 | + The discussions with your customer are automatically displayed at |
808 | + the bottom of each invoice. |
809 | + </p> |
810 | + </field> |
811 | + </record> |
812 | + |
813 | + <record id="action_sale_debit_tree_view" model="ir.actions.act_window.view"> |
814 | + <field eval="1" name="sequence"/> |
815 | + <field name="view_mode">tree</field> |
816 | + <field name="act_window_id" ref="action_sale_debit_tree"/> |
817 | + </record> |
818 | + |
819 | + <record id="action_sale_debit_form_view" model="ir.actions.act_window.view"> |
820 | + <field eval="2" name="sequence"/> |
821 | + <field name="view_mode">form</field> |
822 | + <field name="view_id" ref="account.invoice_form"/> |
823 | + <field name="act_window_id" ref="action_sale_debit_tree"/> |
824 | + </record> |
825 | + |
826 | + |
827 | + |
828 | + <menuitem action="action_sale_debit_tree" id="menu_action_sale_debit_tree" parent="account.menu_finance_receivables"/> |
829 | + |
830 | + <record id="action_purchase_debit_tree" model="ir.actions.act_window"> |
831 | + <field name="name">Supplier Debit Notes</field> |
832 | + <field name="res_model">account.invoice</field> |
833 | + <field name="view_type">form</field> |
834 | + <field name="view_mode">tree,form,calendar,graph</field> |
835 | + <field eval="False" name="view_id"/> |
836 | + <field name="domain">[('type','=','in_invoice'),('parent_id','!=',False)]</field> |
837 | + <field name="context">{'default_type': 'in_invoice', 'type': 'in_invoice', 'journal_type': 'purchase_debit'}</field> |
838 | + <field name="search_view_id" ref="account.view_account_invoice_filter"/> |
839 | + <field name="help" type="html"> |
840 | + <p class="oe_view_nocontent_create"> |
841 | + Click to record a new supplier debit note. |
842 | + </p><p> |
843 | + You can control the invoice from your supplier according to |
844 | + what you purchased or received. OpenERP can also generate |
845 | + draft invoices automatically from purchase orders or receipts. |
846 | + </p> |
847 | + </field> |
848 | + </record> |
849 | + |
850 | + <record id="action_purchase_debit_tree_view" model="ir.actions.act_window.view"> |
851 | + <field eval="1" name="sequence"/> |
852 | + <field name="view_mode">tree</field> |
853 | + <field name="act_window_id" ref="action_purchase_debit_tree"/> |
854 | + </record> |
855 | + |
856 | + <record id="action_purchase_debit_form_view" model="ir.actions.act_window.view"> |
857 | + <field eval="2" name="sequence"/> |
858 | + <field name="view_mode">form</field> |
859 | + <field name="view_id" ref="account.invoice_supplier_form"/> |
860 | + <field name="act_window_id" ref="action_purchase_debit_tree"/> |
861 | + </record> |
862 | + |
863 | + <menuitem action="action_purchase_debit_tree" id="menu_action_purchase_debit_tree" parent="account.menu_finance_payables"/> |
864 | + |
865 | + <record id="account.action_invoice_tree2" model="ir.actions.act_window"> |
866 | + <field name="domain">[('type','=','in_invoice'),('parent_id','=',False)]</field> |
867 | + </record> |
868 | + |
869 | + <record id="account.action_invoice_tree1" model="ir.actions.act_window"> |
870 | + <field name="domain">[('type','=','out_invoice'),('parent_id','=',False)]</field> |
871 | + </record> |
872 | + |
873 | </data> |
874 | </openerp> |
875 | |
876 | === modified file 'l10n_ve_fiscal_requirements/view/partner_view.xml' |
877 | --- l10n_ve_fiscal_requirements/view/partner_view.xml 2012-11-06 22:01:07 +0000 |
878 | +++ l10n_ve_fiscal_requirements/view/partner_view.xml 2012-12-10 03:34:20 +0000 |
879 | @@ -3,38 +3,44 @@ |
880 | <data> |
881 | |
882 | <record id="view_partner_form2" model="ir.ui.view"> |
883 | - <field name="name">res.partner.vat.inherit2</field> |
884 | - <field name="model">res.partner</field> |
885 | - <field name="inherit_id" ref="base_vat.view_partner_form"/> |
886 | - <field name="arch" type="xml"> |
887 | - <field name="vat" position="replace"> |
888 | - </field> |
889 | - </field> |
890 | - </record> |
891 | - |
892 | - <record id="view_partner_form3" model="ir.ui.view"> |
893 | - <field name="name">res.partner.vat.inherit3</field> |
894 | + <field name="name">res.partner.vat.inherit2</field> |
895 | <field name="model">res.partner</field> |
896 | <field name="type">form</field> |
897 | <field name="inherit_id" ref="base.view_partner_form"/> |
898 | <field name="arch" type="xml"> |
899 | - <xpath expr='//field[@name="lang"]' position='after'> |
900 | - <field name="vat" on_change="vat_change_fiscal_requirements(vat)" colspan="2"/> |
901 | - <button name="update_rif" string="Update Fiscal Information" type="object" icon="gtk-execute" colspan="2"/> |
902 | - </xpath> |
903 | - </field> |
904 | - </record> |
905 | - |
906 | - <record id="view_partner_form4" model="ir.ui.view"> |
907 | - <field name="name">res.partner.vat.inherit4</field> |
908 | - <field name="model">res.partner</field> |
909 | - <field name="inherit_id" ref="base.view_partner_form"/> |
910 | - <field name="arch" type="xml"> |
911 | + |
912 | + <xpath expr='//button[@name="button_check_vat"]' position='replace'></xpath> |
913 | + <xpath expr='//field[@name="vat"]' position='replace'></xpath> |
914 | + |
915 | <xpath expr="//field[@name='name']" position="replace"> |
916 | <field name="seniat_updated" invisible="1" /> |
917 | <field name="name" attrs="{'readonly': [('seniat_updated', '!=', False)]}" /> |
918 | </xpath> |
919 | - </field> |
920 | + |
921 | + <xpath expr='//field[@name="parent_id"]' position='before'> |
922 | + <label for="vat"/> |
923 | + <field name="vat" colspan="2" placeholder="e.g. VE123456789" class="oe_inline" attrs="{'required':[('uid_country','=','VE'),'|','&','&',('is_company','=',False),('parent_id','!=',False),('type','=','invoice'), ('parent_id','=',False)] }" /> |
924 | + <button name="button_check_vat" string="Check Validity" type="object" icon="gtk-execute" class="oe_inline"/> |
925 | + <field name="uid_country" colspan="2" invisible="1"/> |
926 | + </xpath> |
927 | + |
928 | + <xpath expr='//field[@name="street"]' position='replace'> |
929 | + <field name="street" placeholder="Av. Siempre Viva" colspan="2" attrs="{'required':[('uid_country','=','VE'),'|','&','&',('is_company','=',False),('parent_id','!=',False),('type','=','invoice'), ('parent_id','=',False)] }" /> |
930 | + </xpath> |
931 | + |
932 | + <xpath expr='//field[@name="city"]' position='replace'> |
933 | + <field name="city" placeholder="Caracas" colspan="2" attrs="{'required':[('uid_country','=','VE'),'|','&','&',('is_company','=',False),('parent_id','!=',False),('type','=','invoice'), ('parent_id','=',False)] }" /> |
934 | + </xpath> |
935 | + |
936 | + <xpath expr='//field[@name="country_id"]' position='replace'> |
937 | + <field name="country_id" placeholder="Venezuela" class="oe_no_button" options='{"no_open": True}' colspan="2" attrs="{'required':[('uid_country','=','VE'),'|','&','&',('is_company','=',False),('parent_id','!=',False),('type','=','invoice'), ('parent_id','=',False)] }" /> |
938 | + </xpath> |
939 | + |
940 | + <xpath expr='//field[@name="phone"]' position='replace'> |
941 | + <field name="phone" placeholder="+58 414 432 27 20" class="oe_no_button" options='{"no_open": True}' colspan="2" attrs="{'required':[('uid_country','=','VE'),'|','&','&',('is_company','=',False),('parent_id','!=',False),('type','=','invoice'), ('parent_id','=',False)] }" /> |
942 | + </xpath> |
943 | + </field> |
944 | </record> |
945 | + |
946 | </data> |
947 | </openerp> |
948 | |
949 | === modified file 'l10n_ve_fiscal_requirements/view/res_company_view.xml' |
950 | --- l10n_ve_fiscal_requirements/view/res_company_view.xml 2011-10-25 20:33:16 +0000 |
951 | +++ l10n_ve_fiscal_requirements/view/res_company_view.xml 2012-12-10 03:34:20 +0000 |
952 | @@ -5,15 +5,15 @@ |
953 | <record id="il_company_invoice_damaged" model="ir.ui.view"> |
954 | <field name="name">il_company_invoice_damaged</field> |
955 | <field name="model">res.company</field> |
956 | - <field name="type">form</field> |
957 | + <field name="priority">24</field> |
958 | <field name="inherit_id" ref="base.view_company_form"/> |
959 | <field name="arch" type="xml"> |
960 | - <page string="Configuration" position="inside"> |
961 | - <separator string="Data used by default for invoices damaged" colspan="4"/> |
962 | + <xpath expr="//group[@name='account_grp']" position="after"> |
963 | + <group name='fr1_grp' string='Damaged Invoices Info'> |
964 | <field name="jour_id"/> |
965 | - <field name="acc_id"/> |
966 | - <newline/> |
967 | - </page> |
968 | + <field name="acc_id" domain="[('type','in',('other','receivable','payable'))]"/> |
969 | + </group> |
970 | + </xpath> |
971 | </field> |
972 | </record> |
973 | </data> |
974 | |
975 | === modified file 'l10n_ve_fiscal_requirements/wizard/account_invoice_debit.py' |
976 | --- l10n_ve_fiscal_requirements/wizard/account_invoice_debit.py 2012-11-07 15:19:17 +0000 |
977 | +++ l10n_ve_fiscal_requirements/wizard/account_invoice_debit.py 2012-12-10 03:34:20 +0000 |
978 | @@ -43,11 +43,16 @@ |
979 | obj_journal = self.pool.get('account.journal') |
980 | if context is None: |
981 | context = {} |
982 | - journal = obj_journal.search(cr, uid, [('type', '=', 'sale')]) |
983 | - if context.get('type', False): |
984 | - if context['type'] in ('in_invoice', 'in_refund'): |
985 | - journal = obj_journal.search(cr, uid, [('type', '=', 'purchase')]) |
986 | - return journal and journal[0] or False |
987 | + journal = [] |
988 | + company_id = self.pool.get('res.users').browse(cr, uid, uid, context=context).company_id.id |
989 | + company_id = context.get('company_id', company_id) |
990 | + if context.get('type', False) in ('out_invoice', 'out_refund'): |
991 | + journal = obj_journal.search(cr, uid, [('type', '=', 'sale_debit'),('company_id','=',company_id)]) |
992 | + elif context.get('type', False) in ('in_invoice', 'in_refund'): |
993 | + journal = obj_journal.search(cr, uid, [('type', '=', 'purchase_debit'),('company_id','=',company_id)]) |
994 | + if not journal: |
995 | + raise osv.except_osv(_('No Debit Journal !'),_("You must define a debit journal")) |
996 | + return journal[0] |
997 | |
998 | _defaults = { |
999 | 'date': lambda *a: time.strftime('%Y-%m-%d'), |
1000 | @@ -65,19 +70,23 @@ |
1001 | #type = context.get('journal_type', 'sale_refund') |
1002 | type = context.get('journal_type', 'sale') |
1003 | if type in ('sale', 'sale_refund'): |
1004 | - type = 'sale' |
1005 | + type = 'sale_debit' |
1006 | else: |
1007 | - type = 'purchase' |
1008 | + type = 'purchase_debit' |
1009 | + company_id = self.pool.get('res.users').browse(cr, uid, uid, context=context).company_id.id |
1010 | + company_id = context.get('company_id', company_id) |
1011 | for field in res['fields']: |
1012 | if field == 'journal_id': |
1013 | - journal_select = journal_obj._name_search(cr, uid, '', [('type', '=', type)], context=context, limit=None, name_get_uid=1) |
1014 | + journal_select = journal_obj._name_search(cr, uid, '', [('type', '=', type),('company_id','=',company_id)], context=context, limit=None, name_get_uid=1) |
1015 | res['fields'][field]['selection'] = journal_select |
1016 | return res |
1017 | |
1018 | - def _get_period(self, cr, uid, context={}): |
1019 | + def _get_period(self, cr, uid, context=None): |
1020 | """ |
1021 | Return default account period value |
1022 | """ |
1023 | + if context is None: |
1024 | + context = {} |
1025 | account_period_obj = self.pool.get('account.period') |
1026 | ids = account_period_obj.find(cr, uid, context=context) |
1027 | period_id = False |
1028 | @@ -85,10 +94,12 @@ |
1029 | period_id = ids[0] |
1030 | return period_id |
1031 | |
1032 | - def _get_orig(self, cr, uid, inv, ref, context={}): |
1033 | + def _get_orig(self, cr, uid, inv, ref, context=None): |
1034 | """ |
1035 | Return default origin value |
1036 | """ |
1037 | + if context is None: |
1038 | + context = {} |
1039 | nro_ref = ref |
1040 | if inv.type == 'out_invoice': |
1041 | nro_ref = inv.number |
1042 | @@ -114,119 +125,122 @@ |
1043 | if context is None: |
1044 | context = {} |
1045 | |
1046 | - for form in self.read(cr, uid, ids, context=context): |
1047 | - created_inv = [] |
1048 | - date = False |
1049 | - period = False |
1050 | - description = False |
1051 | - company = res_users_obj.browse(cr, uid, uid, context=context).company_id |
1052 | - journal_id = form.get('journal_id', False) |
1053 | - for inv in inv_obj.browse(cr, uid, context.get('active_ids'), context=context): |
1054 | - if inv.state in ['draft', 'proforma2', 'cancel']: |
1055 | - raise osv.except_osv(_('Error !'), _('Can not create a debit note from draft/proforma/cancel invoice.')) |
1056 | - if inv.reconciled in ('cancel', 'modify'): |
1057 | - raise osv.except_osv(_('Error !'), _('Can not create a debit note from invoice which is already reconciled, invoice should be unreconciled first. You can only Refund or Debit this invoice')) |
1058 | - if inv.type not in ['in_invoice', 'out_invoice']: |
1059 | - raise osv.except_osv(_('Error !'), _('Can not make a debit note on a refund invoice.')) |
1060 | - if form['period']: |
1061 | - period = form['period'] |
1062 | - else: |
1063 | - #Take period from the current date |
1064 | - #period = inv.period_id and inv.period_id.id or False |
1065 | - period = self._get_period(cr, uid, context) |
1066 | - |
1067 | - if not journal_id: |
1068 | - journal_id = inv.journal_id.id |
1069 | - |
1070 | - if form['date']: |
1071 | - date = form['date'] |
1072 | - if not form['period']: |
1073 | - cr.execute("select name from ir_model_fields \ |
1074 | - where model = 'account.period' \ |
1075 | - and name = 'company_id'") |
1076 | - result_query = cr.fetchone() |
1077 | - if result_query: |
1078 | - #in multi company mode |
1079 | - cr.execute("""select p.id from account_fiscalyear y, account_period p where y.id=p.fiscalyear_id \ |
1080 | - and date(%s) between p.date_start AND p.date_stop and y.company_id = %s limit 1""", (date, company.id,)) |
1081 | - else: |
1082 | - #in mono company mode |
1083 | - cr.execute("""SELECT id |
1084 | - from account_period where date(%s) |
1085 | - between date_start AND date_stop \ |
1086 | - limit 1 """, (date,)) |
1087 | - res = cr.fetchone() |
1088 | - if res: |
1089 | - period = res[0] |
1090 | - else: |
1091 | - #Take current date |
1092 | - #date = inv.date_invoice |
1093 | - date = time.strftime('%Y-%m-%d') |
1094 | - if form['description']: |
1095 | - description = form['description'] |
1096 | - else: |
1097 | - description = inv.name |
1098 | - |
1099 | - if not period: |
1100 | - raise osv.except_osv(_('Data Insufficient !'), \ |
1101 | - _('No Period found on Invoice!')) |
1102 | - |
1103 | - #we get original data of invoice to create a new invoice that is the copy of the original |
1104 | - invoice = inv_obj.read(cr, uid, [inv.id], |
1105 | - ['name', 'type', 'number', 'reference', |
1106 | - 'comment', 'date_due', 'partner_id', |
1107 | - 'partner_insite', 'partner_contact', |
1108 | - 'partner_ref', 'payment_term', 'account_id', |
1109 | - 'currency_id', 'invoice_line', 'tax_line', |
1110 | - 'journal_id', 'period_id'], context=context) |
1111 | - invoice = invoice[0] |
1112 | - del invoice['id'] |
1113 | - invoice_lines = [] |
1114 | - tax_lines = [] |
1115 | - #Add origin, parent and comment values |
1116 | - orig = self._get_orig(cr, uid, inv, invoice['reference'], context) |
1117 | - invoice.update({ |
1118 | - 'type': inv.type, |
1119 | - 'date_invoice': date, |
1120 | - 'state': 'draft', |
1121 | - 'number': False, |
1122 | - 'invoice_line': invoice_lines, |
1123 | - 'tax_line': tax_lines, |
1124 | - 'period_id': period, |
1125 | - 'parent_id':inv.id, |
1126 | - 'name': description, |
1127 | - 'origin': orig, |
1128 | - 'comment':form['comment'] |
1129 | - }) |
1130 | - #take the id part of the tuple returned for many2one fields |
1131 | - for field in ('partner_id', |
1132 | - 'account_id', 'currency_id', 'payment_term', 'journal_id'): |
1133 | - invoice[field] = invoice[field] and invoice[field][0] |
1134 | - # create the new invoice |
1135 | - inv_id = inv_obj.create(cr, uid, invoice, {}) |
1136 | - # we compute due date |
1137 | - if inv.payment_term.id: |
1138 | - data = inv_obj.onchange_payment_term_date_invoice(cr, uid, [inv_id], inv.payment_term.id, date) |
1139 | - if 'value' in data and data['value']: |
1140 | - inv_obj.write(cr, uid, [inv_id], data['value']) |
1141 | - created_inv.append(inv_id) |
1142 | - #we get the view id |
1143 | - if inv.type in ('out_invoice', 'out_refund'): |
1144 | - xml_id = 'action_invoice_tree1' |
1145 | - else: |
1146 | - xml_id = 'action_invoice_tree2' |
1147 | - #we get the model |
1148 | - result = mod_obj.get_object_reference(cr, uid, 'account', xml_id) |
1149 | - id = result and result[1] or False |
1150 | - # we read the act window |
1151 | - result = act_obj.read(cr, uid, id, context=context) |
1152 | - # we add the new invoices into domain list |
1153 | - invoice_domain = eval(result['domain']) |
1154 | - invoice_domain.append(('id', 'in', created_inv)) |
1155 | - result['domain'] = invoice_domain |
1156 | - return result |
1157 | + form = self.browse(cr, uid, ids[0], context = context) |
1158 | + created_inv = [] |
1159 | + date = False |
1160 | + period = False |
1161 | + description = False |
1162 | + company = res_users_obj.browse(cr, uid, uid, context=context).company_id |
1163 | + journal_id = form.journal_id and form.journal_id.id or False |
1164 | + inv = inv_obj.browse(cr, uid, context.get('active_ids')[0], context=context) |
1165 | + if inv.state in ['draft', 'proforma2', 'cancel']: |
1166 | + raise osv.except_osv(_('Error !'), _('Can not create a debit note from draft/proforma/cancel invoice.')) |
1167 | + if inv.reconciled in ('cancel', 'modify'): |
1168 | + raise osv.except_osv(_('Error !'), _('Can not create a debit note from invoice which is already reconciled, invoice should be unreconciled first. You can only Refund or Debit this invoice')) |
1169 | + if inv.type not in ['in_invoice', 'out_invoice']: |
1170 | + raise osv.except_osv(_('Error !'), _('Can not make a debit note on a refund invoice.')) |
1171 | + if form.period: |
1172 | + period = form.period.id |
1173 | + else: |
1174 | + #Take period from the current date |
1175 | + #period = inv.period_id and inv.period_id.id or False |
1176 | + period = self._get_period(cr, uid, context) |
1177 | + |
1178 | + if not journal_id: |
1179 | + journal_id = inv.journal_id.id |
1180 | + |
1181 | + if form.date: |
1182 | + date = form.date |
1183 | + if not form.period.id: |
1184 | + cr.execute("select name from ir_model_fields \ |
1185 | + where model = 'account.period' \ |
1186 | + and name = 'company_id'") |
1187 | + result_query = cr.fetchone() |
1188 | + if result_query: |
1189 | + #in multi company mode |
1190 | + cr.execute("""select p.id from account_fiscalyear y, account_period p where y.id=p.fiscalyear_id \ |
1191 | + and date(%s) between p.date_start AND p.date_stop and y.company_id = %s limit 1""", (date, company.id,)) |
1192 | + else: |
1193 | + #in mono company mode |
1194 | + cr.execute("""SELECT id |
1195 | + from account_period where date(%s) |
1196 | + between date_start AND date_stop \ |
1197 | + limit 1 """, (date,)) |
1198 | + res = cr.fetchone() |
1199 | + if res: |
1200 | + period = res[0] |
1201 | + else: |
1202 | + #Take current date |
1203 | + #date = inv.date_invoice |
1204 | + date = time.strftime('%Y-%m-%d') |
1205 | + if form.description: |
1206 | + description = form.description |
1207 | + else: |
1208 | + description = inv.name |
1209 | + |
1210 | + if not period: |
1211 | + raise osv.except_osv(_('Data Insufficient !'), \ |
1212 | + _('No Period found on Invoice!')) |
1213 | + |
1214 | + #we get original data of invoice to create a new invoice that is the copy of the original |
1215 | + invoice = inv_obj.read(cr, uid, [inv.id], |
1216 | + ['name', 'type', 'number', 'reference', |
1217 | + 'comment', 'date_due', 'partner_id', |
1218 | + 'partner_insite', 'partner_contact', |
1219 | + 'partner_ref', 'payment_term', 'account_id', |
1220 | + 'currency_id', 'invoice_line', 'tax_line', |
1221 | + 'journal_id', 'period_id'], context=context) |
1222 | + invoice = invoice[0] |
1223 | + del invoice['id'] |
1224 | + invoice_lines = [] |
1225 | + tax_lines = [] |
1226 | + #Add origin, parent and comment values |
1227 | + orig = self._get_orig(cr, uid, inv, invoice['reference'], context) |
1228 | + invoice.update({ |
1229 | + 'type': inv.type, |
1230 | + 'date_invoice': date, |
1231 | + 'state': 'draft', |
1232 | + 'number': False, |
1233 | + 'invoice_line': invoice_lines, |
1234 | + 'tax_line': tax_lines, |
1235 | + 'period_id': period, |
1236 | + 'parent_id':inv.id, |
1237 | + 'name': description, |
1238 | + 'origin': orig, |
1239 | + 'comment':form.comment, |
1240 | + 'journal_id':journal_id |
1241 | + }) |
1242 | + #take the id part of the tuple returned for many2one fields |
1243 | + for field in ('partner_id', |
1244 | + 'account_id', 'currency_id', 'payment_term'): |
1245 | + invoice[field] = invoice[field] and invoice[field][0] |
1246 | + # create the new invoice |
1247 | + inv_id = inv_obj.create(cr, uid, invoice, {}) |
1248 | + # we compute due date |
1249 | + if inv.payment_term.id: |
1250 | + data = inv_obj.onchange_payment_term_date_invoice(cr, uid, [inv_id], inv.payment_term.id, date) |
1251 | + if 'value' in data and data['value']: |
1252 | + inv_obj.write(cr, uid, [inv_id], data['value']) |
1253 | + created_inv.append(inv_id) |
1254 | + #we get the view id |
1255 | + if inv.type in ('out_invoice', 'out_refund'): |
1256 | + xml_id = 'action_sale_debit_tree' |
1257 | + else: |
1258 | + xml_id = 'action_purchase_debit_tree' |
1259 | + #we get the model |
1260 | + result = mod_obj.get_object_reference(cr, uid, 'l10n_ve_fiscal_requirements', xml_id) |
1261 | + id = result and result[1] or False |
1262 | + # we read the act window |
1263 | + result = act_obj.read(cr, uid, id, context=context) |
1264 | + # we add the new invoices into domain list |
1265 | + invoice_domain = eval(result['domain']) |
1266 | + invoice_domain.append(('id', 'in', created_inv)) |
1267 | + result['domain'] = invoice_domain |
1268 | + return result |
1269 | |
1270 | def invoice_debit(self, cr, uid, ids, context=None): |
1271 | + if context is None: |
1272 | + context = {} |
1273 | return self.compute_debit(cr, uid, ids, context=context) |
1274 | |
1275 | |
1276 | |
1277 | === modified file 'l10n_ve_fiscal_requirements/wizard/search_info_partner_seniat.py' |
1278 | --- l10n_ve_fiscal_requirements/wizard/search_info_partner_seniat.py 2012-09-26 20:44:41 +0000 |
1279 | +++ l10n_ve_fiscal_requirements/wizard/search_info_partner_seniat.py 2012-12-10 03:34:20 +0000 |
1280 | @@ -35,28 +35,31 @@ |
1281 | 'vat_subjected':fields.boolean('Pay VAY', help='Pay VAT, in spanish known as : Contribuyente formal'), |
1282 | } |
1283 | |
1284 | - def search_partner_seniat(self, cr, uid, vat, context=None): |
1285 | + def search_partner_seniat(self, cr, uid, ids, context=None): |
1286 | if context is None: |
1287 | context={} |
1288 | - aux = '' |
1289 | + this = self.browse(cr, uid, ids)[0] |
1290 | su_obj = self.pool.get('seniat.url') |
1291 | rp_obj = self.pool.get('res.partner') |
1292 | - url_obj = su_obj.browse(cr, uid, su_obj.search(cr, uid, []))[0] |
1293 | - url1 = url_obj.name + '%s' |
1294 | - url2 = url_obj.url_seniat + '%s' |
1295 | - url3 = url_obj.url_seniat2 + '%s' |
1296 | - var_vat = self.read(cr,uid,vat,['vat']) |
1297 | - if var_vat: |
1298 | - aux = var_vat[0]['vat'] |
1299 | - if rp_obj.check_vat_ve(aux,context): |
1300 | - context.update({'spf_info':True}) |
1301 | - res = su_obj._dom_giver(url1,url2,url3, aux,context) |
1302 | + vat = this.vat.upper() |
1303 | + res={'name': _('The requested contributor does not exist'),'vat_subjected': False,'vat':vat,'wh_iva_agent':False, 'wh_iva_rate': 0.0} |
1304 | + |
1305 | + if 'VE' in vat: |
1306 | + vat = vat[2:] |
1307 | + |
1308 | + if rp_obj.check_vat_ve(vat,context=context): |
1309 | + res = su_obj._dom_giver(cr, uid, vat,context) |
1310 | if res: |
1311 | - res.update({'wh_iva_rate':su_obj._buscar_porcentaje(aux,url2)}) |
1312 | - else: |
1313 | - raise osv.except_osv(_('Error'),_("Does not exist the contributor requested")) |
1314 | - self.write(cr,uid,vat,res) |
1315 | - |
1316 | - return False |
1317 | - |
1318 | + res.update({'wh_iva_rate':su_obj._buscar_porcentaje(cr, uid, vat)}) |
1319 | + self.write(cr,uid,ids,res) |
1320 | + |
1321 | + return { |
1322 | + 'type': 'ir.actions.act_window', |
1323 | + 'res_model': 'search.info.partner.seniat', |
1324 | + 'view_mode': 'form', |
1325 | + 'view_type': 'form', |
1326 | + 'res_id': this.id, |
1327 | + 'views': [(False, 'form')], |
1328 | + 'target': 'new', |
1329 | + } |
1330 | search_info_partner_seniat() |
1331 | |
1332 | === modified file 'l10n_ve_fiscal_requirements/wizard/update_info_partner.py' |
1333 | --- l10n_ve_fiscal_requirements/wizard/update_info_partner.py 2012-02-14 14:19:25 +0000 |
1334 | +++ l10n_ve_fiscal_requirements/wizard/update_info_partner.py 2012-12-10 03:34:20 +0000 |
1335 | @@ -32,15 +32,11 @@ |
1336 | |
1337 | def update_info(self, cr, uid, ids, context={}): |
1338 | aux=[] |
1339 | - res_part_obj = self.pool.get('res.partner') |
1340 | seniat_url_obj = self.pool.get('seniat.url') |
1341 | - sql= '''SELECT vat FROM res_partner GROUP BY vat HAVING count(vat) > 1 ;''' |
1342 | - cr.execute(sql) |
1343 | - record = cr.dictfetchall() |
1344 | - for r in record: |
1345 | - aux.append(r.values()[0]) |
1346 | - es_partner_ids= res_part_obj.search(cr, uid, [('vat','not in',aux)]) |
1347 | - seniat_url_obj.connect_seniat(cr, uid, es_partner_ids, context,True) |
1348 | + cr.execute('''SELECT id FROM res_partner WHERE vat ilike 'VE%';''') |
1349 | + record = cr.fetchall() |
1350 | + pids = record and map(lambda x: x[0],record) or [] |
1351 | + seniat_url_obj.connect_seniat(cr, uid, pids, context=context, all_rif=True) |
1352 | return{} |
1353 | |
1354 | |
1355 | |
1356 | === modified file 'l10n_ve_fiscal_requirements/wizard/wizard_invoice_nro_ctrl.py' |
1357 | --- l10n_ve_fiscal_requirements/wizard/wizard_invoice_nro_ctrl.py 2012-09-24 15:42:44 +0000 |
1358 | +++ l10n_ve_fiscal_requirements/wizard/wizard_invoice_nro_ctrl.py 2012-12-10 03:34:20 +0000 |
1359 | @@ -95,13 +95,6 @@ |
1360 | wizard_brw = self.browse(cr, uid, ids, context=None) |
1361 | wizard_deli_obj = self.pool.get('wz.picking.delivery.note') |
1362 | inv_id = context.get('active_id') |
1363 | - #~ if context['menu']: |
1364 | - #~ invoice_obj = self.pool.get('account.invoice') |
1365 | - #~ inv_brw = invoice_obj.browse(cr, uid, invoice_obj.search(cr, uid, [], limit=1), context) |
1366 | - #~ if inv_brw == []: |
1367 | - #~ raise osv.except_osv(_("ERROR !"), _("You must have created at least one invoice to declare it as damaged")) |
1368 | - #~ inv_id = inv_brw[0].id |
1369 | - #~ inv_brw = inv_brw[0] |
1370 | for wizard in wizard_brw: |
1371 | if not wizard.sure: |
1372 | raise osv.except_osv(_("Validation error!"), _("Please confirm that you know what you're doing by checking the option bellow!")) |
1373 | |
1374 | === modified file 'l10n_ve_fiscal_requirements/wizard/wizard_nro_ctrl.py' |
1375 | --- l10n_ve_fiscal_requirements/wizard/wizard_nro_ctrl.py 2012-09-24 14:47:16 +0000 |
1376 | +++ l10n_ve_fiscal_requirements/wizard/wizard_nro_ctrl.py 2012-12-10 03:34:20 +0000 |
1377 | @@ -32,7 +32,7 @@ |
1378 | _description = "Wizard that changes the invoice control number" |
1379 | |
1380 | def set_noctrl(self, cr, uid, ids, context=None): |
1381 | - if context==None: |
1382 | + if context is None: |
1383 | context={} |
1384 | data = self.pool.get('wiz.nroctrl').read(cr, uid, ids)[0] |
1385 | if not data['sure']: |
1386 | @@ -41,8 +41,6 @@ |
1387 | n_ctrl = data['name'] |
1388 | |
1389 | invoice = inv_obj.browse(cr, uid, context['active_id']) |
1390 | - if invoice.state == 'draft': |
1391 | - raise osv.except_osv(_("Error!"), _("You cannot change the state of a Draft invoice")) |
1392 | |
1393 | inv_obj.write(cr, uid, context.get('active_id'), {'nro_ctrl': n_ctrl}, context=context) |
1394 | return {} |