/** * Devuelve un array con los huecos en la numeración. * @return type */ public function huecos() { $error = TRUE; $huecolist = $this->cache->get_array2('factura_cliente_huecos', $error); if ($error) { $ejercicio = new ejercicio(); $serie = new serie(); foreach ($ejercicio->all_abiertos() as $eje) { $codserie = ''; $num = 1; $data = $this->db->select("SELECT codserie," . $this->db->sql_to_int('numero') . " as numero,fecha,hora\n FROM " . $this->table_name . " WHERE codejercicio = " . $this->var2str($eje->codejercicio) . " ORDER BY codserie ASC, numero ASC;"); if ($data) { foreach ($data as $d) { if ($d['codserie'] != $codserie) { $codserie = $d['codserie']; $num = 1; $se = $serie->get($codserie); if ($se) { /// ¿Se ha definido un nº inicial de factura para esta serie y ejercicio? if ($eje->codejercicio == $se->codejercicio) { $num = $se->numfactura; } } } if (intval($d['numero']) < $num) { /** * El número de la factura es menor que el inicial. * El usuario ha cambiado el número inicial después de hacer * facturas. */ } else { if (intval($d['numero']) == $num) { /// el número es correcto, avanzamos $num++; } else { /** * Hemos encontrado un hueco y debemos usar el número y la fecha. * La variable pasos permite dejar de añadir huecos al llegar a 100, * así evitamos agotar la memoria en caso de error grave. */ $pasos = 0; while ($num < intval($d['numero']) and $pasos < 100) { $huecolist[] = array('codigo' => $eje->codejercicio . sprintf('%02s', $codserie) . sprintf('%06s', $num), 'fecha' => Date('d-m-Y', strtotime($d['fecha'])), 'hora' => $d['hora']); $num++; $pasos++; } /// avanzamos uno más $num++; } } } } } $this->cache->set('factura_cliente_huecos', $huecolist, 3600); } return $huecolist; }
public function stats_series($tabla = 'facturasprov') { $stats = array(); $serie0 = new serie(); $sql = "select codserie,sum(totaleuros) as total from " . $tabla . " group by codserie order by total desc;"; $data = $this->db->select($sql); if ($data) { foreach ($data as $d) { $serie = $serie0->get($d['codserie']); if ($serie) { $stats[] = array('txt' => $serie->descripcion, 'total' => round(abs($this->euro_convert(floatval($d['total']))), FS_NF0)); } else { $stats[] = array('txt' => $d['codserie'], 'total' => round(abs($this->euro_convert(floatval($d['total']))), FS_NF0)); } } } return $stats; }
public function huecos() { $error = TRUE; $huecolist = $this->cache->get_array2('factura_cliente_huecos', $error, TRUE); if ($error) { $ejercicio = new ejercicio(); $serie = new serie(); foreach ($ejercicio->all_abiertos() as $eje) { $codserie = ''; $num = 1; $data = $this->db->select("SELECT codserie," . $this->db->sql_to_int('numero') . " as numero,fecha,hora\n FROM " . $this->table_name . " WHERE codejercicio = " . $this->var2str($eje->codejercicio) . " ORDER BY codserie ASC, numero ASC;"); if ($data) { foreach ($data as $d) { if ($d['codserie'] != $codserie) { $codserie = $d['codserie']; $num = 1; if (defined('FS_NFACTURA_CLI')) { /// mantenemos compatibilidad con versiones anteriores $num = intval(FS_NFACTURA_CLI); } $se = $serie->get($codserie); if ($se) { /// ¿Se ha definido un nº inicial de factura para esta serie y ejercicio? if ($eje->codejercicio == $se->codejercicio) { $num = $se->numfactura; } } } if (intval($d['numero']) < $num) { /** * El número de la factura es menor que el inicial. * El usuario ha cambiado el número inicial después de hacer * facturas. */ } else { if (intval($d['numero']) == $num) { /// el número es correcto, avanzamos $num++; } else { /// Hemos encontrado un hueco y debemos usar el número y la fecha. while ($num < intval($d['numero'])) { $huecolist[] = array('codigo' => $eje->codejercicio . sprintf('%02s', $codserie) . sprintf('%06s', $num), 'fecha' => Date('d-m-Y', strtotime($d['fecha'])), 'hora' => $d['hora']); $num++; } /// avanzamos uno más $num++; } } } } } $this->cache->set('factura_cliente_huecos', $huecolist, 3600, TRUE); } return $huecolist; }
private function sync() { $continuar = TRUE; $art0 = new articulo(); $ej0 = new ejercicio(); $serie0 = new serie(); $div0 = new divisa(); foreach (array_reverse($this->pedidos) as $ped) { $data = $this->db->select("SELECT * FROM albaranescli WHERE numero2 = " . $art0->var2str($this->order_numero2($ped->order_number)) . ";"); if (!$data and $continuar and $ped->status == 'completed') { $albaran = new albaran_cliente(); $albaran->numero2 = $this->order_numero2($ped->order_number); $albaran->fecha = Date('d-m-Y', strtotime($ped->created_at)); $albaran->hora = Date('H:i:s', strtotime($ped->created_at)); $albaran->observaciones = 'Este pedido ha sido importado con la demo de woocommerce, por eso no se ha asignado el cliente.'; $albaran->cifnif = ''; $albaran->direccion = ''; $ejercicio = $ej0->get_by_fecha($albaran->fecha); if ($ejercicio) { $albaran->codejercicio = $ejercicio->codejercicio; $serie = $serie0->get($this->setup['wooc_serie']); if ($serie) { $albaran->codserie = $serie->codserie; $albaran->irpf = $serie->irpf; $albaran->codalmacen = $this->setup['wooc_alm']; $divisa = $div0->get($this->empresa->coddivisa); if ($divisa) { $albaran->coddivisa = $divisa->coddivisa; $albaran->tasaconv = $divisa->tasaconv; } $albaran->codpago = $this->empresa->codpago; if ($albaran->save()) { foreach ($ped->line_items as $l) { $linea = new linea_albaran_cliente(); $linea->idalbaran = $albaran->idalbaran; $linea->referencia = $l->sku; $linea->descripcion = $l->name; $linea->cantidad = $l->quantity; $linea->irpf = $albaran->irpf; $articulo = $art0->get($l->sku); if ($articulo and !$serie->siniva and $cliente->regimeniva != 'Exento') { $linea->codimpuesto = $articulo->codimpuesto; $linea->iva = $articulo->get_iva(); } $linea->pvpunitario = 100 * $l->total / $l->quantity / (100 + $linea->iva); $linea->pvptotal = $linea->pvpsindto = $linea->pvpunitario * $linea->cantidad; if ($linea->save()) { /// descontamos del stock if ($articulo) { $articulo->sum_stock($albaran->codalmacen, 0 - $linea->cantidad); } $albaran->neto += $linea->pvptotal; $albaran->totaliva += $linea->pvptotal * $linea->iva / 100; $albaran->totalirpf += $linea->pvptotal * $linea->irpf / 100; $albaran->totalrecargo += $linea->pvptotal * $linea->recargo / 100; } else { $this->new_error_msg("¡Imposible guardar la linea con referencia: " . $linea->referencia); $continuar = FALSE; } } /// cupones foreach ($ped->coupon_lines as $l) { $linea = new linea_albaran_cliente(); $linea->idalbaran = $albaran->idalbaran; $linea->descripcion = 'Cupón: ' . $l->code; $linea->cantidad = -1; $linea->irpf = $albaran->irpf; if (!$serie->siniva and $cliente->regimeniva != 'Exento') { $impuesto = $this->impuesto->get($this->setup['wooc_imp']); if ($impuesto) { $linea->codimpuesto = $impuesto->codimpuesto; $linea->iva = $impuesto->iva; } } $linea->pvpunitario = 100 * floatval($l->amount) / (100 + $linea->iva); $linea->pvptotal = $linea->pvpsindto = $linea->pvpunitario * $linea->cantidad; if ($linea->save()) { $albaran->neto += $linea->pvptotal; $albaran->totaliva += $linea->pvptotal * $linea->iva / 100; $albaran->totalirpf += $linea->pvptotal * $linea->irpf / 100; $albaran->totalrecargo += $linea->pvptotal * $linea->recargo / 100; } else { $this->new_error_msg("¡Imposible guardar la linea del cupón: " . $l->code); $continuar = FALSE; } } if ($continuar) { /// redondeamos $albaran->neto = round($albaran->neto, FS_NF0); $albaran->totaliva = round($albaran->totaliva, FS_NF0); $albaran->totalirpf = round($albaran->totalirpf, FS_NF0); $albaran->totalrecargo = round($albaran->totalrecargo, FS_NF0); $albaran->total = $albaran->neto + $albaran->totaliva - $albaran->totalirpf + $albaran->totalrecargo; if ($albaran->save()) { $this->new_message("<a href='" . $albaran->url() . "'>" . ucfirst(FS_ALBARAN) . "</a> guardado correctamente."); $this->new_change(ucfirst(FS_ALBARAN) . ' Cliente ' . $albaran->codigo, $albaran->url(), TRUE); } else { $this->new_error_msg("¡Imposible actualizar el <a href='" . $albaran->url() . "'>" . FS_ALBARAN . "</a>!"); $continuar = FALSE; } } else { if ($albaran->delete()) { $this->new_message(ucfirst(FS_ALBARAN) . " eliminado correctamente."); } else { $this->new_error_msg("¡Imposible eliminar el <a href='" . $albaran->url() . "'>" . FS_ALBARAN . "</a>!"); $continuar = FALSE; } } } else { $this->new_error_msg('Error al guardar los datos del ' . FS_ALBARAN . ' ' . $ped->order_number); $continuar = FALSE; } } else { $this->new_error_msg('Imposible encontrar una serie para el ' . FS_ALBARAN . ' ' . $ped->order_number); $continuar = FALSE; } } else { $this->new_error_msg('Imposible encontrar un ejercicio para el ' . FS_ALBARAN . ' ' . $ped->order_number); $continuar = FALSE; } break; } } $this->new_advice('Esto es una demo. La versión completa importa todos los pedidos completados, incluyendo clientes y artículos. ' . '<a href="https://www.facturascripts.com/store/producto/plugin-woocommerce/" target="_blank">' . '<span class="glyphicon glyphicon-shopping-cart"></span> comprar la versión completa</a>'); }
public function new_codigo() { $num = intval(FS_NFACTURA_CLI); /// definido en el config2 // buscamos el número inicial para la serie $serie0 = new serie(); if ($serie = $serie0->get($this->codserie)) { if ($this->codejercicio == $serie->codejercicio) { $num = $serie->numfactura; } } /// buscamos un hueco $encontrado = FALSE; $fecha = $this->fecha; $numeros = $this->db->select("SELECT " . $this->db->sql_to_int('numero') . " as numero,fecha\n FROM " . $this->table_name . " WHERE codejercicio = " . $this->var2str($this->codejercicio) . " AND codserie = " . $this->var2str($this->codserie) . " ORDER BY numero ASC;"); if ($numeros) { foreach ($numeros as $n) { if (intval($n['numero']) > $num) { $encontrado = TRUE; $fecha = Date('d-m-Y', strtotime($n['fecha'])); break; } else { $num++; } } } if ($encontrado) { $this->numero = $num; $this->fecha = $fecha; } else { $this->numero = $num; /// nos guardamos la secuencia para abanq/eneboo $sec = new secuencia(); $sec = $sec->get_by_params2($this->codejercicio, $this->codserie, 'nfacturacli'); if ($sec) { if ($sec->valorout <= $this->numero) { $sec->valorout = 1 + $this->numero; $sec->save(); } } } if (FS_NEW_CODIGO == 'eneboo') { $this->codigo = $this->codejercicio . sprintf('%02s', $this->codserie) . sprintf('%06s', $this->numero); } else { $this->codigo = 'FAC' . $this->codejercicio . $this->codserie . $this->numero; } }