changes for cp

This commit is contained in:
Elvis 2023-11-06 21:38:58 -05:00
parent 7eeac6717d
commit 8c18ebc221
16 changed files with 483 additions and 0 deletions

View File

@ -18,6 +18,7 @@ from . import work
from . import genetics
from . import move
from . import account
from . import supplier_certificate
def register():
@ -25,6 +26,7 @@ def register():
configuration.Configuration,
sale.AduanaDetailedStart,
account.PrintSupplierCertificateStart,
account.InvoiceAuthorization,
crop.Kind,
crop.Activity,
crop.Variety,
@ -74,8 +76,12 @@ def register():
sale.SaleLineKitComponent,
sale.GroupingSalesStart,
sale.PortfolioDetailedStart,
supplier_certificate.SupplierCertificate,
supplier_certificate.SupplierCetificateInvoiceLine,
supplier_certificate.SupplierCetificateParty,
product.Template,
product.ProductStyle,
product.HarmonizedTariffSchedule,
production.Production,
production.ProductionSummaryStart,
production.MaterialsForecastStart,

View File

@ -25,6 +25,15 @@ from trytond.pool import Pool, PoolMeta
from trytond.exceptions import UserError
class InvoiceAuthorization(metaclass=PoolMeta):
__name__ = 'account.invoice.authorization'
# @classmethod
# def __setup__(cls):
# super().__setup__()
# cls.kind.selection.append(('supplier_certificate', "Supplier Certificate"))
class PrintSupplierCertificateStart(ModelView):
'Print Supplier Certificate Start'
__name__ = 'farming.print_supplier_certificate.start'

View File

@ -10,6 +10,9 @@ class Party(metaclass=PoolMeta):
export_route = fields.Char('Export Route', select=True)
customs_globals = fields.One2Many('party.customs_global', 'party',
'Custom Globals')
# supplier billing information
invoice_authorization = fields.Many2One('account.invoice.authorization',
'Invoice Authorization', domain=[('state', '=', 'active'), ('type', '=', 'in')])
class Company(metaclass=PoolMeta):

View File

@ -21,3 +21,15 @@ class Template(metaclass=PoolMeta):
('indirect', 'Indirect'),
], 'Cost Type')
hts = fields.Char('HTS')
harmonized_tariff_schedule = fields.Many2One('farming.harmonized_tariff_schedule',
'Harmonized Tariff Schedule')
# exportation info
class HarmonizedTariffSchedule(ModelSQL, ModelView):
"""HarmonizedTariffSchedule"""
__name__ = 'farming.harmonized_tariff_schedule'
name = fields.Char('Name', states={'required': True})
code = fields.Char('Code', states={'required': True})
uom = fields.Many2One('product.uom', 'uom',
states={'required': True})

View File

@ -21,5 +21,35 @@ The COPYRIGHT file at the top level of this repository contains the full copyrig
<field name="inherit" ref="product.template_view_form"/>
<field name="name">template_form</field>
</record>
<record model="ir.ui.view" id="harmonized_tariff_schedule_view_tree">
<field name="model">farming.harmonized_tariff_schedule</field>
<field name="type">tree</field>
<field name="priority">11</field>
<field name="name">harmonized_tariff_schedule_tree</field>
</record>
<record model="ir.ui.view" id="harmonized_tariff_schedule_view_form">
<field name="model">farming.harmonized_tariff_schedule</field>
<field name="type">form</field>
<field name="name">harmonized_tariff_schedule_form</field>
</record>
<record model="ir.action.act_window" id="act_harmonized_tariff_schedule_tree">
<field name="name">Harmonized Tariff Schedule</field>
<field name="res_model">farming.harmonized_tariff_schedule</field>
</record>
<record model="ir.action.act_window.view" id="act_harmonized_tariff_schedule_view_tree1">
<field name="sequence" eval="10"/>
<field name="view" ref="harmonized_tariff_schedule_view_tree"/>
<field name="act_window" ref="act_harmonized_tariff_schedule_tree"/>
</record>
<record model="ir.action.act_window.view" id="act_harmonized_tariff_schedule_view_tree2">
<field name="sequence" eval="20"/>
<field name="view" ref="harmonized_tariff_schedule_view_form"/>
<field name="act_window" ref="act_harmonized_tariff_schedule_tree"/>
</record>
<menuitem name="Harmonized Tariff Schedule" parent="product.menu_main_product"
sequence="80" id="menu_harmonized_tariff_schedule"
action="act_harmonized_tariff_schedule_tree"/>
</data>
</tryton>

