Skip to content
Snippets Groups Projects
Venta.php 8.31 KiB
Newer Older
<?php


namespace UNAM\Pirapire\SQ;

use UNAM\Pirapire\Constantes;

class Venta
{
    private $idVenta;
    private $tokenUV;
    private $datosVenta;
    private $datosVentaItems;
    private $unidadGestion;

    public function __construct($idVenta)
    {
        $this->idVenta = $idVenta;
    }

    public function setTokenUV($tokenUV)
    {
        $this->tokenUV = $tokenUV;
    }

    public function generarEstructuraVenta()
    {
        $datosVenta = $this->getDatosVenta();
        $ventaItems = $this->getDatosVentaItems();

        if (isset($datosVenta[0])) {
            $datosVenta = $datosVenta[0];
        } else {
            return false;
        }

        $ventaId = $this->idVenta;

        $importe = 0;
        foreach ($ventaItems as $item) {
            $importe += $item['precio'] * $item['cantidad'];
        }

        return [
            'id' => $ventaId,
            'estado' => Constantes::SQ['estado_venta_cobrada'],
            'cliente' => $this->getReceptor($datosVenta),
            'importe_total' => $importe,
            'leyenda' => "Venta ID: {$ventaId}",
            'articulos' => $this->getArticulos($datosVenta, $ventaItems),
            'cobranza' => $this->getCobranza($datosVenta, $importe),
            'contexto' => null,
            'medio_pago' => $datosVenta['medio_pago'],
            'canal_venta' => Constantes::SQ['canal_venta_virtual'],
            'realizada_en' => $datosVenta['fecha_emision'],
            'unidad_venta' => $this->getTokenUV(),
            'id_referencia' => null,
            'condicion_venta' => $datosVenta['condicion_venta'],
            'cobranza_vence_en' => $datosVenta['fecha_emision'],
            'moneda_extranjera' => null,
            'vencimiento_actual' => 1,
            'importe_total_moneda_extranjera' => null,
            'tipo_servicio' => $this->getTipoServicio(),
            'info_personalizada' => $this->getInfoPersonalizada($datosVenta, $ventaItems)
        ];
    }

    public function setDatosVenta($datosVenta)
    {
        $this->datosVenta = $datosVenta;
    }

    private function getDatosVenta()
    {
        return $this->datosVenta;
    }

    private function getDatosVentaItems()
    {
        return $this->datosVentaItems;
    }

    public function setDatosVentaItems($datosVentaItems)
    {
        $this->datosVentaItems = $datosVentaItems;
    }

    private function getReceptor($datosVenta)
    {
        return ["cuit" => $datosVenta['cliente_numero_documento'],
            "id_local" => "1",
            "pais" => null,
            "razon_social" => $datosVenta['cliente_razon_social'],
            "id_global" => null,
            "id_tipo_documento_afip" => $datosVenta['cliente_tipo_documento'],
            "numero_documento" => $datosVenta['cliente_numero_documento'],
            "identificacion_fiscal" => $datosVenta['cliente_numero_documento'],
            "domicilio" => $datosVenta['cliente_domicilio'],
            "nombres" => $datosVenta['cliente_razon_social'],
            "apellido" => $datosVenta['cliente_razon_social'],
            "email" => $datosVenta['cliente_email'],
            "es_persona_fisica" => 0,
        ];
    }

    public function setUnidadGestion($unidadGestion)
    {
        $this->unidadGestion = $unidadGestion;
    }

    private function getArticulos($datosVenta, $ventaItems)
    {
        $items = [];

        foreach ($ventaItems as $item) {
            $items[] = [
                "id" => null,
                "importe" => $item['precio'] * $item['cantidad'],
                "descripcion" => $item['descripcion'],
                "servicio" => [
                    "id" => $datosVenta['id_concepto_venta'],
                    "importe" => $item['precio'] * $item['cantidad'],
                    "descripcion" => $datosVenta['concepto_venta']
                ]
            ];
        }

        return $items;
    }

    private function getInfoPersonalizada($datosVenta, $ventaItems): array
    {
        $infoPersAfip = $this->getInfoPersonalizadaAfip($datosVenta, $ventaItems);

        $infoPersNotificacion = $this->getInfoPersonalizadaNotificacion($datosVenta);

        return array_merge($infoPersAfip, $infoPersNotificacion);
    }

