This commit is contained in:
Mauricio Baeza 2018-09-28 02:17:17 -05:00
parent 17a9b00cb5
commit d795069b38
10 changed files with 290 additions and 39 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 712 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 476 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 704 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 483 B

View File

@ -59,7 +59,7 @@ from settings import DEBUG, MV, log, template_lookup, COMPANIES, DB_SAT, \
PATH_XSLT, PATH_XSLTPROC, PATH_OPENSSL, PATH_TEMPLATES, PATH_MEDIA, PRE, \
PATH_XMLSEC, TEMPLATE_CANCEL, DEFAULT_SAT_PRODUCTO, DECIMALES, DIR_FACTURAS
from settings import DEBUG, SEAFILE_SERVER, USAR_TOKEN, API
from settings import SEAFILE_SERVER, USAR_TOKEN, API, DECIMALES_TAX
from .configpac import AUTH
@ -2310,7 +2310,9 @@ def get_bool(value):
return False
def get_float(value):
def get_float(value, four=False):
if four:
return round(float(value), DECIMALES_TAX)
return round(float(value), DECIMALES)

View File

@ -1665,7 +1665,7 @@ class CuentasBanco(BaseModel):
)
def __str__(self):
return '{} ({})'.format(self.banco.name, self.cuenta[-4:])
return '{} ({})'.format(self.nombre, self.cuenta[-4:])
@classmethod
def activate(cls, values):
@ -1732,13 +1732,14 @@ class CuentasBanco(BaseModel):
rows = (CuentasBanco
.select()
.where(CuentasBanco.de_emisor==True, CuentasBanco.activa==True)
.order_by(CuentasBanco.id)
)
if not (len(rows)):
return {'ok': False}
first = rows[0]
rows = [{'id': r.id, 'value': '{} ({})'.format(
r.banco.name, r.cuenta[-4:])} for r in rows]
r.nombre, r.cuenta[-4:])} for r in rows]
data = {
'ok': True,
'rows': tuple(rows),
@ -1917,11 +1918,14 @@ class MovimientosBanco(BaseModel):
else:
actualizar = True
hora = values.pop('hora')
account = CuentasBanco.get(CuentasBanco.id==int(values['cuenta']))
values['fecha'] = '{}T{}'.format(values['fecha'][:10], hora)
values['cuenta'] = int(values['cuenta'])
values['cuenta'] = account
values['moneda'] = account.moneda.key
values['retiro'] = util.get_float(values['retiro'])
values['deposito'] = util.get_float(values['deposito'])
values['tipo_cambio'] = util.get_float(values.get('tipo_cambio', 1.00))
values['tipo_cambio'] = util.get_float(
values.get('tipo_cambio', 1.00), True)
values['forma_pago'] = int(values['forma_pago'])
ultimo_saldo = self._ultimo_saldo(
@ -1959,11 +1963,11 @@ class MovimientosBanco(BaseModel):
msg = 'El movimiento esta conciliado, no se puede cancelar'
return {'ok': False, 'msg': msg}
filters = (CfdiPagos.movimiento==obj)
cp = CfdiPagos.select().where(filters).count()
if cp > 0:
msg = 'El movimiento tiene Factura de Pago, no se puede cancelar'
return {'ok': False, 'msg': msg}
# ~ filters = (CfdiPagos.movimiento==obj)
# ~ cp = CfdiPagos.select().where(filters).count()
# ~ if cp > 0:
# ~ msg = 'El movimiento tiene Factura de Pago, no se puede cancelar'
# ~ return {'ok': False, 'msg': msg}
with database_proxy.transaction():
obj.cancelado = True
@ -2481,6 +2485,7 @@ class Socios(BaseModel):
auto_round=True)
web = TextField(default='')
correo_facturas = TextField(default='')
correo_facturasp = TextField(default='')
forma_pago = ForeignKeyField(SATFormaPago, null=True)
condicion_pago = ForeignKeyField(CondicionesPago, null=True)
addenda = ForeignKeyField(Addendas, null=True)
@ -2525,6 +2530,7 @@ class Socios(BaseModel):
'correo_facturas', 'plantilla', 'id_fiscal')
for name in ft:
fields[name] = values.get(name, '')
fields['correo_facturasp'] = values.pop('partner_email_fp', '')
if fields['pais'] != 'México':
fields['pais'] = fields['pais'].upper()
@ -2543,6 +2549,7 @@ class Socios(BaseModel):
row['condicion_pago'] = \
str(CondicionesPago.get(id=row['condicion_pago']))
row['partner_balance'] = row.pop('saldo_cliente')
row['partner_email_fp'] = row.pop('correo_facturasp')
return row
#~ return {'data': data['rows'][:100], 'pos':0, 'total_count': 1300}
@ -5680,7 +5687,8 @@ class CfdiPagos(BaseModel):
impuestos = {}
mov = invoice.movimiento
currency = mov.cuenta.moneda.key
# ~ currency = mov.cuenta.moneda.key
currency = mov.moneda
related_docs = self._get_related_xml(self, invoice.movimiento, currency)
pagos = {
'FechaPago': mov.fecha.isoformat()[:19],
@ -5709,6 +5717,7 @@ class CfdiPagos(BaseModel):
def _stamp(self, values):
id_mov = int(values['id_mov'])
send_email = util.get_bool(Configuracion.get_('correo_directo'))
auth = Emisor.get_auth()
filters = (
(CfdiPagos.movimiento==id_mov) &
@ -5742,7 +5751,8 @@ class CfdiPagos(BaseModel):
'row': row,
}
if result['ok']:
self._sync(self, obj.id)
self._sync(self, obj.id, send_email)
return result
def _get_related(self, values):
@ -5833,9 +5843,10 @@ class CfdiPagos(BaseModel):
return doc, name
@util.run_in_thread
def _sync(self, id):
CfdiPagos.get_file_xml(id)
CfdiPagos.get_file_pdf(id)
def _sync(self, id, send_email=False):
files = (CfdiPagos.get_file_xml(id), CfdiPagos.get_file_pdf(id))
if send_email:
self._send(self, {'id': id}, files)
return
@util.run_in_thread
@ -5848,7 +5859,45 @@ class CfdiPagos(BaseModel):
opt = values.pop('opt')
return getattr(cls, '_get_{}'.format(opt))(cls, values)
def _send(self, values):
def _get_table(self, values):
# ~ print('\n\n', values, '\n')
if 'start' in values:
filters = CfdiPagos.fecha.between(
util.get_date(values['start']),
util.get_date(values['end'], True))
else:
if values['year'] == '-1':
fy = (CfdiPagos.fecha.year > 0)
else:
fy = (CfdiPagos.fecha.year == int(values['year']))
if values['month'] == '-1':
fm = (CfdiPagos.fecha.month > 0)
else:
fm = (CfdiPagos.fecha.month == int(values['month']))
filters = (fy & fm)
rows = tuple(CfdiPagos.select(
CfdiPagos.id,
CfdiPagos.serie,
CfdiPagos.folio,
CfdiPagos.uuid,
CfdiPagos.fecha,
CfdiPagos.tipo_comprobante,
CfdiPagos.estatus,
case(MovimientosBanco.cancelado, (
(True, 'Cancelado'),
(False, 'Activo'),
)).alias('movimiento'),
MovimientosBanco.deposito.alias('total'),
MovimientosBanco.moneda.alias('currency'),
(MovimientosBanco.deposito * MovimientosBanco.tipo_cambio).alias('total_mn'),
Socios.nombre.alias('cliente'))
.join(MovimientosBanco).switch(CfdiPagos)
.join(Socios).switch(CfdiPagos)
.where(filters).dicts())
return {'ok': True, 'rows': rows}
def _send(self, values, files=()):
id = int(values['id'])
values = Configuracion.get_({'fields': 'correo'})
@ -5861,12 +5910,13 @@ class CfdiPagos(BaseModel):
msg = 'La factura no esta timbrada'
return {'ok': False, 'msg': msg}
to = obj.socio.correo_facturas
to = obj.socio.correo_facturasp or obj.socio.correo_facturas
if not to:
msg = 'El cliente no tiene configurado el correo para facturas'
return {'ok': False, 'msg': msg}
files = (self.get_file_pdf(id), self.get_file_xml(id))
if not files:
files = (self.get_file_pdf(id), self.get_file_xml(id))
fields = util.make_fields(obj.xml)
server = {
@ -8142,12 +8192,15 @@ def _migrate_tables(rfc=''):
if not 'id_fiscal' in columns:
id_fiscal = TextField(default='')
migrations.append(
migrator.add_column(
'socios', 'id_fiscal', id_fiscal))
migrator.add_column('socios', 'id_fiscal', id_fiscal))
if not 'plantilla' in columns:
plantilla = TextField(default='')
migrations.append(
migrator.add_column('socios', 'plantilla', plantilla))
if not 'correo_facturasp' in columns:
correo_facturasp = TextField(default='')
migrations.append(
migrator.add_column('socios', 'correo_facturasp', correo_facturasp))
columns = [c.name for c in database_proxy.get_columns('folios')]
if not 'plantilla' in columns:

View File

@ -25,6 +25,7 @@ function init_config_bank(){
var multi_currency = get_config('multi_currency')
var g1 = $$('grid_cfdi_por_pagar')
var g2 = $$('grid_cfdi_este_deposito')
var g3 = $$('grid_bank_invoice_pay')
if(multi_currency){
g1.showColumn('total')
@ -33,9 +34,11 @@ function init_config_bank(){
g2.showColumn('currency')
g2.showColumn('this_pay')
g2.showColumn('type_change')
g3.showColumn('total')
g3.showColumn('currency')
}
show('cmd_complemento_pago', get_config('used_cfdi_pays'))
//~ show('cmd_show_invoice_pay', get_config('used_cfdi_pays'))
show('cmd_show_invoice_pay', get_config('used_cfdi_pays'))
set_year_month()
}
@ -52,6 +55,7 @@ var bancos_controllers = {
$$('cmd_invoice_payed').attachEvent('onItemClick', cmd_invoice_payed_click)
$$('txt_retiro_importe').attachEvent('onChange', txt_retiro_importe_change)
$$('txt_deposito_importe').attachEvent('onChange', txt_deposito_importe_change)
$$('deposit_type_change').attachEvent('onChange', deposit_type_change_change)
$$('grid_cfdi_este_deposito').attachEvent('onAfterDrop', grid_cfdi_este_deposito_after_drop)
$$('grid_cfdi_por_pagar').attachEvent('onAfterDrop', grid_cfdi_por_pagar_after_drop)
$$('grid_cfdi_este_deposito').attachEvent('onBeforeEditStop', grid_cfdi_este_deposito_before_edit_stop)
@ -66,6 +70,10 @@ var bancos_controllers = {
$$('grid_cfdi_pay').attachEvent('onItemClick', grid_cfdi_pay_click)
$$('grid_cfdi_por_pagar').attachEvent('onItemDblClick', grid_cfdi_por_pagar_double_click)
$$('grid_cfdi_este_deposito').attachEvent('onItemDblClick', grid_cfdi_este_deposito_double_click)
$$('cmd_show_invoice_pay').attachEvent('onItemClick', cmd_show_invoice_pay_click)
$$('filter_invoice_pay_year').attachEvent('onChange', filter_invoice_pay_change)
$$('filter_invoice_pay_month').attachEvent('onChange', filter_invoice_pay_change)
$$('grid_bank_invoice_pay').attachEvent('onItemClick', grid_bank_invoice_pay_click)
init_config_bank()
}
@ -75,6 +83,7 @@ var bancos_controllers = {
function set_year_month(){
var d = new Date()
var y = $$('filter_cuenta_year')
var y2 = $$('filter_invoice_pay_year')
var m = $$('filter_cuenta_month')
webix.ajax().get('/values/cuentayears', {
@ -85,6 +94,7 @@ function set_year_month(){
success:function(text, data, XmlHttpRequest){
var values = data.json()
y.getList().parse(values)
y2.getList().parse(values)
y.blockEvent()
m.blockEvent()
y.setValue(d.getFullYear())
@ -378,14 +388,22 @@ function cmd_guardar_retiro_click(){
function txt_retiro_importe_change(new_value, old_value){
if(!isFinite(new_value)){
if(!isFinite(new_value) || !new_value){
this.config.value = old_value
this.refresh()
}
}
function txt_deposito_importe_change(new_value, old_value){
if(!isFinite(new_value)){
if(!isFinite(new_value) || !new_value){
this.config.value = old_value
this.refresh()
}
}
function deposit_type_change_change(new_value, old_value){
if(!isFinite(new_value) || !new_value){
this.config.value = old_value
this.refresh()
}
@ -525,7 +543,7 @@ function grid_cfdi_este_deposito_before_edit_stop(state, editor){
function validate_deposito(values){
var grid = $$('grid_cfdi_este_deposito')
var importe = values.deposito_importe.to_float()
var type_change = values.deposit_type_change.to_float()
var type_change = values.deposit_type_change.to_float4()
var msg_tc = ''
if(!importe){
@ -642,7 +660,7 @@ function guardar_deposito(values){
data['numero_operacion'] = values.deposito_referencia.trim()
data['forma_pago'] = $$('lst_deposito_forma_pago').getValue()
data['deposito'] = values.deposito_importe.to_float()
data['tipo_cambio'] = values.deposit_type_change.to_float()
data['tipo_cambio'] = values.deposit_type_change.to_float4()
data['retiro'] = 0.0
data['descripcion'] = values.deposito_descripcion
@ -768,8 +786,9 @@ function cmd_cancelar_movimiento_click(){
return
}
var msg = '¿Estás seguro de cancelar el movimiento seleccionado?'
msg += '<BR><BR>ESTA ACCIÓN NO SE PUEDE DESHACER<BR><BR>'
var msg = '¿Estás seguro de cancelar el movimiento seleccionado?<BR><BR>'
msg += 'SI EL MOVIMIENTO TIENE FACTURA DE PAGO, QUEDARÁ HUERFANA<BR><BR>'
msg += 'ESTA ACCIÓN NO SE PUEDE DESHACER<BR><BR>'
webix.confirm({
title: 'Cancelar Movimiento',
ok: 'Si',
@ -841,6 +860,11 @@ function filter_cuenta_change(){
}
function filter_invoice_pay_change(){
get_invoices_pay()
}
function filter_cuenta_dates_change(range){
if(range.start != null && range.end != null){
get_estado_cuenta(range)
@ -955,6 +979,8 @@ function send_stamp_cfdi_pay(id_mov){
var g = $$('grid_cfdi_pay')
var data = {'opt': 'stamp', 'id_mov': id_mov}
//~ ToDo Actualizar cantidad de facturas de pago en el movimiento
webix.ajax().sync().post('cfdipay', data, {
error:function(text, data, XmlHttpRequest){
msg = 'Ocurrio un error, consulta a soporte técnico'
@ -1156,6 +1182,20 @@ function grid_cfdi_pay_click(id, e, node){
}
function grid_bank_invoice_pay_click(id, e, node){
var row = this.getItem(id)
if(id.column == 'xml'){
location = '/doc/xmlpago/' + row.id
}else if(id.column == 'pdf'){
window.open('/doc/pdfpago/' + row.id, '_blank')
}else if(id.column == 'email'){
send_cfdi_email(row)
}
}
function grid_cfdi_por_pagar_double_click(id, e, node){
var grid = $$('grid_cfdi_este_deposito')
@ -1172,9 +1212,47 @@ function grid_cfdi_este_deposito_double_click(id, e, node){
}
//~ function set_is_mn(){
//~ var c = $$('txt_cuenta_moneda').getValue()
//~ if(c!=CURRENCY_MN){
//~ is_mn = false
//~ }
//~ }
function cmd_show_invoice_pay_click(){
var y = $$('filter_invoice_pay_year')
var m = $$('filter_invoice_pay_month')
y.blockEvent()
m.blockEvent()
y.setValue($$('filter_cuenta_year').getValue())
m.setValue($$('filter_cuenta_month').getValue())
y.unblockEvent()
m.unblockEvent()
get_invoices_pay()
$$('multi_bancos').setValue('bank_invoice_pay')
}
function get_invoices_pay(rango){
if(rango == undefined){
var filtro = {
opt: 'table',
year: $$('filter_invoice_pay_year').getValue(),
month: $$('filter_invoice_pay_month').getValue(),
}
}else{
var filtro = {
opt: 'table',
fechas: rango,
}
}
var grid = $$('grid_bank_invoice_pay')
webix.ajax().get('/cfdipay', filtro, {
error:function(text, data, XmlHttpRequest){
msg = 'Ocurrio un error, consulta a soporte técnico'
msg_error(msg)
},
success:function(text, data, XmlHttpRequest){
var values = data.json()
grid.clearAll()
if (values.ok){
grid.parse(values.rows, 'json')
}
}
})
}

View File

@ -154,10 +154,20 @@ String.prototype.to_float4 = function(){
function get_float(value){
return parseFloat(value.replace('$', '').replace(',', '').trim()).round(DECIMALES)
var f = parseFloat(value.replace('$', '').replace(',', '').trim()).round(DECIMALES)
if(!f){
f = 0.00
}
return f
}
function get_float4(value){
return parseFloat(value.replace('$', '').replace(',', '').trim()).round(DECIMALES_TAX)
var f = parseFloat(value.replace('$', '').replace(',', '').trim()).round(DECIMALES_TAX)
if(!f){
f = 0.00
}
return f
}

View File

@ -41,10 +41,10 @@ var toolbar_movimientos_banco = [
{view: 'button', id: 'cmd_agregar_deposito', label: 'Depósito',
type: 'iconButton', autowidth: true, icon: 'plus'},
{},
{view: 'button', id: 'cmd_complemento_pago', label: 'Factura de Pago',
{view: 'button', id: 'cmd_complemento_pago', label: 'Generar Factura de Pago',
type: 'iconButton', autowidth: true, icon: 'file-code-o'},
{view: 'button', id: 'cmd_show_invoice_pay', label: 'Ver Facturas de Pago',
type: 'iconButton', autowidth: true, icon: 'table', hidden: true},
type: 'iconButton', autowidth: true, icon: 'table'},
{},
{view: 'button', id: 'cmd_cancelar_movimiento', label: 'Cancelar',
type: 'iconButton', autowidth: true, icon: 'ban'},
@ -258,6 +258,69 @@ var grid_pay_related = {
}
var grid_bank_invoice_pay_cols = [
{id: 'index', header: '#', adjust: 'data', css: 'right',
footer: {content: 'countRows', colspan: 3, css: 'right'}},
{id: "id", header:"ID", hidden:true},
{id: 'serie', header: ["Serie"], adjust: "data", sort: 'string',
template: '{common.subrow()} #serie#'},
{id: 'folio', header: ['Folio', {content: 'numberFilter'}], adjust: 'header',
sort: 'int', css: 'right', footer: {text: 'Facturas', colspan: 3}},
{id: "uuid", header: ["UUID", {content: "textFilter"}], adjust: "data",
sort:"string", hidden:true},
{id: "fecha", header: ["Fecha y Hora"], width: 135,
sort: "string"},
{id: "tipo_comprobante", header: ["Tipo"], adjust: 'data',
sort: 'string'},
{id: "estatus", header: ["Estatus", {content: "selectFilter"}],
adjust: "header", sort:"string"},
{id: 'movimiento', header: ['Movimiento', {content: "selectFilter"}],
adjust: 'data', sort: 'string'},
{id: 'total', header: ['Total', {content: 'numberFilter'}],
width: 125, sort: 'int', format: webix.i18n.priceFormat, css: 'right',
hidden: true},
{id: 'currency', header: ['Moneda', {content: 'selectFilter'}],
adjust: 'data', sort: 'string', hidden: true},
{id: 'total_mn', header: ['Total M.N.', {content: 'numberFilter'}],
width: 150, sort: 'int', format: webix.i18n.priceFormat, css: 'right',
footer: {content: 'summTimbrada', css: 'right'}},
{id: 'cliente', header: ['Razón Social', {content: 'selectFilter'}],
fillspace: true, sort: 'string'},
{id: 'xml', header: 'XML', adjust: 'data', template: get_icon('xml')},
{id: 'pdf', header: 'PDF', adjust: 'data', template: get_icon('pdf')},
//~ {id: 'ods', header: 'ODS', adjust: 'data', template: get_icon('table')},
//~ {id: 'zip', header: 'ZIP', adjust: 'data', template: get_icon('zip')},
{id: 'email', header: '', adjust: 'data', template: get_icon('email')}
]
var grid_bank_invoice_pay = {
view: 'datatable',
id: 'grid_bank_invoice_pay',
//~ subview: sv_grid_invoices,
select: 'row',
adjust: true,
footer: true,
resizeColumn: true,
headermenu: true,
columns: grid_bank_invoice_pay_cols,
scheme:{
$change:function(item){
if (item.estatus == 'Cancelada'){
item.$css = 'cancel'
}
}
},
on:{
'data->onStoreUpdated':function(){
this.data.each(function(obj, i){
obj.index = i + 1
})
}
},
}
var toolbar_banco_retiro = [
{view: 'label', label: 'Agregar retiro de banco', id: 'title_bank_retiro'},
{view: 'button', id: 'cmd_guardar_retiro', label: 'Guardar Retiro',
@ -291,6 +354,25 @@ var toolbar_bank_pay = [
]
var toolbar_bank_invoice_pay = [
{view: 'label', label: 'Administración de Facturas de Pago'},
{},
{view: 'icon', click: '$$("multi_bancos").setValue("banco_home")',
icon: 'times-circle'}
]
var toolbar_bank_invoice_pay_filter = [
{view: 'richselect', id: 'filter_invoice_pay_year', label: 'Año',
labelAlign: 'right', labelWidth: 50, width: 150, options: []},
{view: 'richselect', id: 'filter_invoice_pay_month', label: 'Mes',
labelAlign: 'right', labelWidth: 50, width: 200, options: months},
{view: 'daterangepicker', id: 'filter_invoice_pay_dates', label: 'Fechas',
labelAlign: 'right', width: 300},
{},
]
var controls_banco_retiro = [
{view: 'toolbar', elements: toolbar_banco_retiro},
{cols: [
@ -401,6 +483,13 @@ var controls_bank_pay = [
]
var controls_bank_invoice_pay = [
{view: 'toolbar', elements: toolbar_bank_invoice_pay},
{view: 'toolbar', elements: toolbar_bank_invoice_pay_filter},
grid_bank_invoice_pay
]
var form_banco_retiro = {
type: 'space',
responsive: true,
@ -440,6 +529,19 @@ var form_bank_pay = {
}
var form_bank_invoice_pay = {
type: 'space',
responsive: true,
cols: [{
view: 'form',
id: 'form_bank_invoice_pay',
complexData: true,
scroll: true,
elements: controls_bank_invoice_pay,
}],
}
var multi_bancos = {
id: 'multi_bancos',
animate: true,
@ -452,7 +554,8 @@ var multi_bancos = {
]},
{id: 'banco_retiro', rows: [form_banco_retiro]},
{id: 'banco_deposito', rows: [form_banco_deposito]},
{id: 'bank_pay', rows: [form_bank_pay]}
{id: 'bank_pay', rows: [form_bank_pay]},
{id: 'bank_invoice_pay', rows: [form_bank_invoice_pay]}
],
}

View File

@ -133,9 +133,14 @@ var controls_others = [
label: 'Nombre Comercial: '},
{view: 'text', id: 'telefonos', name: 'telefonos', label: 'Teléfonos: '},
{view: 'text', id: 'web', name: 'web', label: 'Página Web: '},
{cols: [
{view: 'text', id: 'correo_facturas', name: 'correo_facturas',
label: 'Correos para Facturas: ', tooltip: 'Separados por comas',
bottomLabel: 'Uno o más correos electrónicos separados por comas'},
{view: 'text', id: 'partner_email_fp', name: 'partner_email_fp',
label: 'Para Facturas de pago: ', tooltip: 'Separados por comas',
bottomLabel: 'Uno o más correos electrónicos separados por comas'},
]},
{cols: [
{view: 'checkbox', id: 'es_cliente', name: 'es_cliente',
label: 'Es Cliente: ', value: true, width: 180},