src/AppBundle/Controller/Contabilidad/FacturacionController.php
/**
     * Al crearse una factura es necesario que se timbre
     * el timbrado se hace actualmente a traves de la clase Multifacturas en el metodo "procesa"
     * este metodo se llama desde FacturaPuedeTimbrarValidator ya que desde ahi se valida si la factura pudo ser
     * timbrada por el procesador de multifacturas
     *
     * @Route("/new", name="contabilidad_facturacion_new")
     * @Method({"GET", "POST"})
     *
     * @param Request $request
     *
     * @return \Symfony\Component\HttpFoundation\RedirectResponse|Response
     */
Al crearse una factura es necesario que se timbre
el timbrado se hace actualmente a traves de la clase Multifacturas en el metodo "procesa"
este metodo se llama desde FacturaPuedeTimbrarValidator ya que desde ahi se valida si la factura pudo ser
timbrada por el procesador de multifacturas



@param Request $request


Al crearse una factura es necesario que se timbre el timbrado se hace actualmente a traves de la clase Multifacturas en el metodo " procesa " este metodo se llama desde FacturaPuedeTimbrarValidator ya que desde ahi se valida si la factura pudo ser timbrada por el procesador de multifacturas @param Request $request
public function newAction(Request $request)
    {
        $factura = new Facturacion();
        $this->denyAccessUnlessGranted('CONTABILIDAD_CREATE', $factura);
        $em = $this->getDoctrine()->getManager();
        $form = $this->createForm(FacturacionType::class, $factura);
        $form->handleRequest($request);
        if ($form->isSubmitted() && $form->isValid()) {
            $facturacionRepository = $em->getRepository(Facturacion::class);
            $receptor = $factura->getReceptor();
            if ($factura->getMetodoPago() === 'PUE') {
                $factura->setIsPagada(1);
            }
            $factura->setFolio(
                $facturacionRepository->getFolioByEmpresa($factura->getEmisor()->getId())
            );
            $cotizacionRepository = FacturacionHelper::getCotizacionRepository($em, $factura->getEmisor()->getId());
            $cotizacionFecha = $form->get('fechaFiltro')->getData();
            $cotizacionId = $form->get('cotizaciones')->getData();
            $cotizaciones = $cotizacionRepository->getFullCotizacionesFromCliente(
                $factura->getCliente()->getId(),
                $cotizacionFecha->modify('first day of this month'),
                (clone $cotizacionFecha)->modify('last day of this month'),
                $cotizacionId === 'ALL' ? null : $cotizacionId
            );
            foreach ($cotizaciones as $cotizacion) {
                $cotizacion->setFactura($factura);
                $em->persist($cotizacion);
            }
            if ($cotizacionRepository->getClassName() === AstilleroCotizacion::class) {
                $astilleroProductoRepository = $em->getRepository(Astillero\Producto::class);
                $conceptos = $form->get('conceptos')->all();
                foreach ($conceptos as $concepto) {
                    if ($productoId = $concepto->get('producto')->getData()) {
                        $producto = $astilleroProductoRepository->find($productoId);
                        $cantidadInicial = $producto->getExistencia() ?? 0;
                        $cantidadDevolver = $concepto->getData()->getCantidad();
                        $cantidadRemover = $concepto->get('productoRemover')->getData();
                        $cantidadFinal = ($cantidadInicial - ($cantidadDevolver - $cantidadRemover));
                        $producto->setExistencia($cantidadFinal);
                        $em->persist($producto);
                    }
                }
            }
            $em->persist($factura);
            $em->flush();
            if (is_string($receptor->getCorreos()) && strlen($receptor->getCorreos()) > 0) {
                $arrayCorreos = explode(',', $receptor->getCorreos());
                $this->enviarFactura($factura, $arrayCorreos, $this->getUser()->getCorreo());
            }
            return $this->redirectToRoute('contabilidad_facturacion_index');
        }
        return $this->render(
            'contabilidad/facturacion/new.html.twig',
            [
                'form' => $form->createView(),
                'factura' => $factura,
            ]
        );
    }
