Преглед изворни кода

Crear órdenes de cobro para bioelectric.

SEBAS пре 1 недеља
родитељ
комит
1fe285c439
8 измењених фајлова са 237 додато и 250 уклоњено
  1. BIN
      __init__.pyc
  2. 62 139
      orden_cobro.py
  3. BIN
      orden_cobro.pyc
  4. 6 6
      orden_cobro_report.xml
  5. 112 105
      orden_cobro_view.xml
  6. 28 0
      wizard_select_invoice.py
  7. BIN
      wizard_select_invoice.pyc
  8. 29 0
      wizard_select_invoice_view.xml

+ 62 - 139
orden_cobro.py

@@ -21,10 +21,7 @@
 
 
 from openerp import models, fields, api
-from openerp.exceptions import ValidationError, except_orm, Warning, RedirectWarning
-from openerp.tools import DEFAULT_SERVER_TIME_FORMAT
-from openerp.tools import DEFAULT_SERVER_DATETIME_FORMAT
-from datetime import datetime
+from openerp.exceptions import ValidationError
 
 class OrdenCobro(models.Model):
     _name = 'orden.cobro'
@@ -36,154 +33,80 @@ class OrdenCobro(models.Model):
     def _get_number(self):
         return self.env['ir.sequence'].next_by_code('orden.cobro') or '*'
 