256
supplier_certificate.py Normal file
View File

@ -0,0 +1,256 @@
from trytond.model import fields, ModelSQL, ModelView, Unique, Workflow
from trytond.pool import Pool
# from trytond.transaction import Transaction
# from trytond.wizard import Button, StateTransition, StateView, Wizard
from trytond.pyson import Eval
from decimal import Decimal
from trytond.exceptions import UserError
from lxml import etree
from datetime import datetime, timedelta
class SupplierCertificate(Workflow, ModelSQL, ModelView):
"""Supplier Certificate"""
__name__ = 'farming.supplier_certificate'
number = fields.Char('Number', states={
'readonly': True
})
# supplier = fields.Many2Many('party.party', 'Supplier')
suppliers = fields.Many2Many('farming.supplier_certificate-party.party', 'supplier_certificate',
'party', 'Party')
provider_link = fields.Char('Link Mail')
start_date = fields.Date('Start Date')
end_date = fields.Date('End Date')
invoice_lines = fields.Many2Many('farming.supplier_certificate-account_invoice_line', 'supplier_certificate',
'invoice_line', 'Invoice Lines', domain=[
('invoice.type', '=', 'in'),
('invoice.party', 'in', Eval('suppliers')),
('product.exportable', '=', True),
('invoice.invoice_date', '>=', Eval('start_date')),
('invoice.invoice_date', '<=', Eval('end_date')),
], depends=['suppliers', 'start_date', 'end_date'])
# ('invoice', '=', Eval('invoice')),
state = fields.Selection([
('draft', 'Draft'),
('cancelled', 'Cancelled'),
('done', 'Done'),
('processed', 'Processed'),
], 'State', readonly=True, select=True)
total_amount = fields.Function(fields.Numeric('Total_amount'), 'get_total_amount')
vat_amount = fields.Function(fields.Numeric('Vat Amount'), 'get_vat_amount')
xml_certificate = fields.Text('XML Certificate')
@classmethod
def __setup__(cls):
super(SupplierCertificate, cls).__setup__()
cls._transitions |= set((
('draft', 'processed'),
('processed', 'done'),
('processed', 'cancelled'),
))
cls._buttons.update({
'draft': {
'invisible': Eval('state').in_(['draft', 'processed', 'done'])
},
'cancel': {
'invisible': Eval('state').in_(['cancelled', 'draft', 'done']),
},
'process': {
'invisible': Eval('state') != 'draft',
},
'done': {
'invisible': Eval('state').in_(['draft', 'cancelled', 'done']),
},
'create_certificate': {
}
})
@classmethod
@ModelView.button
@Workflow.transition('draft')
def draft(cls, records):
pass
@classmethod
@ModelView.button
@Workflow.transition('cancelled')
def cancel(cls, records):
pass
@classmethod
@ModelView.button
@Workflow.transition('processed')
def process(cls, records):
for record in records:
record.set_number()
@classmethod
@ModelView.button
@Workflow.transition('done')
def done(cls, records):
pass
@staticmethod
def default_state():
return 'draft'
def get_total_amount(self, name):
total_amount = 0
if self.invoice_lines:
for invoice_line in self.invoice_lines:
total_amount += invoice_line.amount
return Decimal(total_amount)
def get_vat_amount(self, name):
total_amount_taxes = 0
TAX = Pool().get('account.tax')
iva = TAX(2)
if self.invoice_lines:
for invoice_line in self.invoice_lines:
# total_amount_taxes += invoice_line.amount * iva.rate * Decimal(invoice_line.quantity)
total_amount_taxes += invoice_line.amount * iva.rate
return Decimal(total_amount_taxes)
@classmethod
@ModelView.button
def create_certificate(cls, certificates):
for record in certificates:
date_exp = record.start_date + timedelta(days=6)
flimexp = date_exp.strftime("%Y-%m-%d")
root = etree.Element("mas", nsmap={"xsi": "http://www.w3.org/2001/XMLSchema-instance"})
root.set("{http://www.w3.org/2001/XMLSchema-instance}noNamespaceSchemaLocation", "../xsd/640.xsd")
cantreg = etree.SubElement(root, "CantReg")
cantreg.text = str(len(record.invoice_lines))
cab = etree.SubElement(root, "Cab")
elements_to_add = {
"Ano": str(record.start_date.year),
"CodCpt": "1",
"Formato": "640",
"Version": "1",
"NumEnvio": record.number,
"FecEnvio": str(datetime.today().isoformat()).split('.')[0],
"FecInicial": str(record.start_date),
"FecFinal": str(record.start_date),
"ValorTotal": "31",
"CantReg": str(len(record.suppliers))
}
for tag, text in elements_to_add.items():
element = etree.Element(tag)
element.text = text
cab.append(element)
pool = Pool()
Authorization = pool.get('account.invoice.authorization')
for supplier in record.suppliers:
resolution_number = supplier.invoice_authorization.number
start_date_auth = supplier.invoice_authorization.start_date_auth
invoice_lines = []
vtcons = 0
vtexen = 0
for line in record.invoice_lines:
try:
autorization, = Authorization.search([('id', '=', line.invoice.authorization)])
except:
autorization = '9999'
if line.invoice.party == supplier:
harmonized_tariff_schedule = line.product.harmonized_tariff_schedule
invoice_line_dict = {
'nfact': line.invoice.reference,
'ffac': str(line.invoice.invoice_date),
'resfac': resolution_number,
'fres': str(start_date_auth),
'tipo': '1',
'subp': harmonized_tariff_schedule.code,
'desc': line.product.description if line.product.description else line.product.name,
'cunfi': f"{line.quantity:.6f}",
'unfi': harmonized_tariff_schedule.uom.symbol,
'cunco': line.unit.symbol,
'unco': 'NAR',
'vuni': line.unit_price,
'amount': round(float(line.unit_price) * line.quantity, 6),
'tiva': '19.00',
'vexen': round((float(line.unit_price) * line.quantity) * 0.19, 6),
'codins': line.product.code,
}
vtcons += invoice_line_dict['amount']
vtexen += invoice_line_dict['vexen']
invoice_lines.append(invoice_line_dict)
cp = etree.SubElement(root, "cp")
cp.set("cpto", "1")
cp.set("tdoc", supplier.type_document)
cp.set("ndoc", supplier.id_number)
if supplier.type_document == '31':
cp.set("razsoc", supplier.name)
else:
cp.set("apl1", supplier.patient.first_family_name)
cp.set("apl2", supplier.patient.second_family_name)
cp.set("nom1", supplier.first_name)
cp.set("nom2", supplier.second_name)
cp.set("cantfac", "1")
cp.set("vtcons", f"{vtcons:.6f}")
cp.set("vtexen", f"{vtexen:.6f}")
cp.set("flimexp", flimexp)
cp.set("nitems", str(len(invoice_lines)))
for line in invoice_lines:
cphoja2 = etree.SubElement(cp, "cphoja2")
cphoja2.set("nfact", line['nfact'])
cphoja2.set("ffac", line['ffac'])
cphoja2.set("resfac", line['resfac'])
cphoja2.set("fres", line['fres'])
cphoja2.set("tipo", '1')
cphoja2.set("subp", line['subp'])
cphoja2.set("desc", line['desc'])
cphoja2.set("cunfi", line['cunfi'])
cphoja2.set("unco", 'NAR')
cphoja2.set("vuni", f"{line['vuni']:.6f}")
cphoja2.set("vtotal", f"{line['amount']:.6f}")
cphoja2.set("tiva", '19.00')
cphoja2.set("vexen", f"{line['vexen']:.6f}")
cphoja2.set("codins", line['codins'])
tree = etree.ElementTree(root)
record.xml_certificate = etree.tostring(tree, xml_declaration=True, pretty_print=True, encoding="ISO-8859-1").decode("ISO-8859-1")
record.save()
def set_number(self):
pool = Pool()
Config = pool.get('account.configuration')
config = Config(1)
if self.number:
return
if not config.sequence_supplier_certificate:
raise UserError('No existe secuencia de certificado de proveedor')
number = config.certificate_sequence.get()
self.write([self], {'number': number})
class SupplierCetificateInvoiceLine(ModelSQL):
'Supplier certificate - invoice Line'
__name__ = 'farming.supplier_certificate-account_invoice_line'
_table = 'supplier_certificate-account_invoice_line'
supplier_certificate = fields.Many2One('farming.supplier_certificate',
'Supplier Certificate', select=True, required=True, ondelete='CASCADE')
invoice_line = fields.Many2One('account.invoice.line', 'Invoice Line',
ondelete='CASCADE', select=True, required=True)
@classmethod
def __setup__(cls):
super(SupplierCetificateInvoiceLine, cls).__setup__()
table = cls.__table__()
cls._sql_constraints += [
('invoice_line_uniq', Unique(table, table.invoice_line),
'invoice line already exists!'),
]
class SupplierCetificateParty(ModelSQL):
'Supplier certificate - invoice Line'
__name__ = 'farming.supplier_certificate-party.party'
_table = 'supplier_certificate-party_party'
supplier_certificate = fields.Many2One('farming.supplier_certificate',
'Supplier Certificate', select=True, required=True, ondelete='CASCADE')
party = fields.Many2One('party.party', 'Party',
ondelete='CASCADE', select=True, required=True)

