<!DOCTYPE html>
<html lang="en">
<head>
<base href="">
<title>Agrovit Facturas | {{ titlePage|default('Bienvenido') }} </title>
<meta charset="utf-8"/>
<meta name="description" content="una descripcion "/>
<meta name="keywords" content="palabras claves "/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<meta property="og:locale" content="en_US"/>
<meta property="og:type" content="article"/>
<meta property="og:title" content="Laboratorio IANSA"/>
<meta property="og:url" content="https://keenthemes.com/metronic"/>
<meta property="og:site_name" content="Facturas | IAnalytics"/>
<link rel="icon" href="{{ asset('media/logo.png') }}">
<link rel="shortcut icon" href="#"/>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Poppins:300,400,500,600,700"/>
<link href="{{ asset('plugins/datatables/dataTables.bootstrap4.css') }}" rel="stylesheet"/>
<link href="{{ asset('plugins/global/plugins.bundle.css') }}" rel="stylesheet" type="text/css"/>
<link href="{{ asset('css/style.bundle.css') }}" rel="stylesheet" type="text/css"/>
<link href="{{ asset('css/iansaLab.css') }} " rel="stylesheet" type="text/css"/>
{% set headerImg = 'media/patterns/banners1.jpg' %}
{% set headerImg2 = 'media/patterns/banners1Black.jpg' %}
{% set mosaico = 'media/svg/wave-bg-dark.svg' %}
{% set modeStyle = '' %}
{% set logoLab = 'media/logo.png' %}
<style>
.email-dropdown-menu {
display: none;
position: absolute;
background-color: #ffffff;
border-radius: 6px; /* Bordes redondeados */
box-shadow: 0 8px 16px 0 rgba(0, 0, 0, 0.2);
z-index: 1000; /* Asegúrate de que la z-index es suficientemente alta para superponer otros elementos */
}
.dark-mode-toggle-container {
display: flex;
align-items: center;
gap: 10px; /* Espacio entre el texto y el switch */
}
.switch {
position: relative;
display: inline-block;
width: 60px;
height: 34px;
}
.switch input {
opacity: 0;
width: 0;
height: 0;
}
.slider {
position: absolute;
cursor: pointer;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: #ccc;
transition: .4s;
}
.slider:before {
position: absolute;
content: "";
height: 26px;
width: 26px;
left: 4px;
bottom: 4px;
background-color: white;
transition: .4s;
}
input:checked + .slider {
background-color: #2196F3;
}
input:checked + .slider:before {
transform: translateX(26px);
}
.slider.round {
border-radius: 34px;
}
.slider.round:before {
border-radius: 50%;
}
</style>
{% block stylesheets %}
{% endblock %}
</head>
<body id="kt_body" style="background-image: url({{ asset(headerImg) }});background-blend-mode: multiply; background-size: auto !important;" class="header-fixed header-tablet-and-mobile-fixed toolbar-enabled dark-mode">
<div class="d-flex flex-column flex-root">
<!--begin::Page-->
<div class="page d-flex flex-row flex-column-fluid">
<!--begin::Wrapper-->
<div class="wrapper d-flex flex-column flex-row-fluid" id="kt_wrapper">
<!--begin::Header-->
<div id="kt_header" class="header align-items-stretch" data-kt-sticky="true" data-kt-sticky-name="header"
data-kt-sticky-offset="{default: '200px', lg: '300px'}"
style="background-color:rgb(255 255 255 / 0%);border-bottom:0">
<!--begin::Container-->
<div class="container-fluid d-flex align-items-center">
<div class="d-flex topbar align-items-center d-lg-none ms-n2 me-3" title="Show aside menu">
<div class="btn btn-icon btn-active-light-primary btn-custom w-30px h-30px w-md-40px h-md-40px"
id="kt_header_menu_mobile_toggle">
<!--begin::Svg Icon | path: icons/duotune/abstract/abs015.svg-->
<span class="svg-icon svg-icon-1">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"
fill="none">
<path d="M21 7H3C2.4 7 2 6.6 2 6V4C2 3.4 2.4 3 3 3H21C21.6 3 22 3.4 22 4V6C22 6.6 21.6 7 21 7Z"
fill="currentColor"/>
<path opacity="0.3"
d="M21 14H3C2.4 14 2 13.6 2 13V11C2 10.4 2.4 10 3 10H21C21.6 10 22 10.4 22 11V13C22 13.6 21.6 14 21 14ZM22 20V18C22 17.4 21.6 17 21 17H3C2.4 17 2 17.4 2 18V20C2 20.6 2.4 21 3 21H21C21.6 21 22 20.6 22 20Z"
fill="currentColor"/>
</svg>
</span>
<!--end::Svg Icon-->
</div>
</div>
<!--begin::Header Logo-->
<div class="header-logo me-5 me-md-8 flex-grow-1 flex-lg-grow-0">
<a href="{{ path('app_dash') }}">
<img alt="Logo" src="{{ asset(logoLab) }}" class="logo-default h-200px"/>
<img alt="Logo" src="{{ asset(logoLab) }}" class="logo-sticky h-200px"/>
</a>
</div>
<div class="d-flex align-items-stretch justify-content-between flex-lg-grow-1">
<!--begin::Navbar-->
<div class="d-flex align-items-stretch mx-auto" id="kt_header_nav">
<div class="header-menu align-items-stretch" data-kt-drawer="true"
data-kt-drawer-name="header-menu" data-kt-drawer-activate="{default: true, lg: false}"
data-kt-drawer-overlay="true"
data-kt-drawer-width="{default:'200px', '300px': '250px'}"
data-kt-drawer-direction="start" data-kt-drawer-toggle="#kt_header_menu_mobile_toggle"
data-kt-swapper="true" data-kt-swapper-mode="prepend"
data-kt-swapper-parent="{default: '#kt_body', lg: '#kt_header_nav'}">
<!--begin::Menu-->
<div class="menu menu-lg-rounded menu-column menu-lg-row menu-state-bg menu-title-gray-700 menu-state-icon-primary menu-state-bullet-primary menu-arrow-gray-400 fw-bold my-5 my-lg-0 align-items-stretch"
id="#kt_header_menu" data-kt-menu="true">
<div data-kt-menu-trigger="click" data-kt-menu-placement="bottom-start"
class="menu-item here show menu-lg-down-accordion me-lg-1">
{% if is_granted('ROLE_SUPER_ADMIN') or is_granted('ROLE_ADMIN') %}
<div class="menu-item menu-here-bg menu-lg-down me-0 me-lg-2 ">
<!--begin:Menu link-->
<a class="btn btn-outline-light {{ startActive|default('') }} py-3 text-black menuHead"
href="{{ path('app_start') }}">Inicio
</a>
</div>
<div class="menu-item menu-here-bg menu-lg-down me-0 me-lg-2 ">
<!--begin:Menu link-->
<a class="btn btn-outline-light {{ ventaActive|default('') }} py-3 text-black menuHead"
href="{{ path('app_sales') }}"> Ventas
</a>
</div>
<div class="menu-item menu-here-bg menu-lg-down me-0 me-lg-2 ">
<!--begin:Menu link-->
<a class="btn btn-outline-light {{ compraActive|default('') }} py-3 text-black menuHead"
href="{{ path('app_purchases') }}"> Compras
</a>
</div>
<div class="menu-item menu-here-bg menu-lg-down me-0 me-lg-2 ">
<!--begin:Menu link-->
<a class="btn btn-outline-light {{ ordenesActive|default('') }} py-3 text-black menuHead"
href="{{ path('app_orders') }}"> Ordenes
</a>
</div>
{% endif %}
{% if is_granted('ROLE_SUPER_ADMIN') or is_granted('ROLE_ADMIN') or is_granted('ROLE_SALESMAN') %}
<div class="menu-item menu-here-bg menu-lg-down me-0 me-lg-2 ">
<!--begin:Menu link-->
<a class="btn btn-outline-light {{ comicionActive|default('') }} py-3 text-black menuHead"
href="{{ path('app_commissions') }}">Comisiones
</a>
</div>
<div class="menu-item menu-here-bg menu-lg-down me-0 me-lg-2 ">
<!--begin:Menu link-->
<a class="btn btn-outline-light {{ reportingActive|default('') }} py-3 text-black menuHead"
href="{{ path('app_reporting') }}">Reportes
</a>
</div>
{% endif %}
{% if is_granted('ROLE_ADMIN') %}
<div class="menu-item menu-here-bg menu-lg-down me-0 dropdown">
<a class="btn btn-outline-light menuHead py-3 text-black dropdown-toggle"
href="#" role="button" id="generalMenuDropdownTwo"
data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false"
>Administración</a>
<div class="dropdown-menu" aria-labelledby="generalMenuDropdownTwo"
style="max-height: 30vh; overflow-y: auto;">
<a class="btn btn-outline-light py-3 menuList {{ UserActive|default('') }}"
href="{{ path('app_user') }}">{{ 'Users'|trans }}</a>
<a class="btn btn-outline-light py-3 menuList {{ SalesmanActive|default('') }}"
href="{{ path('app_salesman_index') }}">{{ 'Salesman'|trans }}</a>
<a class="btn btn-outline-light py-3 menuList {{ OrganizationActive|default('') }}"
href="{{ path('app_organization_index') }}">{{ 'Organization'|trans }}</a>
<a class="btn btn-outline-light py-3 menuList {{ CategoryActive|default('') }}"
href="{{ path('app_category_index') }}">{{ 'Categories'|trans }}</a>
<a class="btn btn-outline-light py-3 menuList {{ ProductActive|default('') }}"
href="{{ path('app_product_index') }}">{{ 'Products'|trans }}</a>
<a class="btn btn-outline-light py-3 menuList {{ PaymentActive|default('') }}"
href="{{ path('app_payment_index') }}">{{ 'Payment'|trans }}
Facturas de Ventas</a>
<a class="btn btn-outline-light py-3 menuList {{ CommissionSettingActive|default('') }}"
href="{{ path('app_commission_setting_index') }}">{{ 'Commission Setting'|trans }}</a>
</div>
</div>
{% endif %}
{% if is_granted('ROLE_SUPER_ADMIN') %}
<div class="menu-item menu-here-bg menu-lg-down me-0 me-lg-2 ">
<a href="#"
class="btn btn-outline-light email-dropdown-toggle py-3 text-black menuHead">
Menu <span class="caret">▾</span> </a>
<div class="email-dropdown-menu">
<div class="menu-item menu-here-bg menu-lg-down me-0 dropdown">
<a class="btn btn-outline-light menuHead py-3 text-black dropdown-toggle"
href="#" role="button" id="generalMenuDropdown"
data-bs-toggle="dropdown" aria-haspopup="true"
aria-expanded="false"
>Administración General</a>
<div class="dropdown-menu" aria-labelledby="generalMenuDropdown"
style="max-height: 30vh; overflow-y: auto;">
<a class="btn btn-outline-light py-3 menuList {{ UserActive|default('') }}"
href="{{ path('app_user') }}">{{ 'Users'|trans }}</a>
<a class="btn btn-outline-light py-3 menuList {{ RoleActive|default('') }}"
href="{{ path('app_role_index') }}">Roles</a>
<a class="btn btn-outline-light py-3 menuList {{ CategoryActive|default('') }}"
href="{{ path('app_category_index') }}">{{ 'Categories'|trans }}</a>
<a class="btn btn-outline-light py-3 menuList {{ ProductActive|default('') }}"
href="{{ path('app_product_index') }}">{{ 'Products'|trans }}</a>
<a class="btn btn-outline-light py-3 menuList {{ InvoiceActive|default('') }}"
href="{{ path('app_invoice_index') }}">{{ 'Invoice'|trans }}</a>
<a class="btn btn-outline-light py-3 menuList {{ OrganizationActive|default('') }}"
href="{{ path('app_organization_index') }}">{{ 'Organization'|trans }}</a>
<a class="btn btn-outline-light py-3 menuList {{ PaymentActive|default('') }}"
href="{{ path('app_payment_index') }}">{{ 'Payment'|trans }}</a>
<a class="btn btn-outline-light py-3 menuList {{ InvoiceItemActive|default('') }}"
href="{{ path('app_invoice_item_index') }}">{{ 'Invoice Item'|trans }}</a>
<a class="btn btn-outline-light py-3 menuList {{ InvoiceStatusActive|default('') }}"
href="{{ path('app_invoice_status_index') }}">{{ 'Invoice Status'|trans }}</a>
<a class="btn btn-outline-light py-3 menuList {{ StoreActive|default('') }}"
href="{{ path('app_store_index') }}">{{ 'Store'|trans }}</a>
<a class="btn btn-outline-light py-3 menuList {{ AddressActive|default('') }}"
href="{{ path('app_address_index') }}">{{ 'Address'|trans }}</a>
<a class="btn btn-outline-light py-3 menuList {{ AddressOrganizationActive|default('') }}"
href="{{ path('app_address_organization_index') }}">{{ 'AddressOrganization'|trans }}</a>
<a class="btn btn-outline-light py-3 menuList {{ AddressSalesmanActive|default('') }}"
href="{{ path('app_address_salesman_index') }}">{{ 'AddressSalesman'|trans }}</a>
<a class="btn btn-outline-light py-3 menuList {{ QuoteActive|default('') }}"
href="{{ path('app_quote_index') }}">{{ 'Quote'|trans }}</a>
<a class="btn btn-outline-light py-3 menuList {{ CommissionSettingActive|default('') }}"
href="{{ path('app_commission_setting_index') }}">{{ 'Commission Setting'|trans }}</a>
<a class="btn btn-outline-light py-3 menuList {{ SalesmanCommissionActive|default('') }}"
href="{{ path('app_salesman_commission_index') }}">{{ 'Commission Salesman'|trans }}</a>
<a class="btn btn-outline-light py-3 menuList {{ SalesmanActive|default('') }}"
href="{{ path('app_salesman_index') }}">{{ 'Salesman'|trans }}</a>
<a class="btn btn-outline-light py-3 menuList {{ PaymentPlanActive|default('') }}"
href="{{ path('app_payment_plan_index') }}">{{ 'PaymentPlan'|trans }}</a>
<a class="btn btn-outline-light py-3 menuList {{ PayQuoteActive|default('') }}"
href="{{ path('app_pay_quote_index') }}">{{ 'PayQuote'|trans }}</a>
<a class="btn btn-outline-light py-3 menuList {{ StockActive|default('') }}"
href="{{ path('app_stock_index') }}">{{ 'Stock'|trans }}</a>
<a class="btn btn-outline-light py-3 menuList {{ PurchaseActive|default('') }}"
href="{{ path('app_purchase_index') }}">{{ 'Purchase'|trans }}</a>
<a class="btn btn-outline-light py-3 menuList {{ PurchaseItemActive|default('') }}"
href="{{ path('app_purchase_item_index') }}">{{ 'Purchase Item'|trans }}</a>
</div>
</div>
<div class="menu-item menu-here-bg menu-lg-down me-0 dropdown">
<a class="btn btn-outline-light menuHead py-3 text-black dropdown-toggle"
href="#" role="button" id="typeMenuDropdown"
data-bs-toggle="dropdown" aria-haspopup="true"
aria-expanded="false"
>Administración Tipos</a>
<div class="dropdown-menu" aria-labelledby="typeMenuDropdown">
<a class="btn btn-outline-light py-3 menuList {{ StatusTypeActive|default('') }}"
href="{{ path('app_status_type_index') }}">Estados</a>
<a class="btn btn-outline-light py-3 menuList {{ ParameterTypeActive|default('') }}"
href="{{ path('app_parameter_type_index') }}">{{ 'Parameter Type'|trans }}</a>
<a class="btn btn-outline-light py-3 menuList {{ ParameterActive|default('') }}"
href="{{ path('app_parameter_index') }}">{{ 'Parameter'|trans }}</a>
<a class="btn btn-outline-light py-3 menuList {{ PaymentTypeActive|default('') }}"
href="{{ path('app_payment_type_index') }}">Forma de Pago</a>
<a class="btn btn-outline-light py-3 menuList {{ CurrencyTypeActive|default('') }}"
href="{{ path('app_currency_type_index') }}">Tipo
Moneda</a>
<a class="btn btn-outline-light py-3 menuList {{ MethodPayTypeActive|default('') }}"
href="{{ path('app_method_pay_type_index') }}">{{ 'Method Pay Type'|trans }}</a>
<a class="btn btn-outline-light py-3 menuList {{ PlanTypeActive|default('') }}"
href="{{ path('app_plan_type_index') }}">{{ 'Plan Type'|trans }}</a>
<a class="btn btn-outline-light py-3 menuList {{ OrganizationTypeActive|default('') }}"
href="{{ path('app_organization_type_index') }}">{{ 'Organization Type'|trans }}</a>
<a class="btn btn-outline-light py-3 menuList {{ AddressTypeActive|default('') }}"
href="{{ path('app_address_type_index') }}">{{ 'Address Type'|trans }}</a>
<a class="btn btn-outline-light py-3 menuList {{ CommissionTypeActive|default('') }}"
href="{{ path('app_commission_type_index') }}">{{ 'Commission Type'|trans }}</a>
</div>
</div>
</div>
</div>
{% endif %}
</div>
</div>
<!--end::Menu-->
</div>
</div>
<!--begin::Toolbar wrapper-->
<div class="topbar d-flex align-items-stretch flex-shrink-0">
<!--begin::Search-->
<!--end::Theme mode-->
<!--begin::User-->
<div class="d-flex align-items-center me-n3 ms-1 ms-lg-3" style="padding-left: 10px" id="kt_header_user_menu_toggle">
{% if app.user %}
<!--begin::Menu wrapper-->
<div class="btn btn-icon btn-active-light-primary btn btn-icon btn-active-light-primary btn-custom w-30px h-30px w-md-40px h-md-40px"
style="padding-right: 15px"
data-kt-menu-trigger="click" data-kt-menu-attach="parent"
data-kt-menu-placement="bottom-end">
{% if app.user.avatar == null %}
<img class="h-50px w-50px rounded"
src="{{ url('profile_avatar', { 'id': app.user.avatar|default('none') } ) }}"
alt=""/>
{% else %}
<img alt="Logo" class="h-50px w-50px rounded"
src="data:image/png;base64,{{ app.user.avatar|default('none') }}"/>
{% endif %}
</div>
<!--begin::User account menu-->
<div class="menu menu-sub menu-sub-dropdown menu-column menu-rounded menu-gray-800 menu-state-bg menu-state-primary fw-bold py-4 fs-6 w-275px"
data-kt-menu="true">
<!--begin::Menu item-->
<div class="menu-item px-3">
<div class="menu-content d-flex align-items-center px-3">
<!--begin::Avatar-->
<div class="symbol symbol-50px me-5">
{% if app.user.avatar == null %}
<img class="h-30px w-30px rounded"
src="{{ url('profile_avatar', { 'id': app.user.avatar|default('none') } ) }}"
alt=""/>
{% else %}
<img alt="Logo"
src="data:image/png;base64,{{ app.user.avatar|default('none') }}"/>
{% endif %}
</div>
<!--end::Avatar-->
<!--begin::Username-->
<div class="d-flex flex-column">
<a href="{{ path('profile_user', {'id': app.user.id}) }}"
class="fw-bold text-muted text-hover-primary fs-7">{{ app.user.email }}</a>
</div>
<!--end::Username-->
</div>
</div>
<!--end::Menu item-->
<!--begin::Menu separator-->
<div class="separator my-2"></div>
<!--end::Menu separator-->
<!--begin::Menu item-->
<div class="menu-item px-5">
<a href="{{ path('profile_user', {'id': app.user.id}) }}"
class="menu-link px-5">Mi Perfil</a>
</div>
<div class="separator my-2"></div>
<div class="dark-mode-toggle-container">
<span style="margin-left: 11%">Modo oscuro</span>
<label class="switch">
<input type="checkbox" id="darkModeToggle">
<span class="slider round"></span>
</label>
</div>
<div class="separator my-2"></div>
<div class="menu-item px-5">
<a href="{{ path('app_logout') }}" class="menu-link px-5">Cerrar Sesión</a>
</div>
</div>
<!--end::User account menu-->
<!--end::Menu wrapper-->
{% else %}
{% endif %}
</div>
<!--end::User -->
<!--begin::Aside mobile toggle-->
<!--end::Aside mobile toggle-->
</div>
<!--end::Toolbar wrapper-->
</div>
</div>
<!--end::Container-->
</div>
<!--end::Header-->
<!--begin::Toolbar-->
{% if showToolbar|default(1) %}
<div class="toolbar " id="kt_toolbar">
<!--begin::Container-->
<div id="kt_toolbar_container" class="container-xxl d-flex flex-stack flex-wrap">
<div class="page-title d-flex flex-column me-3" style="z-index: 10">
<h1 class="p-3" style="color: #12484a">{% block title %} {% endblock %} </h1>
<ul class="breadcrumb breadcrumb-separatorless fw-bold fs-7 my-1">
{% block breadcrumb %}
{% endblock %}
</ul>
</div>
<!--end::Page title-->
<!--begin::Actions-->
<div class="d-flex align-items-center py-3 py-md-1">
{% block breadBottom %}
{% endblock %}
</div>
<!--end::Actions-->
</div>
<!--end::Container-->
</div>
{% else %}
<!--begin::Actions-->
<div class="mb-5">
</div>
{% endif %}
<!--end::Toolbar-->
<!--begin::Container-->
<div id="kt_content_container" class="d-flex flex-column-fluid align-items-start container-fluid">
<!--begin::Post-->
<div class="content flex-row-fluid" id="kt_content">
<div class="row">
<!--begin::Col-->
<div class="col-md-12">
<div class="row">
<div class="col-md-12">
{% if app.request.attributes.get('_route') != 'app_start' and app.request.attributes.get('_route') != 'profile_user' and app.request.attributes.get('_route') != 'load_user' %}
<div class="card card-bordered" style="padding: 25px;">
<div class="card-body">
<div class="table-responsive">
{% endif %}
{% block body %}
{% endblock %}
{% if app.request.attributes.get('_route') != 'app_start' %}
</div>
</div>
</div>
{% endif %}
</div>
</div>
</div>
<!--end::Col-->
</div>
</div>
<!--end::Post-->
</div>
<!--end::Container-->
<!--begin::Footer-->
<div class="footer py-4 d-flex flex-lg-column" id="kt_footer">
<!--begin::Container-->
<div class="container-xxl d-flex flex-column flex-md-row align-items-center justify-content-between">
<!--begin::Copyright-->
<div class="text-dark order-2 order-md-1">
<span class="text-muted fw-bold me-1"></span>
<a href="https://ianalytics.cl" target="_blank" class=" text-hover-primary"
style="color: #12484a">iAnalytics</a>
</div>
</div>
<!--end::Container-->
</div>
<!--end::Footer-->
</div>
<!--end::Wrapper-->
</div>
<!--end::Page-->
</div>
<div class="modal fade payModal" id="staticBackdrop" data-bs-backdrop="static" data-bs-keyboard="false"
tabindex="-1" aria-labelledby="staticBackdropLabel" aria-hidden="true">
<div class="modal-dialog modal-lg">
<form id="payForm" action="" method="post">
<div class="modal-content">
<div class="modal-header" style="background-color: #107c69;">
<h1 class="modal-title fs-5 text-white" id="staticBackdropLabel">Pagar Factura</h1>
<button type="button" class="btn-close text-white" data-bs-dismiss="modal"
aria-label="Close"></button>
</div>
<div class="modal-body p2">
<div class="container text-center">
<div>
<label for="customer" class="label-form">Seleccione una Factura:</label>
<input class="form-control" type="text" id="customer" name="customer">
</div>
<div>
<label for="product" class="label-form">Tipo de Pago:</label>
<input class="form-control" type="text" id="product" name="product">
</div>
<div>
<label for="quantity" class="label-form">Cuotas:</label>
<input class="form-control" type="number" id="quantity" name="quantity">
</div>
<div>
<label for="pay" class="label-form">Abonar:</label>
<input class="form-control" type="number" id="pay" name="pay">
</div>
<div>
<label for="total" class="label-form">Total:</label>
<input class="form-control" type="text" id="total" name="total">
</div>
</div>
</div>
<div class="modal-footer">
<button type="button" style="background-color: #ce3e61" class="btn text-white"
data-bs-dismiss="modal">Cancelar
</button>
<button type="submit" style="background-color: #107c69" class="btn text-white">Pagar</button>
</div>
</div>
</form>
</div>
</div>
<div class="modal fade invoiceModal" id="staticBackdrop" data-bs-backdrop="static" data-bs-keyboard="false"
tabindex="-1" aria-labelledby="staticBackdropLabel" aria-hidden="true">
<div class="modal-dialog modal-lg">
{% set currentRoute = app.request.attributes.get('_route') %}
{% set formAction = 'app_invoice_create' %}
{% if currentRoute == 'app_sales' %}
{% set formAction = 'app_invoice_create' %}
{% elseif currentRoute == 'app_purchases' %}
{% set formAction = 'app_purchase_create' %}
{% elseif currentRoute == 'app_orders' %}
{% set formAction = 'app_preinvoice_create' %}
{% elseif currentRoute == 'app_orders' %}
{% set formAction = 'edit_preinvoice' %}
{% endif %}
<form id="invoiceForm" action="{{ path(formAction) }}" method="POST">
<div class="modal-content">
<div class="modal-header" id="divColor">
<h1 class="modal-title fs-5 text-white" id="titleModal"></h1>
<button type="button" class="btn-close text-white" data-bs-dismiss="modal"
aria-label="Cerrar"></button>
</div>
<div class="modal-body p2">
<div class="container">
<div class="row">
<div class="col-md-12">
<div class="form-group">
<label for="poNumber">N° Orden de Compra</label>
<input type="text" class="form-control" id="poNumber" name="poNumber" placeholder="Ingrese su numero de orden">
</div>
</div>
</div>
<div class="row">
<div class="col-md-6">
<div class="form-group">
<label for="hostNum" class="label-form">N° Factura<i
style="color:red;">*</i></label>
<input type="number" class="form-control mb-4" id="hostNum" name="hostNum" min="1"
required>
</div>
</div>
<div class="{% if currentRoute == 'app_orders' %}col-md-12{% else %}col-md-6{% endif %}">
<div class="form-group">
<label for="date" class="label-form">Fecha de Emisión<i
style="color:red;">*</i></label>
<input type="date" class="form-control mb-4" id="date" name="date" required>
</div>
</div>
</div>
<div class="row">
<div class="{% if currentRoute == 'app_purchases'%}col-md-12{% elseif currentRoute == 'app_orders' %}col-md-12 {% else %}col-md-6{% endif %}">
<div class="form-group">
<label for="endDate" class="label-form">Fecha Vencimiento Factura<i
style="color:red;">*</i></label>
<input type="date" class="form-control mb-4" id="endDate" name="endDate" required>
</div>
</div>
<div class="col-md-6">
<div class="form-group">
<label for="salesman" class="label-form">Vendedor<i style="color:red;">*</i></label>
<select class="form-control optionSelect" id="salesman" name="salesman"
data-control="select2" required>
</select>
</div>
</div>
</div>
<div class="row">
<div class="{% if currentRoute == 'app_purchases' %}col-md-12{% else %}col-md-6{% endif %}">
<div class="form-group">
<label for="organization" class="label-form" id="titleOrganization"></label>
<select class="form-control optionSelect" id="organization" name="organization"
data-control="select2" autocomplete="off" required>
</select>
</div>
</div>
<div class="col-md-6">
<div class="form-group">
<label for="payMethod" class="label-form">Condición de pago<i style="color:red;">*</i></label>
<select class="form-control optionSelect" id="payMethod" name="payMethod"
data-control="select2" required>
</select>
</div>
</div>
<div class="col-md-12">
<div class="form-group">
<label for="payType" class="label-form">Forma de pago<i style="color:red;">*</i></label>
<select class="form-control optionSelect" id="payType" name="payType"
data-control="select2" required>
</select>
</div>
</div>
</div>
<div class="form-group{% if currentRoute == 'app_purchases' %}col-md-12{% else %}col-md-6{% endif %}">
<label for="planType" class="label-form">Plan de pago</label>
<select class="form-control optionSelect" id="planType" name="planType"
data-control="select2" required>
</select>
</div>
<input type="hidden" id="selectedProductsList" name="selectedProductsList">
<div class="row">
<div class="col-md-12">
<div class="form-group">
<label for="productSearch" class="p-2" style="color: #12484a">Productos:<i
style="color:red;">*</i></label>
<input type="text" id="productSearch" placeholder="Buscar">
<div id="products" class="mt-4"
style="max-height: 350px !important;overflow-y: scroll;margin-bottom: 2px;">
</div>
</div>
</div>
</div>
<div class="col-md-12">
<label for="observation" class="form-label">Observaciones:</label>
<textarea class="form-control" name="observation" id="observation" rows="3" placeholder="Ingresar observaciones"></textarea>
</div>
<input type="hidden" name="preinvoices" id="preinvoicesInput" value="">
</div>
</div>
<div class="modal-footer" style="display: flex; justify-content: space-between; align-items: center;">
<div class="form-group">
<label for="totalInvoice" class="p-2"
style="color: #12484a;font-weight: bolder;font-size: x-large;" id="totalInvoiceTitle">Total:</label>
<input hidden="hidden" name="totalInvoice" id="totalInvoice">
</div>
<div>
<button type="button" style="background-color: #ce3e61" class="btn text-white"
data-bs-dismiss="modal">Cancelar
</button>
<button type="submit" style="background-color: #107c69" class="btn text-white btn-create"
id="createInvoice">Crear
</button>
<button type="button" style="background-color: #0d6efd" class="btn text-white btn-sm mt-1 btn-saveChanges" id="saveChangesButton" style="display: none;">
Guardar Cambios
</button>
</div>
</div>
</div>
</form>
</div>
</div>
<div class="modal fade purchasePrint" id="staticBackdrop" data-bs-backdrop="static" data-bs-keyboard="false"
tabindex="-1" aria-labelledby="staticBackdropLabel" aria-hidden="true">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header" id="divColor">
<h1 class="modal-title fs-5 " id="titleModalPrint">Detalle Factura</h1>
<button type="button" class="btn-close text-white" data-bs-dismiss="modal" aria-label="Cerrar"></button>
</div>
<div class="modal-body p2">
<div class="container">
<div class="form-group">
<iframe id="iframe" style="width: 100%; height: 900px; border: none;"></iframe>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="modal fade" id="paymentModal" tabindex="-1" aria-labelledby="paymentModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="paymentModalLabel">Registrar Pago</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<form id="paymentForm">
<div class="mb-3">
<label for="paymentType" class="form-label">Tipo de Pago</label>
<select class="form-select" id="paymentType" name="paymentType" required>
</select>
</div>
<input type="hidden" id="invoiceId" name="invoiceId">
<button type="submit" class="btn btn-primary">Registrar Pago</button>
</form>
</div>
</div>
</div>
</div>
<script src="{{ asset('plugins/global/plugins.bundle.js') }} "></script>
<script src="{{ asset('js/scripts.bundle.js') }} "></script>
<script src="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/js/select2.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js"></script>
<script src="https://cdn.datatables.net/1.10.21/js/jquery.dataTables.min.js"></script>
<script src="https://cdn.datatables.net/1.10.21/js/dataTables.bootstrap4.min.js"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script>
<script>console.log("Ruta actual: {{ currentRoute }}");</script>
{% if is_granted('ROLE_SUPER_ADMIN') %}
<script>
document.addEventListener('DOMContentLoaded', function () {
let toggle = document.querySelector('.email-dropdown-toggle');
let menu = document.querySelector('.email-dropdown-menu');
let subMenus = document.querySelectorAll('.dropdown-menu');
toggle.addEventListener('click', function (event) {
event.stopPropagation();
menu.style.display = menu.style.display === 'block' ? 'none' : 'block';
});
subMenus.forEach(function (subMenu) {
subMenu.addEventListener('click', function (event) {
event.stopPropagation();
});
});
window.addEventListener('click', function (event) {
if (menu.style.display === 'block' && !menu.contains(event.target) && !toggle.contains(event.target)) {
menu.style.display = 'none';
}
});
});
</script>
{% endif %}
<script>
function handleAction(url, confirmMessage) {
Swal.fire({
title: '¿Estás seguro?',
text: confirmMessage,
icon: 'warning',
showCancelButton: true,
confirmButtonColor: '#3085d6',
cancelButtonColor: '#d33',
confirmButtonText: 'Sí, proceder!',
cancelButtonText: 'Cancelar'
}).then((result) => {
if (result.isConfirmed) {
if (url.includes('deactivate')) {
$.ajax({
url: url,
method: 'POST',
success: function (response) {
if (response.success) {
Swal.fire(
'Eliminado!',
'Factura Eliminada.',
'success'
);
$(`button[data-id="${response.id}"]`).closest('tr').remove();
} else {
Swal.fire(
'Error!',
'No se pudo eliminar la factura.',
'error'
);
}
},
error: function () {
Swal.fire(
'Error!',
'Ocurrió un error al intentar eliminar la factura.',
'error'
);
}
});
} else {
window.location.href = url;
}
}
});
}
$(document).on('click', '.printPurchase', function (event) {
event.preventDefault();
let orderId = $(this).data('id');
let urlPrint = "{{ path('view_purchase_detail', { 'id': 'replace_id' }) }}".replace('replace_id', orderId);
$('#iframe').attr('src', urlPrint);
$('.purchasePrint').modal('show');
});
$(document).on('click', '.printInvoice', function (event) {
event.preventDefault();
let orderId = $(this).data('id');
let urlPrint = "{{ path('view_invoice_detail', { 'id': 'replace_id' }) }}".replace('replace_id', orderId);
$('#iframe').attr('src', urlPrint);
$('.purchasePrint').modal('show');
});
$(document).on('click', '.printPreinvoice', function (event) {
event.preventDefault();
$('#titleModalPrint').text('Detalle Orden de Compra')
let orderId = $(this).data('id');
console.log(orderId + 'id recuperado')
let urlPrint = "{{ path('view_preinvoice_detail', { 'id': 'replace_id' }) }}".replace('replace_id', orderId);
$('#iframe').attr('src', urlPrint);
$('.purchasePrint').modal('show');
});
$(document).ready(function () {
$.extend(true, $.fn.dataTable.defaults, {
language: {
url: '//cdn.datatables.net/plug-ins/2.0.8/i18n/es-MX.json'
}
});
$('.btn').each(function () {
if ($(this).text().trim() === 'Guardar' || $(this).text().trim() === 'Actualizar') {
$(this).addClass('btn-sm btn-success');
$(this).css('margin-top', '5px');
}
if ($(this).text().trim() === 'Eliminar' || $(this).text().trim() === 'Cancelar') {
$(this).addClass('btn-sm btn-danger');
$(this).css('margin-top', '5px');
}
if ($(this).text().trim() === 'Crear' || $(this).text().trim() === 'Guardar cambios') {
$(this).addClass('btn-sm');
$(this).css('margin-top', '5px');
}
});
$("a").each(function () {
if ($(this).text().trim() === 'Volver' || $(this).text().trim() === 'Ver') {
$(this).addClass('btn btn-sm btn-secondary');
$(this).css('margin-top', '5px');
}
if ($(this).text().trim() === 'Editar' || $(this).text().trim() === 'Editar admin') {
$(this).addClass('btn btn-sm btn-primary');
$(this).css('margin-top', '5px');
}
if ($(this).text().trim() === 'Crear nuevo' || $(this).text().trim() === 'Crear nuevo admin') {
$(this).addClass('btn btn-sm text-white');
$(this).css('background-color', '#3f4254');
$(this).css('margin-top', '5px');
}
});
$('.optionSelect').each(function () {
$(this).select2({
dropdownParent: $('.invoiceModal .modal-body'),
width: '100%',
});
});
});
let ivaParameter;
let dolarParameter;
$(document).ready(function () {
function checkAndUpdateDollarPrice() {
$.ajax({
url: '{{ path('check_dollar_update') }}',
type: 'GET',
dataType: 'json',
success: function (data) {
if (data.status === 'updated') {
console.log('Precio del dólar actualizado:', data['dollarPrice']);
dolarParameter = parseFloat(data['dollarPrice']).toFixed(3);
$('#dolar').val('$' + dolarParameter);
} else {
console.log('No se requiere actualización. Precio actual del dólar:', data['dollarPrice']);
dolarParameter = parseFloat(data['dollarPrice']).toFixed(3);
$('#dolar').val('$' + dolarParameter);
console.log(dolarParameter);
}
},
error: function (jqXHR, textStatus, errorThrown) {
console.error('Error checking dollar price:', textStatus, errorThrown);
}
});
}
function checkAndUpdateIva() {
$.ajax({
url: '{{ path('check_iva_update') }}',
type: 'GET',
dataType: 'json',
success: function (data) {
ivaParameter = data['iva'];
console.log('iva', ivaParameter)
},
error: function (jqXHR, textStatus, errorThrown) {
console.error('Error checking iva price:', textStatus, errorThrown);
}
});
}
checkAndUpdateDollarPrice();
checkAndUpdateIva();
});
$(document).on("click", ".payBtn", function () {
$(".payModal").modal('show');
});
let typeProduct;
$(document).on("click", ".invoiceBtn", function () {
adittionalData(2, false)
typeProduct = 2;
$('#titleModal').text('Ventas');
$('#titleOrganization').html('Cliente asociado<i style="color:red;">*</i>');
//$('#endDate').closest('.form-group').remove();
$('#poNumber').closest('.form-group').remove();
$('#divColor').css('background-color', '#107c69');
$('.btn-saveChanges').hide();
$(".invoiceModal").modal('show');
setTimeout(function () {
calculateInvoice();
}, 300);
});
$(document).on("click", ".purchaseBtn", function () {
adittionalData(1, false)
typeProduct = 1;
$('#titleModal').text('Compras');
$('#titleOrganization').html('Proveedor asociado<i style="color:red;">*</i>');
$('#salesman').closest('.form-group').remove();
$('#payMethod').closest('.form-group').remove();
$('#planType').closest('.form-group').remove();
$('#poNumber').closest('.form-group').remove();
$('#divColor').css('background-color', '#bd2d50');
$('.btn-saveChanges').hide();
$(".invoiceModal").modal('show');
setTimeout(function () {
calculateInvoice();
}, 300);
});
$(document).on("click", ".orderBtn", function () {
adittionalData(1, false)
typeProduct = 1;
$('#titleModal').text('Orden de Compra');
$('#titleOrganization').html('Proveedor asociado<i style="color:red;">*</i>');
$('#hostNum').closest('.form-group').remove();
$('#salesman').closest('.form-group').remove();
$('#payMethod').closest('.form-group').remove();
$('#divColor').css('background-color', '#bd2d54');
$('.btn-saveChanges').hide();
$(".invoiceModal").modal('show');
setTimeout(function () {
calculateInvoice();
}, 300);
});
$(document).on('change', '.form-check-input.productsOption', function () {
let index = parseInt($(this).attr('id').split('_')[1]);
let quantityInput = $(`#quantity_${index}`);
let priceInput = $(`#price_${index}`);
if ($(this).is(":checked")) {
quantityInput.show();
priceInput.show();
} else {
quantityInput.hide();
priceInput.hide();
}
calculateInvoice()
});
$(document).on("click", "#statusSwitch", function () {
let isChecked = $(this).prop('checked');
if (isChecked) {
$(this).next('.form-check-label').text('estado: Activo');
$('#statusSwitch').prop('checked', true);
} else {
$(this).next('.form-check-label').text('estado: Inactivo');
$('#statusSwitch').prop('checked', false);
}
});
$(document).on('input', '.quantity', function () {
let inputValue = $(this).val().trim();
let stockavailable = $(this).data('stockavailable');
if (isNaN(inputValue) || inputValue === "") {
$(this).val(0);
inputValue = 0;
}
let quantity = parseInt(inputValue);
if (quantity < 1) {
quantity = 1;
} else if (quantity > stockavailable) {
quantity = stockavailable;
}
$(this).val(quantity);
calculateInvoice();
});
document.addEventListener('DOMContentLoaded', function () {
let numInputs = document.querySelectorAll('.numInputs');
numInputs.forEach(function (input) {
input.addEventListener('input', function () {
let inputValue = this.value;
if (!/^\d*\.?\d*$/.test(inputValue)) {
this.value = inputValue.slice(0, -1);
}
});
});
});
{% for flashMessage in app.session.flashbag.get('error') %}
Swal.fire({
text: "{{ flashMessage }}",
icon: "error",
timer: 2000,
showConfirmButton: false,
showCancelButton: false,
});
{% endfor %}
{% for flashMessage in app.session.flashbag.get('success') %}
Swal.fire({
text: "{{ flashMessage }}",
icon: "success",
timer: 2000,
showConfirmButton: false,
showCancelButton: false,
});
{% endfor %}
{% for flashMessage in app.session.flashbag.get('info') %}
Swal.fire({
text: "{{ flashMessage }}",
icon: "info",
timer: 2000,
showConfirmButton: false,
showCancelButton: false,
});
{% endfor %}
toastr.options = {
"closeButton": false,
"debug": false,
"newestOnTop": false,
"progressBar": true,
"positionClass": "toastr-top-right",
"preventDuplicates": false,
"onclick": null,
"showDuration": "300",
"hideDuration": "1000",
"timeOut": "5000",
"extendedTimeOut": "1000",
"showEasing": "swing",
"hideEasing": "linear",
"showMethod": "fadeIn",
"hideMethod": "fadeOut"
};
{% set excluded_routes = ['app_start', 'app_sales', 'app_purchases', 'app_orders', 'app_commissions'] %}
{% if app.request.attributes.get('_route') not in excluded_routes %}
$(document).ready(function () {
let table = $('.table');
if (!table.find('tbody tr').text().includes('No existen registros')) {
table.DataTable({
order: [[0, "desc"]],
columnDefs: [
{type: 'num', targets: 0}
]
});
table.addClass('table-row-bordered gy-5 stylish-table mb-0 mt-2');
$('.table tr').addClass('fw-semibold fs-6 text-center');
} else {
console.log("La tabla está vacía o contiene el mensaje de que no existen registros");
}
});
{% endif %}
function validateForm(currentForm) {
if (currentForm.id === 'paymentForm') {
return false;
}
if (currentForm.id === 'organizationForm') {
let rut = $('#rutInput').val();
let orgType = $('#orgType').val();
rut = formatearRUT(rut);
let isValidRUT = validateRUT(rut);
let isRUTExist = verificarRUTExistente(rut, orgType);
if (isValidRUT && isRUTExist) {
Swal.fire({
title: 'Error de Validación',
text: 'El RUT ingresado es inválido o ya existe.',
icon: 'error',
confirmButtonColor: '#3085d6',
confirmButtonText: 'OK'
});
return false;
}
}
if (currentForm.id === 'salesmanForm') {
let rut = $('#rutInput').val();
rut = formatearRUT(rut);
let isValidRUT = validateRUT(rut);
let isRUTExist = verificarRUTExistente(rut, '0');
if (isValidRUT && isRUTExist) {
Swal.fire({
title: 'Error de Validación',
text: 'El RUT ingresado es inválido o ya existe.',
icon: 'error',
confirmButtonColor: '#3085d6',
confirmButtonText: 'OK'
});
return false;
}
}
if (currentForm.id === 'invoiceForm') {
let allFilled = true;
let emptyFields = [];
let invalidSelects = [];
$(currentForm).find('input[required], select[required], textarea[required]').each(function () {
if (!$(this).val().trim() || ($(this).is('select') && ($(this).val() === '0' || $(this).val() === null))) {
allFilled = false;
let label = $('label[for="' + $(this).attr('id') + '"]').text() || $(this).attr('id');
emptyFields.push(label);
if ($(this).is('select')) {
invalidSelects.push(label);
}
}
});
if (!allFilled) {
let fieldNames = emptyFields.join(', ');
let message = 'Por favor, completa los siguientes campos antes de enviar: ' + fieldNames;
Swal.fire({
title: 'Campos incompletos',
text: message,
icon: 'warning',
confirmButtonColor: '#3085d6',
confirmButtonText: 'OK'
});
return false;
}
if ($('.productsOption:checked').length === 0) {
Swal.fire({
icon: 'error',
title: 'Error',
text: 'Debe seleccionar al menos un producto.'
});
return false;
}
}
let allFilled = true;
let emptyFields = [];
$(currentForm).find('input, textarea, select').each(function () {
if ($(this).attr('type') !== 'file' && $(this).prop('required') && ($(this).val().trim() === '')) {
allFilled = false;
let id = $(this).attr('id');
let label = $("label[for='" + id + "']").text();
emptyFields.push(label);
}
});
if (!allFilled) {
let fieldNames = emptyFields.join(', ');
Swal.fire({
title: 'Campos incompletos',
text: 'Por favor, completa los siguientes campos antes de enviar: ' + fieldNames,
icon: 'warning',
confirmButtonColor: '#3085d6',
confirmButtonText: 'OK'
});
return false;
}
return true;
}
$(document).ready(function () {
let forms = $('form');
if (forms.length > 0) {
forms.on('submit', function (e) {
e.preventDefault();
let currentForm = this;
let isSubmitting = $(currentForm).data('isSubmitting');
if (isSubmitting) {
return;
}
if (validateForm(currentForm)) {
Swal.fire({
title: '¿Estás Seguro?',
text: "¡No podrás revertir esta acción!",
icon: 'warning',
showCancelButton: true,
confirmButtonColor: '#3085d6',
cancelButtonColor: '#d33',
confirmButtonText: 'Confirmar',
cancelButtonText: 'Cancelar'
}).then((result) => {
if (result.isConfirmed) {
$(currentForm).data('isSubmitting', true);
currentForm.submit();
}
});
}
});
}
});
let selectedProducts = {};
let products;
let unitActualSale;
let cant = false;
function adittionalData(type, act) {
$.ajax({
url: `{{ path('app_additional_data_invoice') }}?type=${type}`,
method: 'GET',
success: function (response) {
$('#totalInvoiceTitle').text("Total:");
let organizations = response.result.organization;
products = response.result['products'];
let sellers = response.result.salesman;
let planTypes = response.result.planType;
let paymentMethods = response.result['methodPayment'];
let paymentTypes = response.result['payTypes'];
let selectPlanType = $('#planType');
let selectSalesman = $('#salesman');
let selectOrganization = $('#organization');
let selectPayMethod = $('#payMethod');
let selectPayType = $('#payType');
$("#products").empty();
if (!act) {
selectOrganization.empty();
selectSalesman.empty();
selectPayMethod.empty();
selectPlanType.empty();
selectPayType.empty();
selectOrganization.html("<option value='0'>No Especifíca</option>");
selectSalesman.html("<option value='0'>No Especifíca</option>");
selectPayMethod.html("<option value='0'>No Especifíca</option>");
selectPlanType.html("<option value='null'>No Especifíca</option>");
$.each(organizations, function (i, organization) {
let option = $("<option></option>");
option.attr('value', organization.id);
option.attr('data-agent_legal_name', organization['agent_legal_name']);
option.attr('data-organization_type', organization.name);
option.text(organization['business_name']);
$("#organization").append(option);
});
$.each(sellers, function (i, salesman) {
let option = $("<option></option>");
option.attr('value', salesman.id);
option.attr('data-salesman_dni', salesman['salesman_dni']);
option.text(salesman['salesman_name']);
$("#salesman").append(option);
});
$.each(planTypes, function (i, planType) {
let option = $("<option></option>");
option.attr('value', planType.id);
option.text(planType.name + " - Cuotas: " + planType['quote_num']);
$("#planType").append(option);
});
$.each(paymentMethods, function (i, paymentMethod) {
let option = $("<option></option>");
option.attr('value', paymentMethod.id);
option.text(paymentMethod.name);
$("#payMethod").append(option);
});
$.each(paymentTypes, function (i, paymentType) {
let option = $("<option></option>");
option.attr('value', paymentType.id);
option.text(paymentType.name);
$("#payType").append(option);
});
}
renderProducts(products, type);
$('#productSearch').on('input', function () {
let searchTerm = $(this).val().toLowerCase();
let filteredProducts = products.filter(product => {
let productName = product['product_name'];
return productName && productName.toLowerCase().includes(searchTerm);
});
renderProducts(filteredProducts, type);
});
}
});
}
function renderProducts(productsList, type) {
$('#products').empty();
$.each(productsList, function (i, product) {
if(!product['quantity_available'] || product['quantity_available'] <= 0){
return
}
let divCheck = $(`<div class="form-check mb-2 mt-4"></div>`);
let productId = product.id;
let checkbox = $(`<input class="form-check-input productsOption" type="checkbox" id="product_${productId}" name="products[${i}][id]" value="${product.id}">`);
let productName = $(`<span id="product_name_${productId}" title="">${product['product_name']} - Stock Disponible: ${product['quantity_available']}</span>`);
let inputContainer = $('<div class="input-container" style="margin-top: 10px;width: 650px;"></div>');
let quantityInput = $(`<div class="col-6" id="divQuantity_${productId}" style="display:none;">Cantidad: <input type="number" class="form-control mb-2 quantity" id="quantity_${productId}" name="products[${i}][quantity]" value="1" placeholder="Cantidad"></div>`);
let dolarInput = $(`<div class="col-6" id="divDolar_${productId}" style="display:none;">Dolar Producto: <input type="text" id="dolar_${productId}" name="products[${i}][dolar]" value="$${dolarParameter}" placeholder="Dolar"></div>`);
let priceInput = $(`<div class="col-3" id="divPrice_${productId}" style="display:none;">Precio Distribuidor: <input type="text" id="price_${productId}" name="products[${i}][price]" ></div>`);
priceInput.find('input').val(product['unit_price_amount']);
let ivaUni = $(`<div class="col-3" id="divIva_${productId}" style="display:none;">Monto IVA: <input type="text" class="form-control mb-2" id="supplier_unit_amount_${productId}" name="products[${i}][supplier_unit_amount]" readonly></div>`);
let netoUni = $(`<div class="col-3" id="divNeto_${productId}" style="display:none;">Valor Neto: <input type="text" class="form-control mb-2" id="item_amount_${productId}" name="products[${i}][item_amount]" readonly></div>`);
let brutoUni = $(`<div class="col-3" id="divBruto_${productId}" style="display:none;">Total: <input type="text" class="form-control mb-2" id="supplier_tax_amount_${productId}" name="products[${i}][supplier_tax_amount]" readonly></div>`);
let priceInputTwo = $(`<div class="col-3" style="display:none;">Valor Unitario: <input type="text" id="priceSale_${productId}" name="products[${i}][priceSale]" ></div>`);
priceInputTwo.find('input').val(product['sale_price_amount']);
let iva = $('<div class="col-3" style="display:none;">Monto IVA : <input type="text" class="form-control mb-2" id="tax_amount_' + productId + '" name="products[' + i + '][tax_amount]" readonly></div>');
let neto = $('<div class="col-3" style="display:none;">Valor Neto : <input type="text" class="form-control mb-2" id="net_amount_' + productId + '" name="products[' + i + '][net_amount]" readonly></div>');
let totalP = $('<div class="col-3" style="display:none;">Total : <input type="text" class="form-control mb-2" id="gross_margin_pct_' + productId + '" name="products[' + i + '][gross_margin_pct]" readonly></div>');
if (type === 2) {
inputContainer.append($('<div class="row" style="display: flex;justify-content: space-between;">').append(quantityInput).append(dolarInput).append(priceInputTwo).append(neto).append(iva).append(totalP));
} else {
inputContainer.append($('<div class="row" style="display: flex;justify-content: space-between;">').append(quantityInput).append(dolarInput).append(quantityInput).append(dolarInput).append(priceInput).append(netoUni).append(ivaUni).append(brutoUni));
}
divCheck.append(checkbox);
divCheck.append(productName);
divCheck.append(inputContainer);
let saleUnitInput = $('<input type="hidden" id="sale_unit_' + productId + '" name="products[' + i + '][sale_unit]" value="' + product['currency_type_sale'] + '">');
let purchaseUnitInput = $('<input type="hidden" id="purchase_unit_' + productId + '" name="products[' + i + '][purchase_unit]" value="' + product['currency_type_unit'] + '">');
divCheck.append(saleUnitInput, purchaseUnitInput);
console.log('restore1')
if (selectedProducts[productId]) {
var currentRoute = '{{ app.request.attributes.get('_route') }}';
checkbox.prop('checked', true);
quantityInput.show().find('input').val(selectedProducts[productId].quantity);
dolarInput.show().find('input').val('$' + selectedProducts[productId].dolarInput);
if (currentRoute === 'app_sales') {
if (selectedProducts[productId].currency_type_sale_actual === '1') {
console.log('usdVneta')
let formatPriceSale = selectedProducts[productId].priceSale.replace(',', '.');
priceInputTwo.show().find('input').val(formatCurrency(Math.round(formatPriceSale * selectedProducts[productId].dolarInput)));
} else if (selectedProducts[productId].currency_type_sale_actual === '2') {
console.log('clpVenta')
console.log(selectedProducts[productId]['priceSale'])
priceInputTwo.show().find('input').val(formatCurrency(selectedProducts[productId]['priceSale']));
}
totalP.show().find('input').val(formatCurrency(selectedProducts[productId]['grossMarginPct']));
iva.show().find('input').val(formatCurrency(selectedProducts[productId]['taxAmount']));
neto.show().find('input').val(formatCurrency(selectedProducts[productId]['netAmount']));
} else {
if (selectedProducts[productId].currency_type_unit_actual === '1') {
console.log('usdCopra')
let formatPrice =selectedProducts[productId].price.replace(',', '.');
priceInput.show().find('input').val(formatCurrency(Math.round(formatPrice * selectedProducts[productId].dolarInput)));
} else if (selectedProducts[productId].currency_type_unit_actual === '2') {
console.log('clpCopra')
priceInput.show().find('input').val(formatCurrency(selectedProducts[productId].price));
}
netoUni.show().find('input').val(formatCurrency(selectedProducts[productId]['item_amount']));
ivaUni.show().find('input').val(formatCurrency(selectedProducts[productId]['supplier_unit_amount']));
brutoUni.show().find('input').val(formatCurrency(selectedProducts[productId]['supplier_tax_amount']));
}
}
dolarInput.find('input').on('input', function () {
let valor = $(this).val().replace(/,/g, '.');
valor = valor.replace(/[^0-9.]/g, '');
if (valor.length > 9) {
valor = valor.substring(0, 9);
}
let parts = valor.split('.');
if (parts.length > 2) {
valor = parts[0] + '.' + parts.slice(1).join('');
}
if (parts.length > 1 && parts[1].length > 3) {
parts[1] = parts[1].substring(0, 3);
valor = parts.join('.');
}
$(this).val('$'+valor);
updateProductPrices(productId);
});
quantityInput.find('input').on('input', function () {
let valor = $(this).val();
if (valor.length > 6) {
valor = valor.substring(0, 6);
$(this).val(valor);
return false;
}
if (valor === '' || valor === 'Na' || valor <= 0) {
$(this).val(1);
return false;
}
updateProductPrices(productId);
});
priceInput.find('input').on('input', function () {
let valor = $(this).val();
valor = valor.replace(/[^0-9,]/g, '');
let parts = valor.split(',');
if (parts.length > 2) {
valor = parts[0] + ',' + parts.slice(1).join('');
}
if (parts.length > 1 && parts[1].length > 3) {
parts[1] = parts[1].substring(0, 3);
valor = parts.join('.');
}
let integerPart = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, '.');
if (parts.length > 1) {
valor = integerPart + ',' + parts[1];
} else {
valor = integerPart;
}
if (valor.length > 15) {
valor = valor.substring(0, 15);
$(this).val(valor);
return false;
}
$(this).val(valor);
});
priceInput.find('input').on('change', function () {
let newPrice = priceInput.find('input').val();
if (newPrice === '') {
updateProductPrices(productId);
Swal.fire('Cancelado!', 'No se han realizado cambios y el precio original ha sido restaurado.', 'info');
return;
}
Swal.fire({
title: 'Actualizar Precio',
text: '¿Quieres actualizar el precio globalmente, temporalmente o cancelar la actualización?',
icon: 'warning',
showCancelButton: true,
showDenyButton: true,
confirmButtonText: 'Globalmente',
denyButtonText: 'Temporalmente',
cancelButtonText: 'Cancelar',
reverseButtons: true
}).then((result) => {
if (result.isConfirmed || result.isDenied) {
let isGlobal = result.isConfirmed;
Swal.fire({
title: 'Seleccionar Unidad',
text: 'Selecciona el tipo de unidad:',
icon: 'question',
showCancelButton: true,
confirmButtonText: 'USD',
cancelButtonText: 'CLP',
reverseButtons: true
}).then((unitResult) => {
let unit = unitResult.isConfirmed ? '1' : '2'; // USD = 1, CLP = 2
if (unit === '2') {
newPrice = parseCurrency(newPrice);
} else {
newPrice = newPrice.replace('.', '');
}
selectedProducts[productId].currency_type_unit_actual = unit;
selectedProducts[productId].price = newPrice;
if (isGlobal) {
selectedProducts[productId].priceOrg = newPrice;
updateGlobalPrice(productId, newPrice, 1, unit);
updateProductPrices(productId);
Swal.fire('Actualizado!', 'El precio se actualizará globalmente.', 'success');
} else {
updateProductPrices(productId);
Swal.fire('Temporal', 'El precio se actualizará solo temporalmente.', 'info');
}
});
} else if (result.dismiss === Swal.DismissReason.cancel) {
updateProductPrices(productId);
Swal.fire('Cancelado!', 'No se han realizado cambios y el precio original ha sido restaurado.', 'info');
}
});
});
priceInputTwo.find('input').on('input', function () {
let valor = $(this).val();
// Eliminar caracteres no permitidos, permitiendo números y comas
valor = valor.replace(/[^0-9,]/g, '');
// Permitir solo una coma
let parts = valor.split(',');
if (parts.length > 2) {
valor = parts[0] + ',' + parts.slice(1).join('');
}
if (parts.length > 1 && parts[1].length > 2) {
parts[1] = parts[1].substring(0, 2);
valor = parts.join('.');
}
// Formatear la parte entera con puntos como separadores de miles
let integerPart = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, '.');
if (parts.length > 1) {
valor = integerPart + ',' + parts[1];
} else {
valor = integerPart;
}
if (valor.length > 15) {
valor = valor.substring(0, 15);
$(this).val(valor);
return false;
}
$(this).val(valor);
console.log(valor);
});
priceInputTwo.find('input').on('change', function () {
let newPrice = priceInputTwo.find('input').val();
if (newPrice === '') {
updateProductPrices(productId);
Swal.fire('Cancelado!', 'No se han realizado cambios y el precio original ha sido restaurado.', 'info');
return;
}
Swal.fire({
title: 'Actualizar Precio',
text: '¿Quieres actualizar el precio globalmente, temporalmente o cancelar la actualización?',
icon: 'warning',
showCancelButton: true,
showDenyButton: true,
confirmButtonText: 'Globalmente',
denyButtonText: 'Temporalmente',
cancelButtonText: 'Cancelar',
reverseButtons: true
}).then((result) => {
if (result.isConfirmed || result.isDenied) {
let isGlobal = result.isConfirmed;
Swal.fire({
title: 'Seleccionar Unidad',
text: 'Selecciona el tipo de unidad:',
icon: 'question',
showCancelButton: true,
confirmButtonText: 'USD',
cancelButtonText: 'CLP',
reverseButtons: true
}).then((unitResult) => {
let unit = unitResult.isConfirmed ? '1' : '2'; // USD = 1, CLP = 2
if (unit === '2') {
newPrice = parseCurrency(newPrice);
} else {
newPrice = newPrice.replace('.', '');
}
selectedProducts[productId].currency_type_sale_actual = unit;
selectedProducts[productId].priceSale = newPrice;
if (isGlobal) {
selectedProducts[productId].priceOrg = newPrice;
updateGlobalPrice(productId, newPrice, 2, unit);
updateProductPrices(productId);
Swal.fire('Actualizado!', 'El precio se actualizará globalmente.', 'success');
} else {
updateProductPrices(productId);
Swal.fire('Temporal', 'El precio se actualizará solo temporalmente.', 'info');
}
});
} else if (result.dismiss === Swal.DismissReason.cancel) {
updateProductPrices(productId);
Swal.fire('Cancelado!', 'No se han realizado cambios y el precio original ha sido restaurado.', 'info');
}
});
});
checkbox.on('change', function () {
if ($(this).is(':checked')) {
quantityInput.show();
priceInput.show();
priceInputTwo.show();
totalP.show();
iva.show();
neto.show();
brutoUni.show();
ivaUni.show();
netoUni.show();
dolarInput.show();
updateProductPrices(productId);
} else {
quantityInput.hide();
priceInput.hide();
$(`#price_${productId}`).val(selectedProducts[productId].priceOrg);
$(`#purchase_unit_${productId}`).val(selectedProducts[productId].currency_type_unit_actual);
priceInputTwo.hide();
$(`#priceSale_${productId}`).val(selectedProducts[productId].priceOrg);
$(`#sale_unit_${productId}`).val(selectedProducts[productId].currency_type_sale_actual);
totalP.hide();
iva.hide();
neto.hide();
brutoUni.hide();
ivaUni.hide();
dolarInput.hide();
netoUni.hide();
delete selectedProducts[productId];
}
});
$("#products").append(divCheck);
});
calculateInvoice();
}
function updateProductPrices(productId) {
var currentRoute = '{{ app.request.attributes.get('_route') }}';
let dolarInput = $(`#dolar_${productId}`).val();
let quantity = parseInt($(`#quantity_${productId}`).val());
dolarInput = dolarInput.replace(/^\$+/g, '');
console.log('calculops');
console.log(dolarInput);
console.log(selectedProducts[productId]);
console.log(currentRoute)
let priceOriginalInput;
let unitAct = 0;
let priceAct = 0;
if (currentRoute === 'app_purchases') {
if (selectedProducts[productId] === undefined) {
unitAct = $(`#purchase_unit_${productId}`).val();
priceAct = $(`#price_${productId}`).val();
priceOriginalInput = priceAct;
} else {
console.log(selectedProducts[productId]);
unitAct = selectedProducts[productId].currency_type_unit_actual;
priceAct = selectedProducts[productId].price;
priceOriginalInput = selectedProducts[productId].priceOrg;
}
console.log(priceAct + ' probando precio');
let netAmountUnit = 0;
let taxAmountUnit = 0;
let totalUnit = 0;
let pricePurchase;
if (unitAct === '1') {
console.log('usd');
priceAct = parseFloat(priceAct.replace(',', '.'));
console.log(priceAct);
console.log(dolarInput);
pricePurchase = priceAct * dolarInput;
netAmountUnit = pricePurchase * quantity;
taxAmountUnit = netAmountUnit * ivaParameter;
totalUnit = netAmountUnit + taxAmountUnit;
console.log(pricePurchase + ' valor en CLP');
console.log(netAmountUnit + ' monto neto');
console.log(taxAmountUnit + ' monto IVA');
} else if (unitAct === '2') {
console.log('clp');
pricePurchase = parseFloat(priceAct);
netAmountUnit = pricePurchase * quantity;
taxAmountUnit = netAmountUnit * ivaParameter;
totalUnit = netAmountUnit + taxAmountUnit;
console.log(taxAmountUnit + 'iva')
}
$(`#price_${productId}`).val(formatCurrency(Math.round(pricePurchase)));
$(`#item_amount_${productId}`).val(formatCurrency(Math.round(netAmountUnit)));
$(`#supplier_unit_amount_${productId}`).val(formatCurrency(Math.ceil(taxAmountUnit)));
$(`#supplier_tax_amount_${productId}`).val(formatCurrency(Math.round(totalUnit)));
console.log('guardando');
selectedProducts[productId] = {
quantity: quantity,
price: parseFloat(priceAct),
currency_type_unit_actual: unitAct,
priceOrg: priceOriginalInput,
dolarInput: dolarInput,
supplier_unit_amount: Math.ceil(taxAmountUnit),
item_amount: Math.round(netAmountUnit),
supplier_tax_amount: Math.round(totalUnit)
};
}
if (currentRoute === 'app_sales') {
if (selectedProducts[productId] === undefined) {
unitAct = $(`#sale_unit_${productId}`).val();
priceAct = $(`#priceSale_${productId}`).val();
priceOriginalInput = priceAct;
} else {
console.log(selectedProducts[productId])
unitAct = selectedProducts[productId].currency_type_sale_actual;
priceAct = selectedProducts[productId].priceSale;
priceOriginalInput = selectedProducts[productId].priceOrg;
}
console.log(priceAct);
console.log(unitAct);
let netAmountUnit = 0;
let taxAmountUnit = 0;
let totalUnit = 0;
let pricePurchase;
if (unitAct === '1') {
console.log('usd')
pricePurchase = priceAct.replace(',','.') * dolarInput;
netAmountUnit = pricePurchase * quantity;
taxAmountUnit = netAmountUnit * ivaParameter;
totalUnit = netAmountUnit + taxAmountUnit;
} else if (unitAct === '2') {
console.log('clp')
pricePurchase = priceAct;
netAmountUnit = pricePurchase * quantity;
taxAmountUnit = netAmountUnit * ivaParameter;
totalUnit = netAmountUnit + taxAmountUnit;
}
$(`#price_${productId}`).val(formatCurrency(Math.round(pricePurchase)));
$(`#gross_margin_pct_${productId}`).val(formatCurrency(Math.round(totalUnit)));
$(`#tax_amount_${productId}`).val(formatCurrency(Math.trunc(taxAmountUnit)));
$(`#net_amount_${productId}`).val(formatCurrency(Math.round(netAmountUnit)));
console.log(taxAmountUnit)
console.log('guardando')
selectedProducts[productId] = {
quantity: quantity,
currency_type_sale_actual: unitAct,
priceOrg: priceOriginalInput,
priceSale: priceAct,
taxAmount: Math.trunc(taxAmountUnit),
netAmount: Math.round(netAmountUnit),
dolarInput: dolarInput,
grossMarginPct: Math.round(totalUnit),
};
}
if (currentRoute === 'app_orders') {
if (selectedProducts[productId] === undefined) {
unitAct = $(`#purchase_unit_${productId}`).val();
priceAct = $(`#price_${productId}`).val();
priceOriginalInput = priceAct;
} else {
console.log(selectedProducts[productId])
unitAct = selectedProducts[productId].currency_type_unit_actual;
priceAct = selectedProducts[productId].price;
priceOriginalInput = selectedProducts[productId].priceOrg;
}
console.log(priceAct, 'precio magico');
console.log(unitAct);
let netAmountUnit = 0;
let taxAmountUnit = 0;
let totalUnit = 0;
let pricePurchase;
if (unitAct === '1') {
console.log('usd')
pricePurchase = priceAct.replace(',','.') * dolarInput;
netAmountUnit = pricePurchase * quantity;
taxAmountUnit = netAmountUnit * ivaParameter;
totalUnit = netAmountUnit + taxAmountUnit;
} else if (unitAct === '2') {
console.log('clp')
pricePurchase = priceAct;
netAmountUnit = pricePurchase * quantity;
taxAmountUnit = netAmountUnit * ivaParameter;
totalUnit = netAmountUnit + taxAmountUnit;
}
$(`#price_${productId}`).val((parseFloat(pricePurchase).toFixed(3)));
$(`#item_amount_${productId}`).val(formatCurrency(Math.round(netAmountUnit)));
$(`#supplier_unit_amount_${productId}`).val(formatCurrency(Math.ceil(taxAmountUnit)));
$(`#supplier_tax_amount_${productId}`).val(formatCurrency(Math.round(totalUnit)));
console.log('guardando')
selectedProducts[productId] = {
quantity: quantity,
price: priceAct,
currency_type_unit_actual: unitAct,
priceOrg: priceOriginalInput,
dolarInput: dolarInput,
supplier_unit_amount: Math.ceil(taxAmountUnit),
item_amount: Math.round(netAmountUnit),
supplier_tax_amount: Math.round(totalUnit)
};
}
setTimeout(function () {
calculateInvoice();
}, 300);
}
function updateGlobalPrice(productId, newPrice, type, unit) {
console.log(unit)
if(unit === '1' ){
newPrice = newPrice.replace(',','.');
}
$.ajax({
type: 'POST',
url: '{{ path('update_global_price') }}',
data: {
id: productId,
price: newPrice,
type: type,
unit: unit
},
success: function (response) {
console.log(response.message);
},
error: function (xhr, status, error) {
console.error('Error al actualizar el precio global:', error);
}
});
}
function calculateInvoice() {
let currentRoute = "{{ app.request.attributes.get('_route') }}";
let total = 0;
for (let productId in selectedProducts) {
let product = selectedProducts[productId];
let itemAmount;
if (currentRoute === 'app_sales') {
itemAmount =product.grossMarginPct || 0;
} else {
itemAmount = product.supplier_tax_amount || 0;
}
total += itemAmount;
}
$('#totalInvoiceTitle').text("Total: " + formatCurrency(total));
$('#totalInvoice').val(total);
$('#selectedProductsList').val(JSON.stringify(selectedProducts));
console.log(selectedProducts, 'productos seleccionados')
}
function formatCurrency(value, decimals = 0) {
return new Intl.NumberFormat('es-CL', {
style: 'currency',
currency: 'CLP',
minimumFractionDigits: decimals,
maximumFractionDigits: decimals
}).format(value);
}
function parseCurrency(value) {
// Remover los puntos de separador de miles
value = value.replace(/\./g, "");
// Reemplazar la coma como separador decimal por un punto
value = value.replace(/,/g, ".");
// Convertir a float
return parseFloat(value);
}
function formatPriceCLP(price) {
// Convertir a número flotante y luego a una cadena para asegurar el formato
price = parseFloat(price.replace(/,/g, '.')).toFixed(3).toString();
// Separar la parte entera y decimal
let parts = price.split('.');
let integerPart = parts[0];
let decimalPart = parts.length > 1 ? parts[1] : '';
// Formatear la parte entera con puntos como separadores de miles
integerPart = integerPart.replace(/\B(?=(\d{3})+(?!\d))/g, '.');
// Combinar las partes nuevamente
return integerPart;
}
$(document).ready(function () {
$('#payType').closest('.form-group').hide();
$('#planType').closest('.form-group').hide();
$('#payMethod').change(function() {
var selectedValue = $(this).val();
console.log(selectedValue)
if (selectedValue == '1') {
console.log('selectedValue')
$('#payType').closest('.form-group').hide();
$('#planType').closest('.form-group').show();
} else if (selectedValue == '2') {
$('#payType').closest('.form-group').show();
$('#planType').closest('.form-group').hide();
} else {
$('#payType').closest('.form-group').hide();
$('#planType').closest('.form-group').hide();
}
});
$('#hostNum').on('input', function () {
let valor = $(this).val();
// Eliminar cualquier carácter que no sea un número
valor = valor.replace(/[^0-9]/g, '');
// Si el valor es menor o igual a 0, establecerlo en 1
if (valor === '' || valor <= 0) {
$(this).val(1);
} else {
$(this).val(valor);
}
});
$('#orgType,#rutInput').on('input', function () {
let rut = $('#rutInput');
let orgType = $('#orgType').val();
if (orgType === undefined) {
orgType = 0;
}
let rutF = formatearRUT(rut.val());
rut.val(rutF);
let isValid = validateRUT(rut);
if (isValid) {
$('#rutValidation').html('✔').css('color', 'green');
verificarRUTExistente(rut, orgType);
} else {
$('#rutValidation').html('✘').css('color', 'red');
}
});
});
function validateRUT(rut) {
rut = rut.replace(/[^0-9kK]/g, '');
if (rut.length < 2) return false;
let dv = rut.slice(-1).toUpperCase();
let rutNumero = parseInt(rut.slice(0, -1), 10);
let m = 0;
let s = 1;
while (rutNumero > 0) {
s = (s + rutNumero % 10 * (9 - m++ % 6)) % 11;
rutNumero = Math.floor(rutNumero / 10);
}
return (dv === (s ? s - 1 : 'K'));
}
function formatearRUT(rut) {
rut = rut.replace(/[^\dkK]+/g, '');
let reversed = rut.split('').reverse().join('');
let dv = reversed.charAt(0).toUpperCase();
let digits = reversed.substring(1);
let formattedRUT = dv + '-';
for (let i = 0; i < digits.length; i++) {
formattedRUT += digits.charAt(i);
if (i % 3 === 2 && i !== digits.length - 1) {
formattedRUT += '.';
}
}
return formattedRUT.split('').reverse().join('');
}
function verificarRUTExistente(rut, orgType) {
let url = '{{ path('valid_rut', {'rut': 'PLACEHOLDER', 'orgType': 'PLACEHOLDER_ORG'})|raw }}';
url = url.replace('PLACEHOLDER', encodeURIComponent(rut)).replace('PLACEHOLDER_ORG', encodeURIComponent(orgType));
let exist = false;
$.ajax({
type: 'GET',
url: url,
async: false,
success: function (response) {
if (response.exists) {
$('#patenteOn').prop('hidden', false);
$('#patenteOff').prop('hidden', true);
exist = true;
} else {
$('#patenteOn').prop('hidden', true);
$('#patenteOff').prop('hidden', false);
exist = false;
}
}
});
return exist;
}
</script>
<script>
function openPaymentModal(invoiceId) {
$('#invoiceId').val(invoiceId);
$('#paymentModal').modal('show');
// Llenar las opciones del tipo de pago
$.ajax({
url: '{{ path('app_get_payment_types') }}',
method: 'GET',
success: function (response) {
$('#paymentType').empty();
response.forEach(function (type) {
$('#paymentType').append(new Option(type.name, type.id));
});
}
});
}
$('#paymentForm').submit(function (event) {
event.preventDefault();
const paymentType = $('#paymentType').val();
const invoiceId = $('#invoiceId').val();
$.ajax({
url: '{{ path('app_register_payment') }}',
method: 'POST',
data: {
paymentType: paymentType,
invoiceId: invoiceId
},
success: function (response) {
if (response.success) {
$('#paymentModal').modal('hide');
Swal.fire(
'Actualizado!',
'Pago realizado.',
'success'
).then((result) => {
if (result.isConfirmed) {
location.reload();
}
});
}
}
});
});
//Editar Preinvoices
$(document).on("click", ".editOrderBtn", function () {
const preinvoiceId = $(this).data("id");
const url = `/admin/preinvoice/${preinvoiceId}/edit`;
$('#invoiceForm').data('preinvoice-id', preinvoiceId);
$('#invoiceForm').attr('action', `/admin/preinvoice/${preinvoiceId}/update`);
adittionalData(1, false);
typeProduct = 1;
selectedProducts = {};
$('#invoiceForm').attr('action', url.replace('/edit', ''));
$('#titleModal').text('Editar Orden de Compra');
$('#titleOrganization').html('Proveedor Asociado<i style="color:red;">*</i>');
$('#hostNum').closest('.form-group').remove();
$('#salesman').closest('.form-group').remove();
$('#payMethod').closest('.form-group').remove();
$('#divColor').css('background-color', '#bd2d54');
$('.btn-saveChanges').show();
$('.btn-create').hide();
$.ajax({
url: url,
method: "GET",
success: function (response) {
console.log("Respuesta recibida:", response);
$('#poNumber').val(response.poNumber);
$('#date').val(response.date);
$('#endDate').val(response.endDate);
$('#organization').val(response.organization).trigger('change');
$('#planType').val(response.planType).trigger('change');
$('#observation').val(response.observation);
;
if (response.products && typeof response.products === "object") {
const products = response.products;
Object.keys(products).forEach((productId) => {
const product = products[productId];
const checkbox = $(`#product_${productId}`);
if (checkbox.length) {
checkbox.prop("checked", true);
checkbox.trigger("change");
$(`#price_${productId}`).val(product.price);
$(`#dolar_${productId}`).val(product.dolarInput || '');
$(`#item_amount_${productId}`).val(product.item_amount);
$(`#supplier_unit_amount_${productId}`).val(parseFloat(product.supplier_unit_amount));
$(`#supplier_tax_amount_${productId}`).val(product.supplier_tax_amount);
$(`#quantity_${productId}`).val(product.quantity || '');
updateProductPrices(productId);
} else {
console.warn(`Checkbox con ID product_${productId} no encontrado en el DOM.`);
}
});
} else {
console.error("products no es un objeto válido:", response.products);
}
setTimeout(function () {
calculateInvoice();
}, 300);
$('#totalInvoice').val(response.total);
$(".invoiceModal").modal("show");
},
error: function (xhr) {
console.error("Error al cargar datos:", xhr.responseText);
Swal.fire("Error", "No se pudieron cargar los datos.", "error");
},
});
});
$(document).ready(function () {
const urlParams = new URLSearchParams(window.location.search);
let preinvoices = [];
for (const [key,value] of urlParams.entries()){
if(key.startsWith('preinvoices')){
preinvoices.push(value)
}
}
console.log(preinvoices, 'Id de ordenes de compra');
if (preinvoices.length > 0) {
adittionalData(1, false);
typeProduct = 1;
selectedProducts = {};
$('#titleModal').text('Factura de Compra');
$('#titleOrganization').html('Proveedor Asociado<i style="color:red;">*</i>');
$('#poNumber').closest('.form-group').remove();
$('#salesman').closest('.form-group').remove();
$('#payMethod').closest('.form-group').remove();
$('#divColor').css('background-color', '#bd2d54');
$('.btn-saveChanges').hide();
$.ajax({
url: `{{ path('purchase_consolidated') }}`,
method: "POST",
contentType: 'application/json',
data: JSON.stringify({preinvoices}),
success: function (response) {
if(response.status){
console.log("Datos cargados:", response);
$('#preinvoicesInput').val(JSON.stringify(preinvoices));
$('#organization').val(response.data.organization).trigger('change');
$('planType').val(response.planType).trigger('change');
$('observation').val(response.observation);
$('#totalInvoice').val(response.data.total);
Object.keys(response.data.products).forEach(productId => {
const product = response.data.products[productId];
const checkbox = $(`#product_${productId}`);
if (checkbox.length) {
checkbox.prop("checked", true);
checkbox.trigger("change");
$(`#price_${productId}`).val(product.price);
$(`#dolar_${productId}`).val(product.dolarInput || '');
$(`#item_amount_${productId}`).val(product.item_amount);
$(`#supplier_unit_amount_${productId}`).val(parseFloat(product.supplier_unit_amount));
$(`#supplier_tax_amount_${productId}`).val(product.supplier_tax_amount);
$(`#quantity_${productId}`).val(product.quantity || '');
updateProductPrices(productId);
} else {
console.warn(`Checkbox con ID product_${productId} no encontrado en el DOM.`);
}
});
}
setTimeout(function () {
calculateInvoice();
}, 300);
$('#totalInvoice').val(response.total);
// Mostrar el modal
$(".invoiceModal").modal("show");
},
error: function (xhr) {
console.error("Error al cargar los datos:", xhr.responseText);
Swal.fire("Error", "No se pudieron cargar los datos de la orden.", "error");
},
});
} else {
console.error("No se encontró preinvoiceId en la URL.");
}
});
$(document).ready(function () {
const urlParams = new URLSearchParams(window.location.search);
const preinvoiceIds = [];
for (const [key, value] of urlParams.entries()) {
if (key.startsWith('preinvoices')) {
preinvoiceIds.push(value);
}
}
if (preinvoiceIds.length > 0) {
$('.invoiceModal').modal('show');
$('.invoiceModal').on('hidden.bs.modal', function () {
history.replaceState(null, '', '/purchases');
window.location.href = '/purchases';
});
}
});
</script>
<script>
$(document).ready(function() {
// Función para aplicar el modo oscuro
function enableDarkMode() {
$('#kt_body').css('background-image', 'url({{ asset(headerImg2) }})');
$('.menu-here-bg .text-black').removeClass('text-black').addClass('modeDark');
localStorage.setItem('darkMode', 'enabled');
}
// Función para desactivar el modo oscuro
function disableDarkMode() {
$('#kt_body').css('background-image', 'url({{ asset(headerImg) }})');
$('.menu-here-bg .modeDark').removeClass('modeDark').addClass('text-black');
localStorage.setItem('darkMode', 'disabled');
}
// Recuperar el estado del modo oscuro del almacenamiento local
if (localStorage.getItem('darkMode') === 'enabled') {
$('#darkModeToggle').prop('checked', true);
enableDarkMode();
} else {
disableDarkMode();
}
// Cambiar el modo oscuro al cambiar el switch
$('#darkModeToggle').change(function() {
if ($(this).is(':checked')) {
enableDarkMode();
} else {
disableDarkMode();
}
});
});
</script>
{% block javascripts %}
{% endblock %}
</body>
</html>