-    name = fields.Char(
-        string=u'Referencia',
-        readonly=True,
-        default=_get_number,
-    )
-
-    partner_id = fields.Many2one(
-        'res.partner',
-        string='Cliente',
-        required=True
-    )
-
-    date = fields.Date(
-        string='Fecha elab.',
-        default=fields.Date.context_today
-    )
-
-    user_id = fields.Many2one(
-        comodel_name='res.users',
-        string='Preparado por:',
-        default=_get_user
-    )
-
-    company_id = fields.Many2one(
-        'res.company',
-        string='Compañía',
-        required=True,
-        default=lambda self: self.env.user.company_id
-    )
-
-    invoice_ids = fields.One2many(
-        comodel_name='account.invoice',
-        inverse_name='ordencobro_invoice_id',
+    name = fields.Char(string=u'Referencia', readonly=True, default=_get_number)
+    partner_id = fields.Many2one('res.partner', string='Cliente', required=True)
+    date = fields.Date(string='Fecha elab.', default=fields.Date.context_today)
+    user_id = fields.Many2one('res.users', string='Preparado por:', default=_get_user)
+    company_id = fields.Many2one('res.company', string='Compañía', required=True, default=lambda self: self.env.user.company_id)
+    # account_invoice_id = fields.Many2one('account.invoice', string='Factura')
+    # invoice_line_ids = fields.One2many('orden.cobro.line', 'orden_cobro_id', string='Facturas')
+    invoice_line_ids = fields.One2many(
+        comodel_name='orden.cobro.line',
+        inverse_name='orden_cobro_id',
         string='Facturas'
     )
-
-    responsable = fields.Char(
-        string='Aprobado Gerencia General:'
-    )
-
-    celular_partner = fields.Char(
-        related='partner_id.mobile',
-        string='Móvil',
-        store=True
-    )
-
-    telefono_partner = fields.Char(
-        related='partner_id.phone',
-        string='Teléfono',
-        store=True
-    )
-
-    ruc_partner = fields.Char(
-        related='partner_id.ruc',
-        string='RUC:',
-        readonly=True
-    )
-
-    forma_cobro = fields.Char(
-        string='Forma de Cobro'
-    )
-
-    presupuesto_nro = fields.Char(
-        string='Presupuesto N°'
-    )
-
-    cheque_nro = fields.Char(
-        string='Cheque N°'
-    )
-
-    transf_nro = fields.Char(
-        string='Transferencia N°'
-    )
-
-    cheque_banco = fields.Char(
-        string='Banco Cheque'
-    )
-
-    transf_banco = fields.Char(
-        string='Cuenta Bancaria'
-    )
-
-    concepto = fields.Char(
-        string='Concepto'
-    )
-
-    currency_id = fields.Many2one(
-        'res.currency',
-        string='Moneda',
-        related='company_id.currency_id',
-        store=True,
-        readonly=True
-    )
-
+    responsable = fields.Char(string='Aprobado Gerencia General:')
+    celular_partner = fields.Char(related='partner_id.mobile', string='Móvil', store=True)
+    telefono_partner = fields.Char(related='partner_id.phone', string='Teléfono', store=True)
+    ruc_partner = fields.Char(related='partner_id.ruc', string='RUC:', readonly=True)
+    forma_cobro = fields.Char(string='Forma de Cobro')
+    presupuesto_nro = fields.Char(string='Presupuesto N°')
+    cheque_nro = fields.Char(string='Cheque N°')
+    transf_nro = fields.Char(string='Transferencia N°')
+    cheque_banco = fields.Char(string='Banco Cheque')
+    transf_banco = fields.Char(string='Cuenta Bancaria')
+    concepto = fields.Char(string='Concepto')
+    currency_id = fields.Many2one('res.currency', related='company_id.currency_id', string='Moneda', store=True, readonly=True)
     is_efec = fields.Boolean(string="Efectivo", default=False)
     is_cheq = fields.Boolean(string="Cheque", default=False)
     is_transf = fields.Boolean(string="Transferencia", default=False)
+    comprobante_monto = fields.Float(string='Importe Comprobante')
+    obra = fields.Char(string='Obra')
+    solicitado_por = fields.Char(string='Recibido por')
+    obs = fields.Char(string='Obs.')
+    total = fields.Float(string='Total', compute='_compute_total', store=True)
 
-    comprobante_monto = fields.Float(
-        string='Importe Comprobante'
-    )
-
-    obra = fields.Char(
-        string='Obra'
-    )
-
-    solicitado_por = fields.Char(
-        string='Recicbido por'
-    )
-
-    obs = fields.Char(
-        string='Obs.'
-    )
-
-    total = fields.Float(
-        string='Total',
-        compute='_compute_total',
-        store=True
-    )
-
-
-    @api.depends('invoice_ids.amount_total')
+    @api.depends('invoice_line_ids.monto_cobrado')
     def _compute_total(self):
         for rec in self:
-            rec.total = sum(line.amount_total for line in rec.invoice_ids)
-
-
-    @api.onchange('partner_id')
-    def _onchange_partner_id(self):
-        # Filtro dinámico para facturas abiertas del cliente seleccionado
-        if self.partner_id:
-            return {
-                'domain': {
-                    'invoice_ids': [
-                        ('partner_id', '=', self.partner_id.id),
-                        ('state', '=', 'open'),
-                        ('type', '=', 'out_invoice')
-                    ]
+            rec.total = sum(line.monto_cobrado for line in rec.invoice_line_ids if line.invoice_id)
+
+    # @api.constrains('invoice_line_ids')
+    # def _check_invoice_lines(self):
+    #     for rec in self:
+    #         for line in rec.invoice_line_ids:
+    #             if not line.invoice_id:
+    #                 raise ValidationError("Todas las líneas deben tener una factura seleccionada.")
+
+    @api.multi
+    def action_buscar_facturas(self):
+        self.ensure_one()
+        return {
+                'type': 'ir.actions.act_window',
+                'res_model': 'wizard.select.invoice',
+                'view_type': 'form',
+                'view_mode': 'form',
+                'target': 'new',
+                'context': {
+                    'default_orden_cobro_id': self.id,
                 }
-            }
+        }
+
+class OrdenCobroLine(models.Model):
+    _name = 'orden.cobro.line'
+    _description = 'Detalle de Facturas en Orden de Cobro'
 
+    orden_cobro_id = fields.Many2one(comodel_name='orden.cobro', string='Orden de cobro')
+    invoice_id = fields.Many2one('account.invoice', string='Factura',
+        domain="[('partner_id', '=', parent.partner_id), ('state', '=', 'open'), ('type', '=', 'out_invoice')]")
+    invoice_number = fields.Char(related='invoice_id.number', string='Nro Factura', readonly=True)
+    invoice_total = fields.Float(related='invoice_id.amount_total', string='Total Factura', readonly=True)
+    monto_cobrado = fields.Float(string='Monto a cobrar', required=True)
 
 
 
 class AccountInvoice(models.Model):
     _inherit = 'account.invoice'
 
-    ordencobro_invoice_id = fields.Many2one(
-        comodel_name='orden.cobro',
-        string='Orden de cobro'
-    )
+    ordencobro_id = fields.One2many('orden.cobro.line', 'invoice_id', string='Órdenes de cobro relacionadas')
+    # ordencobro_id = fields.Many2one(comodel_name='orden.cobro.line', 'invoice_id', string='Órdenes de cobro relacionadas')


+ 6 - 6
orden_cobro_report.xml

@@ -106,9 +106,9 @@
                         </tr>
                       </thead>
                       <tbody>
-                        <tr t-foreach="o.invoice_ids" t-as="line">
-                          <td style="border: 1px solid #ddd; padding: 7px;"><span t-esc="line.name"/></td>
-                          <td style="border: 1px solid #ddd; padding: 7px; text-align: right;"><span t-esc="'{0:,.0f}'.format(line.amount_total)"/></td>
+                        <tr t-foreach="o.invoice_line_ids" t-as="line">
+                          <td style="border: 1px solid #ddd; padding: 7px;"><span t-esc="line.invoice_number"/></td>
+                          <td style="border: 1px solid #ddd; padding: 7px; text-align: right;"><span t-esc="'{0:,.0f}'.format(line.monto_cobrado)"/></td>
                         </tr>
                       </tbody>
                     </table>
@@ -158,18 +158,18 @@
                     </table>
                   </div>
                 </div>
-                <table style="width:100%; margin-top: 20px; font-size: 11px;">
+                <table style="width:100%; margin-top: 10px; font-size: 11px;">
                   <tr style="height: 25px;">
                     <td><strong>Obs.:</strong> <span t-esc="o.obs or ''"/></td>
                   </tr>
 
                 </table>
-                <table style="width:100%; margin-top: 20px; font-size: 11px;">
+                <table style="width:100%; margin-top: 10px; font-size: 11px;">
                   <tr style="height: 25px;">
                     <td><strong>Recibido por:</strong> <span t-esc="o.solicitado_por or ''"/></td>
 
                   </tr>
-                  <tr style="height: 25px;">
+                  <tr style="height: 5px;">
 
                   </tr>
                   <tr style="height: 25px;">

+ 112 - 105
orden_cobro_view.xml

@@ -2,125 +2,132 @@
 <openerp>
     <data>
 
-      <!-- <act_window
-            id="action_open_account_invoice_cobroorden"
-            name="Servicios"
-            res_model="account.invoice"
-            view_type="form"
-            view_mode="tree,form"
-            domain="[('ordencobro_invoice_id', '=', active_id)]"/> -->
+        <!-- Vista formulario principal orden.cobro -->
+        <record id="view_orden_cobro_form" model="ir.ui.view">
+            <field name="name">orden.cobro.form</field>
+            <field name="model">orden.cobro</field>
+            <field name="type">form</field>
+            <field name="arch" type="xml">
+                <form string="Orden de Cobro">
+                    <sheet>
+                        <group>
+                            <group>
+                                <field name="name" readonly="1"/>
+                                <field name="partner_id" required="1"/>
+                                <field name="celular_partner" readonly="1"/>
+                                <field name="obra"/>
+                                <field name="concepto"/>
+                                <field name="is_efec"/>
+                                <field name="is_cheq"/>
+                                <field name="cheque_banco"/>
+                                <field name="transf_nro"/>
+                                <field name="user_id" readonly="1"/>
+                            </group>
+                            <group>
+                                <field name="date" required="1"/>
+                                <field name="ruc_partner" readonly="1"/>
+                                <field name="telefono_partner" readonly="1"/>
+                                <field name="presupuesto_nro"/>
+                                <field name="currency_id" readonly="1"/>
+                                <field name="responsable"/>
+                                <field name="cheque_nro"/>
+                                <field name="is_transf"/>
+                                <field name="transf_banco"/>
+                                <field name="solicitado_por"/>
+                            </group>
+                        </group>
 
-            <!-- Vista Formulario Orden de cobro -->
-          <record id="view_orden_cobro_form" model="ir.ui.view">
-              <field name="name">orden.cobro.form</field>
-              <field name="model">orden.cobro</field>
-              <field name="arch" type="xml">
-                  <form string="Orden de cobro">
-                      <sheet>
                         <group>
-                          <group>
-                              <field name="name" readonly="1"/>
-                              <field name="partner_id" required="1"/>
-                              <field name="celular_partner" readonly="1"/>
-                              <field name="obra"/>
-                              <field name="concepto"/>
-                              <field name="is_efec"/>
-                              <field name="is_cheq"/>
-                              <field name="cheque_banco"/>
-                              <field name="transf_nro"/>
-                              <field name="user_id" readonly="1"/>
-                          </group>
-                          <group>
-                              <field name="date" required="1"/>
-                              <field name="ruc_partner" readonly="1"/>
-                              <field name="telefono_partner" readonly="1"/>
-                              <field name="presupuesto_nro"/>
-                              <field name="currency_id" readonly="1"/>
-                              <field name="responsable"/>
-                              <field name="cheque_nro"/>
-                              <field name="is_transf"/>
-                              <field name="transf_banco"/>
-                              <field name="solicitado_por"/>
-                          </group>
-                         </group>
-                         <group>
                             <field name="obs"/>
-                         </group>
-                          <notebook>
-                              <page>
-                                <span style="font-weight:bold;">Facturas relacionadas al Orden de cobro</span>
+                        </group>
 
-                                <field name="invoice_ids" widget="many2many" options="{'no_create': False}">
+                          <!-- <notebook>
+                              <page>
+                                <field name="invoice_line_ids">
                                    <tree editable="top">
-                                       <field name="name" string="Número de factura" />
-                                      <field name="date_invoice" string="Fecha de factura" />
-                                        <field name="residual" string="Saldo" sum="Saldo" />
-                                        <field name="amount_total" string="Total factura" sum="Total" />
-                                        <field name="state" string="Estado" />
+                                       <field name="invoice_id" string="Número de factura" />
+                                       <field name="invoice_number" string="Número de factura" />
+                                        <field name="invoice_total" string="Saldo" sum="Saldo" />
+                                        <field name="monto_cobrado" string="Total a cobrar" sum="Total" />
                                     </tree>
                                 </field>
-                              </page>
-                          </notebook>
+                                </page>
+                            </notebook> -->
 
-                          <group>
-                              <field name="total" readonly="1"/>
-                          </group>
-
-                      </sheet>
-                  </form>
-              </field>
-          </record>
-
-          <!-- Vista Árbol Orden de cobro -->
-          <record id="view_orden_cobro_tree" model="ir.ui.view">
-              <field name="name">orden.cobro.tree</field>
-              <field name="model">orden.cobro</field>
-              <field name="arch" type="xml">
-                  <tree>
-                      <field name="name"/>
-                      <field name="partner_id"/>
-                      <field name="date"/>
-                      <field name="total"/>
-                  </tree>
-              </field>
-          </record>
+                            <notebook>
+                                 <page string="Facturas a cobrar">
+                                     <field name="invoice_line_ids">
+                                         <tree editable="bottom">
+                                             <field name="invoice_id"
+                                                 domain="[('partner_id', '=', parent.partner_id), ('state', '=', 'open'), ('type', '=', 'out_invoice')]"/>
+                                            <field name="invoice_number" string="Número de factura" />
+                                            <field name="invoice_total" string="Saldo" sum="Saldo" />
+                                            <field name="monto_cobrado" string="Total a cobrar" sum="Total" />
+                                         </tree>
+                                     </field>
+                                 </page>
+                             </notebook>
+                        <group>
+                            <field name="total" readonly="1"/>
+                        </group>
+                    </sheet>
+                </form>
+            </field>
+        </record>
 
-          <!-- Acción de Ventana Orden de cobro -->
-          <record id="action_orden_cobro" model="ir.actions.act_window">
-              <field name="name">Órdenes de cobro</field>
-              <field name="res_model">orden.cobro</field>
-              <field name="view_type">form</field>
-              <field name="view_mode">tree,form</field>
-          </record>
+        <!-- Acción -->
+        <record id="action_orden_cobro" model="ir.actions.act_window">
+            <field name="name">Órdenes de Cobro</field>
+            <field name="res_model">orden.cobro</field>
+            <field name="view_type">form</field>
+            <field name="view_mode">tree,form</field>
+        </record>
 
-          <!-- search view -->
+        <record id="search_orden_cobro_line" model="ir.ui.view">
+               <field name="name">orden.cobro.line.search</field>
+               <field name="model">orden.cobro.line</field>
+               <field name="arch" type="xml">
+                   <search string="Facturas">
+                     <field name="invoice_id"/>
+                     <field name="invoice_number"/>
+                     <field name="invoice_total"/>
+                     <field name="monto_cobrado" sum="total"/>
+                   </search>
+               </field>
+           </record>
 
-          <record id="search_orden_cobro_search" model="ir.ui.view">
-              <field name="name">orden.cobro.search</field>
-              <field name="model">orden.cobro</field>
-              <field name="arch" type="xml">
-                  <search string="Orden de cobro">
-                      <field name="name"/>
-                      <field name="partner_id"/>
-                      <field name="ruc_partner"/>
-                      <separator/>
-                    <filter string="Creado Hoy" domain="[('date', '&gt;=', datetime.datetime.now().strftime('%Y-%m-%d 00:00:00')),('date', '&lt;=',datetime.datetime.now().strftime('%Y-%m-%d 23:23:59'))]"/>
-                    <filter string="Creado mes actual" domain="[('date','&lt;',(context_today()+relativedelta(months=1)).strftime('%%Y-%%m-01')), ('date','&gt;=',time.strftime('%%Y-%%m-01'))]"/>
-                    <filter string="Creado semana anterior" domain="[('date', '&gt;=', ((context_today()+relativedelta(weeks=-2, days=1, weekday=0)).strftime('%%Y-%%m-%%d'))),('date', '&lt;=', ((context_today()+relativedelta(weeks=-1, weekday=6)).strftime('%%Y-%%m-%%d')))]"/>
-                    <filter string="Creado esta semana" domain="[('date', '&gt;=', ((context_today()+relativedelta(weeks=-1, days=1, weekday=0)).strftime('%%Y-%%m-%%d'))),('date', '&lt;=', ((context_today()+relativedelta(weeks=0, weekday=6)).strftime('%%Y-%%m-%%d')))]"/>
+           <record id="form_orden_cobro_line" model="ir.ui.view">
+               <field name="name">orden.cobro.line.form</field>
+               <field name="model">orden.cobro.line</field>
+               <field name="arch" type="xml">
+                   <form string="Facturas">
+                       <sheet>
+                           <group>
+                              <field name="invoice_id"/>
+                               <field name="invoice_number"/>
+                               <field name="invoice_total"/>
+                               <field name="monto_cobrado" sum="total"/>
+                           </group>
+                       </sheet>
+                   </form>
+               </field>
+           </record>
 
-                      <group expand="0" string="Agrupar por...">
-                          <filter string="Por dia" context="{'group_by':'date:day'}"/>
-                          <filter string="Por mes" context="{'group_by':'date:month'}"/>
-                          <filter string="Usuario" domain="[]" context="{'group_by':'user_id'}" />
-                          <filter string="Cliente" domain="[]" context="{'group_by':'partner_id'}" />
-                      </group>
-                  </search>
-              </field>
-          </record>
+           <record id="action_orden_cobro_line" model="ir.actions.act_window">
+               <field name="name">Facturas</field>
+               <field name="type">ir.actions.act_window</field>
+               <field name="res_model">orden.cobro.line</field>
+               <field name="view_type">form</field>
+               <field name="view_mode">tree,form</field>
+               <field name="search_view_id" ref="search_orden_cobro_line"/>
+           </record>
 
         <!-- Menú -->
-        <menuitem id="menu_orden_cobro_main" name="Órdenes de cobro"  parent="account.menu_finance_receivables" action="action_orden_cobro" sequence="60"/>
+        <menuitem id="menu_orden_cobro_main"
+                  name="Órdenes de cobro"
+                  parent="account.menu_finance_receivables"
+                  action="action_orden_cobro"
+                  sequence="60"/>
 
     </data>
 </openerp>

+ 28 - 0
wizard_select_invoice.py

@@ -0,0 +1,28 @@
+from openerp import api, models, fields
+from num2words import num2words
+
+
+class WizardSelectInvoice(models.TransientModel):
+    _name = 'wizard.select.invoice'
+
+    orden_cobro_id = fields.Many2one('orden.cobro', string="Orden de Cobro", readonly=True)
+    invoice_ids = fields.Many2many('account.invoice', string="Facturas")
+
+    @api.model
+    def default_get(self, fields_list):
+        res = super(WizardSelectInvoice, self).default_get(fields_list)
+        orden_id = self.env.context.get('active_id')
+        if orden_id:
+            res['orden_cobro_id'] = orden_id
+        return res
+
+    def action_add_invoices(self):
+        for wizard in self:
+            orden = wizard.orden_cobro_id
+            for factura in wizard.invoice_ids:
+                orden.invoice_line_ids.create({
+                    'orden_cobro_id': orden.id,
+                    'invoice_id': factura.id,
+                    'monto_cobrado': factura.residual,
+                })
+        return {'type': 'ir.actions.act_window_close'}

BIN
wizard_select_invoice.pyc


+ 29 - 0
wizard_select_invoice_view.xml

@@ -0,0 +1,29 @@
+<?xml version="1.0"?>
+<openerp>
+  <data>
+    <record id="view_wizard_select_invoice_form" model="ir.ui.view">
+      <field name="name">wizard.select.invoice.form</field>
+      <field name="model">wizard.select.invoice</field>
+      <field name="type">form</field>
+      <field name="arch" type="xml">
+        <form string="Seleccionar Facturas">
+          <group>
+            <field name="invoice_ids" widget="many2many_tags"/>
+          </group>
+          <footer>
+            <button string="Aceptar" type="object" name="confirmar_seleccion" class="oe_highlight"/>
+            <button string="Cancelar" class="oe_link" special="cancel"/>
+          </footer>
+        </form>
+      </field>
+    </record>
+
+    <record id="action_wizard_select_invoice" model="ir.actions.act_window">
+      <field name="name">Seleccionar Facturas</field>
+      <field name="res_model">wizard.select.invoice</field>
+      <field name="view_type">form</field>
+      <field name="view_mode">form</field>
+      <field name="target">new</field>
+    </record>
+  </data>
+</openerp>