    private function getInfoPersonalizadaNotificacion($datosVenta)
    {
        $email = null;
        if (isset($this->unidadGestion) && !empty($this->unidadGestion[0]['email'])) {
            $email = $this->unidadGestion[0]['email'];
        }

        return [
            [
                "entidad" => "MENSAJE_TIPO_NOTIFICACION",
                "datos" => [
                    [
                        "codigo" => "FCTFNZA",
                        "comodines" => [
                            ["valor" => $datosVenta['cliente_razon_social']],
                            ["valor" => date('d/m/Y', strtotime($datosVenta['fecha_emision']))],
                            ["valor" => $email],
                        ]
                    ],
                    [
                        "codigo" => "VTACOBANUL",
                        "comodines" => [
                            ["valor" => $datosVenta['cliente_razon_social']],
                            ["valor" => date('d/m/Y', strtotime($datosVenta['fecha_emision']))],
                            ["valor" => $email],
                        ]
                    ]
                ]
            ]
        ];
    }

    private function getInfoPersonalizadaAfip($datosVenta, $ventaItems)
    {
        $itemsPers = [];

        foreach ($ventaItems as $item) {
            $subtotal = $item['precio'] * $item['cantidad'];

            $itemsPers[] = [
                "codigo" => $item['codigo'],
                "detalle" => $item['descripcion'],
                "precio_unit" => "$ " . number_format($item['precio'], 2, ',', '.'),
                "cantidad" => $item['cantidad'],
                "subtotal" => "$ " . number_format($subtotal, 2, ',', '.')
            ];
        }

        $datosItemsPers = [
            "tipo_documento" => $datosVenta['cliente_tipo_documento_desc'],
            "condicion_iva" => $datosVenta['cliente_condicion_iva_desc'],
            "condicion_venta" => $datosVenta['condicion_venta_descripcion'],
            "items_pers" => $itemsPers,
            "concepto" => [
                "codigo" => $datosVenta['afip_concepto_codigo'],
                "descripcion" => $datosVenta['afip_concepto_descripcion']
            ]
        ];

        $datosAfip = [
            "concepto" => [
                "codigo" => $datosVenta['afip_concepto_codigo'],
                "descripcion" => $datosVenta['afip_concepto_descripcion']
            ]
        ];

        if ($datosVenta['afip_concepto_codigo'] == Constantes::AFIP['concepto_servicio'] || $datosVenta['afip_concepto_codigo'] == Constantes::AFIP['concepto_producto_servicio']) {
            $periodoFacturado = [
                "periodo_facturado" => [
                    "fecha_desde" => $datosVenta['fecha_servicio_desde'],
                    "fecha_hasta" => $datosVenta['fecha_servicio_hasta'],
                ]
            ];

            $datosItemsPers = array_merge($datosItemsPers, $periodoFacturado);
            $datosAfip = array_merge($datosAfip, $periodoFacturado);
        }

        return [
            [
                "entidad" => "AFIP_COMPROBANTE",
                "datos" => $datosItemsPers
            ], [
                "entidad" => "AFIP",
                "datos" => $datosAfip
            ]
        ];
    }

    private function getCobranza($datosVenta, float $importe)
    {
        $datosCobranza[] = [
            "id" => $this->idVenta,
            "importe" => $importe,
            "detalles" => [[
                "importe" => $importe,
                "id_concepto_cobranza" => Constantes::SQ['concepto_cobranza_neto'],
            ]],
            "cobrada_en" => $datosVenta['fecha_emision'],
            "id_externo" => null,
            "medio_pago" => $datosVenta['medio_pago'],
            "liberada_en" => $datosVenta['fecha_emision'],
            "conciliada_en" => date('Y-m-d'),
            "conciliada_por" => "SQ",
            "conciliada_automaticamente" => true
        ];

        return $datosCobranza;
    }

    private function getTokenUV()
    {
        return $this->tokenUV;
    }

    private function getTipoServicio()
    {
        return [
            'codigo' => Constantes::TIPO_SERVICIO_NUCLEO,
            'devenga' => false
        ];
    }