68
supplier_certificate.xml Normal file
View File

@ -0,0 +1,68 @@
<?xml version="1.0"?>
<!-- This file is part product_barcode module for Tryton.
The COPYRIGHT file at the top level of this repository contains the full copyright notices and license terms. -->
<tryton>
<data>
<record model="ir.ui.view" id="supplier_certificate_view_form">
<field name="model">farming.supplier_certificate</field>
<field name="type">form</field>
<field name="name">supplier_certificate_form</field>
</record>
<record model="ir.ui.view" id="supplier_certificate_view_tree">
<field name="model">farming.supplier_certificate</field>
<field name="type">tree</field>
<field name="name">supplier_certificate_tree</field>
</record>
<record model="ir.ui.view" id="supplier_certificate_line_view_form">
<field name="model">farming.supplier_certificate.line</field>
<field name="type">form</field>
<field name="name">supplier_certificate_line_form</field>
</record>
<record model="ir.ui.view" id="supplier_certificate_line_view_tree">
<field name="model">farming.supplier_certificate.line</field>
<field name="type">tree</field>
<field name="name">supplier_certificate_line_tree</field>
</record>
<record model="ir.action.act_window" id="act_supplier_certificate_form">
<field name="name">Supplier Certificate</field>
<field name="res_model">farming.supplier_certificate</field>
</record>
<record model="ir.action.act_window.view"
id="act_supplier_certificate_form_view1">
<field name="sequence" eval="10"/>
<field name="view" ref="supplier_certificate_view_tree"/>
<field name="act_window" ref="act_supplier_certificate_form"/>
</record>
<record model="ir.action.act_window.view"
id="act_supplier_certificate_form_view2">
<field name="sequence" eval="20"/>
<field name="view" ref="supplier_certificate_view_form"/>
<field name="act_window" ref="act_supplier_certificate_form"/>
</record>
<menuitem
parent="account_invoice.menu_invoices"
action="act_supplier_certificate_form"
sequence="10"
id="menu_invoice_in_form"/>
<record model="ir.ui.view" id="add_invoice_lines_start_view_form">
<field name="model">farming.add_invoice_line.start</field>
<field name="type">form</field>
<field name="name">add_invoice_line_start_form</field>
</record>
<record model="ir.action.wizard" id="wizard_add_invoice_lines">
<field name="name">Add Invoice Lines</field>
<field name="wiz_name">farming.add_invoice_line</field>
</record>
<record model="ir.action.keyword" id="action_create_order_line_keyword">
<field name="keyword">form_action</field>
<field name="model">farming.supplier_certificate,-1</field>
<field name="action" ref="wizard_add_invoice_lines"/>
</record>
</data>
</tryton>