public function newAction ( Request $ request ) { $ factura = new Facturacion ( ) ; $ this -> denyAccessUnlessGranted ( 'CONTABILIDAD_CREATE' , $ factura ) ; $ em = $ this -> getDoctrine ( ) -> getManager ( ) ; $ form = $ this -> createForm ( FacturacionType :: class , $ factura ) ; $ form -> handleRequest ( $ request ) ; if ( $ form -> isSubmitted ( ) && $ form -> isValid ( ) ) { $ facturacionRepository = $ em -> getRepository ( Facturacion :: class ) ; $ receptor = $ factura -> getReceptor ( ) ; if ( $ factura -> getMetodoPago ( ) === 'PUE' ) { $ factura -> setIsPagada ( 1 ) ; } $ factura -> setFolio ( $ facturacionRepository -> getFolioByEmpresa ( $ factura -> getEmisor ( ) -> getId ( ) ) ) ; $ cotizacionRepository = FacturacionHelper :: getCotizacionRepository ( $ em , $ factura -> getEmisor ( ) -> getId ( ) ) ; $ cotizacionFecha = $ form -> get ( 'fechaFiltro' ) -> getData ( ) ; $ cotizacionId = $ form -> get ( 'cotizaciones' ) -> getData ( ) ; $ cotizaciones = $ cotizacionRepository -> getFullCotizacionesFromCliente ( $ factura -> getCliente ( ) -> getId ( ) , $ cotizacionFecha -> modify ( 'first day of this month' ) , ( clone $ cotizacionFecha ) -> modify ( 'last day of this month' ) , $ cotizacionId === 'ALL' ? null : $ cotizacionId ) ; foreach ( $ cotizaciones as $ cotizacion ) { $ cotizacion -> setFactura ( $ factura ) ; $ em -> persist ( $ cotizacion ) ; } if ( $ cotizacionRepository -> getClassName ( ) === AstilleroCotizacion :: class ) { $ astilleroProductoRepository = $ em -> getRepository ( Astillero \ Producto :: class ) ; $ conceptos = $ form -> get ( 'conceptos' ) -> all ( ) ; foreach ( $ conceptos as $ concepto ) { if ( $ productoId = $ concepto -> get ( 'producto' ) -> getData ( ) ) { $ producto = $ astilleroProductoRepository -> find ( $ productoId ) ; $ cantidadInicial = $ producto -> getExistencia ( ) ?? 0 ; $ cantidadDevolver = $ concepto -> getData ( ) -> getCantidad ( ) ; $ cantidadRemover = $ concepto -> get ( 'productoRemover' ) -> getData ( ) ; $ cantidadFinal = ( $ cantidadInicial - ( $ cantidadDevolver - $ cantidadRemover ) ) ; $ producto -> setExistencia ( $ cantidadFinal ) ; $ em -> persist ( $ producto ) ; } } } $ em -> persist ( $ factura ) ; $ em -> flush ( ) ; if ( is_string ( $ receptor -> getCorreos ( ) ) && strlen ( $ receptor -> getCorreos ( ) ) > 0 ) { $ arrayCorreos = explode ( ',' , $ receptor -> getCorreos ( ) ) ; $ this -> enviarFactura ( $ factura , $ arrayCorreos , $ this -> getUser ( ) -> getCorreo ( ) ) ; } return $ this -> redirectToRoute ( 'contabilidad_facturacion_index' ) ; } return $ this -> render ( 'contabilidad/facturacion/new.html.twig' , [ 'form' => $ form -> createView ( ) , 'factura' => $ factura , ] ) ; }
Al crearse una factura es necesario que se timbre
 el timbrado se hace actualmente a traves de la clase Multifacturas en el metodo "procesa"
 este metodo se llama desde FacturaPuedeTimbrarValidator ya que desde ahi se valida si la factura pudo ser
 timbrada por el procesador de multifacturas
Al crearse una factura es necesario que se timbre el timbrado se hace actualmente a traves de la clase Multifacturas en el metodo " procesa " este metodo se llama desde FacturaPuedeTimbrarValidator ya que desde ahi se valida si la factura pudo ser timbrada por el procesador de multifacturas
// Aqui existe un problema de race condition, donde pueden existir mas de dos usuarios creando una // cotizacion, lo que ocasionara que se dupliquen los folios, para prevenir esto // se vuelve a leer el valor y se escribe aun cuando el folio se muestra antes de generar el formulario // Buscar las cotizaciones a las que se les asignara una factura // Puede ser una o muchas dependiendo si el emisor es V&V Store y este quiere facturar todas las ventas // Ciclar por cada cotizacion y asignarle la factura // Esto solo debe pasar en astillero por el momento // checar si la factura pertenece a astillero y verificar si hay que restar o devolver productos de su inventario // Se asigna la variable $productoId y verificamos que exista