View File

@ -33,3 +33,4 @@ xml:
work.xml
genetics.xml
message.xml
supplier_certificate.xml

View File

@ -0,0 +1,11 @@
<?xml version="1.0"?>
<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
this repository contains the full copyright notices and license terms. -->
<form>
<label name="name"/>
<field name="name"/>
<label name="code"/>
<field name="code"/>
<label name="uom"/>
<field name="uom"/>
</form>

View File

@ -0,0 +1,8 @@
<?xml version="1.0"?>
<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
this repository contains the full copyright notices and license terms. -->
<tree>
<field name="name"/>
<field name="code"/>
<field name="uom"/>
</tree>

View File

@ -9,4 +9,8 @@ this repository contains the full copyright notices and license terms. -->
<field name="freight_forwader"/>
<field name="customs_globals" colspan="4"/>
</xpath>
<xpath expr="/form/notebook/page[@id='supplier']" position="inside">
<label name="invoice_authorization"/>
<field name="invoice_authorization"/>
</xpath>
</data>

View File

@ -0,0 +1,44 @@
<?xml version="1.0"?>
<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
this repository contains the full copyright notices and license terms. -->
<form>
<label name="number"/>
<field name="number"/>
<label name="start_date"/>
<field name="start_date"/>
<label name="end_date"/>
<field name="end_date"/>
<!-- <label name="provider_link"/>
<field name="provider_link" widget="url" xexpand="1" width="40"/> -->
<notebook colspan="6">
<page string="Suppliers" id="suppliers" col="4">
<field name="suppliers" colspan="4"/>
</page>
<page string="Invoice Lines" id="main_info" col="4">
<field name="invoice_lines" colspan="4"/>
<group col="2" colspan="2" id="states" yfill="1">
<label name="state"/>
<field name="state"/>
<newline/>
</group>
<group col="2" colspan="2" id="totals" yfill="1">
<label name="total_amount" xalign="1.0" xexpand="1"/>
<field name="total_amount" symbol="currency" xalign="1.0" xexpand="0"/>
<label name="vat_amount" xalign="1.0" xexpand="1"/>
<field name="vat_amount" symbol="currency" xalign="1.0" xexpand="0"/>
</group>
</page>
<page string="xml" id="xml_cp" col="1">
<label name="xml_certificate"/>
<field name="xml_certificate"/>
</page>
</notebook>
<group col='4' colspan='4' id="buttons">
<button name="draft" string="Draft" icon="tryton-clear"/>
<button name="process" string="Process" icon="tryton-forward"/>
<button name="create_certificate" string="create_certificate" icon="tryton-forward"/>
<button name="done" string="Done" icon="tryton-forward"/>
<button name="cancel" string="cancel" icon="tryton-forward"/>
</group>
</form>

View File

@ -0,0 +1,9 @@
<?xml version="1.0"?>
<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
this repository contains the full copyright notices and license terms. -->
<form>
<label name="invoice"/>
<field name="invoice"/>
<label name="invoice_line"/>
<field name="invoice_line"/>
</form>

View File

@ -0,0 +1,7 @@
<?xml version="1.0"?>
<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
this repository contains the full copyright notices and license terms. -->
<tree>
<field name="invoice"/>
<field name="invoice_line"/>
</tree>

View File

@ -0,0 +1,10 @@
<?xml version="1.0"?>
<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
this repository contains the full copyright notices and license terms. -->
<tree>
<field name="number"/>
<!-- <field name="supplier"/> -->
<field name="state"/>
<field name="start_date"/>
<field name="end_date"/>
</tree>

View File

@ -11,4 +11,9 @@ this repository contains the full copyright notices and license terms. -->
<label name="hts"/>
<field name="hts"/>
</xpath>
<xpath expr="/form/notebook/page[@id='suppliers']/field[@name='purchase_uom']"
position="after">
<label name="harmonized_tariff_schedule"/>
<field name="harmonized_tariff_schedule"/>
</xpath>
</data>